From e82460e4937fd9206bba32e2659fdfb9e2830db8 Mon Sep 17 00:00:00 2001 From: Simon Steiner Date: Tue, 22 Jan 2019 11:53:31 +0000 Subject: [PATCH] FOP-2733: Drop dependency on Avalon-Framework git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1851806 13f79535-47bb-0310-9956-ffa450edef68 --- fop-core/pom.xml | 10 - .../apache/fop/activity/ContainerUtil.java | 48 +++ .../apache/fop/activity/Initializable.java | 24 ++ .../java/org/apache/fop/apps/FOUserAgent.java | 4 +- .../org/apache/fop/apps/FopConfParser.java | 6 +- .../java/org/apache/fop/apps/FopFactory.java | 2 +- .../apache/fop/apps/FopFactoryBuilder.java | 3 +- .../org/apache/fop/apps/FopFactoryConfig.java | 3 +- .../main/java/org/apache/fop/cli/Main.java | 3 - .../fop/configuration/Configurable.java | 24 ++ .../fop/configuration/Configuration.java | 61 ++++ .../configuration/ConfigurationException.java | 30 ++ .../configuration/DefaultConfiguration.java | 293 ++++++++++++++++++ .../DefaultConfigurationBuilder.java | 76 +++++ .../fop/configuration/NullConfiguration.java | 124 ++++++++ .../apache/fop/fonts/DefaultFontConfig.java | 4 +- .../java/org/apache/fop/fonts/FontConfig.java | 5 +- .../fop/fonts/FontManagerConfigurator.java | 4 +- .../FontSubstitutionsConfigurator.java | 3 +- .../org/apache/fop/render/RendererConfig.java | 3 +- .../fop/render/RendererConfigOption.java | 2 + .../fop/render/XMLHandlerConfigurator.java | 4 +- .../apache/fop/render/afp/AFPFontConfig.java | 6 +- .../org/apache/fop/render/afp/AFPInfo.java | 3 +- .../fop/render/afp/AFPRendererConfig.java | 4 +- .../fop/render/afp/AFPRendererContext.java | 5 +- .../fop/render/afp/AFPRendererOption.java | 5 + .../apache/fop/render/afp/AFPShadingMode.java | 2 +- .../render/bitmap/BitmapRendererConfig.java | 16 +- .../fop/render/bitmap/PNGRendererConfig.java | 3 +- .../fop/render/bitmap/TIFFRendererConfig.java | 3 +- .../render/intermediate/IFRendererConfig.java | 3 +- .../render/java2d/Java2DRendererConfig.java | 3 +- .../render/java2d/Java2DRendererOption.java | 5 + .../fop/render/pcl/Java2DRendererOption.java | 23 +- .../fop/render/pcl/PCLRendererConfig.java | 3 +- .../fop/render/pdf/PDFRendererConfig.java | 12 +- .../apache/fop/render/pdf/PDFSVGHandler.java | 2 +- .../fop/render/ps/PSRendererConfig.java | 4 +- .../apache/fop/render/ps/PSSVGHandler.java | 3 +- .../fop/render/txt/TxtRendererConfig.java | 3 +- .../apache/fop/svg/AbstractFOPTranscoder.java | 8 +- .../PDFDocumentGraphics2DConfigurator.java | 5 +- .../org/apache/fop/svg/PDFTranscoder.java | 3 +- .../AbstractRendererConfigParserTester.java | 5 +- .../AbstractRendererConfiguratorTest.java | 3 +- .../org/apache/fop/apps/MutableConfig.java | 3 +- .../apache/fop/config/BaseUserConfigTest.java | 2 +- .../apache/fop/threading/AvalonAdapter.java | 8 +- .../org/apache/fop/threading/FOPTestbed.java | 38 +-- .../apache/fop/threading/FOProcessorImpl.java | 20 +- .../apache/fop/threading/IFProcessorImpl.java | 21 +- .../java/org/apache/fop/threading/Main.java | 13 +- .../org/apache/fop/threading/Processor.java | 5 +- .../visual/AbstractPSPDFBitmapProducer.java | 6 +- .../org/apache/fop/visual/BatchDiffer.java | 8 +- .../org/apache/fop/visual/BitmapProducer.java | 4 +- .../fop/visual/BitmapProducerJava2D.java | 6 +- .../fop/visual/ReferenceBitmapLoader.java | 7 +- fop-servlet/pom.xml | 12 - fop-transcoder-allinone/pom.xml | 11 - .../src/tools/resources/assembly/assembly.xml | 4 - fop/build.xml | 9 +- fop/examples/embedding/build.xml | 1 - .../java/embedding/ExampleAWTViewer.java | 4 +- .../embedding/java/embedding/ExampleEPS.java | 8 +- .../java/embedding/ExampleJava2D2PDF.java | 6 +- fop/lib/README.txt | 8 - fop/lib/avalon-framework-api-4.3.1.jar | Bin 33218 -> 0 bytes fop/lib/avalon-framework-impl-4.3.1.jar | Bin 61021 -> 0 bytes fop/lib/avalon-framework.LICENSE.txt | 175 ----------- fop/lib/avalon-framework.NOTICE.TXT | 11 - pom.xml | 1 - 73 files changed, 863 insertions(+), 396 deletions(-) create mode 100644 fop-core/src/main/java/org/apache/fop/activity/ContainerUtil.java create mode 100644 fop-core/src/main/java/org/apache/fop/activity/Initializable.java create mode 100644 fop-core/src/main/java/org/apache/fop/configuration/Configurable.java create mode 100644 fop-core/src/main/java/org/apache/fop/configuration/Configuration.java create mode 100644 fop-core/src/main/java/org/apache/fop/configuration/ConfigurationException.java create mode 100644 fop-core/src/main/java/org/apache/fop/configuration/DefaultConfiguration.java create mode 100644 fop-core/src/main/java/org/apache/fop/configuration/DefaultConfigurationBuilder.java create mode 100644 fop-core/src/main/java/org/apache/fop/configuration/NullConfiguration.java delete mode 100644 fop/lib/avalon-framework-api-4.3.1.jar delete mode 100644 fop/lib/avalon-framework-impl-4.3.1.jar delete mode 100644 fop/lib/avalon-framework.LICENSE.txt delete mode 100644 fop/lib/avalon-framework.NOTICE.TXT diff --git a/fop-core/pom.xml b/fop-core/pom.xml index 45af7badf..ae061197d 100644 --- a/fop-core/pom.xml +++ b/fop-core/pom.xml @@ -87,16 +87,6 @@ ant 1.8.2 - - org.apache.avalon.framework - avalon-framework-api - ${avalon.version} - - - org.apache.avalon.framework - avalon-framework-impl - ${avalon.version} - org.apache.pdfbox fontbox diff --git a/fop-core/src/main/java/org/apache/fop/activity/ContainerUtil.java b/fop-core/src/main/java/org/apache/fop/activity/ContainerUtil.java new file mode 100644 index 000000000..00476d504 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/activity/ContainerUtil.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: Accessibility.java 1343632 2012-05-29 09:48:03Z vhennebert $ */ +package org.apache.fop.activity; + +import org.apache.fop.configuration.Configurable; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; + +public final class ContainerUtil { + + private ContainerUtil() { + // Never invoked. + } + + public static void configure(Configurable configurable, Configuration configuration) { + try { + configurable.configure(configuration); + } catch (ConfigurationException e) { + e.printStackTrace(); + throw new IllegalStateException(e); + } + } + + public static void initialize(Initializable initializable) { + try { + initializable.initialize(); + } catch (Exception e) { + e.printStackTrace(); + throw new IllegalStateException(e); + } + } +} diff --git a/fop-core/src/main/java/org/apache/fop/activity/Initializable.java b/fop-core/src/main/java/org/apache/fop/activity/Initializable.java new file mode 100644 index 000000000..9c46b70b3 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/activity/Initializable.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: Accessibility.java 1343632 2012-05-29 09:48:03Z vhennebert $ */ +package org.apache.fop.activity; + +public interface Initializable { + + void initialize() throws Exception; +} diff --git a/fop-core/src/main/java/org/apache/fop/apps/FOUserAgent.java b/fop-core/src/main/java/org/apache/fop/apps/FOUserAgent.java index 2aaa2ad22..51c0d8869 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FOUserAgent.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FOUserAgent.java @@ -30,8 +30,6 @@ import java.util.Map; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -47,6 +45,8 @@ import org.apache.fop.accessibility.Accessibility; import org.apache.fop.accessibility.DummyStructureTreeEventHandler; import org.apache.fop.accessibility.StructureTreeEventHandler; import org.apache.fop.apps.io.InternalResourceResolver; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.events.DefaultEventBroadcaster; import org.apache.fop.events.Event; import org.apache.fop.events.EventBroadcaster; diff --git a/fop-core/src/main/java/org/apache/fop/apps/FopConfParser.java b/fop-core/src/main/java/org/apache/fop/apps/FopConfParser.java index c68226db5..7dcbae34c 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FopConfParser.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FopConfParser.java @@ -31,9 +31,6 @@ import java.util.Map; import org.xml.sax.SAXException; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -43,6 +40,9 @@ import org.apache.xmlgraphics.io.ResourceResolver; import org.apache.fop.apps.io.InternalResourceResolver; import org.apache.fop.apps.io.ResourceResolverFactory; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; +import org.apache.fop.configuration.DefaultConfigurationBuilder; import org.apache.fop.fonts.FontManagerConfigurator; import org.apache.fop.hyphenation.HyphenationTreeCache; import org.apache.fop.hyphenation.Hyphenator; diff --git a/fop-core/src/main/java/org/apache/fop/apps/FopFactory.java b/fop-core/src/main/java/org/apache/fop/apps/FopFactory.java index 100b028e9..2e640ce6d 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FopFactory.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FopFactory.java @@ -30,7 +30,6 @@ import java.util.Set; import org.xml.sax.SAXException; -import org.apache.avalon.framework.configuration.Configuration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -41,6 +40,7 @@ import org.apache.xmlgraphics.util.UnitConv; import org.apache.fop.apps.io.InternalResourceResolver; import org.apache.fop.apps.io.ResourceResolverFactory; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fo.ElementMapping; import org.apache.fop.fo.ElementMappingRegistry; import org.apache.fop.fonts.FontManager; diff --git a/fop-core/src/main/java/org/apache/fop/apps/FopFactoryBuilder.java b/fop-core/src/main/java/org/apache/fop/apps/FopFactoryBuilder.java index 92f0e8a17..84f85cdbd 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FopFactoryBuilder.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FopFactoryBuilder.java @@ -26,8 +26,6 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.xmlgraphics.image.loader.ImageContext; import org.apache.xmlgraphics.image.loader.ImageManager; import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.FallbackResolver; @@ -35,6 +33,7 @@ import org.apache.xmlgraphics.io.ResourceResolver; import org.apache.fop.apps.io.InternalResourceResolver; import org.apache.fop.apps.io.ResourceResolverFactory; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.FontManager; import org.apache.fop.layoutmgr.LayoutManagerMaker; diff --git a/fop-core/src/main/java/org/apache/fop/apps/FopFactoryConfig.java b/fop-core/src/main/java/org/apache/fop/apps/FopFactoryConfig.java index 47df64599..37482244b 100644 --- a/fop-core/src/main/java/org/apache/fop/apps/FopFactoryConfig.java +++ b/fop-core/src/main/java/org/apache/fop/apps/FopFactoryConfig.java @@ -23,13 +23,12 @@ import java.net.URI; import java.util.Map; import java.util.Set; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.xmlgraphics.image.loader.ImageManager; import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.FallbackResolver; import org.apache.xmlgraphics.io.ResourceResolver; import org.apache.fop.apps.io.InternalResourceResolver; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.FontManager; import org.apache.fop.layoutmgr.LayoutManagerMaker; diff --git a/fop-core/src/main/java/org/apache/fop/cli/Main.java b/fop-core/src/main/java/org/apache/fop/cli/Main.java index e082265f1..b8ba68df9 100644 --- a/fop-core/src/main/java/org/apache/fop/cli/Main.java +++ b/fop-core/src/main/java/org/apache/fop/cli/Main.java @@ -112,9 +112,6 @@ public final class Main { try { //System.out.println(Thread.currentThread().getContextClassLoader()); Class clazz = Class.forName("org.apache.commons.io.IOUtils"); - if (clazz != null) { - clazz = Class.forName("org.apache.avalon.framework.configuration.Configuration"); - } return (clazz != null); } catch (Exception e) { return false; diff --git a/fop-core/src/main/java/org/apache/fop/configuration/Configurable.java b/fop-core/src/main/java/org/apache/fop/configuration/Configurable.java new file mode 100644 index 000000000..79f87b768 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/configuration/Configurable.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: Accessibility.java 1343632 2012-05-29 09:48:03Z vhennebert $ */ +package org.apache.fop.configuration; + +public interface Configurable { + + void configure(Configuration cfg) throws ConfigurationException; +} diff --git a/fop-core/src/main/java/org/apache/fop/configuration/Configuration.java b/fop-core/src/main/java/org/apache/fop/configuration/Configuration.java new file mode 100644 index 000000000..674a91f39 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/configuration/Configuration.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: Accessibility.java 1343632 2012-05-29 09:48:03Z vhennebert $ */ +package org.apache.fop.configuration; + +public interface Configuration { + + Configuration getChild(String key); + + Configuration getChild(String key, boolean required); + + Configuration[] getChildren(String key); + + String[] getAttributeNames(); + + String getAttribute(String key) throws ConfigurationException; + + String getAttribute(String key, String defaultValue); + + boolean getAttributeAsBoolean(String key, boolean defaultValue); + + float getAttributeAsFloat(String key) throws ConfigurationException; + + float getAttributeAsFloat(String key, float defaultValue); + + int getAttributeAsInteger(String key, int defaultValue); + + String getValue() throws ConfigurationException; + + String getValue(String defaultValue); + + boolean getValueAsBoolean() throws ConfigurationException; + + boolean getValueAsBoolean(boolean defaultValue); + + int getValueAsInteger() throws ConfigurationException; + + int getValueAsInteger(int defaultValue); + + float getValueAsFloat() throws ConfigurationException; + + float getValueAsFloat(float defaultValue); + + String getLocation(); + +} diff --git a/fop-core/src/main/java/org/apache/fop/configuration/ConfigurationException.java b/fop-core/src/main/java/org/apache/fop/configuration/ConfigurationException.java new file mode 100644 index 000000000..66b68ab72 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/configuration/ConfigurationException.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: Accessibility.java 1343632 2012-05-29 09:48:03Z vhennebert $ */ +package org.apache.fop.configuration; + +public class ConfigurationException extends Exception { + + public ConfigurationException(String message) { + super(message); + } + + public ConfigurationException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/fop-core/src/main/java/org/apache/fop/configuration/DefaultConfiguration.java b/fop-core/src/main/java/org/apache/fop/configuration/DefaultConfiguration.java new file mode 100644 index 000000000..22f28a170 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/configuration/DefaultConfiguration.java @@ -0,0 +1,293 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: Accessibility.java 1343632 2012-05-29 09:48:03Z vhennebert $ */ +package org.apache.fop.configuration; + +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class DefaultConfiguration implements Configuration { + + static final DocumentBuilderFactory DBF = DocumentBuilderFactory.newInstance(); + + static { + DBF.setNamespaceAware(false); + DBF.setValidating(false); + DBF.setIgnoringComments(true); + DBF.setIgnoringElementContentWhitespace(true); + DBF.setExpandEntityReferences(true); + } + + /** + * @deprecated For debug only. + */ + public static String toString(Document document) { + try { + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + //initialize StreamResult with File object to save to file + StreamResult result = new StreamResult(new StringWriter()); + DOMSource source = new DOMSource(document); + transformer.transform(source, result); + return result.getWriter().toString(); + } catch (TransformerException e) { + throw new IllegalStateException(e); + } + } + + private Element element; + + public DefaultConfiguration(String key) { + DocumentBuilder builder = null; + try { + builder = DBF.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + throw new IllegalStateException(e); + } + Document doc = builder.newDocument(); + // create the root element node + element = doc.createElement(key); + doc.appendChild(element); + } + + DefaultConfiguration(Element element) { + this.element = element; + } + + Element getElement() { + return element; + } + + public void addChild(DefaultConfiguration configuration) { + Element node = (Element) element.getOwnerDocument().importNode(configuration.getElement(), true); + element.appendChild(node); + } + + String getValue0() { + String result = element.getTextContent(); + if (result == null) { + result = ""; + } + return result; + } + + @Override + public Configuration getChild(String key) { + NodeList nl = element.getElementsByTagName(key); + for (int i = 0; i < nl.getLength(); ++i) { + Node n = nl.item(i); + if (n.getNodeName().equals(key)) { + return new DefaultConfiguration((Element) n); + } + } + return NullConfiguration.INSTANCE; + } + + @Override + public Configuration getChild(String key, boolean required) { + Configuration result = getChild(key); + if (!required && result == NullConfiguration.INSTANCE) { + return null; + } + if (required && (result == null || result == NullConfiguration.INSTANCE)) { + // throw new IllegalStateException("No child '" + key + "'"); + return NullConfiguration.INSTANCE; + } + return result; + } + + @Override + public Configuration[] getChildren(String key) { + NodeList nl = element.getElementsByTagName(key); + Configuration[] result = new Configuration[nl.getLength()]; + for (int i = 0; i < nl.getLength(); ++i) { + Node n = nl.item(i); + result[i] = new DefaultConfiguration((Element) n); + } + return result; + } + + @Override + public String[] getAttributeNames() { + NamedNodeMap nnm = element.getAttributes(); + String[] result = new String[nnm.getLength()]; + for (int i = 0; i < nnm.getLength(); ++i) { + Node n = nnm.item(i); + result[i] = n.getNodeName(); + } + return result; + } + + @Override + public String getAttribute(String key) { + String result = element.getAttribute(key); + if ("".equals(result)) { + result = null; + } + return result; + } + + @Override + public String getAttribute(String key, String defaultValue) { + String result = getAttribute(key); + if (result == null || "".equals(result)) { + result = defaultValue; + } + return result; + } + + @Override + public boolean getAttributeAsBoolean(String key, boolean defaultValue) { + String result = getAttribute(key); + if (result == null || "".equals(result)) { + return defaultValue; + } + return "true".equalsIgnoreCase(result) || "yes".equalsIgnoreCase(result); + } + + @Override + public float getAttributeAsFloat(String key) throws ConfigurationException { + return Float.parseFloat(getAttribute(key)); + } + + @Override + public float getAttributeAsFloat(String key, float defaultValue) { + String result = getAttribute(key); + if (result == null || "".equals(result)) { + return defaultValue; + } + return Float.parseFloat(result); + } + + @Override + public int getAttributeAsInteger(String key, int defaultValue) { + String result = getAttribute(key); + if (result == null || "".equals(result)) { + return defaultValue; + } + return Integer.parseInt(result); + } + + @Override + public String getValue() throws ConfigurationException { + String result = getValue0(); + if (result == null || "".equals(result)) { + throw new ConfigurationException("No value in " + element.getNodeName()); + } + return result; + } + + @Override + public String getValue(String defaultValue) { + String result = getValue0(); + if (result == null || "".equals(result)) { + result = defaultValue; + } + return result; + } + + @Override + public boolean getValueAsBoolean() throws ConfigurationException { + return Boolean.parseBoolean(getValue0()); + } + + @Override + public boolean getValueAsBoolean(boolean defaultValue) { + String result = getValue0().trim(); + if ("".equals(result)) { + return defaultValue; + } + return Boolean.parseBoolean(result); + } + + @Override + public int getValueAsInteger() throws ConfigurationException { + try { + return Integer.parseInt(getValue0()); + } catch (NumberFormatException e) { + throw new ConfigurationException("Not an integer", e); + } + } + + @Override + public int getValueAsInteger(int defaultValue) { + String result = getValue0(); + if (result == null || "".equals(result)) { + return defaultValue; + } + return Integer.parseInt(result); + } + + @Override + public float getValueAsFloat() throws ConfigurationException { + try { + return Float.parseFloat(getValue0()); + } catch (NumberFormatException e) { + throw new ConfigurationException("Not a float", e); + } + } + + @Override + public float getValueAsFloat(float defaultValue) { + String result = getValue0(); + if (result == null || "".equals(result)) { + return defaultValue; + } + return Float.parseFloat(getValue0()); + } + + @Override + public String getLocation() { + List path = new ArrayList(); + for (Node el = element; el != null; el = el.getParentNode()) { + if (el instanceof Element) { + path.add(((Element) el).getTagName()); + } + } + Collections.reverse(path); + + StringBuilder sb = new StringBuilder(); + for (String s : path) { + if (sb.length() > 0) { + sb.append("/"); + } + sb.append(s); + } + return sb.toString(); + } +} diff --git a/fop-core/src/main/java/org/apache/fop/configuration/DefaultConfigurationBuilder.java b/fop-core/src/main/java/org/apache/fop/configuration/DefaultConfigurationBuilder.java new file mode 100644 index 000000000..5abf8f499 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/configuration/DefaultConfigurationBuilder.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: Accessibility.java 1343632 2012-05-29 09:48:03Z vhennebert $ */ +package org.apache.fop.configuration; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.DOMException; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class DefaultConfigurationBuilder { + + private static final Log LOG = LogFactory.getLog(DefaultConfigurationBuilder.class.getName()); + + public DefaultConfiguration build(InputStream confStream) throws ConfigurationException { + try { + DocumentBuilder builder = DefaultConfiguration.DBF.newDocumentBuilder(); + Document document = builder.parse(confStream); + return new DefaultConfiguration(document.getDocumentElement()); + } catch (DOMException e) { + throw new ConfigurationException("xml parse error", e); + } catch (ParserConfigurationException e) { + throw new ConfigurationException("xml parse error", e); + } catch (IOException e) { + throw new ConfigurationException("xml parse error", e); + } catch (SAXException e) { + throw new ConfigurationException("xml parse error", e); + } finally { + try { + confStream.close(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + } + + public DefaultConfiguration buildFromFile(File file) throws ConfigurationException { + try { + DocumentBuilder builder = DefaultConfiguration.DBF.newDocumentBuilder(); + Document document = builder.parse(file); + return new DefaultConfiguration(document.getDocumentElement()); + } catch (DOMException e) { + throw new ConfigurationException("xml parse error", e); + } catch (ParserConfigurationException e) { + throw new ConfigurationException("xml parse error", e); + } catch (IOException e) { + throw new ConfigurationException("xml parse error", e); + } catch (SAXException e) { + throw new ConfigurationException("xml parse error", e); + } + } +} diff --git a/fop-core/src/main/java/org/apache/fop/configuration/NullConfiguration.java b/fop-core/src/main/java/org/apache/fop/configuration/NullConfiguration.java new file mode 100644 index 000000000..a15ed9ef9 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/configuration/NullConfiguration.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id: Accessibility.java 1343632 2012-05-29 09:48:03Z vhennebert $ */ +package org.apache.fop.configuration; + +final class NullConfiguration implements Configuration { + + static final NullConfiguration INSTANCE = new NullConfiguration(); + + private NullConfiguration() { + + } + + @Override + public Configuration getChild(String key) { + return INSTANCE; + } + + @Override + public Configuration getChild(String key, boolean required) { + return INSTANCE; + } + + @Override + public Configuration[] getChildren(String key) { + return new Configuration[0]; + } + + @Override + public String[] getAttributeNames() { + return new String[0]; + } + + @Override + public String getAttribute(String key) throws ConfigurationException { + return ""; + } + + @Override + public String getAttribute(String key, String defaultValue) { + return defaultValue; + } + + @Override + public boolean getAttributeAsBoolean(String key, boolean defaultValue) { + return defaultValue; + } + + @Override + public float getAttributeAsFloat(String key) throws ConfigurationException { + return 0; + } + + @Override + public float getAttributeAsFloat(String key, float defaultValue) { + return defaultValue; + } + + @Override + public int getAttributeAsInteger(String key, int defaultValue) { + return defaultValue; + } + + @Override + public String getValue() throws ConfigurationException { + // return null; + throw new ConfigurationException("missing value"); + } + + @Override + public String getValue(String defaultValue) { + return defaultValue; + } + + @Override + public boolean getValueAsBoolean() throws ConfigurationException { + return false; + } + + @Override + public boolean getValueAsBoolean(boolean defaultValue) { + return defaultValue; + } + + @Override + public int getValueAsInteger() throws ConfigurationException { + return 0; + } + + @Override + public int getValueAsInteger(int defaultValue) { + return defaultValue; + } + + @Override + public float getValueAsFloat() throws ConfigurationException { + return 0; + } + + @Override + public float getValueAsFloat(float defaultValue) { + return defaultValue; + } + + @Override + public String getLocation() { + return ""; + } +} diff --git a/fop-core/src/main/java/org/apache/fop/fonts/DefaultFontConfig.java b/fop-core/src/main/java/org/apache/fop/fonts/DefaultFontConfig.java index af162ee35..a1663756c 100644 --- a/fop-core/src/main/java/org/apache/fop/fonts/DefaultFontConfig.java +++ b/fop-core/src/main/java/org/apache/fop/fonts/DefaultFontConfig.java @@ -23,12 +23,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.fop.apps.FOPException; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.events.EventProducer; import org.apache.fop.util.LogUtil; diff --git a/fop-core/src/main/java/org/apache/fop/fonts/FontConfig.java b/fop-core/src/main/java/org/apache/fop/fonts/FontConfig.java index 167baf09e..db4b724c2 100644 --- a/fop-core/src/main/java/org/apache/fop/fonts/FontConfig.java +++ b/fop-core/src/main/java/org/apache/fop/fonts/FontConfig.java @@ -19,9 +19,8 @@ package org.apache.fop.fonts; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.apps.FOPException; +import org.apache.fop.configuration.Configuration; import org.apache.fop.events.EventProducer; /** @@ -45,6 +44,6 @@ public interface FontConfig { * @throws FOPException if an error occurs creating the font configuration object */ FontConfig parse(Configuration cfg, FontManager fontManager, boolean strict, - EventProducer eventProducer) throws FOPException; + EventProducer eventProducer) throws FOPException; } } diff --git a/fop-core/src/main/java/org/apache/fop/fonts/FontManagerConfigurator.java b/fop-core/src/main/java/org/apache/fop/fonts/FontManagerConfigurator.java index 01502c5c2..dbe430ad4 100644 --- a/fop-core/src/main/java/org/apache/fop/fonts/FontManagerConfigurator.java +++ b/fop-core/src/main/java/org/apache/fop/fonts/FontManagerConfigurator.java @@ -24,8 +24,6 @@ import java.net.URISyntaxException; import java.util.List; import java.util.regex.Pattern; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -34,6 +32,8 @@ import org.apache.xmlgraphics.io.ResourceResolver; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.io.InternalResourceResolver; import org.apache.fop.apps.io.ResourceResolverFactory; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.fonts.substitute.FontSubstitutions; import org.apache.fop.fonts.substitute.FontSubstitutionsConfigurator; import org.apache.fop.util.LogUtil; diff --git a/fop-core/src/main/java/org/apache/fop/fonts/substitute/FontSubstitutionsConfigurator.java b/fop-core/src/main/java/org/apache/fop/fonts/substitute/FontSubstitutionsConfigurator.java index 885a4d2a1..2c38c3f63 100644 --- a/fop-core/src/main/java/org/apache/fop/fonts/substitute/FontSubstitutionsConfigurator.java +++ b/fop-core/src/main/java/org/apache/fop/fonts/substitute/FontSubstitutionsConfigurator.java @@ -19,9 +19,8 @@ package org.apache.fop.fonts.substitute; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.apps.FOPException; +import org.apache.fop.configuration.Configuration; /** * Configures a font substitution catalog diff --git a/fop-core/src/main/java/org/apache/fop/render/RendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/RendererConfig.java index 4b3b63a51..d629a2716 100644 --- a/fop-core/src/main/java/org/apache/fop/render/RendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/RendererConfig.java @@ -19,10 +19,9 @@ package org.apache.fop.render; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.FontConfig; /** diff --git a/fop-core/src/main/java/org/apache/fop/render/RendererConfigOption.java b/fop-core/src/main/java/org/apache/fop/render/RendererConfigOption.java index 5b670d07a..632932d74 100644 --- a/fop-core/src/main/java/org/apache/fop/render/RendererConfigOption.java +++ b/fop-core/src/main/java/org/apache/fop/render/RendererConfigOption.java @@ -26,4 +26,6 @@ package org.apache.fop.render; public interface RendererConfigOption { /** The name of the option. */ String getName(); + + Object getDefaultValue(); } diff --git a/fop-core/src/main/java/org/apache/fop/render/XMLHandlerConfigurator.java b/fop-core/src/main/java/org/apache/fop/render/XMLHandlerConfigurator.java index ac50da273..6c594b9a2 100644 --- a/fop-core/src/main/java/org/apache/fop/render/XMLHandlerConfigurator.java +++ b/fop-core/src/main/java/org/apache/fop/render/XMLHandlerConfigurator.java @@ -19,13 +19,13 @@ package org.apache.fop.render; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; /** * Configurator for XMLHandler objects. diff --git a/fop-core/src/main/java/org/apache/fop/render/afp/AFPFontConfig.java b/fop-core/src/main/java/org/apache/fop/render/afp/AFPFontConfig.java index 1ebc4b83e..f6a0a2a75 100644 --- a/fop-core/src/main/java/org/apache/fop/render/afp/AFPFontConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/afp/AFPFontConfig.java @@ -27,8 +27,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -44,6 +42,8 @@ import org.apache.fop.afp.fonts.RasterFont; import org.apache.fop.afp.util.AFPResourceAccessor; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.io.InternalResourceResolver; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.events.EventProducer; import org.apache.fop.fonts.EmbedFontInfo; import org.apache.fop.fonts.FontConfig; @@ -85,7 +85,7 @@ public final class AFPFontConfig implements FontConfig { /** {@inheritDoc}} */ public AFPFontConfig parse(Configuration cfg, FontManager fontManager, boolean strict, - EventProducer eventProducer) throws FOPException { + EventProducer eventProducer) throws FOPException { try { return new ParserHelper(cfg, fontManager, strict, (AFPEventProducer) eventProducer).fontConfig; diff --git a/fop-core/src/main/java/org/apache/fop/render/afp/AFPInfo.java b/fop-core/src/main/java/org/apache/fop/render/afp/AFPInfo.java index 647a8a7c0..b20d12895 100644 --- a/fop-core/src/main/java/org/apache/fop/render/afp/AFPInfo.java +++ b/fop-core/src/main/java/org/apache/fop/render/afp/AFPInfo.java @@ -19,12 +19,11 @@ package org.apache.fop.render.afp; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.afp.AFPGraphics2D; import org.apache.fop.afp.AFPPaintingState; import org.apache.fop.afp.AFPResourceInfo; import org.apache.fop.afp.AFPResourceManager; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.FontInfo; /** diff --git a/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererConfig.java index 062933df6..d6b81e676 100644 --- a/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererConfig.java @@ -23,8 +23,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.EnumMap; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -38,6 +36,8 @@ import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; import org.apache.fop.apps.io.InternalResourceResolver; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.fonts.FontManager; import org.apache.fop.render.RendererConfig; import org.apache.fop.render.afp.AFPFontConfig.AFPFontInfoConfigParser; diff --git a/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererContext.java b/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererContext.java index c05666863..c5a44ff61 100644 --- a/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererContext.java +++ b/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererContext.java @@ -21,12 +21,11 @@ package org.apache.fop.render.afp; import java.util.Map; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.afp.AFPPaintingState; import org.apache.fop.afp.AFPResourceInfo; import org.apache.fop.afp.AFPResourceManager; import org.apache.fop.afp.modca.ResourceObject; +import org.apache.fop.configuration.Configuration; import org.apache.fop.render.AbstractRenderer; import org.apache.fop.render.ImageHandlerUtil; import org.apache.fop.render.RendererContext; @@ -58,7 +57,7 @@ public class AFPRendererContext extends RendererContext { info.setHeight((Integer) getProperty(RendererContextConstants.HEIGHT)); info.setX((Integer) getProperty(RendererContextConstants.XPOS)); info.setY((Integer) getProperty(RendererContextConstants.YPOS)); - info.setHandlerConfiguration((Configuration)getProperty( + info.setHandlerConfiguration((Configuration) getProperty( RendererContextConstants.HANDLER_CONFIGURATION)); info.setFontInfo((org.apache.fop.fonts.FontInfo)getProperty( AFPRendererContextConstants.AFP_FONT_INFO)); diff --git a/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererOption.java b/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererOption.java index d573570d0..33e4da11c 100644 --- a/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererOption.java +++ b/fop-core/src/main/java/org/apache/fop/render/afp/AFPRendererOption.java @@ -61,4 +61,9 @@ public enum AFPRendererOption implements RendererConfigOption { public Class getType() { return type; } + + @Override + public Object getDefaultValue() { + return null; + } } diff --git a/fop-core/src/main/java/org/apache/fop/render/afp/AFPShadingMode.java b/fop-core/src/main/java/org/apache/fop/render/afp/AFPShadingMode.java index 7e963148a..e634b9b13 100644 --- a/fop-core/src/main/java/org/apache/fop/render/afp/AFPShadingMode.java +++ b/fop-core/src/main/java/org/apache/fop/render/afp/AFPShadingMode.java @@ -49,7 +49,7 @@ public enum AFPShadingMode { * @return the enumeration object */ public static AFPShadingMode getValueOf(String name) { - if (COLOR.getName().equalsIgnoreCase(name)) { + if (name == null || "".equals(name) || COLOR.getName().equalsIgnoreCase(name)) { return COLOR; } else if (DITHERED.getName().equalsIgnoreCase(name)) { return DITHERED; diff --git a/fop-core/src/main/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java index 551827fef..99bc14960 100644 --- a/fop-core/src/main/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java @@ -23,10 +23,9 @@ import java.awt.Color; import java.awt.image.BufferedImage; import java.util.EnumMap; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.fonts.FontEventAdapter; @@ -170,7 +169,18 @@ public class BitmapRendererConfig implements RendererConfig { } private String getValue(Configuration cfg, BitmapRendererOption option) { - return cfg.getChild(option.getName()).getValue(null); + Object defaultValue = option.getDefaultValue(); + Object result = cfg.getChild(option.getName()).getValue(null); + if (result == null || "".equals(result)) { + result = defaultValue; + } + if (result == null) { + return null; + } + if (result instanceof Color) { + return ColorUtil.colorToString((Color) result); + } + return result.toString(); } public String getMimeType() { diff --git a/fop-core/src/main/java/org/apache/fop/render/bitmap/PNGRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/bitmap/PNGRendererConfig.java index 26553bc69..8e98ddd25 100644 --- a/fop-core/src/main/java/org/apache/fop/render/bitmap/PNGRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/bitmap/PNGRendererConfig.java @@ -17,12 +17,11 @@ package org.apache.fop.render.bitmap; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.xmlgraphics.util.MimeConstants; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.fonts.FontEventAdapter; diff --git a/fop-core/src/main/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java index c8d71ba17..c339e02d1 100644 --- a/fop-core/src/main/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java @@ -21,13 +21,12 @@ package org.apache.fop.render.bitmap; import java.util.EnumMap; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.xmlgraphics.image.writer.Endianness; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.fonts.FontEventAdapter; diff --git a/fop-core/src/main/java/org/apache/fop/render/intermediate/IFRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/intermediate/IFRendererConfig.java index 7fc7be063..f972dcb05 100644 --- a/fop-core/src/main/java/org/apache/fop/render/intermediate/IFRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/intermediate/IFRendererConfig.java @@ -19,10 +19,9 @@ package org.apache.fop.render.intermediate; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.fonts.FontConfig; diff --git a/fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererConfig.java index 141b61bf9..14d31e1c8 100644 --- a/fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererConfig.java @@ -21,10 +21,9 @@ package org.apache.fop.render.java2d; import java.util.EnumMap; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.fonts.FontEventAdapter; diff --git a/fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererOption.java b/fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererOption.java index b25f05889..8b6ca99a0 100644 --- a/fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererOption.java +++ b/fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererOption.java @@ -34,4 +34,9 @@ public enum Java2DRendererOption implements RendererConfigOption { public String getName() { return name; } + + @Override + public Object getDefaultValue() { + return null; + } } diff --git a/fop-core/src/main/java/org/apache/fop/render/pcl/Java2DRendererOption.java b/fop-core/src/main/java/org/apache/fop/render/pcl/Java2DRendererOption.java index 7a0a4a77e..58e778f21 100644 --- a/fop-core/src/main/java/org/apache/fop/render/pcl/Java2DRendererOption.java +++ b/fop-core/src/main/java/org/apache/fop/render/pcl/Java2DRendererOption.java @@ -25,19 +25,25 @@ import org.apache.fop.render.RendererConfigOption; */ public enum Java2DRendererOption implements RendererConfigOption { - RENDERING_MODE("rendering", PCLRenderingMode.class), - TEXT_RENDERING("text-rendering", Boolean.class), - DISABLE_PJL("disable-pjl", Boolean.class), - OPTIMIZE_RESOURCES("optimize-resources", Boolean.class), - MODE_COLOR("color", Boolean.class); + RENDERING_MODE("rendering", PCLRenderingMode.class, PCLRenderingMode.QUALITY), + TEXT_RENDERING("text-rendering", Boolean.class, Boolean.FALSE), + DISABLE_PJL("disable-pjl", Boolean.class, Boolean.FALSE), + OPTIMIZE_RESOURCES("optimize-resources", Boolean.class, Boolean.FALSE), + MODE_COLOR("color", Boolean.class, Boolean.FALSE); private final String name; private final Class type; - private Java2DRendererOption(String name, Class type) { + private final Object defaultValue; + + private Java2DRendererOption(String name, Class type, Object defaultValue) { this.name = name; this.type = type; + this.defaultValue = defaultValue; + if (defaultValue != null && !(type.isAssignableFrom(defaultValue.getClass()))) { + throw new IllegalArgumentException("default value " + defaultValue + " is not of type " + type); + } } /** {@inheritDoc} */ @@ -48,4 +54,9 @@ public enum Java2DRendererOption implements RendererConfigOption { Class getType() { return type; } + + @Override + public Object getDefaultValue() { + return defaultValue; + } } diff --git a/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java index 06aebba71..1a1c3727e 100644 --- a/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java @@ -22,11 +22,10 @@ package org.apache.fop.render.pcl; import java.util.EnumMap; import java.util.Map; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.fonts.FontEventAdapter; diff --git a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java index 84ac45f40..851189cd7 100644 --- a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java @@ -25,15 +25,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.fonts.FontEventAdapter; @@ -217,7 +216,12 @@ public final class PDFRendererConfig implements RendererConfig { private String parseConfig(Configuration cfg, RendererConfigOption option) { Configuration child = cfg.getChild(option.getName()); - return child.getValue(null); + String value = child.getValue(null); + if (value == null || "".equals(value)) { + Object v = option.getDefaultValue(); + return v == null ? null : v.toString(); + } + return value; } private boolean doesValueExist(Configuration cfg, RendererConfigOption option) { diff --git a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFSVGHandler.java b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFSVGHandler.java index 70a1ad800..467a1f180 100644 --- a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFSVGHandler.java +++ b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFSVGHandler.java @@ -22,10 +22,10 @@ package org.apache.fop.render.pdf; import java.io.OutputStream; import java.util.Map; -import org.apache.avalon.framework.configuration.Configuration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.FontInfo; import org.apache.fop.pdf.PDFDocument; import org.apache.fop.pdf.PDFPage; diff --git a/fop-core/src/main/java/org/apache/fop/render/ps/PSRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/ps/PSRendererConfig.java index 4df5e6bad..c0d28ff96 100644 --- a/fop-core/src/main/java/org/apache/fop/render/ps/PSRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/ps/PSRendererConfig.java @@ -22,14 +22,14 @@ package org.apache.fop.render.ps; import java.util.EnumMap; import java.util.Locale; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.fonts.FontEventAdapter; diff --git a/fop-core/src/main/java/org/apache/fop/render/ps/PSSVGHandler.java b/fop-core/src/main/java/org/apache/fop/render/ps/PSSVGHandler.java index ad8af8a49..3cb58049e 100644 --- a/fop-core/src/main/java/org/apache/fop/render/ps/PSSVGHandler.java +++ b/fop-core/src/main/java/org/apache/fop/render/ps/PSSVGHandler.java @@ -26,8 +26,6 @@ import java.util.Map; import org.w3c.dom.Document; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.batik.bridge.BridgeContext; import org.apache.batik.bridge.GVTBuilder; import org.apache.batik.gvt.GraphicsNode; @@ -35,6 +33,7 @@ import org.apache.batik.gvt.GraphicsNode; import org.apache.xmlgraphics.java2d.ps.PSGraphics2D; import org.apache.xmlgraphics.ps.PSGenerator; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.FontInfo; import org.apache.fop.image.loader.batik.BatikUtil; import org.apache.fop.render.AbstractGenericSVGHandler; diff --git a/fop-core/src/main/java/org/apache/fop/render/txt/TxtRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/txt/TxtRendererConfig.java index bd6f07c4a..76128d42b 100644 --- a/fop-core/src/main/java/org/apache/fop/render/txt/TxtRendererConfig.java +++ b/fop-core/src/main/java/org/apache/fop/render/txt/TxtRendererConfig.java @@ -21,11 +21,10 @@ package org.apache.fop.render.txt; import java.util.EnumMap; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.fonts.FontEventAdapter; diff --git a/fop-core/src/main/java/org/apache/fop/svg/AbstractFOPTranscoder.java b/fop-core/src/main/java/org/apache/fop/svg/AbstractFOPTranscoder.java index debd55c1e..0b3e6985f 100644 --- a/fop-core/src/main/java/org/apache/fop/svg/AbstractFOPTranscoder.java +++ b/fop-core/src/main/java/org/apache/fop/svg/AbstractFOPTranscoder.java @@ -28,10 +28,6 @@ import javax.xml.transform.stream.StreamSource; import org.w3c.dom.DOMImplementation; import org.xml.sax.EntityResolver; -import org.apache.avalon.framework.configuration.Configurable; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.configuration.DefaultConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.impl.SimpleLog; @@ -55,6 +51,10 @@ import org.apache.xmlgraphics.image.loader.ImageSessionContext; import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext; import org.apache.xmlgraphics.util.UnitConv; +import org.apache.fop.configuration.Configurable; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; +import org.apache.fop.configuration.DefaultConfiguration; import org.apache.fop.svg.font.FOPFontFamilyResolver; /** diff --git a/fop-core/src/main/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java b/fop-core/src/main/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java index a8e9307a7..1ecca82c7 100644 --- a/fop-core/src/main/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java +++ b/fop-core/src/main/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java @@ -23,12 +23,11 @@ import java.io.File; import java.net.URI; import java.util.List; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; - import org.apache.fop.apps.FOPException; import org.apache.fop.apps.io.InternalResourceResolver; import org.apache.fop.apps.io.ResourceResolverFactory; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfigurator; import org.apache.fop.fonts.EmbedFontInfo; diff --git a/fop-core/src/main/java/org/apache/fop/svg/PDFTranscoder.java b/fop-core/src/main/java/org/apache/fop/svg/PDFTranscoder.java index 1481f7028..ee8e64dcd 100644 --- a/fop-core/src/main/java/org/apache/fop/svg/PDFTranscoder.java +++ b/fop-core/src/main/java/org/apache/fop/svg/PDFTranscoder.java @@ -27,8 +27,6 @@ import java.io.OutputStream; import org.w3c.dom.Document; import org.w3c.dom.svg.SVGLength; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.batik.bridge.BridgeContext; import org.apache.batik.bridge.UnitProcessor; import org.apache.batik.ext.awt.RenderingHintsKeyExt; @@ -37,6 +35,7 @@ import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.ImageTranscoder; import org.apache.fop.Version; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.FontInfo; import org.apache.fop.svg.font.FOPFontFamilyResolverImpl; diff --git a/fop-core/src/test/java/org/apache/fop/apps/AbstractRendererConfigParserTester.java b/fop-core/src/test/java/org/apache/fop/apps/AbstractRendererConfigParserTester.java index e4c9ceb44..555f73226 100644 --- a/fop-core/src/test/java/org/apache/fop/apps/AbstractRendererConfigParserTester.java +++ b/fop-core/src/test/java/org/apache/fop/apps/AbstractRendererConfigParserTester.java @@ -22,10 +22,9 @@ package org.apache.fop.apps; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; - import org.apache.fop.apps.FopConfBuilder.RendererConfBuilder; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.DefaultConfigurationBuilder; import org.apache.fop.events.DefaultEventBroadcaster; import org.apache.fop.fonts.FontManager; import org.apache.fop.render.RendererConfig; diff --git a/fop-core/src/test/java/org/apache/fop/apps/AbstractRendererConfiguratorTest.java b/fop-core/src/test/java/org/apache/fop/apps/AbstractRendererConfiguratorTest.java index 2487c0a63..b0dbf440c 100644 --- a/fop-core/src/test/java/org/apache/fop/apps/AbstractRendererConfiguratorTest.java +++ b/fop-core/src/test/java/org/apache/fop/apps/AbstractRendererConfiguratorTest.java @@ -27,9 +27,8 @@ import org.xml.sax.SAXException; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.apache.avalon.framework.configuration.ConfigurationException; - import org.apache.fop.apps.FopConfBuilder.RendererConfBuilder; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.render.PrintRendererConfigurator; import org.apache.fop.render.intermediate.IFDocumentHandler; diff --git a/fop-core/src/test/java/org/apache/fop/apps/MutableConfig.java b/fop-core/src/test/java/org/apache/fop/apps/MutableConfig.java index a27a318cb..201408235 100644 --- a/fop-core/src/test/java/org/apache/fop/apps/MutableConfig.java +++ b/fop-core/src/test/java/org/apache/fop/apps/MutableConfig.java @@ -21,13 +21,12 @@ import java.net.URI; import java.util.Map; import java.util.Set; -import org.apache.avalon.framework.configuration.Configuration; - import org.apache.xmlgraphics.image.loader.ImageManager; import org.apache.xmlgraphics.image.loader.impl.AbstractImageSessionContext.FallbackResolver; import org.apache.xmlgraphics.io.ResourceResolver; import org.apache.fop.apps.io.InternalResourceResolver; +import org.apache.fop.configuration.Configuration; import org.apache.fop.fonts.FontManager; import org.apache.fop.layoutmgr.LayoutManagerMaker; diff --git a/fop-core/src/test/java/org/apache/fop/config/BaseUserConfigTest.java b/fop-core/src/test/java/org/apache/fop/config/BaseUserConfigTest.java index 1af57d985..90616c526 100644 --- a/fop-core/src/test/java/org/apache/fop/config/BaseUserConfigTest.java +++ b/fop-core/src/test/java/org/apache/fop/config/BaseUserConfigTest.java @@ -25,11 +25,11 @@ import java.io.InputStream; import org.xml.sax.SAXException; -import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.configuration.DefaultConfigurationBuilder; import org.apache.fop.render.pdf.BasePDFTest; import static org.apache.fop.FOPTestUtils.getBaseDir; diff --git a/fop-core/src/test/java/org/apache/fop/threading/AvalonAdapter.java b/fop-core/src/test/java/org/apache/fop/threading/AvalonAdapter.java index 5074d6b70..8a8bbf79a 100644 --- a/fop-core/src/test/java/org/apache/fop/threading/AvalonAdapter.java +++ b/fop-core/src/test/java/org/apache/fop/threading/AvalonAdapter.java @@ -19,7 +19,7 @@ package org.apache.fop.threading; -import org.apache.avalon.framework.logger.Logger; +import org.apache.commons.logging.Log; import org.apache.fop.events.Event; import org.apache.fop.events.EventFormatter; @@ -31,10 +31,10 @@ import org.apache.fop.events.model.EventSeverity; */ class AvalonAdapter implements EventListener { - private final Logger logger; + private final Log logger; private String filename; - public AvalonAdapter(Logger logger, String filename) { + public AvalonAdapter(Log logger, String filename) { this.logger = logger; this.filename = filename; } @@ -49,7 +49,7 @@ class AvalonAdapter implements EventListener { } else if (severity == EventSeverity.ERROR) { logger.error(filename + ": " + msg); } else if (severity == EventSeverity.FATAL) { - logger.fatalError(filename + ": " + msg); + logger.fatal(filename + ": " + msg); } else { assert false; } diff --git a/fop-core/src/test/java/org/apache/fop/threading/FOPTestbed.java b/fop-core/src/test/java/org/apache/fop/threading/FOPTestbed.java index b2d2ecb95..7f6319ba8 100644 --- a/fop-core/src/test/java/org/apache/fop/threading/FOPTestbed.java +++ b/fop-core/src/test/java/org/apache/fop/threading/FOPTestbed.java @@ -31,25 +31,27 @@ import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamSource; -import org.apache.avalon.framework.CascadingRuntimeException; -import org.apache.avalon.framework.activity.Executable; -import org.apache.avalon.framework.activity.Initializable; -import org.apache.avalon.framework.configuration.Configurable; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.container.ContainerUtil; -import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.CountingOutputStream; import org.apache.commons.io.output.NullOutputStream; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.fop.activity.ContainerUtil; +import org.apache.fop.activity.Initializable; +import org.apache.fop.configuration.Configurable; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; /** * Testbed for multi-threading tests. The class can run a configurable set of task a number of * times in a configurable number of threads to easily reproduce multi-threading issues. */ -public class FOPTestbed extends AbstractLogEnabled +public class FOPTestbed implements Configurable, Initializable { + private static final Log LOG = LogFactory.getLog(FOPTestbed.class); + private int repeat; private List taskList = new java.util.ArrayList(); private int threads; @@ -85,7 +87,7 @@ public class FOPTestbed extends AbstractLogEnabled * Starts the stress test. */ public void doStressTest() { - getLogger().info("Starting stress test..."); + LOG.info("Starting stress test..."); long start = System.currentTimeMillis(); this.counter = 0; @@ -94,7 +96,7 @@ public class FOPTestbed extends AbstractLogEnabled List threadList = new java.util.LinkedList(); for (int ti = 0; ti < this.threads; ti++) { TaskRunner runner = new TaskRunner(); - ContainerUtil.enableLogging(runner, getLogger()); + // ContainerUtil.enableLogging(runner, logger); Thread thread = new Thread(workerGroup, runner, "Worker- " + ti); threadList.add(thread); } @@ -150,7 +152,7 @@ public class FOPTestbed extends AbstractLogEnabled } } - private class TaskRunner extends AbstractLogEnabled implements Runnable { + private class TaskRunner implements Runnable { public void run() { try { @@ -158,12 +160,12 @@ public class FOPTestbed extends AbstractLogEnabled for (Object aTaskList : taskList) { TaskDef def = (TaskDef) aTaskList; final Task task = new Task(def, counter++, foprocessor); - ContainerUtil.enableLogging(task, getLogger()); + // ContainerUtil.enableLogging(task, logger); task.execute(); } } } catch (Exception e) { - getLogger().error("Thread ended with an exception", e); + LOG.error("Thread ended with an exception", e); } } @@ -178,12 +180,12 @@ public class FOPTestbed extends AbstractLogEnabled Class clazz = Class.forName(this.fopCfg.getAttribute("class", "org.apache.fop.threading.FOProcessorImpl")); Processor fop = (Processor)clazz.getDeclaredConstructor().newInstance(); - ContainerUtil.enableLogging(fop, getLogger()); + // ContainerUtil.enableLogging(fop, logger); ContainerUtil.configure(fop, this.fopCfg); ContainerUtil.initialize(fop); return fop; } catch (Exception e) { - throw new CascadingRuntimeException("Error creating FO Processor", e); + throw new RuntimeException("Error creating FO Processor", e); } } @@ -243,7 +245,7 @@ public class FOPTestbed extends AbstractLogEnabled } - private class Task extends AbstractLogEnabled implements Executable { + private class Task { private TaskDef def; private int num; @@ -257,7 +259,7 @@ public class FOPTestbed extends AbstractLogEnabled public void execute() throws Exception { - getLogger().info("Processing: " + def); + LOG.info("Processing: " + def); long start = System.currentTimeMillis(); try { DecimalFormat df = new DecimalFormat("00000"); diff --git a/fop-core/src/test/java/org/apache/fop/threading/FOProcessorImpl.java b/fop-core/src/test/java/org/apache/fop/threading/FOProcessorImpl.java index 721830aee..b784b5c03 100644 --- a/fop-core/src/test/java/org/apache/fop/threading/FOProcessorImpl.java +++ b/fop-core/src/test/java/org/apache/fop/threading/FOProcessorImpl.java @@ -36,25 +36,29 @@ import javax.xml.transform.sax.SAXResult; import org.xml.sax.SAXException; -import org.apache.avalon.framework.activity.Initializable; -import org.apache.avalon.framework.configuration.Configurable; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.commons.io.FilenameUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.fop.activity.Initializable; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; import org.apache.fop.apps.MimeConstants; +import org.apache.fop.configuration.Configurable; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; /** * Default implementation of the {@link Processor} interface using FOP. */ -public class FOProcessorImpl extends AbstractLogEnabled +public class FOProcessorImpl implements Processor, Configurable, Initializable { + private static final Log LOG = LogFactory.getLog(FOProcessorImpl.class); + private FopFactory fopFactory; private TransformerFactory factory = TransformerFactory.newInstance(); private URI userconfig; @@ -74,7 +78,7 @@ public class FOProcessorImpl extends AbstractLogEnabled public void initialize() throws Exception { if (this.userconfig != null) { - getLogger().debug("Setting user config: " + userconfig); + LOG.debug("Setting user config: " + userconfig); fopFactory = FopFactory.newInstance(new File(userconfig)); } else { fopFactory = FopFactory.newInstance(new File(".").toURI()); @@ -92,7 +96,7 @@ public class FOProcessorImpl extends AbstractLogEnabled URL url = new URL(src.getSystemId()); String filename = FilenameUtils.getName(url.getPath()); foUserAgent.getEventBroadcaster().addEventListener( - new AvalonAdapter(getLogger(), filename)); + new AvalonAdapter(LOG, filename)); } catch (MalformedURLException mfue) { throw new RuntimeException(mfue); } diff --git a/fop-core/src/test/java/org/apache/fop/threading/IFProcessorImpl.java b/fop-core/src/test/java/org/apache/fop/threading/IFProcessorImpl.java index 0dc87fa50..ed50e0521 100644 --- a/fop-core/src/test/java/org/apache/fop/threading/IFProcessorImpl.java +++ b/fop-core/src/test/java/org/apache/fop/threading/IFProcessorImpl.java @@ -35,17 +35,19 @@ import javax.xml.transform.stream.StreamResult; import org.xml.sax.ContentHandler; -import org.apache.avalon.framework.activity.Initializable; -import org.apache.avalon.framework.configuration.Configurable; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.commons.io.FilenameUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.fop.activity.Initializable; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.FopFactory; import org.apache.fop.apps.MimeConstants; +import org.apache.fop.configuration.Configurable; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.render.intermediate.IFDocumentHandler; import org.apache.fop.render.intermediate.IFException; import org.apache.fop.render.intermediate.IFParser; @@ -54,9 +56,12 @@ import org.apache.fop.render.intermediate.IFUtil; /** * Implementation of the {@link Processor} interface that renders IF XML to a final output format. */ -public class IFProcessorImpl extends AbstractLogEnabled +public class IFProcessorImpl implements Processor, Configurable, Initializable { + private static final Log LOGGER = LogFactory.getLog(IFProcessorImpl.class); + + private FopFactory fopFactory; private TransformerFactory factory = TransformerFactory.newInstance(); private String userconfig; @@ -73,7 +78,7 @@ public class IFProcessorImpl extends AbstractLogEnabled /** {@inheritDoc} */ public void initialize() throws Exception { if (this.userconfig != null) { - getLogger().debug("Setting user config: " + userconfig); + LOGGER.debug("Setting user config: " + userconfig); fopFactory = FopFactory.newInstance(new File(this.userconfig)); } else { fopFactory = FopFactory.newInstance(new File(".").toURI()); @@ -89,7 +94,7 @@ public class IFProcessorImpl extends AbstractLogEnabled URL url = new URL(src.getSystemId()); String filename = FilenameUtils.getName(url.getPath()); foUserAgent.getEventBroadcaster().addEventListener( - new AvalonAdapter(getLogger(), filename)); + new AvalonAdapter(LOGGER, filename)); } catch (MalformedURLException mfue) { throw new RuntimeException(mfue); } diff --git a/fop-core/src/test/java/org/apache/fop/threading/Main.java b/fop-core/src/test/java/org/apache/fop/threading/Main.java index d18ae405a..32812d078 100644 --- a/fop-core/src/test/java/org/apache/fop/threading/Main.java +++ b/fop-core/src/test/java/org/apache/fop/threading/Main.java @@ -23,11 +23,9 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import org.apache.avalon.framework.ExceptionUtil; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; -import org.apache.avalon.framework.container.ContainerUtil; -import org.apache.avalon.framework.logger.ConsoleLogger; +import org.apache.fop.activity.ContainerUtil; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.DefaultConfigurationBuilder; /** * Starter class for the multi-threading testbed. @@ -61,7 +59,7 @@ public final class Main { //Setup testbed FOPTestbed testbed = new FOPTestbed(); - ContainerUtil.enableLogging(testbed, new ConsoleLogger(ConsoleLogger.LEVEL_INFO)); + // ContainerUtil.enableLogging(testbed, new ConsoleLogger(ConsoleLogger.LEVEL_INFO)); ContainerUtil.configure(testbed, cfg); ContainerUtil.initialize(testbed); @@ -70,7 +68,8 @@ public final class Main { System.exit(0); } catch (Exception e) { - System.err.println(ExceptionUtil.printStackTrace(e)); + // System.err.println(ExceptionUtil.printStackTrace(e)); + e.printStackTrace(System.err); System.exit(-1); } } diff --git a/fop-core/src/test/java/org/apache/fop/threading/Processor.java b/fop-core/src/test/java/org/apache/fop/threading/Processor.java index 2f37c02a1..2551e0039 100644 --- a/fop-core/src/test/java/org/apache/fop/threading/Processor.java +++ b/fop-core/src/test/java/org/apache/fop/threading/Processor.java @@ -24,10 +24,13 @@ import java.io.OutputStream; import javax.xml.transform.Source; import javax.xml.transform.Templates; +import org.apache.fop.activity.Initializable; +import org.apache.fop.configuration.Configurable; + /** * Represents a processor. */ -public interface Processor { +public interface Processor extends Configurable, Initializable { /** * Process a file. diff --git a/fop-core/src/test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java b/fop-core/src/test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java index 162a83756..5edae8074 100644 --- a/fop-core/src/test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java +++ b/fop-core/src/test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java @@ -32,14 +32,14 @@ import javax.xml.transform.Transformer; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; -import org.apache.avalon.framework.configuration.Configurable; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.io.IOUtils; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; +import org.apache.fop.configuration.Configurable; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.util.DefaultErrorListener; /** diff --git a/fop-core/src/test/java/org/apache/fop/visual/BatchDiffer.java b/fop-core/src/test/java/org/apache/fop/visual/BatchDiffer.java index cb78028f4..c9a2d477e 100644 --- a/fop-core/src/test/java/org/apache/fop/visual/BatchDiffer.java +++ b/fop-core/src/test/java/org/apache/fop/visual/BatchDiffer.java @@ -30,10 +30,6 @@ import javax.xml.transform.stream.StreamSource; import org.xml.sax.SAXException; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; -import org.apache.avalon.framework.container.ContainerUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.AndFileFilter; import org.apache.commons.io.filefilter.IOFileFilter; @@ -44,6 +40,10 @@ import org.apache.commons.logging.LogFactory; import org.apache.xmlgraphics.image.writer.ImageWriterUtil; +import org.apache.fop.activity.ContainerUtil; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; +import org.apache.fop.configuration.DefaultConfigurationBuilder; import org.apache.fop.layoutengine.LayoutEngineTestUtils; /** diff --git a/fop-core/src/test/java/org/apache/fop/visual/BitmapProducer.java b/fop-core/src/test/java/org/apache/fop/visual/BitmapProducer.java index 9326656f4..80a4fce0c 100644 --- a/fop-core/src/test/java/org/apache/fop/visual/BitmapProducer.java +++ b/fop-core/src/test/java/org/apache/fop/visual/BitmapProducer.java @@ -22,10 +22,12 @@ package org.apache.fop.visual; import java.awt.image.BufferedImage; import java.io.File; +import org.apache.fop.configuration.Configurable; + /** * Interface for a converter. */ -public interface BitmapProducer { +public interface BitmapProducer extends Configurable { /** * Produces a BufferedImage from the source file by invoking the FO processor and diff --git a/fop-core/src/test/java/org/apache/fop/visual/BitmapProducerJava2D.java b/fop-core/src/test/java/org/apache/fop/visual/BitmapProducerJava2D.java index c29de1e85..96a0d0f94 100644 --- a/fop-core/src/test/java/org/apache/fop/visual/BitmapProducerJava2D.java +++ b/fop-core/src/test/java/org/apache/fop/visual/BitmapProducerJava2D.java @@ -30,15 +30,15 @@ import javax.xml.transform.Transformer; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; -import org.apache.avalon.framework.configuration.Configurable; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.commons.io.IOUtils; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; import org.apache.fop.apps.MimeConstants; +import org.apache.fop.configuration.Configurable; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; import org.apache.fop.util.DefaultErrorListener; /** diff --git a/fop-core/src/test/java/org/apache/fop/visual/ReferenceBitmapLoader.java b/fop-core/src/test/java/org/apache/fop/visual/ReferenceBitmapLoader.java index 29b0afd00..2100178f0 100644 --- a/fop-core/src/test/java/org/apache/fop/visual/ReferenceBitmapLoader.java +++ b/fop-core/src/test/java/org/apache/fop/visual/ReferenceBitmapLoader.java @@ -23,9 +23,9 @@ import java.awt.image.BufferedImage; import java.io.File; import java.net.URI; -import org.apache.avalon.framework.configuration.Configurable; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; +import org.apache.fop.configuration.Configurable; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; /** * BitmapProducer implementation that simply loads preproduced reference bitmaps from a @@ -47,7 +47,6 @@ public class ReferenceBitmapLoader extends AbstractBitmapProducer implements Con super(baseUri); } - /** @see org.apache.avalon.framework.configuration.Configurable */ public void configure(Configuration cfg) throws ConfigurationException { this.bitmapDirectory = new File(cfg.getChild("directory").getValue(null)); if (!bitmapDirectory.exists()) { diff --git a/fop-servlet/pom.xml b/fop-servlet/pom.xml index 8b28ed631..73779cd27 100644 --- a/fop-servlet/pom.xml +++ b/fop-servlet/pom.xml @@ -44,16 +44,6 @@ commons-logging ${commons.logging.version} - - org.apache.avalon.framework - avalon-framework-api - ${avalon.version} - - - org.apache.avalon.framework - avalon-framework-impl - ${avalon.version} - @@ -63,8 +53,6 @@ ${war.plugin.version} - WEB-INF/lib/avalon-framework-api-${avalon.version}.jar, - WEB-INF/lib/avalon-framework-impl-${avalon.version}.jar, WEB-INF/lib/batik-all-*.jar, WEB-INF/lib/commons-io-${commons.io.version}.jar, WEB-INF/lib/commons-logging-${commons.logging.version}.jar, diff --git a/fop-transcoder-allinone/pom.xml b/fop-transcoder-allinone/pom.xml index 13a03d40b..ca93d1251 100644 --- a/fop-transcoder-allinone/pom.xml +++ b/fop-transcoder-allinone/pom.xml @@ -41,17 +41,6 @@ commons-logging ${commons.logging.version} - - org.apache.avalon.framework - avalon-framework-api - ${avalon.version} - - - org.apache.avalon.framework - avalon-framework-impl - ${avalon.version} - - junit junit diff --git a/fop-transcoder-allinone/src/tools/resources/assembly/assembly.xml b/fop-transcoder-allinone/src/tools/resources/assembly/assembly.xml index 9913561e6..838edf610 100644 --- a/fop-transcoder-allinone/src/tools/resources/assembly/assembly.xml +++ b/fop-transcoder-allinone/src/tools/resources/assembly/assembly.xml @@ -22,10 +22,6 @@ true - org/apache/avalon/framework/* - org/apache/avalon/framework/activity/* - org/apache/avalon/framework/configuration/* - org/apache/avalon/framework/container/* org/apache/commons/io/*.class org/apache/commons/io/filefilter/*.class org/apache/commons/io/output/*.class diff --git a/fop/build.xml b/fop/build.xml index cc286b2bd..3547015fe 100644 --- a/fop/build.xml +++ b/fop/build.xml @@ -73,7 +73,6 @@ list of possible build targets. - @@ -597,7 +596,6 @@ list of possible build targets. - @@ -642,6 +640,7 @@ list of possible build targets. + @@ -665,7 +664,6 @@ list of possible build targets. - @@ -698,10 +696,6 @@ list of possible build targets. - - - - @@ -712,7 +706,6 @@ list of possible build targets. - diff --git a/fop/examples/embedding/build.xml b/fop/examples/embedding/build.xml index 0ad70d03c..2439f73f6 100644 --- a/fop/examples/embedding/build.xml +++ b/fop/examples/embedding/build.xml @@ -33,7 +33,6 @@ - diff --git a/fop/examples/embedding/java/embedding/ExampleAWTViewer.java b/fop/examples/embedding/java/embedding/ExampleAWTViewer.java index 0d75a7319..24718ce49 100644 --- a/fop/examples/embedding/java/embedding/ExampleAWTViewer.java +++ b/fop/examples/embedding/java/embedding/ExampleAWTViewer.java @@ -31,8 +31,6 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; -import org.apache.avalon.framework.ExceptionUtil; - import org.apache.fop.apps.FOPException; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; @@ -103,7 +101,7 @@ public class ExampleAWTViewer { System.out.println("Success!"); } catch (Exception e) { - System.err.println(ExceptionUtil.printStackTrace(e)); +// System.err.println(ExceptionUtil.printStackTrace(e)); System.exit(-1); } } diff --git a/fop/examples/embedding/java/embedding/ExampleEPS.java b/fop/examples/embedding/java/embedding/ExampleEPS.java index d35413f60..03540c41b 100644 --- a/fop/examples/embedding/java/embedding/ExampleEPS.java +++ b/fop/examples/embedding/java/embedding/ExampleEPS.java @@ -21,12 +21,12 @@ package embedding; import java.awt.Font; +import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; - +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.DefaultConfigurationBuilder; import org.apache.xmlgraphics.java2d.GraphicContext; import org.apache.xmlgraphics.java2d.ps.EPSDocumentGraphics2D; @@ -43,7 +43,7 @@ public class ExampleEPS { try { String configFile = "examples/fop-eps.xconf"; DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder(); - Configuration c = cfgBuilder.buildFromFile(configFile); + Configuration c = cfgBuilder.buildFromFile(new File(configFile)); FontInfo fontInfo = PDFDocumentGraphics2DConfigurator.createFontInfo(c, false); diff --git a/fop/examples/embedding/java/embedding/ExampleJava2D2PDF.java b/fop/examples/embedding/java/embedding/ExampleJava2D2PDF.java index 7a9b12cd0..abe6d7f86 100644 --- a/fop/examples/embedding/java/embedding/ExampleJava2D2PDF.java +++ b/fop/examples/embedding/java/embedding/ExampleJava2D2PDF.java @@ -30,13 +30,13 @@ import java.io.StringReader; import javax.swing.JEditorPane; -import org.apache.avalon.framework.configuration.Configuration; -import org.apache.avalon.framework.configuration.ConfigurationException; -import org.apache.avalon.framework.configuration.DefaultConfiguration; import org.apache.commons.io.IOUtils; import org.apache.xmlgraphics.util.UnitConv; +import org.apache.fop.configuration.Configuration; +import org.apache.fop.configuration.ConfigurationException; +import org.apache.fop.configuration.DefaultConfiguration; import org.apache.fop.svg.PDFDocumentGraphics2D; import org.apache.fop.svg.PDFDocumentGraphics2DConfigurator; diff --git a/fop/lib/README.txt b/fop/lib/README.txt index e61bd8559..b570edfd1 100644 --- a/fop/lib/README.txt +++ b/fop/lib/README.txt @@ -27,14 +27,6 @@ Normal Dependencies Apache License v2.0 -- Apache Avalon Framework - - avalon-framework-*.jar - http://excalibur.apache.org/framework/ - (Avalon Framework, maintained by the Apache Excalibur project) - - Apache License v2.0 - - Apache XML Graphics Commons xmlgraphics-commons-*.jar diff --git a/fop/lib/avalon-framework-api-4.3.1.jar b/fop/lib/avalon-framework-api-4.3.1.jar deleted file mode 100644 index b60000b34b4412e16d7e177f432d308b6116935d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33218 zcmb@u1yr0%)-H^@ySuwP1a}DT!QI^@xVr@p?gV#tcMGn8;O>FjnK|E_Il13GnfcdG zv+3^D)wSOJ?ArEJy(q|lg24d&{PC}R&+(5JfBb<4Jj;ox2+>Q)i!&NwSUur|=ZNgh*-EY1aYzpGyM*0xABh24H|ovvV~2*Tw(eBVhj+VPJ1y zWNz{|15y4u(7@He+RpZG#^e33<4qk6Y)stj9IgK5o8-Uwrh$>Og{y_L$KOmr{kth# z4J@n;3@xnxej1A3Ok-qcV{d0`V(a`jmqPQ~Ic!ZW%v>A|oGtzqPqN?7<80#ocUMCC zn;ER_%*;$2|3($c-%Ma{@YA}^CXP;jGs*Ata58apwJ`d-mH0b7oXs6g42=JE2~hv= z3VbVkx-EDhpd5e_e{on@DG@PwWibY4cjt92ZKqWZ4Bx3Q-R7odC)narZKr3AK1xQ# zs+`HJ2_0zy!emqiA}Dl%T8pnw{FrN0Bl34H{Ar7M;emlpkCSc)H`3nU&1S|Nzw|?X zD4Q%*XKa6DG|A$~dT@PhMCux`O}eA%^m)E(Gs8R$&3(I^$mrWzpF z-R^x}y*&-%Txu52b>=WtFWhGZvug=J9Af$mlAyDP zdto^7B$UjUa}Vkl%G!_Ul_z`hx!3l3oGD&kG>8$r#D*Zx=Q{9^sZ zkRv1SG!Ge+sMx`U95zTqHruNaeS!XUT(hC4Ami@dr#Oy|!624`%y-`qNPs7SVksdf zXJF-@h7V5_5Dsk1Y3K*+Pp*ypSnjT|sqnUlEo8ZZ;!~6a-L|oqftQ_MH7YBBBnb*_ z_Zp!ebGDWI%_D#{qzR>2c7z2vnLyj|wxj968Le2#@gOSbjdMR&Vmg3BD!i{fH89hF znno~~guR>)+oWB7gia`B4m~yw#x=Pm)wooIW(&*65(heS_zLlQql>aiMAey$khP>p zqt*;5{!SFp2;ElftXGHY#HD4b8z_@q5dPzM{gGlKEptQMo&sec-VP^syW=GUMKo(m8k!X)4M2N;O44coh7Ebew&W{|QBaQk* zcO72N;e}CWoMOTsqB6|SmO#Q}JOmjwU&)e5vRLD4f&2N%Ka$8q04r{GFUozi;j{(j z<#Pwy5SkH7PxKT(Hz)1AWYt1$m)$=bu#87V7d2TS*!3yz{>1)i$K&eCWkGj*C(TqB zW9b=ctXh&i?&Bg57Up4ar8QLy0>+YysKDT)ww^x5p1Asmf_ZUIp)v7u+s=RzS`Faqd zNtl4EDj7qdKoNgtt>M}M7ev@j>b~$~|7aro0DQx~AVj)!D0`pIcfQsCaLHax(AGCN zf@i{tr?;fmLkZu1Hj@OkXST3*@7HW_*r*S_rxEMm9pVf<`Ro8|)f0hK;zLS2y^A`X zCR3SDnXR$sqb+|;ih-&ruzD%XO=)ca`GehQS|a@Ov)@)0twzxkFe;o@46y>4!nA{k zGrgyP)i?gn$3)hQgy=QxpOJ27imKudgpd{ByBXgwkp`Ci@lhSRQB9^`piO&6rom3~ ztIJQGAy(z){O3kS!#?OX)W+kSOq`pBg3>0$t+gU^@($}B6f7iVHGtnh<44ct-tC9` z?N{Z(b7WniBX1#MNg3bPpEwI~A-Oeot^_>EUKNc#(jy#3C>(z?)XaY~V%!5NWh%;7 zhUhRt-;>|Tf!_1p^-YFR+gn`Zx=)7-8KRm9dkKFRcu;7**Awm8ozG!8BnCu>k@P-u z3k+QkgsTj?qWQYgH9?u;0I#nm;GLFX8Bs{-G8+o03Cu*vRMND00p2w^V>L|`!l%5$ z4kX%H@Lsi^J|yp%RwDT4{)pVIwibVb=)ZkAXb)8PEhB-B-iplDGzS z$bvCDP}uMI5mX-!DVTlPW6yC8l3dO0 zEFrkZ-BN>>5S<<^wL3w$JUIEBaMWi(d5M}lQ+>d(nh41mE^R~@{DT+Kg)RiC9PjiD~95{IZKqC2AwBfAxJ`tZj7>!3p)8WOmvMp;a7 z>=}qbjnZ&NM3k&T7y|YB%U5?W2caBg$$^~yH7x!>IHf8UQS;obS{ zBwqbJR!9!pS+-FgBV9DvOEEOZktqjEGka+cIBD9Y7n?4vO$B&rA6Gk5TN9!xRj$R` z&b~+bR;mce|06XSomWr5@& z^wMY*!rn<#vBd1L)h)Upnl@o^Rje(kpsFf3kPp)aX)ocu}P%$;Z0psZ=4cYD{dX&N|Or2dgs@T!Dv z7YisuL=&fqUSmiGi|i_XgPVr9Bs-@tw|$wCH*%0gTuZ-Q|49I3f&RcU%IW9g{O)&8 zaJezE{G}{`?jRfHNae1xR~@q!=iBEXuMi4YP+=k(zG~Zk6tk&7NLK5BH2d=^+T=vLVDLtf-W~;x%;f_XeDGQ)K(MJ~;i zz-wT;OF%>3RE5bw%3Dr-t0T?`*z{&^RsdO6^2>?DJuPwRm08vD26=^csC65rdJC9z9L~~w180~3w>O3lUksiM-PQ4rnh|Mh+(9h>=&+rQ4!mD1(Kh*AEo|6OW1?q}X~yN@~cJV&!qY}?Yw z(Nf9~Gnpz7nLNUYGDUeI!`UKqSl7NDZ`+MP1|I4i>jv6X=K6vdUZ~ z==!+5Iu|_VMJ9X4g5=cqZgx@3PT|W`B+iV~tNI!4Em8M1prsY$T3+R&WeV1kXD_w% z!EczA2NQHd8}GhdaDPI>^qF=n$8F`)Gu%fP^lSCM(Z{|h$u*!ngvxT|u!QE+L=qGc zU^$$xn(6M8cKOi1dS=Kn8l9NKIQWc?3ZD6$(^DoWCTVq>k7PqTh#v9*%_3NNjnZI>>A)sLq!QTmCkmkRTAlF?DE3efOeBOh;XF zLG#QO{|&CHMsKqiRlY^bc6I?9=aF=y{!j5ahm*XleGA@(_P0A(?$a=_>sScOSbLQ`$ z^S*4Quby_agL^MzG0WXzU7SXH(Wr%-4KyDgQcH_Yn0LTjBGE-UkY&mHVkw0aR->8m zxs7Rc@O^GrQ@hZz(6=#ldV7L#%uT)TA3xXhJS^Z}38w2O-H;b0+A5;t6-y~%K=@Kb@h4Vc=P++`Z;o)d)XNoGnyb5mGwmMr z9_p;5#8Jf^n-3&S<~MwA9Dg4JoR~{HWSSgWGVr+O?sa2Kihme}A;}SK{2C`_B#xWU zfYkj4{y#j)KRd$2QbJERKu22y5LAHti|LVnuL9@^e>Q|Z5C=R8Abeb=Ujdh!FD{= zD48v(AJdyPj8Z<~NbXN}2-67M3&O8VL9{BH<^q*`dxPUpR7IGKW~TG~wBOoV$^J{{ znkg+JwQ#+Q7+4ESedimkCYe zhm6HX@EBm&Hl>Vxq0#FwPmG#B~~q~*|vLUbRF%#YXbIRQEo>!GlbF^x@^J#W|s z%y3_&lrO6)qGQ1Q;|!4YzhgYcG0A7=K7jny2!slqOst~DrKFi_e!^(@3MigM1r%0 zb3PYfIE4$F%bDQ{`zhjbiyfEO^%7mK=mo?Vx{R=Bc~5vA8|xmGQ&b~@A188nZIf~7 zT{0ZzuX%G-bIj=4v|qmy$Kn)nZKZKFC=7a|XVTp(w?$=#U|4=a&TS2gk2KL^H87(eY4ZMNAuU?40z|IPW>= zCK#ntH=1{_@`u`8i>1E@*H~jSyz`Z=%>Jg5*gdYAR**0+FN0A*yVsZ(D9~ofDCMDy z>zC{&(V7Yc^8 ziq_`op3aK@FgRHV2*1BT?mF0=|8)8!N6^Mjku!c&IgURtv0Xqpscu`Hx~D}2MbzR* zk9PS1WG9osnKyNdX~Pl=$T3aJwfC(0L2QC56DI1})iFs_;(M(s>6R6O`iRR!!Y4H< zfYB{#`8Y%gTzJczBPILag|A9=9s2%@nf+(Pk=J?cP6DXh0Fa+V^M7P`Wfv!V6I2+14Vx}cA!5|fY)>@W!3xk!!X%ik=_T-B~$`SgIG zS_XxUNoEPv@k1uBA3x6vl#8n)I<@6+dUI{T#eW_}$ukE<%hv7Y--HDkHqk>v& zaK2j`UVp@`!9FS_Ah=0|)iX?>YeL5#E&oKUtRRU*DJ240Ah^ZH!lgN%+x1ry+XG*~ zRRHw60Epo4^!#@wR_Nc}2)P+J{t>)PVrpP|1(8G#4B679MSnopwCk3$sRf8l`=U;| zUpivOeA@b=`2g&j^a+$XU=@y+_xaP$mEMgEfdzrZEUToPBo6yQj9p4B90jg!fT1|O znI!A7xmL+6V?W;D37(M6<&ud*JtLyhdF-VxURtfGgqT(>W}upbV^>AV6Qi9yY39Ya z6e+p}Q~urim)LHmv!|0poq~mr{yl-XQ)Y)fkXom_HjJPLr0$@9MZyKZni~KE0eOG` z0g3!KNT}KZV*5{u+S)|S-N?lLCprAjNM5KoCf_TF#@|;Cg6{n>g7(7*t?TyeQtzR- zVIGw>>wHaAJ-(7wa@VY=(M~VoMSheUj3VlCOB(lqz+@)x{q^w=(2v2=2-Hcnl6ltp z1Kl(tD{TVkq#=ci_+1AnV?INcq5d~nA40~nZ%o{~t5vh)-%D8Hhs?*fBEt=&+ze>$ zxro`1v{g+bQf0K^6G%=__NXi;iiGr~z~Dt9Hm{>%l(vpG*@B*hL!#ff2)4GV3-)mPUOU2ttbJ&Z5r(fbe_NLCUej-Ln9ykkGJ+v@%FT}UQaTH$4>;hgr zyLSJDj4zUWLt@-KunuMN(eOKRd*L=wV+MuhylUSg^PaLEQ*o!EAs9nSNtI5d$Y917izYGciX;JI8;TD_U_x zzE=T_{|nlvf|yXhMJ}%v^oQpDX5v;$S-7A|k0h-!{Bf)J&3~DzsgOooR;T^>%>Jxp zZuNPL76{bKWO$j5IJ78$9()zX6^rK8gb#T;DwZ!J*Fg80*VdiSKB}j7f-~r|_ff1h^QY9(wA_IXVoX~@GkNapW@M37xL~6T zZCg3(z_1P`rYf-eQ%x${D1ulzfugcv;h+E>WpCby=EQ{8qo~|^CY_m@U4k6(0uJpJ z!o-y4Z555Xv<%~Uzm#J#YMO{;RmG3Os}FwV^&#g0X~oxHZhCq>QmplGcRt$E1QNgh zlHx3WpCZYaCt54J2>zA(iS}um_0xuLz)f5L4Vn6!LgXwv$g#r6N={#muwsE0x|L{( z`LT*1iKYmDKIh?kLysTGvp+B$h+PN@gO2dxkXft?N(LeS>T-4Jk@E2XgMowoKEM2F zu)q3Pa>B$<9}AwkFv|T*74|^5F2uYT-P&COJ%i57jMQjaVN@z?wL&70LV<&VDew`| zq+OXN?qfKE=fT>lR~Pr(_k*QpNFe+S8bb{=m1jiTg z0-G|{8jJ}rjC{wgumIJj)zOPTE`2U)!|C!<vRalB z3o1#blh^Y&xR#kSqlGSm5Z4+xOnk@>`23pRgI6su=OwD@AbH{gn*tk{1Nub379=QMWum@~`&Sdo8J_|<08Bgz z@JZhP)F+i(Y@ID^evPJCN`PppfW)7w?xCWHrpPAlrU3r|YZqiU4!N4bssnhOq_%SL%f8YAhwJxOXeP4n=)E4_?fQr1Nkv#>HozYp zX1Q(7!DUzd#7~$(_9Yp_OJS1Lp(}*Q?abhYKunM|J?M}%&FPf`u|`1DC~kPZGo{XF zBY8bg$cyy^hAH5KQUt-3BbPlu|J9OGEVxKNE22(-{H_@Mm$RyvJKDMZSr3`~+1kLM z;;Mfvt!}?Po-%*Q$-v?;NWE~;H7=O9i^k9zgAQn z;>Sy#^N;?3{=Fy_pU;BwzS+K7iiWn99=?i=zAUme0y?;)fk2Y^zVe2;t(|^KYL<@B z(+J`a6cAAQ#`+KmvT$_2l&=>$nTLr0m#Y8=0ulhI@^|Iy|Dwh(bxfAB)q7MSH2%4i zMmkuiD}_tNOQAOUiY-!cC>%vpIF6P<_v}cm0g*6VM_s_2H3%od8>~$| z4s)Zjd0z4!q>q+xPr^dIK)Y5QbkjlR8e{}~$R$9`KiJyrL1jwo>;2uHso2E9A~=f7 zMhXg+j)TsvWm9YE3wumWnR-&P%XePyn9T6cC-dM074E(xDeRhbv>9Qv*;aPXwPkmF zenSkN3+V?moYkr6hu?h_7eI!bO0SyI=UH~r zj0)Ny8>LFir#}@pIGENJ1YoXRNpdWmQYfMMojTk@>F_xJjNDT6FGWV%a zOzQXc13_TJr!@yeg-aQO4a!UNZ>(>q2^>tMHAnLnWRA=-u-bte;&P+9wVb@ZZA5jC zTNKLF>LzK=55@<$tDQ?MT8kuqWrkgI4s^(MUqA?@-aue zKyV;Cw9*Rx4iS|67O`x`Gi0A~0wm_I>B;SMm_HCTJpyyh9KkG@@34c8lSPU)cgV+} zKu;?d7n+<>8uN8FWf&7DtVtE_L!D$6|2#|@)0e`y#dcxRZ_(R%cdXBaVLy;-hDcmz zf`4$=Fk0Q!FntN^nDF3Uk!#!a&c!{Taj5!HxO=HKv@IX$?s5jU27u!f z|8(AD1!j3rAviqBZ4BX$Y>y(d)$qcS)QTkmN}_q6S!tbGjO)Bs+JNlxw}AOzwiCC^ z%_oC9c4sD+Utc`mfb^L;xLCO;jRgkRbIIt6#^}4MZ}A-4s+5th9<8yJZCi|+kjo2V zdju#q#;jy{k9RtwgoJJE{Pdi9?JvI-R77IY1j6>3_o0v9 z_qp@fT~huG<_k_@O4~tqOTpM+lKr~k;{m6^3+K&|1+6@1%lDFn4RTT>PxHKYL^sR| z-UTJ4X|8ZF=t%NR^9Y<_<6G<14UP6g2j=xJInus!HV$wTkt_qD$|^y9~Dg7?w~5`fZ2#WtSI<&hSkL zBR#bi^R=ahy?YMNr$HN=HPCAcQA`%gie}iTQ1qHMk3FuUVbjQHun~JI zz0MBAf&tyh)hO*J^lLA_1lnq6=neX9erniD&ynH{=7AgR77eZhBQf)$Xk?AF#PIx)zL00Lxist1Q%9 z&+May)2Jz9`jngN324X zgH(Nf{DmcwDwdj=20-8sfZ%r=*`E+7nf&ARzk?7bC*LOs7o4*?O-%o8AEVj;iMD_a zwxT4iq<X|8%?tB$hh`{Gk5^4MSt!U_{Qo$zik-{rad~5 zo%`l^2Ne{froJf+P2A&OmR%;=HnW~PiC=JNHH7n5N1MXo@Tdf!B=R4HsDD3aCSv!; zyMHmnSusBuVmPs`T()|qZhC!UTv#|sC_o)WcE=_yBV$oE4Ps`r1%w9^52rHTVElEe zw(ITr+8cNaivHzp4Q8;0TVD-g3TfpdiUIJ#Rxhnap zhqaz-?*ybCejFSy0wFZAy2tm(_(w4&`rMbJY1Eca7~N+a2iflNLQ3I@zS8>RfwLta zQ20lHUH!P23_n(szgtIqpKV^6*pt!?H_|2{^q{%b!LM7nqEd6-oa9A@k0OH39m<^i zT(!d(Q=He=eLlE0`W3&Egz!1UvoaEGJj*kh9R6;l%J*sNj6uade(jV@rDR=>%ueTX z0Y6R*)jK>|1!migICY%K)$eS1qE9S~K5*bTAi*;aMG-I1JzgLKGh3b|YsSLPS+<=s zhv`R+BHYC79N%6lm2#c)p)V^pd>&`u+iIIMUb)#W$hBiR-zhxVhEv+Xg1*jULN~-K znITB#`Z|FYHj(F9P^PR;N7H$IaZ_E|r*A8Y)O3|Gv&E%&7~0k0C~$n2*o`0y;>7}e zGD}u{e&T;Lm|X$s$sZiw=Amo`Wu0|x@EH`V{$*Mqg&=D@!wG}eOHU3KN><2k6eA0f z?&F0cVKMageaW&xY(vv{6B7*XLB6URhZqL}*r-UV0+vV(X=ZY|;!owxDTZqH`~wv` z;t?&}-yGqalw`4+l*f6_3O>QF$uXm^;U24QJud3AswtSz?F#Jj5HQ(p8TcW_Vnr?+ z)6H}txX%tn(Yp6GM-8JNbI@>N<6neSN*ObPj~J2W~9NWK8<$o0UA-K0CuqG3FBZ_=Ss_ zD50&WRO?8g_S%*!n44jkzI=E4NAM8I+ho&4Y4J3JDt#>zvC8t5n5q)Hg$PY$=@hMn zd)edY9W8eH1rEus*%ne+_n8vxJCr`dqxqy83K8>xwMA@C7;!m08@0&RhFlEVf^bY( zxk~G@l%D%+7UOd)_>dP15drt&@3(=dcu59Ks>|eIN{Ut{ChLt+T3@B)N{*sKv|Jsz zO}mMnn_bK~T4Yc?%OlXo=Ay^spP!Is`& zo63@1%>@#`A&nNpiVP(^Qji-t+`H6SSUiaYV*2#^AvmsO5N{*KGkp{bd2Mga;!8O4 zR_gsg2i;6*fUUe{8*sKl9Xq;C`DmsijQ0bjs&!Z~M9@*Q*GHC_F2`l>`_~6tLopk3 z8asnf5vBoLJhfw&BL@C=zL@)aPxl0`nzUy}>2k5LHm%}t%$5vYJA5b%GZ_mK@9{sd z>jEc$B|tJsZi1b1Ac=llRD8r;R)h6-w# zqeBYjXBIOtRr3;JXOJ$9=VH2Eej#~i2ZIqi0G<>I$ZfyxHviqDepUhhS9Xh&`ME_H z@@8m0NQ#oGpYKLuK#Z)00v+yiT+eJIE8~?t(F=?xjRtK%Sy!UslU&wC(Db|yBbZ0C z1)Bsm8kE4gLNUg~#U*mcKDY?3WRt9mT^d8v7_P(9z)X3(c=e(5j`#p_bKYhW`t_n> z;x3%mALe?TAd@4X$@KK;hEpL^D@0AQGZA8P(_C>)UPe?I@w zjJ)qb=n+KnQ8pyB*Acj} zB7L{;!eD$fj>y?4;*W>)T-PJMaLgW1WY2a?t9Lg%(ZGQVs-ziafP;=S5S#f<|H#xB3F!OMl+?J)(*65UX*mW1Vc?Pvlo8?5ze&ewhB>aawyM$k?FyHW>TY< z%zy0q?}!TZBy+GWfPZLjU1wAWLc#Yh5{x9mJFnzsF__QMOqFa<_MA|{Pp)av;cnPZ zbipmP(YH!?L(PjTNj&uM(SW??VlX!Ye=KDCI-wtNdy&%VOwQI1dLXDUKj*pI7Gg?_UIkR zs?ECX?TAcN>O(>2(+N3qzj+?HrQyv0q+inI_=%Re%}(EVCb!c!-p$9!@h_Wtoxs!f zO5#9$EWOj|!z&w6_{-D=L0+zx7EMw7XKbTQ`6z?NY$Ay@n9t40P=yM|`4A>KrNvl&8*>QWq9lQLLO zuAefgx2~ktGiOfeHofG#5=StwA&RbDwdP2t8Jeutwh4@ND5K_rI z$S1;-kI8CV+9`Phw!I==W6a~6!=bcdFAv+86>rXu9Voxi0DY&^X-pYCLbsG3zQi-m zNOdSon1eulC|DfS2NRh4IiJ3Nh7!R~pt{{D#n*YoJmq(GDEj~=$YoUB@dLL5JPp^!c#;z zy6N`TRHa9&Q(&X5w?x(0T{_xZ{A>1?qp^>v4WPuo~UgrBQcUH*V$Ap)`jM$PK5z zI2~-FVzwKgU}yt4-S74Z|G4>0$k55z5par5*3L}K_Gk1l{--BqDUaFC0Zv`)@~v^n zYY7u7D4BaKgeT%)l)x(FR_Z4g3DcvujXFRsk=M`;0bf#k19`=LhQcVZex&Np3QxR= z7Ym@9=;-Xc&)j8Y^?QAN0q^b=fyX&Bj_dh=e$N(hU#Ag5T$>Q#h(RNZj*hMx629om zYX5NZGyU_jD?*D&S6zm`T?h0jh96;&U8QZRYT`Dt$W!=%*9?wGFV!hC8D}8q zB$MW~x9)j84&Pb>u3Qy=U-SEVl5qX*`;gBc;E5~q#90+msSRv%98C5xDd5T#cYDR{9NXg``K%ZRE9+fq) z@m-io&n94Soxv~ zaSO!43H3eKmlqHy3Bt4)CurfQWQ-A-l$0EkVKYyLY-@t?_Fx;rQJBcO35JScrFEl} zdtz#j{z(CzUn{bS`1L=L%XMQ^t_IyDoO~r8S5K&18~9#_Zp0D4-cK(q84ukX6Qoj& zMe8o7hk^$C&8~znp7nh$%8#G`U^`vclex2%{(Z^LfisnyFVhFKk{H2Ps>V0EksK87ppi&QMrJQlWop z9g7PnRJZ^gvODlc!NIwgUp6C9RBnJ07SiC3vqj;>;QS=gmF9M!fzQl>qQ+*!Z49DN z&i-~^xXnvqx0qYXHNHXpZIi-CYoqX|e!~Umdk<8D-ko==h$OPwQI)PCoF=3T?4(F2 z^&-@{q4jcyLs>-6znlrJFQS>s2BuKkH$@z*Hk{- zuP~(fsxINkYNwl#B6)FC6la-iN!)DHCg5DDf-CeDR~sX9C2y8|0^Vz%*G9L*k@vfA z_qeZ1Zjm_%_y-w-^Yx`_~g+fvT3z-USE zLzGuS1my0GNUq6?`{cH@6DBC#B~A4aEU}zo<|V_Kj89)BA?OHvdsS!_g;(9%uo6H~ zE+kxMem^F9xZLqf^CjDdS-v1b3+_&`pBZr+UnULfh&JI>p;e@^$N~rTU5A=6HUrO9k4$v7ph z4GM!aaco3n`LIh5qP)Z0w|-oQfqV#tVlUz9RvFdBQU;ok+PdMoW)CsgstDJMlTZ(K9!#UQcOif@|){#!lpk3k6DV{Iudt94^^chhgb;LzUZ z;?0Nv2!KRDK%D;{)~eG#>y|ZU?zZEZka`Djg!4;Qnlaz##!jkPeHC9vv2?MCusM}5XP*ncQx%8vOA z9DC?4zR^{%8@vBQ6WsmoZ$gk_1ntsLj5kjp8aSFtM8DWcZ~ zn70tW)YP}Qr<`P`H|#;b5#E7U?Tt5y-iKh7n=XSFmZ&$>l2w6fuTB4BH@o#Z7yakX zQ?EN1o%XrW7#DKN#J*iq^(%W88uw?#u_Oztf#nrA7%bE!%oH$7 zw++FWs`e~tH+VA2M`7cgr;0SZugOw`s7UItK^%oF)LwOhV$bR2U?4t=VbtKt*iKCE zn2k;E$wOx|!_VqN62F%xd`-e@O9b}f6Jr&htmnr9Nv-EKof{d~SkmRq7>%;Y@e8EC4z7_HUqiB2B^_;JS{=23VGPB! z#WPJPWLErS+7Ik!5Qt~)bIxY=A-4%;3rz*@miPVPHwd)6@%8+!oYKDEj!sh}!2Oa( zU*&08U4em8S>pzPGE>JaI&?beAFQZSmg5@}FdgkBJXCr20yv~F2V%I2zc!$+FefvIqCNi6C{!AO=8EoAz0QgmwZ}1S%IBtGAk%MwEyyAOvbVj<{EtQb~97S9V7l^B7MS1Nj z7P8P#_;%d-niCg!W&&p)H39y-3KKcroWdGex_!LhI<+szw@RD#8lv!PbU5xk^dK_d zA`;@pKapZ!M2DF7dV!~;c-X0A>o7N&K`(2jBTwjG!o}1cIx?t zXnOEv_6=);qcr(MCHKR|(e?-8ursQ~mGY^-vZ+2P?fdc(Rhwkr4nXEErKTovjeo$b zs}v5|HzovqN;=9`N;W5{6MyX;b=uu zFN>n7z$lZyWDI{6J<+4B0NHJ6<8uI#%&Bf7&rzh7vAhjkZ}G;Avh4vKQe$Q1SL+0m z){YtTv;*%lB0mzJ%lm;PO}StTip%28ilQMLW{Yop#>Q$w&t)0gNHf))IE?jIU& z8iS+hK2n;bC|^)7P!2XZruYYu;%+)GRXoY89N9EtuJsB<;`9WxZD?>tS6O=2Nnbua zYc41y84nD(D1QY{7)f#ZC~D*8nVxAW_O)KkM5ADBWR{~o&f%)Od!So!@}1{(&X+1J zx&zK10t8{_!r)qalaQZBu65QmhdlIpT?l@(>kiGBc8+NIw?4p$zTnk^vX;1m_)8@B z-?opwwE^KGb)!GH2w+b>OVXSQ-vN1x96iAwm2Gvf3PgWCbpMn(M{>z@v>Qu0?SMfH z|DM=eD;mWtSG^?H%p6&`T~|b8DL0|0tfU!%BE?V#JBEAoL*JD}P`NOF^p#W}Rt{+9 z*X~U&rK(76D#{PjyZDAU$+vYo|}z4>YGgz=CjY#U1ZKutQiD;+plm?$VWk z!Po}PU(pLxS$+t%C{!61SqLmDypLK=_;(5hU+|ju~}CG1VnpPPQ0ncAqfc)FUQZM05U_$jp(67Oiz~ zUVIDjJevbuRRXK0qVrk4F%3J2yIK8UVf+a&q(WJg6 zv87B}Mt9^IBIC@r`;k7xnV8g>=p21g-*1uMFc42M8gPS#=3!oA+_5CqnmLAcqm->7 z#)=_SoEfFZ_4hsYO~~B_VK9ZFy|vB9CxEW`_QXmf{3IM?zuMkebGFGo<~xINwkkeB z?SqUqu7#JY=xY`4WTEuyA1BS4eD-fFM^<&yYhUIJ7NcdR6Kl|jf#7%-ZJ69!7xRc# zv{w=#Nm@u&8&NyFml&O)Qm|~;<-4~cKN+2wNgIw=JgI*>vNIfhTY{E~WX6~hCTEVB zF+<;|pTB$;LV8btxSKiLkmF3!^sRx!jh)mDUbD@XAl?g6rWLiNjT$p4-kxL$*BqM3 zwI=a0>fYJ`GU_Gr++Lb3 zjmWr-dydR_=z5avRpHI3au!P8)~K?rxP+?sQh8fWVrbe7C052%LMpZB0JZ6@g`T*2 z3--ET>FRn^Hmt0`*9W zk+x?-#H@c9i0DLYfx1g;r>5$0%j>bWNjcL<`{x+f@nfL$dk%)I1H) zgM@2lh>^{&=MYyK$itI%m;@%orgh0>>pvEKFt@NUSgwdh<4U}P=Mbz%M&{K`bO(N~ z*Uu!()*PB~>`I9u@*|ny643&|OJi3DEn+VvU`P;dPlsQM>NhzUN0h(wK#&BSBg492 zqe#B8cX!?Ra8eFCjvHsAUFQl0?>lEV&@>4p_9brLjp(;xTEQ8k^B@L6UA>kFSG6|c zyGokc1s=5_Pr`Et9h*Gdka%FZE$gs8e<@Clx^VS^(b{}8o&|AvEWf(ei^gnZXHE9x za+3D)2PJ}9%Th%Z5A`fp#~RvS3Lkqva2$&Gv~>;ll~R$BDJ zf=2h@c^J5gr3!GW6STD{IJ#4z^nqcENwV9U{<2f1#JNO#kiu>3Mao;tn_KS25 zEN_^Cn&G3(qV_Kztkqnr9`F!F*l^yfN)VJf#17cz`VcEOXp*x6Ef$scHg%fvad3gE z-LCHnm&voGyQxg0s;Gq(Jd1CKT0-`GANx#m*~;C3_sH}#Es+tjl}D}Qx+iZc^^BUz zbpUbX03oi}wGz(MZsKqXc3O78sb{?$fvW_WOS>AR!S!gS>wOJ=#bl9s#!R5`K8$)LuBc^MLnG`D5YASk>c?f142f1nZelua|bih?#(>pV>MQ5Mgps(bEar~brFX6 zq{Zlo&-+{4mTw?8;WEi#nrD<|gJ|%Fz6D~4Yp-J0CU8l9G+n=zc{i0Vwj;)9jWcF z9-~WYznD?X*(EftRCX>PMjWXl;tk|UZ+mFI=BcbgWqX|k8>2pkG$_G-)VxOa3*XP{ zjck`^lxxBFo<87v@$*tJPTh+u8vpp^r@L|aIy7hnbe=YchO8ab8#c7UGSuW$A1$w| zkG}4!AlWuYBAv@>r?a9W2R&cM53w}-h;N8P zUd28yvvP#DpF=yMhsJqhP%;9Sa34$KX!g~tZi9EgYKc1xIb~ejY_!-`Bvvf$qJ)|v zeA0C~UO+T6A1yz*5PVhWz*ptGY7WP5W_C(npCL<>aVJH*{3ybmpX2pfu4S~KV#424 zCPSj~C}Sl@FEzvBHO)H7wJgEF@MP3jh~ggb`fnk&QJ^zJiY4izmQ@@JF>_i3I8)$K zk3&p*PW^$yXx%O?^MTv$a9lR#lk~7k|BcTEd(oZDeJCC+w$rb)blN4F(RzH=Fo{WF z+q$tBeg?17azKvT6*j z0m(%%dGmg|q)ThO$-ImjYB1gGyol0E(aGYhXqKZ?grr9^%f1DL zoSniTuO+vGa{umNvyevR7GG66i?`~;72BzLK_((_jA6vct$c~*wDJ<0aWYwF>yUS&*c2Es`(3Kx%3si5M%ru3`j~7 zVX$k(?@B+Cs+OKmQ`Rn(W8j%1ewA&;-n*lH39;-we7A3F;%)8hu@4t1-3pa^S(={S z)~8Xt7ON{r{v<(JQjL;yAdea2Q2!dQYFB5zVj|M6>>-|$H`6;WmJ~&faL2S;>_;pq zNk>+##Yvy{D0CmVxU(5~iS9g;OIB^M7BTZj#30YI>=hBc(4mtpi?f?JPpMbt=~?`d z{K}K#duw|vP9IQLt9Z;XU89ol9*dAj6%G$|bn!FRSL>9{l9h~JQz)3-mWlHOvHv{y zrF9wZo;Wm|q;s5?fev_||6KYJ!E;jj5s)794ED`c%y}e*Ar{O`DVcn-kT|-P-YzRP zd=u5Ol;#P#lfcV%$i;wQ1l-EkF|($J|J7=DG|!F9g+?CYB@~3P5cT2In}9g5*=!Z@ zL%Q8MYrQptEouCZ)>C5g=?(Kx`&9;N`l*YgX#HO_(M7<;v?GswBGg*>AaKoHo0@ib z2sG4zOfYEHS?FNOpWyqE-Kx;LTgo)O6G9Fput4 z*76AA^1Ql`KbiEz&@Ru<&cCtN-*BBc)e4aR;(?JAdJ>s(1z#`@@bg(I4uA^=sQ8HB zu>rd~1k7%g1qPraRSOCySCi>jD3U7_3P<&;!%p;>gjosRB80!t^$5L;OaYzF&H&_@ zd=U1zYIXw(T*5$t&FN2P*Y6_YMi6?vjE$4MLr~5nskv(TI2b*GEk2=ODW3IZ)`$UCk&|NqFjj zR~^0A%gY(ulVI@UyqM&--hAzcl7Y!Ldx!ISa`d$ibM58I-+D1~W-lsu1+h*_8&iHN zZA3b&w9$aTgQ)GKVEiH!6eGANXT5h-4Xm7vjUY)nVJbSdQ%2Zcub8)+p50t^n6-DnEbX_r;mWk32+#fo=-sN;Xs@ukb!g^{Uz950>&izUXWNt2#mlz9* z4Y^LB%$@Z{gFE*P9GJAGc`f3guyG)oqmo#@Q$@ zB4xjjVRX7!9`Bj*ccYRWY=~NW+Kzoy7W$PQFK+f_I;tmaMK+VovSKGtkhN)Br82UrDK);pK6b0=ZnrL?px_&8 zYuV2sT%blBXNz9_coU_J^%(ECCDlSvYECwh5jG?y?79j~t*zvv5YPUo-0>=f z_w-2x3uK~;3nIjy?D>OyV_;}EimW-G+sDFIroFdvwC>xdw$SJhA$Cku+l~%Tu-EKl zP}euG-C?Ir6Ctn#xuN93i*AZCAi{?`CneY{C`Jw(tv7_dHLkU|>Bjh}s+{5EwqZ)J zUUixkSJvTq{+M+_r(NlTkhF$~N&enPtyc3|OBXjCACkiL`*A~S-pP383>!Kvwh7aK zJ!aL7hhrVQX?CC=DHq0|zkBrbjhAMY0tuSI#fwD--2B+)#54|a!CaUNjU8421-h)y zCs*iEk9|fE_8ZYbNUUz@9=sQ~r4+m_=xxq{t~Hj6+WX&ebVC<2q=_l$l}u<9d*=~E zfraoi@TEsAy3n#6O6Nk~_1^eqj+%+NO~<^RF?km#PfQq8;cntEj?|0}>G1zKk?NUP(}geaw+LMqQSOk$kT&D|ST)qa51bQt?q>os@qZ$S1_< zJX0O!WHc@4AsZd$%v0S)q%&t4ebj1j6sNRB__UcAZFQ6Ci{bD~d}0iQ=XN2B_^QV9 z1{B1Z&%{2kb*#9VuIOf6UAh!M`I&(znxa@#>bOgcR2I!TuPX?}+u`F;reBlBK3_@? zX=u{0@;+UVcKkqu$};AjKPq7p;@%$HrWtYrlNr-mH|Xxm8HRPwAsT07&qJ?Crp3mY z(H(F0nS0xbN^{#Rp!>&w2|h2gO3M;>c3TYgMyEe-FaVof|FC8WQ?*pWQp58?n|Ov! z;ScvL7+a)>Tz>xYBQg~MDja!ak?qEIYDRy?Kse&gZJ}JfPYqrxvG$yXTouDF=$v{+ zDzB$anjiDq4yV6dy=wL;wM+_=rS}8*X5;e2fy=`K9@E|3COtlQ^p4E%C{}+@^jldA zR`~sg8E<6hMV&*tm$i697wW^2d6o5BgAlYCb6q4tUMOluT`iWhmk9wW;&IY==5>hB z&nr$xwlcPv6Dx6Iaz2KCUt{U`JTwgl{hFz9&Z4CGb~)3WRAQ3-^#=V3df(!$m!TzQ z!ZD&(Fo^rIihjvoE@Tv9T`HBh2>}7$4w}`wRH8bIARHh}xYp;y9O03FY-XF!O zT|b2cwcrn3)PYJX~TBU^_Pu|D;HxSJ-%)S4mg+Hj562m6aT&Hob-i61_#kgb|&$$>yCL2PV7I;<{-vIRP~LCd%s)tuEq2WQ z{@N3d4dnr(*ev|I>er~j)?1meW;8n}TB_tUe$)(Gck7U>DKOs`XE^0K<9}qQBiw(_ zR>|Y(!>>gdwKM3-J^#l0IQG2tlcVur}A3iM2fV05P@Q7-b$w)Glm= zD(covEJW#r%cA)H{WAg266*H4(#U&n>Gw(nXT;5Br-e=iswLIM7|s;0A>0>!Vjeoy zoGP}^CCy~Tay&Wo&dfsFWi zi;XrV`BVANgBJ!oiJ@a@3eY8ERAT9@)AOafVpdGTcj$}iqdN2M#!9K=H&>~cH5twY z;_SfT+80l*e6~?o-pK6t4eQ^$>jf-r-0eUDoGdX|G;Z-WJunJ^h}~dA%gwk}TX(Ro3829pNbcbW21` zeOy(uG2AeeMv7-6-s2Th#dF8od%hX@jFd-Wul59R7)h+pY-Z`*FYaV1ISyJh0N zQ+=E>G{*5}`n~StK|u*7_YKPib%&UJt_HIuvN*<;0-k6}YBkb49DCvFJP-M5bwPfY zbPN7BnvJC{x(uaXlILbjFnjsrJ3qB zie)6>7bg-fx)o|N=qr?o1)GVCE6jdey*F39!c;B0v6NUJG;FaZn5dE(za>{1z&;H! z5?>-X`jJxf>vkcRz~2==OeC!hT#Qd|j{)3UgyGje22VPfzZyF-e>HYwh8R13zc>Ar z%KvXdUzM4DC^H$@nV&M8eEL|94W1y?&j&mib^=d^#r_BCcDB~cZq`;6Dt!)9Z0L<3 z`btjf>ooK)c%763@kdJ@r*bMjS5E#I>)UlXz#mQ>3OlE26NbuKw1S7HyfG2V<=~SB zBX%R7Dm9V3IdezdY7SpYV+73`xrgk~)eHDYVH|jfCK2dkj9K1Krjz37{d25@`%#Qr zQ*P-r!fR&2(4%MjNnXjONWvD~wl*{?SVMwgz`h;OYDP*X;`B-lB;(+S%%w}QsO>5N z_u8Q>m(yh6X1Stg5V6W__kJc824CdKJWc{6>);5W* za9iaSwJAj#twzMf#SS4oAsf^zySGL@(_w8sNr=>wO%2!fC@xM`?j=!zq*UPURnCQf z*3PMVNG*+@E^=QpM$G%Bc2vm}*0balBP%H?snN;en$hZTEU$ttBL!`r4J}!f=SA*2 z7IUJ}ozROoSS(>m;zRVG334So1a3A`rOb||vu{y1HbtnVEV2dc@k|%0kw(ju>JC~U zZoh-}l2avRhU%vGYcVWh^rq-8dXP93h*o7vrhhd^2SjkaaRGl7Q=|>aUvTIq?!L`P z-j!nOt2YNBSdD~f24 zj?;0TaDoBLUCos_M6N=kaAQ8zs9_8QzO@N50d$46Eq#tTfzR}au&y`UW&HSV-@@EY z#*TRPS-U?g(ek*54=XmSAN#3wmTm?|_zJ5~_5SHWa(>%V83QYvJlrOYp{L-{r(0fvSxzgk`JrEIz-_qrtf1C`ccJ9R-N<1gyQt zSZ;eS9j^@xjHmAs7TsxUvu=Aq1anYSmOqe{enkKayb-}$LDKft@VLh{nVZ|n^o2QS ziLc?`SC&QVa$Uw#UCGUSvs#>N$@KL&X|V|Y@2Ta8vl^ak(e(8=X^0A5hdb5q>%e~| z_+-l_NPC{&w*T?Pai$XWccK3}eX=6>>zP25ez+E&)wz>9v9HHT=W5TBJmn;M=9!)p zV?ku0!GVpl&JVm~|GTPT=j;AgNq3ea#)(rKOaT>u7UU3xcNnJ>WPccv0|kKI;1Gdm@L+J(rT_7n13HBR z5kQA-2*MWZn*LV^pkFr-0W`#hAPlkp67d^*Y#;?_JPn~3T>eW6z=j$~0Qx&a2--M* zO8~k(0~tVXWe7tU_Z-IQAyMGeFQ=TAfi$3hF@z?I_Ybr`yBPz4K)YQC5S`#`;17Gq zQ|7xsb)YvaM7@RZZ`FTxiUksY)}#Eh+S~hb0gJbd-c32+98$0mv=@vVeAe5Ec^n`{k^0>^I%{DZ&dR0qyS~ zBw_Hp=pRWxhem-Ypi>+Kn)TA4v8MRey; zPS2lyH8um1fNo(BQaN~zd3Jw(OM-ZZ0Z~9#CV+XoIm-607*c{4G2jYoU--8a; zz2JnBv(Eb4oyni7_kkc_AvFY)3U+S!3lOlZ8VCTEFhcw3;4Xqh@H7JXT(@B zc8(Qu&R8ig1q=cO@GqZ`YB|>bee$ngkbjRdBFX}^60)N7^8X5h00{mIBaoALv-o@4 z?{7o-&oCJQSqV`QC1pAp(MOr7Nogrsx_MYBTB@0;*+xZ%CFZ?jM;ghQF&ZgaK?v}p zBGn``>OK+ZnVls24m2>!liR~Rh7syf zbZV2V<3PzgMeo5Pg_(<^ zfwRRwoyC72i>KZ%9pzmLV)#QmSmhWNi3!P?Hu?EhB?P9~177DoT^_d@`H z|9z5ht#E1fU;zMf$^XkkE-fJ>BC8}q=j`sht*Pa-$%^JXTia)DYIcPwD$#j;)8eCO zRI0+3%$(4j&MQblVIYJ=!>_sW{lSC2MKLb>;=+@@QV<>(==4702KOZCeQq{C=~z1i zu2V5nu14SWPH&RUn*HYb-Gb0NZkzN%(c|;^(rJc%9h(1hKb<+a&ydi)RaCC)BDY*R1w4R5J>9;WR{!4>}aHTOh82fpi^<~f%l|n|%fl2|ZYLqPMK*dgm zCC$CVzQ}%OvTNY-CSor1xp1&ng`{DKiy{J_$kz@S$Nj@B}4sVAma ziMqu{;d196f~kBZRe#Akd3Z6xQ3JcGZ}{ueV{J{wt78KF#q8v|y3Kj19k_HLOLA-n zse;)g3@&a0i`pO>3CTI2DS%r~MljtwD9dAaD~2aK(}V8%A~C*=9sVJbO3_eo{OPVFOx)pcYM*JTX@Pa1Ewg^9vY?x{ zS3wxjB&4jETMx=F@&Z>E!{6~8|wiK^gbwW5Vkx}s5#hwJ?(-aQ#D6%-mVgY2w z*v(5k(&Y{?tCxusijRxWR=@U=YnZf9SbUJ^Km%# z(sVzAQOpjYR`+aNoip8VKXYWU9ast}s2<+#fESQW%W$ZG-CEZ;pxnclwnszGHRl&zks~I%kn62hA#rx(74OHyvZYInLlmw6>W?=JYs)sjwVrCcn z{`<$~LiUoNEAZ`N0bLlr`4I1Vm)qv&w|gm~CU*|4f7pTs+AkWo9+>S%*W`VdR+{cc z9qGB|I7uLcMNaQzFo7a+SiX&Di}WAk+6+DU=?{<6;#j*!f|!c3_)g%60A~PV$-!sl zp=CeD&aUO*PHiixXou~u9*z8%ULG+iaP|l-q}hYwQxy5#_AwX%*POrAtE&LS@rrGa zS|HzZ_Z5GeM*ylz;!83e2=cQr0C(Z+N7I7RTQODQfK|~N=jT-V%-zz|}gk@%n0^B&PgMB~gB5e{-^d!S&uPRWf zwtVFT4RL$Io!P}u z^; zC&Xl(_^&ws6#xwMv*2oLiWoSwRTp92kr^#LeY7J{wQ+g#(*9y&!q3iwVMUaB>RsS( z(rf@km%vEuyd(lzYK?fP_CjpsOGk*%3@$1fLegdNAFxh*YW&9Jv1Z3Ybj&E}0)j@? z4On(t4$g{)CL<~LbBiN#!7k;DB_)P|rz%3ceTtgZV{=jP@lDB3%=}q0R}_j=N6%Hn z7a@v**s(fvV#I#S79cOF_|pq-*PH?JFHSrz<2`grIa~gr(HCQ-dT^5#r~^ofLLw6I z;zu7vB+lnki2KF8mSR9Jr*_eS%wl}t`BtZU=mn~+7aeY2eN{tdM~CNn&-(Q71sX9E zP!&aEFeC`VJmz}#15kdr{iMD-&tLu~f^UFNzm^4vSI?whGq`W}hTiUf)!}sxj*R1& zFyrX0s`it^4&BTrK^&PaZ@v1p8JxA~gC42JI(UaTL(Y6UKwI@kAe8wK6V4qX&!tOM z7n0|wANgp>J`$rLYw&K~3v!TK8-V}$Jw~JX7Tsp_(YhFZgWFC*46Z_X(%vtLflpdA{*D3?rG6-Qg$=w6C`f*LjKEfxZiP2 zJ}hhY11jPkJcfkvbJLZx06T(PThB(ohx9|q#5*nAS%m!MiJ?Z}j}iS5KsiH6p%PfP z5$cibK`!Kx_n~hxl{r8g5xX|^)UjG2yw1a=R^7!k+PZgh>=)mQ}m5q+7BXgM9gb7xQX>mv?>CJ>4;u{S^l z^@?Me5mD0eVQ`e&U+eB54g$GK;={Q^TNpfnFp4!y!shuCdyMm0Sq`q^!I5%~x)r6O zl{JV>1wTHAp*1nic$28)TF0PqV<@oL9xcoQ=HdjPn16SN=&E{h}NCQ z3dmqOOSj0PWe6vGDTL-aGUS42N&UP1&3uuf+o#}?A~=k4|#L3J(=1S#%oKC5#l`~RD6tp zF{y}|r4_6?G-k!045^~}+BWP>6f-6xExVz8`jswU_l(O<#E1N>#J*ETwX9-6qae5G@&fO)oJ; zCw}04=srQzXrRhE;_2#~oW^_O&N*gK(K=l^`y*v_Vu4nk4hj>gf1w$?DW==Y1WXsv z%BHN>5|YUzy@}iGrY4}a2uWClZR}Q`;%PLk zY5?E^(Jy)nC{>cs_boSxW$Go=P_R;3%Wu{gdh(g>k#;oxZ|i!*$!Y1Yt~DCA{e!)Jp6;t_(Z>Tzk%o1qqgY$>eAWC9wG{ zWw0zx!9=N&f{?KsAsUQFUyq;t7J$lHU3#_K)yZZ0*52Kk8|eGb>yPc)yyJt@RuL~J@5M^jNT)7pNhbinflN)&#@=$z6G$lf!M&Mbg@RpT=waunlW;MUVS=E zGrGffa>tQ|g6=ctSc%=it!H?Q%J0|l`$-@3t}Nex{0t)7mDLiGO#^{nh?nVXsb;>f zN76-SX!FL9X(Bo?mwx0E6&W<^oXt}zC?;uhpPOh$D~J~S3oM{;^M3NZ|BQnYpFIhZ z&Wgq6iX7-jbA4jlIV84nPz`7y6)swf%)MxYo~^xMC$KLD^hhKtAWcF7`kOBCU{0wBIj^FdMQ5IF8t?lK+PXPM zI~X|uiv^B$>(X@UyB1Bv9Dt?xkOpd0{DM=)GO=Fb;cQE;FG~rmuzHQmyiSJA5xM-Z z)-HiHfs;u!T6?@H^j*Dk|GfJCw`H6<y;rA_fuP0+-+_Nw=an@+#?>G@7QS3rGguWlpfAbdp zk0MMg$MeIpx2a@LvR>&lDpZ5FrBpe2$WIIjps{^cAZp{hqFV zkOLv%6bRV-rWH%e%Fpp^054J&9-dRji)9SWY{p7iU1kXn%`Lm%bg&&~9a2_%s((hC zx=~6RmiX~pw;&boD?jYUELew5%C{(g0P9Hfs3`X(7*W$G6uE=e|0sTk+p%7 zQ?Z(r6S4}1uWX{}qVqYa4PyQREk%(8NlKZifNuf)`l}p>05bTC1vDdt2hC}d|z41Hj4-D%WpL?G5#tgJ9Upzc3BK7ru{XE zE^WnoA~+nPx+|(8G;JR#545fkSy|2;;+yNRHsdiE zXVAV3MM&otQ@z9HLev!huBZ$G{VaDcm3J+mk-4KC!xJBvv%WjyxKoQM7K(s}>@>W} zUB|_IsWGF2stXIFSvoWkYS8LM2Bz-PLqQC8JJ5OTQvU{n4x-8U0jJty(#s$0nH1o? z*69SFkQsTs?z9i2VCM`i7%fX#Id*a)+vVy7jb*A*8{6_0O6LrwEncmf@WFgo@*c(1 zY7k}8k_k&albbb~=8`Ox(|3>7YRxfON8gPFYh6oZ%E?C$L6V0<(|*YZM47No`~`R~ zke(=rmk6;W>y;^B%vt@^sBMVxwgAwOH87o|dVFy61navDtwxyc#E?7LdKpr)bhRcF zwI*xXQw>F>;0e5bUxg7!n0e_+r6#5s0;)rH3e(KXQ>~F-+NpObQLXoILXA=+e(EEg z?s5a4OuT)tmeG++yhCDwo{6rh##uvkQM^Hza8WD$mz=X@AMEWT+XN8ce5M#*dW*67)rKe12TXE`^LXA}5yd&B0VZoI z+mEDEzk4(h2X8zF^If0hAMq-H-@`<`S%gPHtDC!ph&Z>JMEQjTsaqMBhp?V2US7)E zao8vX<~xkO^9za9BSohr3f-dUH)iMwrqyfrtyg3zR#VUXgk7_TI|99-x}Rw4kfV56 zxt}cftEKh+cARcv4a+EQPM<0NJb$OTeo4%lzkqHusl&(Z=6QmdgSrwSewk;3BS>w! z!}+j4h47k$NHmr@a}7?NN6`IkW{SDvWey{D)2{{yGaxk!=ovB>L3}op2i(=}+zvyt z^AZo{l7T_uOeVdRr-i5aIp{WzK`HnF`mKQ09X)b}M4W!hsyT$z9$NxNQ%%5t49Q9_ z<4tNH+oG%+4Q& z!lRe}HOL4zr{6xU%!aC9n9Ch}r~c+vq8Ko9PV`$fQGAY0#$s$PUA7bpkqHOMAi%QJ z1wjm#6PGSKhAA72lTXx>$YS)~Pz5T;*Qzaym0Wb5Xrq+6-_9YX7U}DkXRq$DL#0(g zv$bGXGPkMWP>KwWeVx1x5wF<0sR~*;^au__yhuihNtm64SQ?IoK%8X}FnO1%vy(iK_)*Uy)TgRkZIaXqlFr?2GfY?&vo z7+X(Xk&guFH!8=|FOl<1s!*{BoIfash+V>49p-)!l7+u5A55rXkv7u?@svlE)uk@8 zzH2JTu_pbq!<2NEb#1l%-a|Q4F-I<%NSfzgo@q6TxF%gR88xfqZibeC?AdeWg0KXv0@dw{HMK{mFKcpZS6QkJaj5obXm) z1Jq|=0DyG}0080t&#QoviM5H5v)#Wf1Ijv1o5CnOR@5nnR1VhUppufPdDYh;VS*bV z3qdK~bMWMp4jHoUd5!gKEm#^4V~$FD=>{QweenA3`}tFI#wF?b+>eEv-PGj`h0Z-R>{&0Kl1)Q3k5R=#)bYTww~{lwwX)HRWlkiO>?>$pI0Ulo?%w zdU}=WNxP)!?KG=ZWp8BRnUu!%Qo}Z=Zpuj*O(TI3i{_jyb=_z}HBWJT2cnzIw1;GN z%W57@F@($Rdr-PMt=0G#Yi=;%RwXu`&@lJj29W|9&J_WKI!re8E4EhrL<%DbYsWT|THdG>&{E3W zqog|FDSW2tGvFPxwyROk*`X*|)Ln$WAkzMl+f6)_o#4?144MP>@3eJFld;qV=jkyr znX4CF&1?PGm!-KEQ%BmXOQzc{FD9sv^tkghe5_gzcgm>~{aVTg=U?HV6HZZVo5F1i zVpCfE#a0DQ)<+~E(mit~b$!~Jfw$q&W4eRF3hSM>895MF2~=D*twgHQ?@li+wrL4< zSUaQa^-u2VgIw-vgH$URQOLHz1}{O>1%WGdF`Y2Tuh#9T+fGjFH!}kSuWp5X2 zBxWhSYAjYUL?5>?1(KNPPP_`c5iO3^eR1zinMOY1P+AxS*d8!2WEY>al23{%t%m--vFW&3E7BRbu`8^*uM;_@q<{P;Jpev=muF$hnD z3O+E4&v^xZ+a99a$bZpI*CfQj>Iui^F+Ft$N$APaB_u*051D@>4}{OBVNs(v4DaGC zmnaPd={4Q@tS$B%gN%IP&f7?LyKw}yi3KGv>2UYe>CKD-7u~u6g#J0lqO4k6yQ0$M z1dje95m(1>J_&2c$oQ>KJ$i7^;D}9wvKS049)bU{k%He1@ez+ z#lkb~6ZY@U8rk1n!~Z$CRC6@2w>NS8e;}8tHcpG82);A2G+L?zY5aou0>Nm##SXvu zDIg(-Wi$hDk#K+{q%cKztr0aI#2wAK{t&+dA4~DgrMKW^U;^oVf`8a?ZYM^=U?%n( zaCa^7vBy+8NE>Jl{DNd=Do9JV*BMYl zvKRYF>kAs7R_f0h?#UxlB3Y)Zp4W$_TSD{84nB)L3G? zK=Qv?A3A#mRxMo;%`-OiBtLotFZ-?CfE_b)3hQ7l+kJ=;1x<#MHDnVq4@VsdyQtj& zJ9#L}U$oX-vxzIQA?Knfy#Z9G%sk!RGZ5RrF2I~Ur5?Lx+j^#ZCc~*dAs`~^BppqCxf_C8)ZWZeLzgIBqc0)pj-UcoBV%t)znHQFF){!=RmwUODFr z^8EI=VTYFcrv&E+QQnbPdSo_}%do5Dk}PGD>hWZ@7iaoL?`v;l8c(tfbFS_%`4c2Q z*dPQC~c!N&?PIg<=S${$o!)Es@;F|g z7TAGYVKpYBx`LKOFHy!1tOZR;xje(-4&W0TYkC-YrwBZunHXC#IQPTrL-Axtojs2V zQH%KTi(_w2)JHJJSau7ZzaQx1ToF&}f@q$@9Fop*c0}-A8Dm}eq9LIeWhJ~tI|Yky z1(7K6eK^EzFf9g5jNQWQnTl|&8Y|`=Irdx9vPq-sqFNVuumU zz?U5EMX;*`yg=N>uc(Dv854ZM%@qKU358}IXo5;H%()7NcM96$AO!o-mj9SdT%+&S zOU6Ng+2f&qAtVSuNNAJL2}7iM7ft>E|6{h{!UIzS`UG%{Kpq#Hi{h zVgHMkg;=j!N0a`oX=M-zML1MrV_^jiN~75PFwe@ErW&0&4Y}^xn7M9Uw)4*R0sb@+ z={l02U@F=DywiL5ma~mu4zae!kQMv-=#l%F)A)Xw%cl!8ch?=o+(u|X7U6(NI3>zR zxL*hm*QL(Qs&M?y15yp}olFGFji8P^tEYJnB=m+}3GS)N#%_ zIHxtvcf!Xsl!_mpYI^<>lJcUxxI97P*B9vIl4P)rB?l9z*aK)u|<06YU@Uy9zVTmM|R`n#DYzBB4qK zj_W0zz+F}mzbvk+A^NZn)TjgA!7)7aN|(uw%e0o!Z8V<&s%eI;ox|3PVk9?I<2zK~ zMHJ)unmrs*l&s-Sq#o5c{uqJF1SFy#cAdUEht%*Fm9&0fQ24*P#(Pk{?N(izmb0s5 zBc?PXxnh|5DBshhrsYc|w=}`lUZpj%sB%?VsMRMGXdEWcGah|eMoA4G$A9dpI^fn` zqTl2Q^W=LM)fB_r&f=ng4s#uPB@yA8duiVU`5~-NA01OM8wM^cKsJ9T%2SrW07Dw5 zi8yj{)Z8=VK1NPCRE_KzKg7n}q$7j66Mn+F)a;u=qU4HGZiwsJiS=IeWOf@OTX$Ym7zLO zn4Lk3szg?yEK>($4yu!Uy%`q3C;evd1FCoO;vxLBg+%1GWPpnsvR3H=(Eo*33&Y3l+ zcSQbMvGkv-X9NtLoE;5}{`zMB>FWP6&8pSC+)>m}f40|UOdBu-)gc5YjD7W1m^aQp@;vtL%>_P3kwnR`0zlDEoa{gjQM22Il70&>KUW=lNcn#>zx`HRpH(j z0?jcVSK{>s)jOVCWx+8WU-fwd%UQXT>A}1+KoDbrxu0gx%h{i7#OfJ7bnh* zwPYVTbYsCey$=dG_4uj@NyO6Ki|Z}j|HSgm+YiO^E!rQ&@-5get$HHT^BqZ5qVlcT zC&gbmFoErzyOT=kDcDz|(p9;)Lal{Fsf`{fD0czMsUXD#+9`RXQ_^?TVlfR_^vO0g z%$#4BLh{q%Hhgl$2&dTH6tt@#&p5A`(m0fX88aZZWUh zB0*hgX`&?=bb>u&=)o~L!CH08)EVVmi`wW0Ett88Zbm^F{fb0@<3qrt9qLVOLYfIaRahwN8_%Ca-{AFlSTLlX>8-L}<3Qwg_ zEb5$VHd%TIaB9{mh|v#F`4%3wLMY9vcgT(2+DFE$-iJi&UcLdp)UnT`%JvkmE2jbp z)5MBc2z69Owk}1H5u-(x0{sysvH(-$G38gS=<~+4JBS5pegqa}(jNj+utHv-Xm(V^ zVep#fWllM0-8qntJgZjbAI(KraiEvNBGbIYh;Mb#4xy#`t~#WDqt+`kRMSEP8#8{z zEbN3*t8^C|-K|q2Fz;O-=6a8+)rA%s-gWr`W`hd4Qga*6_8M_>>tAx9R&v9(MJ%h| zy=i*6#MHYLP#(oSLr&B4ha+xO(BK*IU>F5W!KnrbWLt#|z-eY7MzzPndE*A zHlcKMDupUK)BziC3X~9_$jUdwES5=CNle0^?L)r3Ai7t?Wn;E?+qcF28S(WA8&_i=fWe-w573H_zi{acavfIBmGhaT9=J zl&&erFG{JY$7DjHI8I$qjz^_8&H|3yjHO*^#gW5A<-}P@_R6=d7|ZbSIgPP=G1s=y ztRg;EC8@$o^Jz~x{ibdvaWyOKzZ&TpB;iOo-o>Ii7fVInEp{S|$xQ-k zTaEXd2}n+B?iN>I9xw?sQdC}B*B9o3f3DVKl0{0D$Rx3-N<1Q_pKZ<;=;Ng@?T8+` z|A^qv*ReCxq&DMt{>Cq_TA_N5nb3JPg)MVVERiWXjl~qIH}RGHte)RdzEA za7y9}m2|)5f^J}NTUyiVq7Jczp5R8NxEphFW!+F=Mpdaoz+`>0>ShG$T1ad>k7jc) zqQ+((f1aLmAW={jo|WD?Gh^uMRdzHibbq^?SJu}yX)WVU42TH)cF5}(LL zKJe!|QfIfh2*_&tSfP+21w+zVY#2FQ>i*$EBpz9FeoV2Da(KvGq{vH)v}AWl)53{^ zLyS|L3Gk;^_k9x2NvuaC;4SAU7!1M-W)dGb!CV2JIBt98ZhMrI0j1-=&7z^XR|^(N z6;5$1^z4fOxakv)Py`+p*pYq_?dKa!TI{8BCBe(>ZS8vm7TF~{(L%l21RP~U_BTT7 z(5*AuQFOVN0dW72jr&0){KOD@b&zs9(=_gLNOM*-lLE`R+)NCuBJnH)^C*p zqovWl7~)0=2cPt68-uyRn6n8TpX3s&h_w}XvA!$0E?aqm$9O^)lx zl8JM&a_auVar9;kZ0vY;IYVb4w|T^}c4YrKDaOtY7vy2XD@b436`4vop(anI8%(D= zD0$xzxF!kCn0-^*ifCnjU~7+1=_WuUGm4OE4TlSv>sJJzf2&AwtH9dpr@D?4?>}#5 zE6{fWcMPoRG~@p#w%`k(Sozsmq+hc5O$g`;Oi~~fr4qN|RTZ|KxI|j4o(VWZ(Lz=H1xw38AzK?f{MnKr;#NnQ?bmc4)}GM5I>31_yXv5h;W(y$YwC z2l48-ZWAW(@#ikNFIZypqfS_kPSdLnc(Xq)2o1ytZ%s=dQ$K+J$bYePcGB_xR>L!3 z0ssj7zv93DzGSb@8t`w_ARyTK6yHq!SUM&1{y)vzb zL=1WFZn^DtpXMC%P4dvkc6rSD0wAiKj4Emu8i)ZDx2=TAeJc3Rj!l{Yzv1xG54r$) z1FlZY5qGYB-iZ*l5&B~X?}=)c?o0V*MPwR(PGZ@v)GfwBX%i390wx_&Gj*!8^j?h8 zZIKPGezoDcjkRxM_0;Uk@|8eO!*~k~;_;b|ziX^j?q~W=_3HpG9cuY*MeA}j%7yS^ zewZBM!2wlQI5&8n(YG8I3?fGBu5>js`_d`wGg+s)E-C_9R z_8l1SLz%Q|_aR~BsNB(qk?N1NEqnwJXC^3H> zTt+EN?_`U(l`yBMs&6Gpy9h_w5^q?DMny)uGa*{YVd|Wm7+(yCv!t8Hx)>{ol8ro% z?EkHjH@pu{N|A_BS5-%CQMcu#!?KWa6-gPLreluRQ1>Vbpcu-oqoKy`Zwt0s!Sfi~ zA!CXjiWU|#mLWrxa<-opV$`s$!0@Af$GeUi-b9hbi>0#>9g$Dt6igkFB{mUeHnqfL zlPF4WS%&KG(x*TX5i4-L;F7mUU$-?rOrOtqkA{KWO`A@8x=e~!k5|Y9Sh03aT)<{S z#!Z*STEt`H44d{)PG@3DnZOgsq#=v>-AS2(w#_qdtO^0mJboPL%BjnTBuxzu7{4Mb zo>*QDrIO;*D%|2cOuQ{hWmB>cZ!&JK3L!VSP;6=$EJHoYx*rB zA#r#S!xVLLy5BnC8N*=yo>I1c{Wg>;u`ypZ$Bh^C0Mg1t+7ZGU66sPr{LMUqsbnRs z8s%=C37WXtMPW6BiMCGMdN>BC?~f*oJ|lYOZEK+fgKmSElo@ajWbMOaoO!i8Qg% zNkbP;7N5}0^A^6w#cGCDRfo~}cu@rBjM=nS;#5h&Nkp2q1@fr2{Affor>s!nK*Bv~ zU=03#o}mB7(neVmO+Ud!LZtKad8+$2nc$rtZ&<7EL=aZ;gnNKYtC;Xv~N`K zUtcm}SbnPxpkaGr#%nZ#e0Q_`jl{@OgT2mQ*guFaKb40r_sigS0=Ra2GPrj48}gEB zpxz2}$Exi25X72G6K4~FqBtQ&HMWw5oE-h%;UeQ_!(GxSd3}CWz~_xGTyys5M`HHp53k*Yzp{rDUb& z`mGbXQ@E39I#td4$;s~<9SieTG~qE0mscgSa_~wsE6Ww*w63pA9!)huf22fuTvAXA ztEbB^B1at5klAYIw{6JAO3C1tjC>5u8k*>u`e$76qn)l`P7VbK_Xn@TG0-5L9wm2( zMFls~u*hlP8gr=*_Z2dsoZv#i;b*dinQD-CteeuF*K-gNG*gX zt|WD($B{!)1JFM4;Gj%BprUpdiJ0X$yF3$P6Kjc6!JOc!lSR#5<+W8#cyfC`DO%{= zEx4{067}43&`9;odXz*@LPk?sxR>FW-=BL?9>{;<^;?00O}x2cmjk_6T!{A}2Ou z4TC+WRc@g_0ybo`@E^c@{!kD$4#@BSp}6iJlHd2CxE>4w^K%*7jcm|Kqt`m-ftXbF z2=oI$y?iCacz8?+D-MJ||(+ar3Ls5m6DD#wqOOi<&s0S=o50X%i zI#&W8A{i-A~m*xTy6)s{1ZeaTDM?65IPq%>44^{kLp>6#g=%%niUOR z4+k#(h%qym$c`^}2n79&Tnh zJqwz2LKs{9g_(pR#KxK+OMFYQk)_@da=PU`b2XS$a-l12Q*%D7K-;Y1lh#sd0l>WC zbbscP=243(b6l3kkG(-@3{`P%8mbWn5ugDUj5wU>aIOs$h!lBN{}-~~3%)u;K_^Z%6EmCtUIMJTX$hr2*jp?+Z-MI=kSDCWZy|J)Ow1YOP9O!`) zaMK<#`BiH23Zrq_K_kt;DGMdx5cSd264i{HVk`86H*4*2Wzw4`Jay{Ez;k2Y*&mBr z_?2gh!3$-Sq4(q>n;r$Fv^-L?8h$#{r)=T(&Bp5K zpYmB;Xq`AoSuC8G9~8qDegsmKt!F{!dE+?WV#^rP{1mk1JeL*6bykkt>JGlGNbGw)N=aw^I!8IXw!X0Eui@|u*MIVv>HocG^FLkuR|2l#rLVl4{*&!x#*{cd9mwzB zrH=$e!i)?QR)8?i9~FQQN3pMR5VsW+Pl8O2jF7B4|6JelQg4N7-kD5WMAbP=1u2et zCe*s^s@CdKZPnUwskv$6*6P~o;#S?U>vogQ;E0^H1p@Cz4z9m=awt+*5_`@ z2>@%TfLry7;TAoq`Z;;G;Lel-By@a)4KtMAPqvh-Il z{0~+ix9`pbz2Et0?bjO{-*W6CQuobljy=~yG>d6#FkSTvlm0r(t(c0oQ zIibEXnj7n!;lqF-Hv+8Xd=>da*H)S3Wf!r)51*`5eTi`l<* zJ@Xl`^j!KVX5g&fcXgWpXC6aV=!}&i0|oa`Az}FmZd2-MsW!o1qcfbSJ}gBIyVN2s z2~D4Q+>kEKnP#w1PRA+E-HKj0;#Kd_g-(0e9ru7SUqcs4lPY_K&>@nY8>cLM#9(em zFCxX=J}3==q7g(U1_WZm(#6?w~qn);;-Q4Gso8iHU`37&Av@jR50<3p{fj&V94_Jr;a_!Mw z(eGG;%-?W$wnu~!HcPWvrB(o~uh2wdIrgi&<7zJ2D zRaH5A@Ppvn)>*?rR95F4em%G-`XcKgj6>3hPvKNT%8?pi9sKk4Z``>0VOWfr8+b_b zGYbnFI{lUwgh(0$-m;2*Sb9cl9AL7CQGE^2RxageEH7z)Oas~%^V6;tF0c*hW-#73 zgGj9)Pr|{3rqCNz*Ve6S(GC@nyVdT|5g zD*Ph=*LH1MN56x58RM|&02kskX$h7yu!yrpatTyF*9XaMv=@61a9r(Kl2|j!NHpi% z|GwDQdS{c{Hr5AyvADi_#lQUkiXi8iEdChuf;V|iq|z?!S-ff?zAl#sP&q338iB|UQGyT ztg*MnYwB-}6=lBdLUxY_j^`x%lc`zYsK`2t zG9eH=OVxnsQ9*zaC_kebDu-LyyXY^m<0=QLBxVyX4mWB}T>cDnLHpo>)9j}vXx%fG zS@>W%LHQ3(NSPSUXtVwG*snWGchNoEkXCjxlpgsuLy&KBQbYP^(1%ZxG9hHFIvk%T zlqQDxSat$6;I{O)2Py$YbBvNv1jG}}Ss1Mn~^t7|WF&Sn^aYt&$I#s4LOPfZ_ zHH9{;*S5V6F&qqN6g)HLcu@Ku*k3wM1*^n7xY#U+%u&ru-@41#L7e5dsumS#F|HgP@C8Vm{>yj+g+JQl&z)!;KHs zu~Lu)Y*HOhr-1;YL4R=mFnn?2as>~_l*%_*pd>~_iZO7o1W>Y|rmA0-vqbA}P?Y4( zK-Giqjh4p6&T_8Nsah}kzS;|&kn#T}xnEA>`e}j}e+BOp>V$)5&itw7dg|uaCwu?vYExsl8{3sU>@`erugw5>-3INZ&RFV_hwr%s~ z8{N12eqZB`+x=&cz5nj9##-*j-gqdr8); zx!{!m*m*x!egdWRsklSdPv$sb6V{50B7yLRYYy>Q^;05wl7m-5wVG3~g&>*r_VSeh zMnx%SLsaKY;j8ndS@OqUezLMm^bUyxoDSu>+U8+xLai59@OrtDy zt}YR;{|Uv0L#akm0BXP^S@E3LnO!vY$JHRlD=Kf`P?3Xl>k9(LQ^YMxeuBGffh~UC zFBleh9~L|@BP3}thJ!F(UHaaZgsfzx=oVdiQCVHmL|yT`iGFhLxS6)(IPH|E5B~yH z)B~m2w;c8!`Bg~1^S&nZ?AZIj{Ox+_>&2r~jLkSy#A4>?K6}l0+rS|SO%fEE`zS-7 z_J+P_Qo9}#8cz%wPmY`ZMrzdZVXw**vISslOH_glNZM1MZpBs%D_4{Tw;%yXqwR<3 z9R=4CB)t-^>=9mhgV|314r}T|$Btg+JwfJ19~1lvlU%Y(jVB)Hq+!7ptHvGIex%oy zCA;rQ!b=k(hn)wl(kDL`E+}D?YJQtdWh}R)uphr=9l+`qKB5DbBXYonafntOw;$?X?jH&VGI@%`T@Sh6)}A8pMa?gEG>pL{TeIL_}Y z#^{hu-l7l*{}|%8dP%w7|MgAP5paYbD)=GDt&MvW`y0B9)O>@J@fyrv?6rnG|wJz++#^u%!Ij&7{T?E%wGnv13I+ zdar=Ns*78%<`dh}x%bmm+yIV;7-CTPqb~AnyJBoe2#3cw#(-=uTlU*CYT#Q*`50C^ z@n=NLX4bbGq(E;AdZ);UVwRyxlpA}>zut-@pU;}sb0br@{%>BwK7YW63=)P6dVq<; zFNtFurLvs*-b&MQhx%G9joAM(&DIN~c&0slUvPg#3o8%@#TNS6b*zB5gXJw(c-Rc>_% zrP4hi0ZTg7+$r=zUR)n&ccE>sHaA7Cj5KKh^H}*VyTEDG)&yJMFb*?&3vOGkXI!j; zUMsU>1aQ zl$Kvw$5+O5O@F5-k0*4?Ja6bzPKp^%#@# z7@P7KpGlOX*`DpUS{6$JK1TIgWOIygo4`;kox7Cu2N+%_hS6pj#dhGKoLNymkWmpV z`8W93zMFlAUKae@_kDHqBoa`Gpuhfh%ZD#L$dRR41 z|H!P?dE5iN_ll+LOxH1~%E;iaZ_iw^$zJ9%+F~A;b6uxSmvc{tauiF=YJY7Ivir;4 zsS9b0-VsD$A6Fo*X07H~TvI!~M;LJoM%NvZsNR;vtsGvV!cptbnp>A34waaA0frd?meBczLiOPC0V zwatR~eB-5?3y+CXNYK*KT*-A0cAp@`^XmF=wnycEM;AV=rDU6XS z9d>|4hHFLed}FnfTs)-`AHeCXcO}9V-_2F~uZE3$)fd5$M&uy?QJ(lBi^St9PEN)P zi+WThdTn9&Qa`<)3M<4DvrZZr8-zE+ByH&A6kbxxyd#lzVjFU$dQ?Y-x3=R@nRDU^ z>mF=8DS1~1crDu|%x&=v++5OvCDJggK(+&XY_)=Ts3270i|ULyFXmC9MZvvOXYYbF zSRu4vJ>givo()ekWb*K7bk6A{xW{{~&o}(n`d+T9jG0pxHD%tlJ6z|<^iR~s4nN6~ zxpd_O=ZA1qE-}-$lRe?iAV4LB*s0_+GfyR9_?<_=p7%&4u;Dly->p;mwaP8__o9yJ z=6%wtTPM>@nZb5-Ou_i-?7Cgyt~Mw8LnKN%?Og;@UEvij?o`1YsK~; zkSFxRDHpGHwtv$xk}?>tOi-Gi*R@l@Efw>|bAQ89kfxS^$iROr_sMIt}+l)lBanN87FQ}RN^I_noq3Lwk zY|6f9OFrgn?M=t0LF8yKhs=&N^eZQKUL}J`Oo;(_>_9UrDr9~bG^@6B1Ue; z$9>%Y*ZWdC|INq8@87;zeNAm-{+I4c|L-O?!Y-CJCjZ@PTdDD^p)-i_@f{Lv2WZR; zc?C|n6#M1Ea$F@RpL6e_1UuWI7_dCyFQAHH5TH>|;54y)Xq0*QeSEU8e#H|SB9fM& z^11MVEcM~{0VN>S^?K(nDIC-CFwMhuYj&~r`ulOBlkMekG28n)vEMRr6A7*;laUa1 zhzuLexGD;4M%?_Y5Ba;~Gw?gADE;4tI~>c4_yM>)q-9>|71FHu=~T~*{swk7ur;Q4 z2p@iIQ9L6bet>B39Wrz+q1N(k$k>~%AQ9pYi)P)nW2#qgG?o8Rj|%C1Lqt|AB^~&r z^lb*wG`T?An!E9nc4Kq@Dhql^NM`Ru~6B)jbZdOVLz zGkV4keg|)b>powF@245M!c zU$P|T)RQn3q!^hJp;Hd>i4vdfIQ1PucHV(yu!ygkdP%aRl2B%|3J@f%L#>lY5r`>4 z9XB^VJk)hu5{vp%*M?non_C)F3yn=uB~$SThGAFASFe5RqOAhRlmjD=``{bceF1OV zNt>%Cy1`6hhu1Ju+7ke2Os*=rUt>!#HrzE@t8OG6rI2AIHzIwNY(dE~si*bBXM2$8 z{VB0GCY&@j3Z{Zicq^Q*Pd(8}wZt)n4qv;0!^F&qGZ)A6BusXJ3KPR4IA8W(uc#?V zWBGGAwZgU_$cV7)*F@M1(K&^LgN0*gdYQAj@V2CdRxF*6>Tb89CTO>FvH|^JEG1Ts zYI11!f}TUG?aV}?`zBzqntU`~ty`OWL61%~f?&r1k!#D$((Z0|5m&!Y23J2RRpY9R zsM^wtqhdGA7(pRt=SidQXnRNieGx>XiSrJ+3L9(SWp zXQrcao1la4@5ZdVkX|*A>A`X-iomC%dK=l4#T zsIzqZxIWQ8sMns~cMmWsmsl}Gfm>naF@EY9Nw^QYIYD2RKg7c;svjQ}+a2y(Ujo3( zY}2TG_hWn90f*+Ge_wm>n+QnY2}fpMtyM*H2+P>RVJ87~|JjyKT*On%Ja>8Y)L*Q= z{bMqNMtS;ueG%(+jePzvqJ!HL>f4qS1+Ou=^w~%@SU6pmt(phS4Ar_Q;?T) z%($a_n*9vM`~~x7^1Y}4ol{yKx3Dy4%1vuB>ZWe9X^caL_MZIDQhU)twZl0+h_dUi z*RxsmPIUhiPAz}kVorf~eP^fvA5ZntVo>>E4kNb{-}3imh+rjuvM1m6aOEcwpFVx| zwKJ}Sd+GRCrniw8>{&e>&f!lK-^h3q_vR-1zyLm7X6`@H#U zT-!)|evDwmB`{W8wf3iKqM)1&uEX2aXY*v1zr8yl z0e*G5i_xl|>*OQUDpTw|9sa-m#6`5r%V0K2vHR%w9YW+gDFR|N0y~e!&ge zdi>h2Jtl1<$aZ>J*^sHv?@Vs`b8&XmV|KA3Yi`Tvd^4!~4tbw)sPvpr{z)&4`4AK6 z2=k-#uT6wyU4m=$)JDc&lGDnkR?q_~er3s9N;&_4R&J-O(BqNo!K6!^ffy&;;T?R| zG!xIqNG%5A*{w~bi|z0cBX4`y%sqFMhPWb&^2yirN@2`ocA{_o z7d^fNYaeFHmmY}^@7p)||KI1Uim8(&(8kj9|2Seb|GPMe)&Ayyf;=ATJ9EG{AgdI1 z0VcT+%l8-yG-gqC4668K69-mw^9{+GN}0yWNW z^RCi$YaN~D&n_)i+3z8_262xU0+$=kAGe#%lLA}{o$p(qZykC1{n}@$4xM5AXY}2; zXLY;Ye6FJ(h^}iT%6AkP7)!>3a;|G<-O05Yf_6%dbapBZ?S4Rv{-xqPNH-H}-bBUV^%LT8g|ukgTJ49llaZ}GN=kihI$IXC;eNG_*-PFah3=UUiv zvu;Hy*Hw8KYe?rvs8dj~!!AKLNykp2lrU3y8H*Di>EXd5pP-WENbn3a(WAg&7sF|; zHJ(CMFl-a*8A|IA7r6C(Z@ZUFuI7^rt!FrUgj#$h1zT2ts}%o3OzU8#!##6&kNEQT z-j;0Uw;j{WwSza+988Ag`M#}apTmTCjRQ8Kan#wRIb|^nsG2S1z-|$ZMo|<}<To3DThaqOIP=RHBbhFl1((8An&qe-gi2zVr%|mgmH*3u+0?1 z%bo$T!!YV1YN;8__);gr`T6$;++JWW?hESF6`Vdr7TEd`GTQ=ugfmpNF~Iax z?)T5~iSMH)XCgKiswi5D&zOXaIj8uC)f1I|a?MBKw#_fvr{r}WLbyw-9pbm2YAUeb!Rp}|w|Q7Xc3 z8a0{pj&K}K%%?#GQjX0@+@}IDaw3&$U z_cE>RoaRvZrcvWzJF1Q>S)&db{rEKItbn_I-m(Qf&$T2gy|R-DpUV!Bu435pt@(RVX_upY?E zh7#)0Go-qu<5+~vI~UFG(vx*&3Q|L6+=A<=+MQBkf4JgOJw-^3eJ#tA6I<2)Liss z3%`K3NBdnWn$9Z7P-yPGt;ZWgrS)&2YS5;lNBf({8}Qz|Ni*=~+%UFZJ8=^6EE6ug zqFwQf2WA^bY@^7(2LJE9zVm>%;Qo)^zr32Y-_n<6&~|Habco@boE`O*7op}T2Gz%x zpo$NDG&7&&b?`@mfU;7q=XHEVt5TKSXoAUkfMP?;q;yVNG|xCrlT&Y-LX2{HtGETb zJdW^;^U!=^q{emjZ3n9v(ckMZaJPy-{7AE4-%thTUh7!(bNSu%}BavTG?Ey(d$F3@pG;x^M(m=8vVb7=m*YDI3+*qtQ~)>MSX1Ps&_vV7 zjUaG6FE*40vLXAxENTZ*yUM14Gr} z#M4f4U4<*u2<14|Izkz==@B)1=+ri@HDAKcALP-V!@(cs;W)=mo7Df{nT$60HUO^C zLjq`n(?wubm)1|!wUl%WsY&9F^1Iwu_1@%( z>F$(=4K2}usLP#Mj*>O^oTp*rn@CH4LCRE8H(!ERQhzDVgF^Bx=_wyryL{cU>oN2N=&lkuBk!?bqKf zK;_(j7hALJjRQ2Qpv6$d`w{rb%dS(np`yd<9VCBkOV#2igxc{le7}mo-g$-Nr>p9} zHA2=$Y2FfZ#L`E5+%jboe{_mgXMM*G>7o3^=4!mQyq*#oUYogu6IcpkMu*d5g9r>> z%e2w!)ojX%Y5VaPd1lwi5kfFPCU&y?xwQo$nQee8EV9LqAuzcp@y>ycj9+?ALs|W& z{Y9UeP3fH_)9-)yNS;oN9_<-k?9RzB`WIF57t@Wy0@{6hZ8j?FLK(dr+#GzJUD8DQ zqf60Z$M2c}(JKF#b&Ox9CzSkka|0@^~lqHI?yo3_S(}fwQpiaLT*xf zPl0FNBYme*JLAR)zj3oknr!wu)+uA%P@C^ok4fYh(4ND%)zO~I=!-;YViQc6_hofl z)6@f&N5rv{S@8QL<&KE_>Mx;G>2X8;{4bx588R>CKXw9w6=Sp{M0HPKNM0kA`?P zMA6S8%#t;;dJIf)r3x*x?};YUCU@brQVp1~ByATv{|mr~Cfw5)@yqvLh4F>j`~T7d zNZH!D`~n);nEoe^!v8Lh(y&!jJ;dvp_lVDy)8Zt%CHlBT`V!M>UxOT8If*Stzj$&q&KI4G^cR}l2%z7S0*}A5ohO_pyf)l^JWn>_ee-+D#3ICJ`uS~g3}oc3R$wmX zDPK?>dgsEGm8`|&?jXFOFp`WV<|$Q>yzbr~4#mxwW*>5pe)Cc$S>5V560Ur@+PwDE zl)UREdaK9PbvR(jMC-Wbe>wUD@%$74T|N3#VX<+Q2X4;qKI>1^c1`B{?g+NgtFY$Y z8<`D<)Q_0=XVt%+@NLZBIq%Cp;ntxUq{OvxzjdfzF~HREM8OzxlULC~?aUZveA#+U z7w9*B&gbfK&wjbKyjG~Vxt=761StZ_y~-g(Ab=A?zc&2C3YbNviWBK^Al)Fsk)#k2 z4|qu`wMT?|uFc{$r%h-e*qSk92N1!y;torC|262W&9Wf1nJ84VK7l!R=%QL+%b0s5 zlK?bmDhzGKZ6xGIQ`0xZD2tQhdegJBE)n83<@EZ;S{Nu(sU9cLj1QX}S?HMbZIQcG z1YZ=xWN%`JN<>fwihpM0moMjU*+|`?+6n29SGg4!b$U8!lyF%MjCSXF2@i*KtV$R6 z2adW5i#=^hH?m*@4J+%fOyW0)q{Si^H0e!Y9&9^wW-%5v#cn#Z8r%*?a?Im?T^^7D ze`_W=HF^Ey;vF-*yk6YXE?GuD`!%_Hio~}Gm9WZcy1l(h7+ziYu^Q{-|EP7hbQ%Ub z?M(-mrIzV4h-V{a*@z1*RWcjT{ApVTqywPq&~3Db9AsK}6FZ~^c?aMgcx`7mRIrLim2Hg`V$CFI1lItr!(BAg7LH5vY) zRPbM0SQu~$law>&wzAj6-Rin^rBoiS>7pQAEqjS-2L@_R)nG`l|Js#8jLy*#iI&6@ z^OP>YWT&%9;XxelBok)^aMsaVy5lO){sd8iZ6K%FV$dKIbv!jS6$06sEU>#%f@Gc= zzZ1N#S@3u!2T5F~^yV8V`lE0*S-KOAb(1-d{Wfc+qfgUU##4EJk6Rz)L+g@NczoW4 z1r-y`>d=6lLUJNpKWw)EbVJ_I6U z2Q}>3(G6%Vv6~WL8-x%9HbSz$-c@K|$`y-%pj%D`I1m@F@kl3Q9lxMd-|=V(M%m5c zHw0^?rH@L44b^RsfSQIsW*ij5axE927UI@j;c%hvTCxDAa&f7!Ty}5|_8bL$s_2}| z;PE+*Nxz!}Ct~xq^1nZ&Oz_gvE+n`SAm^ z&X$_uy)&}b?#=3Tzr)b~kRd8PR$Gzd&R_>pjNX#|1v>-V{p!m{uFR z256k4b8a(D<)5v%R*F&)wkrtV`ZrgrqU89y6X&DOx*+|w+!91!@N-2%-2SCM8V~1~ zW4=Js(k`W!2@{uutCh12$Gun|uwIOC<=g#t-J#-#$;Ms9M&I%wl@{<|N%>e^(*5wg zD#W#bLj*Vo^s53Edq5T1B?e&b`<$AEM~2c+=`F^}sa;24(8{Ui6h~AZ9knaF+Wb0q zIP^)G`T`%szWfA}W6p+}7f%2Fgp&p?{9~3w$@HfWC!9j%4jlM82&paOXE}_jbdH#Y z;(_Kay$d6iDn)XV-r!Eve&IyoF15n0jF$p;=#?8@?irf#hzMV{LVm>Lyn_+qfiXj> zZm?Cwp#emyXNoL45W4k@k`L&_EqM;p>J@d#6koa+;)F}U4bnQi;@$u;uI)X+wp~$G zoe;msADG6tHaSPemvc%;aKZ-)%Nlbp92B-L{Gf&7D-ltbPsIGmZ&6|haH6pOHQ%ONR$yT4qW7qIj0RvLr9`bj~ozRojoU|G_mGs{y>sYnIK-Ho3j@Jzn0CYicS z^+_QR{g>UlPbi}UqVgc78@0JTAb8`f@q0?q$4`|%8Aeu8LA)D;wh#nOzS1m;W;ie* zzO1M-CF$Ka$4l90uho4YtAMi+gokglMzxQe5OL35a)*=on%|A8Qo8GuTx(s`+z6}M z=mq`BnTSn%#0ZfmBG%EIA3x#=_6$mT|2Yx~a_QY_9k9`CSU-UEd*F=;#w7Q@5YO7i z-XJf0{R)!!gj-D}5nQ_TF+mL%Odq8L-dT4Ga9>Z2oG&fkA-j5}kWZ`in2kradKQ@1 z-bqz=<<^2pAhDNj(=zu$RH;;y^)^N1^A$C6*c^XCIXJxvu6p^i=HMe`BMP1x4QbgL zLS1MTqX-L94Y0Ka1*|<20|<3#!zTw9#0o%I27~~_#>ToPf`CvTIGYq#7Zp}Duime} zFi$SJ{hH;YklUX>3mG+7w0vK1EEwSC;S$P-%jWzw%LsdE8^eUEgy=S#%U@)3$`!4k zPmD)vz!~-}SNh}Gqg(Aq0@gBNTUU{^NP4O)pxTBRU(xs!lXv|H)&tLsG}4bYG2PWp z6O5RK0escHoI8x|&QSP4_au!?zZEWc6awnv%wX%LL7#Pr;Zf!MBq!t z$kSV^?REk{4)+vqzu*}=5QFvR{dpja^pP#kWm#JzX~EWdU2DZiXEaFpM=3*nqe%f! zS;xW}o(h$ga<|OfMDcZ4BSdU9+)E8xXns)lWU1n%Rt>SH=6kJyn1dogHwi~TvMQju zYzcrQzl`sGMT*3d+`+ob9JPf1B>MrxIC!<_Ffjw(6trYd<`+o}en9_cHF|c7nqD~A zw{I_B+@=3HbLoE&o-@h)KbKnxqsqO^UxYdo8gTHu9QS`ZoUX^hU+(VI*d9mUx^6Y< zT!74I0^m0%mf&CHee9XPA?Lyl)6a3A+VR{9G%a
;1V|}2=C*J`zZSY{QBD?AQQMi?7f};=i+~Ltz+zbrr}PK%rewd9O(MX>pTmB^dit1{$!~O7 zx%T6!>a%Nul2*)t({z`lCC%xu1XUOY1#*dP@B{vs_%#Da_?L~G8a49iSzqQCfv3Biq1a^jnq0?LRb!qU2~qR-KQOKT zgA#gY;_WMf@a@|o?zeAB|4T)-{8yHh^H*+`sfmh^=6|ZNC4qJ(HvgAdJ8Np{SVs*4 z0xP7cW%D6xqm$me7Nm7xa+jt!b+G9MrEn8j;^Grc43p1 z^|_HwrJ7E~y!tewwsmFG%;(x8Yii#WY7dja1>fVE*H@XH@tNU#$$vA^`3P2`!uDG; zNRQBaH5hG8KMK=ZBJEPTe$}7P`^qr+*TvlyBayf3p`GQ!P#mLW+j|SNS7EEh_lMz* z%h0V$8Ru--R)e&6!nf|=Y4@MJKkl|9W;~|+gS~a{YmgJ4YR?|giJ}I{X5LiYqdl+K zQd>sDvqvAXdfy7MqK6+f1Z8`xO+lNIw=Gx-Ft5!s9?E?m@@d5Zj}2!p5$ybzm%mE} z8Gn5Ig_z+#?I$t?9TwbDS!N}>Fu7lw13&x2u>zmt*r832NAr&8X5Q4=pbI?I(+*9` z|9M=y{rK?JDD)T)|1qw}fYugvI~V3~f(~V5!?!Pz%)B?YO_iO{Pz;&PfB% z;wlf@OvoOnr(AcaNgE{6JfWRdwj|cXwN?n%c;vSZSBxGSUAOV1Mzl8aB#n>H#LwWA zGc@(@klP!*Q=O zgSx~s)Hv?3$21pkn`P4!`vKyZ9+foark)ikjZU}9l^#M8&e6jX8i*FoED6P1$#6UL zDw;CiIP5GNXX@DGcAMj-^KuuE*o>Q;G>|;X7C6~CLM!4HkT|XJN=lN%%pGvNlt#8= z42&J@x+=%f3eO<=#!bBRWEjz9npVmD^cbxhQ03RuI<0pqdK^Ua!#MLuSAk+KPkxxY|!~VlYh*nF!R=t zO+#^b6>peKn+;Rq#kPIl!uHqM$ydNl1E!shT$*D0zpWnUXytanoXmJKXAwbj(?;`k zOSb&L_P7-i({vk^=doUX-z6Y93eJ0-j@Z9~l7%Cl&|kE}wkD;$1z_~HfOVr=?zP6 zHii0Ktko1*Y*_(_+l8aS3lERXTYDty8ka_cJv9PB|6^X_L%c&)Uk*vgIzW zvT>(-WJM##q$7U=Id{DNT2YF8vee*OBUB`s5gcU#-^-JHZyf|X*;B%RIT%V1r`JFT zsRkT(czdra1Bg!$-*=>Gdgj_5Md<;j8Jn*_GS$*t-7pUKx$fanMZ0~L1dXCG!KNiv zRUW$w9_`We6;Dib_`4cARq#`&37-z@l0#1vbn=Cmm0sDerHtcnD)v4NXMs8hjEpDj+{Xd64EOcRnHp zn$9{ox?nUDwpBzK`<$i=f6t%2rRx%O1P*z5boE^v&Wy}4Tr0mcixMfTj$C;Yf1Rme z>TOL?zB$Esv5sacA4CqZB6TS?H8s34@tSy(d@IvJbB`N86D#ML{30ByHXC&+2^Cb4 zOmcx{-etw&5*#@AjltEwy%{|+d=&^9iBv*0 znc%v7F}T4$GJ;o@A0huJk(%kt7SAA}nHk+XAu%|@9qb7W7wFrxC7-j0CN9v}nk0&_DWwdvAo0 zWDEsRuhZ~TgOSXnB#2S2{CAqcR9>G2$}9gzU-L35J$9)$vW589md}gGKOEp-=E9|V zFPKpA;F|vnSy$|r7V0_Wxz;-3C1FDRUF_YZuVe5=j{iA!%d&jlk~RW}J)-}YD)9T~ z395erQzrrE4!94-jwE;4+%=uC>AYLMk(*G?s@7C{OGOR07WbfOhFvFG7XO#nsBVRHH{e;o*4?>BTkGP zBOJ8{t#X3eOGY9ym){Z2@^=_~tRo=(ocf@u>bO2w!CB*$**eUml|W0_^q4cYUk7#2 zMyn|hq0IId5b`%?oyHEz&?Kgkm2J-?N9T7o{8EpP@OG-}KeOMI+fjd!KPIOgw87JG zI761E*Y?MH;&}K4gf@jrwC3G2lK9_EIKHy*Dr3@?<9K;v3DbFT!8@SVMB>>>z$8zh zW-s7PG>KtEu%YTW#;O~U3ig&zPtQq6B|4p3-cNr)wvaGU+0B{LO(tLJKiHzu?5jRaALx(gEu)9)a95X3}QU@C(mp!srdr@~o{ zB|{|f+&1S+4o{r42sXeBh6rdbMN8O4cO(9R?Mt@_9?OL!1dj;s>!mD(E(;*I4jM$a z{Z47{Bob#kkw=id=mnta_1hbk&6XY{r@7`Ie9Yv8JC%!=dMN_i8=DqqtYNsfq_t12 z8)nr?2IjdD7g;B&$hQ9VT;rwwu-jRa2ftF+_Q3k>#K+iA(1P!_jr+@(>Y~T?t7y3D znA`&64~D)*Bb*^zje---1!U)Ojb5jMyYOsVs_?PI*9YW5!(|CbR@={hJvaa3Ids3; zV2%vnf5jFIpPa6rUwc)KYAb!ugj~lR`4QhHP3#%|b`fV?haQLJ?27XbSSxLdRV1cM zvIx3@ERxWDRcviD)3zO&k8E3icX;NWzJUb2Nkw$4yd<#M@<5$~w9N}kW$@2IPk9R) z65)SB6OL|8SA>jf_ApQQ0yJe;2zg7}nt~YlTj7f>?qKOp*9-5na$Y@Ur?-B!=kfZ{ zLb>nU;NYsK5mY@6;crjq(rmfZkm?O@uXA(ktOt9d5rrfqFTDD7#aJ`RtK1E!k!Vac zV-+V8qa62E5R~M)kMrh3YU}5kqZ0uh&g3gD^xVy`CRTiv01j+T9MAHdqDmP%E!izbs45j@0LV56K*eiz<<-Ax09C5Sg$=|)W% zqb#;xRs7vAm2fTADK97ioulBa1ocE(ycM2oPTN~gVqCLPRU!^=cg{%s6DjLYzSHs3 zb=_6RxQzp%^Nem%gSA+)AkH1H?j`xN=L6&}1;^uK z%mIS-%7l=lHDLjJaz}M$h9d(5&Fv!14x9xd;zpXafG172 ziO#q*>0v@foWh{v^R>izj>dJ(mFgmNOuZE5RipqEk)KFFm`IqfAWNVPWAe!kA` z^~Zm1PycqBSYUo#3#flZ@JReGbu9m{eM+H*?SH^JeW;e#m!qZrQo!5fQa~lfOjRY~ zQcP(|`Y9U21=!ado4Cc%pGolYr3YA9mzI2qg4C?xRnLMs=bI!kIH3U4jSI@CrIkc# zQZOq^D$(cdYgx-A3d zjsIHkTo+aixee0C@m5QF72UQbU1ys4>J&{88qs&)|E@1}(Lg|T2T(UqJpwN>TY8cTR7 zcn!8iS_7!9G3FXf*?43oHPi1^H%iR@cEI@^6Ox%0L`Ed4pd7CiA|KawB+B-yrxkS- zv!&K2(OngL1(_hL6%~4Ymm@Pz5fOjPA>;xCjB-{=Yp(~Ly$tP!N=;9JuXO=}ac$BzuS&{@NY*RsXQ_dC5vR?Mar zMcIq7#y4nVsB+P7RCLcK$)T(@OqdKDjTCz!I_Gbs*KIq=Sk>E6n(AiUX+lU5R-Lml zyH>C9f*s%r#7pA%nRxyKHp=n8-30Y(IC$Ihe{tMBxy?1tm)-U2=C#5GGlHZbNLduu zbD(x1+DZo*KzlUvK?Jtei($fQ-haoVINOL>WW#&dSYe~k26FlfV>0j6p1TA^_<2I* zk5fN1n@uU%-Y4Ktzw?RjtO>U?5EVos1*^zZiCXsY;j5_4J2TFt`AZQdEAB;*Ww@()zs;HY*6`eX#QfJRF zV9kuRSUPBKm)lGGw&Jhog2!%}`JSuP*Pk7jy+e0TMx$aPwHQ9mpL;r@z?DTOb>i zzDLX`_Pjk#Q#l5?uz~zroz%CJ4bjcwpCiRK++X6Q-SliD^pe5 zkn&bfI6hT|3ww`RAexK?2XR&H>IffP{T@Bsi5)e^XLyV+Wl!PLAHAYKfm}oWVMlHe z=4O@}3uTKcrDrvOw=B??p$+(pjeqU8!^CzW9NT~8tN@K4TP0%W}c!%jx@ zf0zaY?jmWoxLw2`9|VghL`I7z2F5aX8PFx?P-hSof^pLr&GK{MwM_5nkR2b3L{BXg#a})P^*Yl<6Y8mk0WPFEt zk|oO|$kY0l$gmz9(-8o-=OMPW7I~@Ur$+G zUeNH3X<%5vPgRzXgSAPTj2MtA!`S@;^ z%V8~XPloM97~IEQ*`BpwLjWk+`nhv$jP4HB2ht!=!3bv`)2CY<$kVF~P7_=Rw<1uU z)j7~>{z&h2#&H2;F@3d+vhxo{o0{VOUU*Gj*7Q86_!}XMby;S)*%sl1<;kFqp|bYe zYl+ctHQ+x8IxS$<;SZL`&0B0SryHS@n7{j%M$?+Fslg?5MFhQ^#Fovf+gnGWJmDKn zE2Gi{pdgn$3RR*=RAI{qXrnbpJK0*@*6cE^AJr?q43qm4v_jKM>^;g;S$Y!mr?&9* z_?3B3u?w@&_!batt&~lKIc`L+fk@or@fHsu*d$wNY$dkW;+=B0Rg8u!Nzy}|FeFjb zXb~kqJ{uR=RwOJVGS1~e&5-di??eXMT-EVT=bFU0U`)TIp!0xE|I@ftp11S9L;R2t zn8P<+p0j{j$Z0Z^;_RLXOnX>niAJaZ9d9K<(}Pk7i-Rx&^^*rO?EA)&{1A1C-%z4i zqCaDSisJR!b0u75m|r-U%0gHqvS1XxP@Yx!yd>SQplVvfs+6ojL2nmF2ShJk0?^y+ zJSy@zr+DWe3U>4YtrKF6`wsskZ-n?-Xkkmb?!VyUuH?}5LF)BE^v!5N{s4Buq60E_ zxM(2Y^_moEWtyNMkW>7E^Dc%SPuG&_PgKG{WXpOIHUk%YaIUj_ZK1xjS`(m{T+4l6 zyf=TWpog9vO@T<`x9RiMP`ysUCT`Rolf@OenT@qJYtYL`_;p5P^TxE3Bc$zR7z2eZ zKAbDijb&7#w9@h1X4fSWN>`^FoUc0W%FMu}9`~A{mz3{ZP@(tWAOiEx921VFh52$; zm9@HP61t)+0K_0XI8EwSRC_YT8)W;eS{ zw<6Rx-S>z@aL;VKz|X&>T>g_)+xi#47)N9ui*COwdGZ_?xC4)$ko^a+~b zZ8qvcaBfPT;1Ronptp?O7jhL%`Q_F+y3=sP`mk!zC3KYLq5omh>|+Fm&oLfmrp5^vo7gwQ}x#H{JQoj0yGAWAUS7yi=A_}QAMlnVf#UL$6r1vef)ax z#{>g8FvcU7Ls5mdQaaXKVV0?4u99IHo({|5BGmZnc|99}`}Qj$lgUndI3-OT{Z?C6 zPgSJ|wcV@~ekIOwJ%mCQq-1H{KcF5x!RKiuN^CJ{p26chjB<1oZcxmcq#S8-c6a8& zupJ?pB|a;VbR9kcA3&9auDvoX2U2%X$&q3s*IbjObRnbp%9v`Tw+@r`8(8mwQp99m zRgc#u>4`9A`38$C5ZL__qYE-IJ&%D8hof*a@3GcO=yzv(A-;g>A7w)gHEpP7>Lw0r zC50H%I&Dk?ob>Afnt4SHx9Vla6!ayX@OZz&wRwgDx%9s(^Y)mDL1se~uM*EOm7yH< z;Lz6hDp&loPP#HW+QKdkJiaK+uW4Chn&dy!K(?-pWn+#WAg4{;yCOe$NTm6*qAe(2 z3++TKzO;R_{ZK2%dM7^4Oo3lQpjH)d5Jw8Ndn{v}#<9;h`%;t@%QA+omW&Dha+J-W zth14PbEhoqWC{*lF2UkDlKPa-_x+K)rJxOJGiH>29)uc)1&uy*yY%gG+lK?sU+sfK z1Jwj7RLPuS$zc;@v@PP_6n%sN1 ztA@h@o0gzr&i4J4B;u*8^bs=;m)1`GdUgrxyZ{%b=lI_=6)?{=o;v z=CBzU?i1?d$sn7} zQe5E2pap9bG38B!uscjUH`2|I?o@2^prIoc24$+m&i73c2fTHoEr^CD4%y#<1EaQx zZaLnwpA6s-bTA7fSe4;F2)nCtw)pdP_o4%2mLlkMPt~}bkOg#FY6Nuab#<#JiK8Ek zh>U|y8)E zeQ(6xKi01udwuI0YtAvpoMS8ck;b*N=`ZE&*zOrpB}3&KC+_vo>|NclHze|>+s z{{#Fs^>F$BOc-CdLv|aikUN>&Pf53<MJMutH|t`$wt)0oIh z-8|rpr>_ax2zrbjJDB6Z}2svd_4@XUYlBezi2%L~TQOoqAm_aHPX$|9_czwz0#C}#0 ziu1&MyP`{jfPTBP0R6YWaa@yZ&hU5h^*KBc5a<8ZQ~aODr!MV`ql*5im9W&X>GmEr z5S1MVkLf^47D&n)C@WNlVpE3_CK;Fxx{y+H8Kb>bvLuyt1AlE^4+mo)tfXSvN8<*D zfygevqd zA>@*3wV^;k5Vm93*|>(W0m9}y3Ha#8@vQZFNvm|<)l~&&rO>vIhG5am81&dm)6l1o zole^`)&aV@R%lj~As)Mq@^sKp7>8*CfX7d~I!$~a0a+AdVoobN_|Vn&xk4Gr{q3NL z@VNO$iRo(MDagTyD1dz;6}5~jeg-Geum5O-B*%I^(FZpNy)=cN+Ec8-5Bs*e5sT>{ zJ!Yyu*c=+xPd9p(?N6Ky-aYkbhg`Z7#=3QVi6)BkS!I>3^z*SPaAoNnpP=M|&u{K% zOD$gHUXUN zVJ{Z7yzQ4TWd|0cTq=+zy5tEpERg~B%@RYJd2FRs;?fOE&1s)sb$amzPH3-Ed3tE_ z7ONp!&~BesiM0m0%@$XbGBTssO}GtYOk2(_krZPn9RP~kB;08W5A2y6%<4cVNz;V4 zM(CEB!RNeDo@FRW;Q?n4y}n^)suh3ohhDYPS$nb}Z<9X#UOTwAn*so60(Q*^9JJC8 zq^-&G2Aos)kOCYxwHeG7JDwbV`iHDUHVT<|(;_Eba5`xj?B%c#VwIv>WW8kvhE=cD z>ffK(@OyQ%Lp0DCm5*fx)jcNMr$~LDrs<`T*qVxcmFyYi9Q0gPyfDL)QFZAi72cjR zt6etbWnnqg_t>)Ku05$+k^ug^?Y^ClYnqYRfBD zhJz*$-~S(fhphc2l6AG6xnL=Cz~xo8F1+>=@h5hTASj+vgYOM?0`qZm zcrK_739h>X`}iYctu^w!0&;mIBv}FmlHZPd+njr>!{)Ff&)Mnx;8JE=0mhaCi`|d+ z&TQDy7xz|XgHeP9l;AblbHrLJ;_^unB|z-kL?>c#c(ATID@|X;k1Eh}xZWplgXnOu z#pr30jH(}8KyX25anWR>V!8TAcP&77X1NRsxeD~c+2U2$S9*gEv!M$SfFD`JJd|{# zqp^o%k!+bSkb8$@i=m8FMcab%XU>B&Liz$AYgX0K&K6SBhEup1&kT8{E)%?3KMQ3y zG+B%33+Wu8tc5)o9&?29X4@N#z3Id)2Mo^tDDHPf(*{7idcGoNFvZXimW4w#u(p#e z*x0he95$?>#SKXwI;_vwLj2TCoV;|qFr;6b$8)Amwnul*i}mD~t;}^Nx`IgK;Nkaw zb1+wcOZA&?q+trBNm}G;0yTXVh7_Mxc5q7R2>uChEYi7jH38z4@4~?RAY=B2Q$Kiw z9&=4ja{-e%-0DRp$9cgS)cuhN5}>zEit_UU;!hd;=3!8e+CJ-=|fG$Mwgq7Ob&9+=)W-eJEQNT1j)+HeP^NVfd)1i<ET19eSGK+{p|GA5XtFO) ziRMwnOTn=5kKIiAytk9Q6I^N1nS6SufQ0SQ>NQS?54gn;22uv&g*sZJh@K%)%~Xbb zN2&*~^+;!~a*ypX&yx)Wk`p8-eaiUX;S~5UIF&bW;a}N@pMshnDCf5fE#v-;vY(;d zmpvEII}JlV;%h!Ld>{EjP9sv#oB$;KALr?Re036CPa-)bE|8{8(OM~d_SGNBeOjin zp>qGIntRO%Uq6>z?91Lr;&LYEkc$M8W*)SfD@${qO*`R@yRo>U+%kH9uzmr0qUoZ20 zj2*Z6qfH;;Y704Gd_sA6eV=1sHiIzE=-Df8AFw#H*|4Wj@5+*|ngCXvSy-JZsWEn8 zNQmWt-06a*u$NKs`OgP5G(Nez#zh8>;bxYAP_%VGUp1>mSj}H?38h1L& zoUarqS-xxfvOYI9NCcc4tM&Nl=G7~W(PK_`v60N`wOC?+NRn>xrK5q*r!70n^|6mf zR!doRRvw;4^giv&4c{%#tYM8zDe3a3PH_&228?vFli28$+fc+k3#d%UXr{uNk+^J* zu8C>6!-}ozm|3nCxhl_$>%|qMp9AP-6@%&OMtD~j&&Y3s#OF0@XM_*b`s8qgv05uv z*iQJN@`(U#fDy*LJ)T{xrf#QXD-R?N){8zpIEFpbaz`D0FSabu&irlmO*J+ib6aac zgPkvR5ac5?xY~U-IK>Bx@A)NV9?ApS9+^HW5=1lIQl469$9HKL5Bn8ScX+2)o!I1k zK@2*{{8WFH;W%z{dY7YhEIbGp?h)g+elyq~x@f!8>OuTmxcT8XJzyvNdROPY+vt?t zuDpPuxm|_Im&!7k4kz2ArL!cTlxJLxe%4YGF(PEG-dy4~6IAd#bsnt7(~trzSxXhG zdSiV*wD93ty`g3syJtQ*Au|cEqe*C-j%r=(_LM|cIJ2ltr8wGJX=%|>qw;mKz7Be1 zCp({4>vP%MAL~q|*3MsMt>MFeGCiaI4i`#4W#zkL&)7sCW1!DIYW_YIgq6~p z@AMyRrV4c9&+0>=?s6_VvUULPlrh}VEQ;+v`$r4Bf6jF(kf-cjtNMg~(0z`Eh6N{k zM1J)m1E2Jdk0=}+0`xaO?;7hGf_F0r6rFx#?QdXS=7^yvy~pu{;-wLGpJ07~{bdX= zPIL104b;2nmjibT_L<8~SP|wNXWJ&`lq)B}RplMqVecLZ25e~Rm`v!u$^ZqK z70KTe*s=W!62dPir>;lRx%|#sMUk5DamzE0((7%)KltOkji+}o2qS2mCLg{w?}z=3 z^NVc5J$vMXZpxl4`l$EAvoGv@u*_Zx&YYxGQv%pnSZ)FY)99*+8-=u@TuMRKLqSp_ z(X@%r0cYQZ1iR;(NBqt~O#iLI14CI)2;H2#LT=Ot5*%&!Tw8F- zoQDc+{ws=&woHU*y+oWEcyn&<-BE~R=CI!cqkrgkevKUYp7Iq&zmtDRpn*G4^f^=9 zKTG++`dc;_(orn#&<4R#Ow)j0YJ!;O0^n4J`iF>vQuCtAzgvMm4xMVr6N64><0<}+ zZj;;t<%ET{P@6f_<>Uf1_p;L5F8bJx2C~2TtDn}gT6Rt`;ktzOc(V(*c{>H&qf?Sn zfW-`Vm(h>UMp%m8lGSrB++O#sMDu=Mm@%BC`!{kF!c1Z}jQDVi8D@N`;gq@qe7Bgt z@HBK%@1LO-QLU6Z7q~t7b$DMG`i*N>DZM>mFIXEl&Q34(IbOLeC|`~r-?uROr^)%4 z$cPmF5O1uIM;e`XfQPII&t8ij;towVfQf_JzIU`0n*bYfdFlw z4O?6{AMipUU?=PouEE(U%~y>Q$YUnR>(0QnV(tGOMiMT#Sm7EF8hZ3--l(|U zovmP_N-TeAS>kN~R`(Gf6IpfOfsLJR(6+BGxlXSIsT|sQ?Zauj?%OPP?eA?6&Zn)A zz)7S8aUX{S7iB?IC9gqz7m9y`2U;8!vY| zC69QPWgEUtw%--bIc+5lFkHt;Uuy_f2`vNn?4a+1iW%jvu`VDtfZPC!@MS!6viY!4 z;z#~8#VG$q$FXVV8^`znb)UoBJczvoj23kTBrGEncqNlygbkYwa|h1k^(%d!qizOu zunsfe7cc!>`Qwk#UFPm|3tsANau=Dr$YJ$Cv89U18s%tuEGJ);LBj7T@4EfWH9CxU zVD<9GV)*im33A`Qc@Y12WAPHcxT5wb)dj@^XI!bV!@3pafnH*QU$3UCY%8YcRk`5%T{#DHKp3wTI@4ZfEQLd@p3acmfd~| z(EGp0{Wo-LO?JOe^N(-I|G%S7{&Aw+3~lV~#O$4H4P9LRq3X|8J9kD=Mg7_$x5cNm zg@jW$lr6KIC+`An4qJXegR-=ow}Q#AOSDDKxBzUy(S?=0_%R*4jKw>??;9sMQVVIj ziv8q1AUN{4+G3pwCN$z{^uBIC$+>^aR)4DP@&CXR0Oi>7Kw{uxyzGs_q2s&;z+r5z zhNNz-M#Io+b@vlkQkZSUF`bAEN7JJE@m>p|a(#~8(}2-;jy7XtQ94PE!J%cKm|h(x zpm6tC-GrVB3W4(D8nhMO;NRLDB6H749)(|PnIho$LzX| zyffueN?Ot(wLAl3TbY^FtYzb7k8f~kg@=bjkQsipBlIHY<7CajK61;3-B^horZ5Uu z;pUEuf`=VOCIK}CR5F5>Cy{fehX@wi9AohoyQFWXE3S=>YTivCj-i?k+*o@}Go&8L z=-r|;6_orvacwW6wfY;_Q+DJOaTObhF_6Ojpy-$0+nJ!Q!cv+DnpMR+PdZra_||wVK?*hy^#clV9XA`p0^f@+7Ic#HkbD=3!++^2pUT z{@}u1s97^b_xLYdguJpaYOkl@uLkiNW%Y3>TInQw#2L(3#8U;QYU=~^z3_;$UgY?V z)x^HE3hEAt3?Zg$xJ8I$Bg}kU1YI?i#-7{W2E20YO3~FG!)~q}wUA8XKVEqh;F;6) zcy9#sSXrpVeWCfCnjRU34asau?&1CN3SdZ5TKe5m@vRvFd$Yne)hoUe^GE=YXb7k& z++}JjHw!9ZQPo+Me9yFm_(f_jF)aF<2X}TA>ojf0-H6~y&XKxnLouu;n=(??eAco_ zZK;l$Q)Im%ws7zx!%t2sqOfjcAxOsFfE7}mk#ltS0f${UDEoatu=#CPaBJJ~1}Ehn z>^^eNNL{er1Ji>-LciMg2LoWOi`mk_Xaffgb-;Pj%Y(c<}CcotYeSK-^A9sKMV z?Stbf%R%Pz3xUihI2J30-z$|RI8%LkHle&slWapn5ZoDv(`%a52^|$i)H+XxvzZg54-iBF#@(bAPn}*THc7;=yro10@5?X;(>rb2B>&RbpASIWI0o_hF8QO zH=Pi65!E&YPURL(9dt}tw(Qv5I7JINXWzLM(%WojU@#12p)}ryt2I}vNrHM^7aTz3 zlUoIaGlFCba^F-LO*k-cG^Ydjj-3P2e-z*zZEC*POE>cCa^b*u9uvK3RlWq|D}23vTo4 z@_YQ07Ey~9QDH^1Gn{C5m}oAMWs}YiE%U~Wz<4?!+A&|?8>~NyBkVqe6Yu* ziP}}A<#EWYfhCC^iAD7kY*Wx>B2G|=j_~^aDElG>#eM#ZJLIfnk;DlI5D@D3L^k$+ zLn{2wts!i0Yin=k{9j?vKkkfVRay595!7yD9>oJn0@-y$%BCM$3b-i6HOl;dMGwg1 zmSrtblyLJ1c^aw>qy^PRPm$f~j3wRc4zlPeL&<}41`u||9X;$1D=bNe%$&`)Gt=L; zeeYTSp6v8|g69?H3`6Oh4RF%4=$wwcwT&~5C>XR2GtSiY-uxH{g^h$=!LnmS#j<0j zW!hA_QN%868+6FrgCA%JOlIXDw#w+=QoRWeOb}?;TLdMKh|yk%mMv7`c#K%E;dYZQ zP0lb~c_>isB#di_E}>#n+GPCA^Z*cq`Of9fo0h%j8tASYdaIVhDSdpLl1E{tx#JPg z=r(lLtx{y&hbTErI7^LK)!jCXm6h6%4=jkTbs1PFLRnG;cx4JL%K9oX%1bL;Xo1Iu>F{HfT}yVlT(= z*N_@i-_1PMA-ac;ODq>iaXi1~l8Ywz^U>fn`S!Vfi|?kPZ;SIxva?}D+<9i`FaJyScHl11V$$oB;?46q=TZktN=TFj$n4K{pr(YP8 z62#L4EZk{G@h?+ZP4J(M3!aUz9H!sI?!k3Ijbeo&ISmIOv#v0%!7CH;2panzBaoIn z#YydIhBfJUr4B!nKBo1s&$EgV*>TNQI-+PY*YLn=JiOv}L)Y zjche(c=%{;zh_3TXMD!@0>cNN>~=C$Y^eCGVW;ucsCP=P+uUH?J|%P~*Sm_Z+eFUR zIoG;c<81deY!@rq)T!EZ(WntU5QAuM_h|nxY}a3qY_)Db**~l>Y=0&>IyOFn4?gmf zK5)l7JU%#r2ORmyQ~3YUy0XdI%&*%dAUVp3P3FN(c|(at;2z~8V0gCBxSDafORYKj zjYr{5O8dMb(SAMqcEDmYt2~0#Oo2&vxsQoN=I-F*;RRu=%(~VG!;x#ymGptaVCH^1 zZx6xjFT!wr{l>f!ILY?PI4=(h@-Y7@e+cIJcmH4b$SL{w{rK-jVzd7f=&*CPw=w-E z=t$C)!Bs^a`AYprGv%g*M1RXi14BbMk*@yrYY5EEaRZ5(K-x5tlXigl@&YzJJLJWH zb$C!cmyJKYM0Q~?mXeMCCC{E*%vi?fQ8PDs81r#+?Ub>q(a<;D`|~8ndwOk$&%5XK zEt25}sUqTBj3p9Ynk6~SlxYc8qX$2rDlD>X@Ml992II){v2okv3Wl-9?zs`Hw2y8K z5ru(hFWL_VCfvk@_NFfW#2l?0Qv*#visb_3Mug!BYIgykj1zOvO2dtwWrlC^zN!fQ zxUFUS^V z+2sUNaOsq6a=z*^tZR+Zxp>MpQ8NR2r2Ossg+p-cU@m}WwU5o%&& zOEK1vBR+M~qLU^S_tZPZFCrv|$rH`>mPx+tmc+`n-xTF~2B>oj<1Af;O?`No@CB+? zIxHpn@CFyG82+1$0@Buc2q3|rInp{T3iQ`45WH0m#4O} zJ5@r)X|Ti#knbR8;Fk)wqK!sqi&4iqm-&@ghiIe^dAa`hiL=piQ1V6+y%oW{HS^g= z*+_cl$aUmw8ZgIJPzgVrQNxPhw4Lym8uq38Jb;$lvEf(SA z0p4^u;n6_?HeZVNb_}J6`ZVQPQkL5Ln^258>RiB4r=Sln{E+1`d*JXBG;7e&CE)|e zAI2f@K{A(L^sGt#r^H{PTz=udhPhY7A7S!8rIP7K(hoBL(Gr7B9pEV%SV7Z;VP7LVlkmi7>Nk)w2;dBgv}44b-Y=zL^k9NH7m-J z$zHPHKxqZf;>U_U$jfw2n7*YXnwxn-sFBve`kS|8J&)RY3>2mkAkqB{hftvs!zOmbHh9Cmegi(WoXHw)KWFc^AznOExp|;?dRrFdp(3`m7TL)MYV0`@ zN_J(4RUIT+F?2^??0F4ITiB;TOrMf6T(?O`%KEBcObcORCP0Jy z%)qj8=nkg%^%0U5rB4GCW5PGu@HM*bT~6bZkk%hLr3Z52C!Db-J7%N;1WY8DQM&+V zg(krAsHc_cR&igK@Ab`fa*ofGhUQmx&>Vs+@qB^SpCV@(@rT(|R)IRL2(*Tl zf*o7t+puMqjos6D{e3$-%k$gxeAApuwwu<71$F>~cI1wMIcs#V)HD?fxzTRRWL3Qd zw{hOGI(<8#-Yn6)>tY$!d+mnyH$pa)|CSX?7Ja9lG6#Fq_rL~}j!SN@0T!*}l5@UU zkifr>e}h=eNra$1rK{mG4a@9mTr*%ph0Iz6qtJb0!=S{ZCTv=xOY&}dKml1rHlgO0 zTh1I@ngPjot*sAymgvIkRx^%bV4*x`utDh;bO}~maH)oiR;d<9U?`b@6Ub+1I^yTJ zQ_mWTUT7aQutmTgjvG-Je%<X3d3E25ddmChx-r!7_F5?e;0tEU2~XM_;*jDdD<%7 zkyPm%BOe@1Te%_HqE*U@L+16>E{)t7WW2Acs&1$KvJb#!1`bhNqSRl5`Sn;h(Tq`% zRuvjn+|)hDTmdF_P!~st0>V|ut5Kxcr_TJ1Dh$tZ$;uhOPlg~i6qQA%0=3emP>r5J zMJl=SftD6M1qP-_CqKP142vsmY`kWzuD;%on>AZ`-Y|)PdWp=J<7W1#(B7t%mLQhc zJKX{N9gWQG;pen?QqD4y)`CMEpHwF?_#XrXXKjP_F$&C=WH%5_G4^P|hLgBn&mzX4 z6$=g|lLJmUAfrd_SIqq10f|J%xJ$RRbkCR|J%$bqk%KfUs)NTb16?4Bk%(+v;jKc0 z%0x!VoDTGb8)3@2u$O=;rBk>cp3D+4gyO;yzrAp-6`nA^6KJ9r)=N(tQqXIo7e!D$ zTA@l{HJEv!RVI^tR2t?Xwu-9jd`^^7jd*Ievc*eHM|Qb-V#W7n6-RnGN2QV%oQiih zgrRoMA<6Rn>#~Qp95nf1Dmf|CFG5vbv{Fto<#!U*&!*7*a?T;D@_liYzs@reJF&`H z36xh-XeVzc{z3VvUh%@(o%mxAZ-0c!Bu7ZsHzIziTEGXR zP`7C0IX<7fsB`s;XSjv&bAtZ;%gu!tWo~*GL@;wtINtw>?4PkAUYST6@0)S6g8PrL z;TslMrTz&UR5#RdOcB3)5m)QBgdpjOJO80{IO!nx(|pd9Bm?ua?~T&azJS{k=bWwQ10p;m=C4hGCd_p;Xgjg z36>`?PhpHTifGfJhrc=yl z3(u9X#?s!wu0YD^8|I2#HWAdWhy!GPRfBxeKDD}EqG0w1cwo|$RGc&O%+fS3GJPks zzCS9qRwt5c1k7EzL(%U%qYM5f6#j+QhY9<3)9`o(Lf{(42cx*@IHx)O8`1vTD5o~< zoJMU=x{uMEw&}=$mZ$Q_CLl*w9kkg=wZFXZt|Zy5LZswxXUm%2TLGV+bEWfJ+blYp z-DdpY>=X?!gfBR>_G~AFRTMTg_Byo8U)P5g_ZsaE%hM+*)5gy9vaQd6ITxoW{KOzE z>`~~)k_~4`yJ5RrtUp|PP_s#+Cd14RGVpS+C6vZV6dcA=XYXBR3gIvisHGs5gT26XORkO1wUr&x#Bg^e7&J@5%-Hx`%0x(PKS z;9le1))rTn-r%Pk>uh z0OLwOw~5c)azISq8y^lE2@h(GW@_>68Vh@l4XA5mu^O{E7tN|)8ghzW>{bkY?I4yT z7|v<)kKLyJ`p_+VS88JTYU-~BxK=Wpi$>U&!=J4<2t+TT${+&MrZSPk$PO?`Pr-A8Z@L%0y&J(PYI7y7VV8QiHBbaUj+f zURQ)*S@H_uzMBJfF_LNzggc4zC$M;cJuYx500mQh zLKRK!j|1$VHZz6ej`2-}i6UtGv$kU62qIm05`f_|oc|0SgA2Nwk)yiQ??#>2*0WnF zTCmzFrbDaR_c|@Kgg!T6P1hInS{vw413yeooP?D@H_9FEDe4hfc3`uU?%v32Mj6zv z9~>>?d0R00FaWz1n85?DYT82-y(g+f_W|f<_4WsqO)0C}67j^zFW1N6 zq>VI#TGLR%e1UpDA-dpXoR+?UfvJ}i>~IhQT0NS#A>wHo`656+mVIog0N9k;4-+X= zut=IX!Xr8G(`dmu7eY1kua_WO`mzSpc>^&zADhe`2Q&rhq6mW+7U0vvguG+Uc%Sr+ z+{_^}|HMOGl*M|Vxh5@bpe$SvRYpf;vGMDgNO&iprtow-$i=eV7F*aHx8;bYaU`iT zegCh}elBW!STj;bt**<4@@QrLpKAFjQE%`;X{2_kIpv~q@IS3jeO0v*)t4mQ5K|4$ zaci=W;1*NDg{~3H?jjuD(uS;pNdc6o1x^rBd-L*?X-zEQ9hJz~V5tQ=geS~gMjKzi zvVdE7#;Nte+bG-Y+$2_~6@g9OecdhBUyOjaQKR@{Pl<Vbnd>UF- zl7b?mnnh$RGRQ+qHIZb8>vU`sC|9jNi@iZ;(qB?c8!y}W5cG55HBTia9FyUJA6RqF z^?qtU;eF2Od_B+I`2<4je@4D~A!NJ~Ov^<iBfLnrVJ*{Dgc#SC{&*M?6f%dt=ZWDo5)T?mQMMA7|9~t!FMIXz(07R%WlX;ZMwi z^k7$m5o52+0PagOG!vFmlss9CYbZvAG%N253|x*$3|y1SUEIK&Mq+ zXk@)?b}FgAwAl0{CDa5^4J)&<4J=k=W7A9#$SJ1T_pP!nSg9D-z&yHQAFG0Ton2-} zA=HrrVOg4h+I`i^8a7N&U=*emb)O@vV4aUjjgHO6rQT?W{U~H+&zoS3OI1AFJGn@| zNM3DR-7v9-DFpUaJ=)I<>F>%vZSpvj)S}bM$ahBHVBYTQM9vvq?Ni3m-%XEVxJ{0# zt*1G_VV_y^nK$|-8+1~t!Q`>kPEFe8b?&^}? zxO$>r-nS>SF=D^l9NX4QRn1ynV{1mjO;8b~JId^8ntdQ*?#;}6yPG4xVyY@C&n|KV zc4PW{GVEW*l&XeGYAYSK*787qo+Id*)Zs5$*AZ}S{KY%^JR z2ONM+wNli|KpGufG{O!w!T~2O$X2E9(r5Y?Sht8FOXTa)r{(nRBoHI@2A}BTmqi{V zNB#@~q0*a07}$ocx5Es69uwNCxU$de2TxIwwS^%A2WD_&{*~B3kSl{xznigl=Gjngn+^zBV~5|6ro1 zU2ribIV2Vn48{QQw4zQTDU4p!#|v0Dq@dhwcurNr-kP((@bK~gjeE=z zeGqz~Q(&hDLVk>?AKfbNSV%qrDIhK->zz+?ALfKFG+urcMQft-KO&oEktH*PAk@Mh z^1FRfg@r_efi@0AKtFVg1G9=hON!I_ps(`XQzq9q)167|kXu(ifJ;Go^2{CnpiOt) zAm0~VGd<9WiA(GoTM!hcN*o#g0TYu?7Ps$IsNUz+8m&kg5Q=g(9@=mF=5vq5lRww*M2*`=_KTX+j=F5p}pn8@jkTNeL8H{{`r+K>3D_k{DH# z+JF$#(XhmYGUyUE9X;Gm_gt&BhG|Zu&%$VbImAEVHtUp=)tI8%(#vb6{n_XFZHs3i zx2MMsf^bg|h_7v59Q50O8gPy~%o*j}*0)C<3I*TFDdW^OWf(EQ8VVbV1@F$e`DmEp ze+?$#J{?+x@C>#tEg#{PpN9$TtGPufahKB7k}si>)NnkQCa}>~QJ$O${Gpi2R*&}M zIw?mTl)JH_WYRv>DWabCBtj+JvwkT=Bsqf)t1~|YY zyCq}%4v>Fcr>#7p|C%}P=c*1Bym-gTGj5?X3ezNFTsc@_b>1Nms+Ch5z<0V84>v{o zvnW8IfJxKvWzI40FalVePX_SRgGO$SUEK zb)bBlA$;K9^>r#4EN2%lq&H_|`YfW1oeWfa-pia|lt3623o@=*1DAg7Un& zW>_){cybP?e17X@Pdg(qrR3))RL&s27Cb4)u?Y61$)&)w{lu#y`U!2jpftTSyOvBO zZR%#wN;!v^??K77fU9YAcLjbd0J2Yb{J}nZe^JN81EtUXYM3j`eJV~+Ap zWQkztmH+~mp#CzLYv&krb~kKCZS)0rW@W z_BJD|Z?zpVrK_elCZa{vtGLE)2rG2ghsYh}s)}(N2>J-?>`9Ik;p`+;<_+#cF=jcG zYi;>qZurTO8B*EpOMFHd8kM-Z{Q=nBZ5aim%>4@#wPqb>0rULTNtwwNa-x#NR#kBm zt-|SCFreD;0XNp2g+;m?jCSqxzK%x^Dd4heYW0F^!;z^U68|>?pkctReZQ7qr(bvJ zH#8X~O545uv$(;rM^ot~$+9G5m3A!nb8nw`7|4EPmS{N1?vCg=zf@qu;ye5y4K;jL zpFbE`FEn~pKdRM|Bl6#w0#Xb4QaE-OI2rU**E>30&Y$olAySosy1AMm=}klIej#1x zI2}WGoE{Y+^Ja$dG&d1@KI<25(1)n}xqn*N1oury;aJ9uK_mxc?j|!#wgV4M>Bj=o zgRvygCrSIi-L1gJHgpn1S;lxk#tPC8yV=G>VGX7D1xp@m&|6myB8L#kta;b9>^fnAvG3E$Q3x{ zu6Rz;6_MMKnaHwUN2dy##PKA^7Z4{wJ=B_26(5=(@*Me{pQeK33|4bx=g`34GR}9n zUhEp+q3&LY3%n4rrg;i!Q=@(PtcD6_+BZZ4>b{&Dv$t*~>><~2;*)~FG>sE3SD1+G zGOl4TK&{81A-SfttPzJXK5k?B>!H8RxTB${DUXC@esm>4TTsGek)G3%%b?;?8#}_b zmb)w;=WQ{LFrkBZ;Rb(ur4FT&)dx&`zz-L3bumpKAUl;dMBd$&?_@RdIBIdqhMuI6 zbW&k{*4$QnB`&mb&)BEG!xs*G0$AAr#s(U$sBq7jlr^ij0D#kmHAn}if52`(?Vj)x zeGm_BXO|w#Lv(;|Q{4mq#!_j(&IJm$tVELIzQYQ+W2$o&&RR?!C&g~9hM(@SiqCjD z!%58G4LhSTJt~WZxp1-_`$0IM(0&sKbluus%i!yrCT>Xd$1-cE>Je+j#jp4Y$w;cF zuA=Nkm4(}{+HJ21Ef580{&}FCN@BAfY*j9`6?9o09eq=SbHWjWr+vCJ0 zi8v`7y4R+Ce#b(S%=A654>FZ6aoGH4V#+f1stSu0epPBBi| zkCRMerF!dNCjvsW!tZC7=X;oYu%A|a_jO)| zO<8{mOB27s2C#)Pu{!gPIzp^FKsw?+;o4KgaA6Cl!`%d(-=lq3E`25@iXdPJm{ zAoUT=-DA@6Ne2RYjhiZ{UUBnXHM9iNfQaiYkg!{=M5_q&1kXjB5KwHq6^9qX2}cs& z3mqfAuax$vLN&GJMIH%fWW_FTNxKDe^7vYZ3p6$fuk|%%sa8o($kpiQAc7w|2>)0R zwG7hj$sa^asbTi`>)V_Y59wW`77F9cCFcY{D_F!Tb52xuA??qvH;y%p9u={cAj_a= z&ftx%FP_ziPSi`^8a~2^(5Nq6u=O7Vwqaw>_uwI=>B^k4_Kr1vXN9t!paD`v+{=Mr zya&%{6?V6H!&Cu{aPX~*_Nr3;dhF;{PAimA@Ucja}@W{)fd={qFP@ zMf@C2XijKou^D3@gqjBYqMMLoH%JU6_<_8^*~dWqQ-RQNd46@N` z6pdrIpGd{999n&k=VwHLxw|G+LK!qJYa`3n$0LXSbJXYi`SVYpvR%c=p)nH$cE7ZZgEmB07D=$!IS%!_($?9_3>$%Slwl2W7R^x{Asqjwh}%%nP7Tdt|d8f?VPNHnNohWt`$$9`4pga{FI+_ za)!IJL=8xMOwqKPrJ~KGd??ipZ`a{nk8e01XWabLdRD>6x85Nd@YZqK<+0t1etSrg zeVlvjIW|X^C`Wj18XMGa{P+E)zs#I2~8w9-!N2gjd2JGZA3|`#kCCMyJuJ$oWW^fj+c61biyUFc03K( zGTBO54C~rhWEd8jS#N|40OMNP3Fv!fC6RWBekad7RDNh6zRERHghHL7rSzOqk(p3* zYg1~1{#!E*1FQV?HO%myyDxw%+4*FWHCeM}vQtXg3WJed=(F}&$2JoN+1D&tlC{WK%2p_{w4fq; zNS5sTR+h?A{9j)&&09(RzxR3OX?mWy=XcNb-gECg_ug}At;UzyDd^G#RfTH~$z+pP z@3(&=5a5tNP;JgU=oLlM2a9KriQnhvB#J!9Uis{jkNa*Oac$W}5#fuWx=fd@czKhc z2ad3KD=rQ&I6P7`$m~JlAH>{HbvI=F&^CP2x|S2-snWulkpIsmS+kswB_YOjs^p<2 zxIL%y?sykuB#*Ydvye3YgT-b|c{?FJ*+~(WXbu)5Z;YOt_-rZ>AC%;&FQtOPbKrIz zcXd$x9uL%B2erd#>qkzjpI_L2^rnP&9BIP^p_qI5A#3lZn~3w1*8L5RHOuo5o>yZ# zlO4EcA;`wHK)nrddw!ikdT;Q<^B03Y!NzhliEyox@XQ!%H)kK0@#YoO9I zhN-UjJ7DVIah>u!*hK*DNF#1fpA{N>yGjLu_rxGvj5Qj=a8zPiFXXu*_*WEXfH7MxpjCX2uACtV+x%_^0N*s@O)NIj6 z*N5TBl~6pPnV=yVYW5QDfhfN^AvU_J0-VMM0ih)HXO&4kv@J5Kr-9@4kc>kH(e}x# z4_9)`@?I(XGG3GxE)puHd$y3FrF}0!`?kH7TdJ0dtOvp}`%}7QZr1gRV};iL#Ihbw zXDs!&%9=e*%P|+kDq;$C2*@i(ynAr3T^@0wjV7BTc&s5x+XJIls#{ih#js^+*byFq zLR2)v3_NTs?=cjIbk`9s%z7^D%}W@4aV~5iC+cs`Q}=Guo8Pn0FFo7HnIN}txvt!7 zU(hg`N=`ouUq*OBT=0R;q4R~PRu;d0QqRxgC9pv057XSVj`G>G&LxZYZ?5~jK3D$Y z-U@>3T3(i~fk;OVP zS|b>`tb96>`mjw|xGLN9V{Nkq8$#M&-nB|EY4isQ!Zk zw^P~UDb&qcdo{(PV*whuNwbGsb???+8$2^w64dg<_O@fvaRjZyt(IlIr_N&K0$C`J z_4r^q)n=_${E&p+5{XJAyT3(mgsjM4&67MnNUmM@wJHL!=)iFPJv4()RQw)tY20Y} z5E-+J{N?LFu`wAkR^N-IF=+dEqtgzrTaL0w_@sFWGqTaAjnRcitCpZ)tG6GBNVrkNTmh~+j zM_~iNEu!m13lhOZe`Rwxgh3+qaga232Wv>oq?jMipig?DH|W}^q7rkSfJFR6s~P`v z8g#4?Ps)XaBs#Ljh<(>tO0mgGA+|`zC%n+OsFmOv#>Jy?C--)q>Yzmuy*v0OZ``X8 zfss;e^Ah41FA@u~$*s*Ebk#~y^Y17s{P+p9gV@=Lx$h2i&nlpM?sV>f+dXmT9_d>8 z8m*_O*Y3w;U{Wpimk%1+zz+2iTuxze@kR4!&pjnE=4lbTW%*8MhgnmkO8b7-?UA?Xp+3j6QwscOIA0$BHNMGUZTI4$tYtR?ftA{fo36)+=H>IO!#9= z=yLsqeX`XYqSwxaxes2gwZ1;`nk`*4(ASd1b)^x;nbLw>4*v z#m+d0lk2Bs(4!f$ZEY-#y~`L#OR63tDV!bPRZ`O(cZl5f_jEJ|vQ_nK7Y7XVJfhaw z+euhKP;cSF(zbXLGr&qnw@9O9fwVn-v$6~ADr{rjgAORQ#P|W3$(jFrcT_iZJ5D=STVg-q+tq`rksAV zXFA|hqWOgu)cKHT{?^<44DZ!Q+f7Q%m*XLSwdxm;k(W)hD+W7BzdfsT05aKK+j|+m z?I5O8zo>8;rd5uswl>xgeOAZqDAqLyaKdz#DQbM|;>f7K#G=>>chGu10>QTM|%M`G`uDE4U+ugzqW&dv|3|CsOl zAKN+p12qP+A6b|~jsM+9g}F(>;y za_J>`ydSP+q5MQaz}nBD7P4}AnmOMfhpUI#b>Uz8TjNq5a?h~<6XfjAfI$Sfd4C21a`yxp=vcDpyjC}a1%05{r z1-pck(5bvq0i#hrny$XCI7jL|-7~NL3C}sAMN`z}!#D3l^EWzHAa{wwu`S{FO6Fil zsNt;lRXHwW7+ZW{Zf*i!ShmDSAFq&}S!PONltv7~a<;bP%jiJn4z;fY9%(=%*tc|Gx_F2)HZA(lAOos4V^EPQrN@e@R7Mnif zJMc`(&An7dUw5Q6I0B7C!#NJ1h6diWNmiw8(g5beUe6^|B~`fpp{5+2wlsio_Ex(0$I-k%O{`*Okj@RGOS=%UDHdNkVk-?Jx@vs zyM>>jv&$plP7>65KV9s^YHIPI5@XYwgZOacaAi|Eqo3Dc9A_ncC%SIuuaEz|Y1oMWwSpYP9V5V zVDaa}>-vb|JC%U{XxDCP{EZla-+dxqOF)lYyUkiR2N47100H^$kAC})5hqjf(i6hDR z7m`fvZ0+q3<_P4rGI?=imi2N=As{IDgHE{b1IWQmD z>MP2Mvhu1L@=&A;5-cJ57BhOo6lDM(Ae+n9gYiBHL>S+apbFOnWPk;1be$W0N)hS6 z<{u$Y4cV>Ycz77^XMlk1|CXEYot*gvW0VaNxUl@?Ma0<-{IT#DzXE8c4sPnU7qetMahGNI)ngl1~8krDn_#W zDR6rgrv{+3$$)x8fI{*(jk?V7E8@33eKYnBPBPLj8vx)|WiafGX9kR|06iX_G%gZ| znzwzcev8CGVZ-Qwaij5&L^a@zIZOk@r^@CMCBUDWj2ehmtBOabA4meoz{{;i?PfKGPOZ3m!JeSd?6u@hn zw;!+`IP5T^KVU1`+Ws`5F<5PI(&SA##+$(EchEmip$sO1GxuVN^VYvZ++iMHFdm$S z3ya6N{0@HGq+DPqH~|F~%Ixz?=+DzpfHB}W=~zr(;IAQW?2D!fINgxENN zhKdS0Do@W3zc93_|_1XP+7E70&s-vCwGXz zH1M4bEUln;r?hQvaDai}^U_#gX8CUbH+s#_hF{Yyhx# diff --git a/fop/lib/avalon-framework.LICENSE.txt b/fop/lib/avalon-framework.LICENSE.txt deleted file mode 100644 index 67db85882..000000000 --- a/fop/lib/avalon-framework.LICENSE.txt +++ /dev/null @@ -1,175 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. diff --git a/fop/lib/avalon-framework.NOTICE.TXT b/fop/lib/avalon-framework.NOTICE.TXT deleted file mode 100644 index 416f7ba9b..000000000 --- a/fop/lib/avalon-framework.NOTICE.TXT +++ /dev/null @@ -1,11 +0,0 @@ - ========================================================================= - == NOTICE file corresponding to the section 4 d of == - == the Apache License, Version 2.0, == - ========================================================================= - - This product is developed by the Apache Avalon Project. - http://avalon.apache.org - - The names "Avalon" and "Merlin" must not be used to endorse or promote - products derived from this software without prior written permission. - For written permission, please contact pmc@avalon.apache.org. diff --git a/pom.xml b/pom.xml index 8eb536167..fc2f0fc2c 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,6 @@ 1.8 - 4.3.1 1.11.0-SNAPSHOT 1.9.1 2.14 -- 2.39.5