From 559f7a39167e05587e2098ceeb9c01969a212e79 Mon Sep 17 00:00:00 2001 From: Reiner Jung <reiner.jung@email.uni-kiel.de> Date: Fri, 20 Nov 2020 15:55:41 +0100 Subject: [PATCH] Updated Moobench code. Refactored and working on support for Kieker 1.14 --- .gitignore | 6 + build.gradle | 36 +++ .../OverheadEvaluationMicrobenchmark}/LICENSE | 0 .../MooBench/benchmark.sh | 0 .../MooBench/collector-2.0/bin/collector | 0 .../MooBench/collector-2.0/bin/collector.bat | 0 .../collector-2.0/lib/collector-2.0.jar | Bin .../collector-2.0/lib/jcommander-1.72.jar | Bin .../collector-2.0/lib/log4j-1.2.17.jar | Bin .../collector-2.0/lib/slf4j-api-1.7.25.jar | Bin .../lib/slf4j-log4j12-1.7.25.jar | Bin .../MooBench/common-functions | 0 .../MooBench/config | 0 .../MooBench/lib/.gitignore | 0 .../MooBench/log4j.cfg | 0 .../MooBench/moobench-2.0-all.jar | Bin .../MooBench/r/stats.csv.r | 0 .../OverheadEvaluationMicrobenchmark}/README | 0 .../executeRemoteMicroBenchmark.sh | 0 .../rerun-benchmark.sh | 0 frameworks/Kieker/build.gradle | 12 + .../src/kieker/tcp/TestExperiment1.java | 266 ------------------ .../src/kieker/tcp/TestExperiment2.java | 83 ------ .../src/kieker/tcp/TestExperiment3.java | 86 ------ .../java/moobench}/kieker/Logger.java | 7 +- .../kieker/tcp/TestConfiguration1.java | 15 + .../kieker/tcp/TestConfiguration2.java | 45 +++ .../kieker/tcp/TestConfiguration3.java | 42 +++ .../moobench}/kieker/tcp/TestExperiment0.java | 2 +- .../moobench/kieker/tcp/TestExperiment1.java | 35 +++ .../moobench/kieker/tcp/TestExperiment2.java | 38 +++ .../moobench/kieker/tcp/TestExperiment3.java | 38 +++ frameworks/SPASSmeter/build.gradle | 8 + frameworks/inspectIT/build.gradle | 8 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++++++++++ gradlew.bat | 104 +++++++ lib/commons-cli-1.2.LICENSE | 207 -------------- lib/commons-cli-1.2.jar | Bin 41123 -> 0 bytes moobench/build.gradle | 12 + .../moobench/application}/MonitoredClass.java | 2 +- .../application}/MonitoredClassSimple.java | 2 +- .../application}/MonitoredClassThreaded.java | 2 +- .../moobench/benchmark/BenchmarkMain.java | 158 +++++++++++ .../benchmark/BenchmarkParameter.java | 91 ++++++ .../benchmark/BenchmarkingThread.java | 2 +- .../benchmark/BenchmarkingThreadMilli.java | 4 +- .../benchmark/BenchmarkingThreadNano.java | 4 +- settings.gradle | 16 ++ src/META-INF/.gitignore | 4 - src/mooBench/benchmark/Benchmark.java | 240 ---------------- 52 files changed, 866 insertions(+), 899 deletions(-) create mode 100644 build.gradle rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/LICENSE (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/benchmark.sh (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/collector-2.0/bin/collector (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/collector-2.0/bin/collector.bat (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/collector-2.0/lib/collector-2.0.jar (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/collector-2.0/lib/jcommander-1.72.jar (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/collector-2.0/lib/log4j-1.2.17.jar (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/collector-2.0/lib/slf4j-api-1.7.25.jar (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/collector-2.0/lib/slf4j-log4j12-1.7.25.jar (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/common-functions (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/config (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/lib/.gitignore (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/log4j.cfg (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/moobench-2.0-all.jar (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/MooBench/r/stats.csv.r (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/README (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/executeRemoteMicroBenchmark.sh (100%) rename {OverheadEvaluationMicrobenchmark => frameworks/Kieker/OverheadEvaluationMicrobenchmark}/rerun-benchmark.sh (100%) create mode 100644 frameworks/Kieker/build.gradle delete mode 100644 frameworks/Kieker/src/kieker/tcp/TestExperiment1.java delete mode 100644 frameworks/Kieker/src/kieker/tcp/TestExperiment2.java delete mode 100644 frameworks/Kieker/src/kieker/tcp/TestExperiment3.java rename frameworks/Kieker/src/{ => main/java/moobench}/kieker/Logger.java (87%) create mode 100644 frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration1.java create mode 100644 frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration2.java create mode 100644 frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration3.java rename frameworks/Kieker/src/{ => main/java/moobench}/kieker/tcp/TestExperiment0.java (99%) create mode 100644 frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment1.java create mode 100644 frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment2.java create mode 100644 frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment3.java create mode 100644 frameworks/SPASSmeter/build.gradle create mode 100644 frameworks/inspectIT/build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat delete mode 100644 lib/commons-cli-1.2.LICENSE delete mode 100644 lib/commons-cli-1.2.jar create mode 100644 moobench/build.gradle rename {src/mooBench/monitoredApplication => moobench/src/main/java/moobench/application}/MonitoredClass.java (95%) rename {src/mooBench/monitoredApplication => moobench/src/main/java/moobench/application}/MonitoredClassSimple.java (97%) rename {src/mooBench/monitoredApplication => moobench/src/main/java/moobench/application}/MonitoredClassThreaded.java (97%) create mode 100644 moobench/src/main/java/moobench/benchmark/BenchmarkMain.java create mode 100644 moobench/src/main/java/moobench/benchmark/BenchmarkParameter.java rename {src/mooBench => moobench/src/main/java/moobench}/benchmark/BenchmarkingThread.java (97%) rename {src/mooBench => moobench/src/main/java/moobench}/benchmark/BenchmarkingThreadMilli.java (96%) rename {src/mooBench => moobench/src/main/java/moobench}/benchmark/BenchmarkingThreadNano.java (97%) create mode 100644 settings.gradle delete mode 100644 src/META-INF/.gitignore delete mode 100644 src/mooBench/benchmark/Benchmark.java diff --git a/.gitignore b/.gitignore index 9119436..a543dc0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,9 @@ /build/ /dist/ /tmp/ + +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..041f1ac --- /dev/null +++ b/build.gradle @@ -0,0 +1,36 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This generated file contains a sample Java project to get you started. + * For more details take a look at the Java Quickstart chapter in the Gradle + * User Manual available at https://docs.gradle.org/6.5/userguide/tutorial_java_projects.html + */ + +plugins { + id 'java' +} + +repositories { + // Use jcenter for resolving dependencies. + // You can declare any Maven/Ivy/file repository here. + jcenter() + mavenCentral() +} + +dependencies { + // This dependency is used by the application. + implementation 'com.google.guava:guava:29.0-jre' + implementation 'com.beust:jcommander:1.72' + + // Use JUnit test framework + testImplementation 'junit:junit:4.13' +} + +subprojects { + repositories { + // Use jcenter for resolving dependencies. + // You can declare any Maven/Ivy/file repository here. + jcenter() + mavenCentral() +} +} diff --git a/OverheadEvaluationMicrobenchmark/LICENSE b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/LICENSE similarity index 100% rename from OverheadEvaluationMicrobenchmark/LICENSE rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/LICENSE diff --git a/OverheadEvaluationMicrobenchmark/MooBench/benchmark.sh b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/benchmark.sh similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/benchmark.sh rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/benchmark.sh diff --git a/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/bin/collector b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/bin/collector similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/bin/collector rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/bin/collector diff --git a/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/bin/collector.bat b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/bin/collector.bat similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/bin/collector.bat rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/bin/collector.bat diff --git a/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/collector-2.0.jar b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/collector-2.0.jar similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/collector-2.0.jar rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/collector-2.0.jar diff --git a/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/jcommander-1.72.jar b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/jcommander-1.72.jar similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/jcommander-1.72.jar rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/jcommander-1.72.jar diff --git a/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/log4j-1.2.17.jar b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/log4j-1.2.17.jar similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/log4j-1.2.17.jar rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/log4j-1.2.17.jar diff --git a/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/slf4j-api-1.7.25.jar b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/slf4j-api-1.7.25.jar similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/slf4j-api-1.7.25.jar rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/slf4j-api-1.7.25.jar diff --git a/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/slf4j-log4j12-1.7.25.jar b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/slf4j-log4j12-1.7.25.jar similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/slf4j-log4j12-1.7.25.jar rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/collector-2.0/lib/slf4j-log4j12-1.7.25.jar diff --git a/OverheadEvaluationMicrobenchmark/MooBench/common-functions b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/common-functions similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/common-functions rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/common-functions diff --git a/OverheadEvaluationMicrobenchmark/MooBench/config b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/config similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/config rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/config diff --git a/OverheadEvaluationMicrobenchmark/MooBench/lib/.gitignore b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/lib/.gitignore similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/lib/.gitignore rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/lib/.gitignore diff --git a/OverheadEvaluationMicrobenchmark/MooBench/log4j.cfg b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/log4j.cfg similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/log4j.cfg rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/log4j.cfg diff --git a/OverheadEvaluationMicrobenchmark/MooBench/moobench-2.0-all.jar b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/moobench-2.0-all.jar similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/moobench-2.0-all.jar rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/moobench-2.0-all.jar diff --git a/OverheadEvaluationMicrobenchmark/MooBench/r/stats.csv.r b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/r/stats.csv.r similarity index 100% rename from OverheadEvaluationMicrobenchmark/MooBench/r/stats.csv.r rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/MooBench/r/stats.csv.r diff --git a/OverheadEvaluationMicrobenchmark/README b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/README similarity index 100% rename from OverheadEvaluationMicrobenchmark/README rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/README diff --git a/OverheadEvaluationMicrobenchmark/executeRemoteMicroBenchmark.sh b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/executeRemoteMicroBenchmark.sh similarity index 100% rename from OverheadEvaluationMicrobenchmark/executeRemoteMicroBenchmark.sh rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/executeRemoteMicroBenchmark.sh diff --git a/OverheadEvaluationMicrobenchmark/rerun-benchmark.sh b/frameworks/Kieker/OverheadEvaluationMicrobenchmark/rerun-benchmark.sh similarity index 100% rename from OverheadEvaluationMicrobenchmark/rerun-benchmark.sh rename to frameworks/Kieker/OverheadEvaluationMicrobenchmark/rerun-benchmark.sh diff --git a/frameworks/Kieker/build.gradle b/frameworks/Kieker/build.gradle new file mode 100644 index 0000000..7f69424 --- /dev/null +++ b/frameworks/Kieker/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'application' +} + +dependencies { + implementation project(':moobench') + implementation 'net.kieker-monitoring:kieker:1.14' + implementation 'net.sourceforge.teetime:teetime:3.0' + implementation 'org.slf4j:slf4j-api:1.7.+' + implementation 'ch.qos.logback:logback-classic:1.2.3' +} diff --git a/frameworks/Kieker/src/kieker/tcp/TestExperiment1.java b/frameworks/Kieker/src/kieker/tcp/TestExperiment1.java deleted file mode 100644 index 335259e..0000000 --- a/frameworks/Kieker/src/kieker/tcp/TestExperiment1.java +++ /dev/null @@ -1,266 +0,0 @@ -/*************************************************************************** - * Copyright 2014 Kieker Project (http://kieker-monitoring.net) - * - * Licensed 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. - ***************************************************************************/ - -package kieker.tcp; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.BufferUnderflowException; -import java.nio.ByteBuffer; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -import kieker.analysis.AnalysisController; -import kieker.analysis.IAnalysisController; -import kieker.analysis.IProjectContext; -import kieker.analysis.exception.AnalysisConfigurationException; -import kieker.analysis.plugin.annotation.OutputPort; -import kieker.analysis.plugin.annotation.Plugin; -import kieker.analysis.plugin.annotation.Property; -import kieker.analysis.plugin.reader.AbstractReaderPlugin; -import kieker.common.configuration.Configuration; -import kieker.common.exception.MonitoringRecordException; -import kieker.common.logging.Log; -import kieker.common.logging.LogFactory; -import kieker.common.record.AbstractMonitoringRecord; -import kieker.common.record.IMonitoringRecord; -import kieker.common.record.misc.RegistryRecord; -import kieker.common.util.registry.ILookup; -import kieker.common.util.registry.Lookup; - -// Command-Line: -// java -javaagent:lib/kieker-1.10-SNAPSHOT_aspectj.jar -Dkieker.monitoring.writer=kieker.monitoring.writer.tcp.TCPWriter -Dkieker.monitoring.writer.tcp.TCPWriter.QueueFullBehavior=1 -jar dist\OverheadEvaluationMicrobenchmark.jar --recursiondepth 10 --totalthreads 1 --methodtime 0 --output-filename raw.csv --totalcalls 10000000 -/** - * @author Jan Waller - */ -public final class TestExperiment1 { - private static final Log LOG = LogFactory.getLog(TestExperiment1.class); - - private TestExperiment1() {} - - public static void main(final String[] args) { - final IAnalysisController analysisController = new AnalysisController("TCPThroughput"); - TestExperiment1.createAndConnectPlugins(analysisController); - try { - analysisController.run(); - } catch (final AnalysisConfigurationException ex) { - TestExperiment1.LOG.error("Failed to start the example project.", ex); - } - } - - private static void createAndConnectPlugins(final IAnalysisController analysisController) { - final Configuration readerConfig = new Configuration(); - // readerConfig.setProperty(TCPReader.CONFIG_PROPERTY_NAME_PORT1, 10333); - // readerConfig.setProperty(TCPReader.CONFIG_PROPERTY_NAME_PORT2, 10334); - final TCPCountingReader reader = new TCPCountingReader(readerConfig, analysisController); - reader.getName(); // to remove unused warning - } -} - -/** - * - * @author Jan Waller - * - * @since 1.8 - */ -@Plugin(description = "A reader which reads records from a TCP port", - outputPorts = { - @OutputPort(name = TCPCountingReader.OUTPUT_PORT_NAME_RECORDS, eventTypes = { IMonitoringRecord.class }, description = "Output Port of the TCPReader") - }, - configuration = { - @Property(name = TCPCountingReader.CONFIG_PROPERTY_NAME_PORT1, defaultValue = "10133", - description = "The first port of the server used for the TCP connection."), - @Property(name = TCPCountingReader.CONFIG_PROPERTY_NAME_PORT2, defaultValue = "10134", - description = "The second port of the server used for the TCP connection.") - }) -final class TCPCountingReader extends AbstractReaderPlugin { - - /** The name of the output port delivering the received records. */ - public static final String OUTPUT_PORT_NAME_RECORDS = "monitoringRecords"; - - /** The name of the configuration determining the TCP port. */ - public static final String CONFIG_PROPERTY_NAME_PORT1 = "port1"; - /** The name of the configuration determining the TCP port. */ - public static final String CONFIG_PROPERTY_NAME_PORT2 = "port2"; - - private static final int MESSAGE_BUFFER_SIZE = 65535; - - static final Log LOG = LogFactory.getLog(TCPCountingReader.class); - - private final int port1; - private final int port2; - private final ILookup<String> stringRegistry = new Lookup<String>(); - - final AtomicInteger counter = new AtomicInteger(0); - final ScheduledExecutorService executorService; - - public TCPCountingReader(final Configuration configuration, final IProjectContext projectContext) { - super(configuration, projectContext); - this.port1 = this.configuration.getIntProperty(CONFIG_PROPERTY_NAME_PORT1); - this.port2 = this.configuration.getIntProperty(CONFIG_PROPERTY_NAME_PORT2); - this.executorService = new ScheduledThreadPoolExecutor(1); - } - - @Override - public boolean init() { - this.executorService.scheduleAtFixedRate(new Runnable() { - public void run() { - System.out.println("Records/s: " + TCPCountingReader.this.counter.getAndSet(0)); - } - }, 0, 1, TimeUnit.SECONDS); - - final TCPStringReader tcpStringReader = new TCPStringReader(this.port2, this.stringRegistry); - tcpStringReader.start(); - return super.init(); - } - - @Override - public Configuration getCurrentConfiguration() { - final Configuration configuration = new Configuration(); - configuration.setProperty(CONFIG_PROPERTY_NAME_PORT1, Integer.toString(this.port1)); - configuration.setProperty(CONFIG_PROPERTY_NAME_PORT2, Integer.toString(this.port2)); - return configuration; - } - - public boolean read() { - ServerSocketChannel serversocket = null; - try { - serversocket = ServerSocketChannel.open(); - serversocket.socket().bind(new InetSocketAddress(this.port1)); - if (LOG.isDebugEnabled()) { - LOG.debug("Listening on port " + this.port1); - } - // BEGIN also loop this one? - final SocketChannel socketChannel = serversocket.accept(); - final ByteBuffer buffer = ByteBuffer.allocateDirect(MESSAGE_BUFFER_SIZE); - while (socketChannel.read(buffer) != -1) { - buffer.flip(); - // System.out.println("Reading, remaining:" + buffer.remaining()); - try { - while (buffer.hasRemaining()) { - buffer.mark(); - final int clazzid = buffer.getInt(); - final long loggingTimestamp = buffer.getLong(); - final IMonitoringRecord record; - try { // NOCS (Nested try-catch) - record = AbstractMonitoringRecord.createFromByteBuffer(clazzid, buffer, this.stringRegistry); - record.setLoggingTimestamp(loggingTimestamp); - // super.deliver(OUTPUT_PORT_NAME_RECORDS, record); - this.counter.incrementAndGet(); - } catch (final MonitoringRecordException ex) { - LOG.error("Failed to create record.", ex); - } - } - buffer.clear(); - } catch (final BufferUnderflowException ex) { - buffer.reset(); - // System.out.println("Underflow, remaining:" + buffer.remaining()); - buffer.compact(); - } - } - // System.out.println("Channel closing..."); - socketChannel.close(); - // END also loop this one? - } catch (final IOException ex) { - LOG.error("Error while reading", ex); - return false; - } finally { - if (null != serversocket) { - try { - serversocket.close(); - } catch (final IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to close TCP connection!", e); - } - } - } - } - return true; - } - - public void terminate(final boolean error) { - LOG.info("Shutdown of TCPReader requested."); - this.executorService.shutdown(); - } -} - -/** - * - * @author Jan Waller - * - * @since 1.8 - */ -class TCPStringReader extends Thread { - - private static final int MESSAGE_BUFFER_SIZE = 65535; - - private static final Log LOG = LogFactory.getLog(TCPStringReader.class); - - private final int port; - private final ILookup<String> stringRegistry; - - public TCPStringReader(final int port, final ILookup<String> stringRegistry) { - this.port = port; - this.stringRegistry = stringRegistry; - } - - @Override - public void run() { - ServerSocketChannel serversocket = null; - try { - serversocket = ServerSocketChannel.open(); - serversocket.socket().bind(new InetSocketAddress(this.port)); - if (LOG.isDebugEnabled()) { - LOG.debug("Listening on port " + this.port); - } - // BEGIN also loop this one? - final SocketChannel socketChannel = serversocket.accept(); - final ByteBuffer buffer = ByteBuffer.allocateDirect(MESSAGE_BUFFER_SIZE); - while (socketChannel.read(buffer) != -1) { - buffer.flip(); - try { - while (buffer.hasRemaining()) { - buffer.mark(); - RegistryRecord.registerRecordInRegistry(buffer, this.stringRegistry); - } - buffer.clear(); - } catch (final BufferUnderflowException ex) { - buffer.reset(); - buffer.compact(); - } - } - socketChannel.close(); - // END also loop this one? - } catch (final IOException ex) { - LOG.error("Error while reading", ex); - } finally { - if (null != serversocket) { - try { - serversocket.close(); - } catch (final IOException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Failed to close TCP connection!", e); - } - } - } - } - } - -} diff --git a/frameworks/Kieker/src/kieker/tcp/TestExperiment2.java b/frameworks/Kieker/src/kieker/tcp/TestExperiment2.java deleted file mode 100644 index 17ab72d..0000000 --- a/frameworks/Kieker/src/kieker/tcp/TestExperiment2.java +++ /dev/null @@ -1,83 +0,0 @@ -/*************************************************************************** - * Copyright 2014 Kieker Project (http://kieker-monitoring.net) - * - * Licensed 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. - ***************************************************************************/ - -package kieker.tcp; - -import java.util.concurrent.TimeUnit; - -import kieker.analysis.AnalysisController; -import kieker.analysis.IAnalysisController; -import kieker.analysis.exception.AnalysisConfigurationException; -import kieker.analysis.plugin.filter.flow.EventRecordTraceReconstructionFilter; -import kieker.analysis.plugin.filter.forward.AnalysisThroughputFilter; -import kieker.analysis.plugin.filter.forward.TeeFilter; -import kieker.analysis.plugin.reader.tcp.TCPReader; -import kieker.analysis.plugin.reader.timer.TimeReader; -import kieker.common.configuration.Configuration; -import kieker.common.logging.Log; -import kieker.common.logging.LogFactory; - -// Command-Line: -// java -javaagent:lib/kieker-1.10-SNAPSHOT_aspectj.jar -Dkieker.monitoring.writer=kieker.monitoring.writer.tcp.TCPWriter -Dkieker.monitoring.writer.tcp.TCPWriter.QueueFullBehavior=1 -jar dist\OverheadEvaluationMicrobenchmark.jar --recursiondepth 10 --totalthreads 1 --methodtime 0 --output-filename raw.csv --totalcalls 10000000 -/** - * @author Jan Waller - */ -public final class TestExperiment2 { - private static final Log LOG = LogFactory.getLog(TestExperiment2.class); - - private TestExperiment2() {} - - public static void main(final String[] args) throws IllegalStateException, AnalysisConfigurationException { - final IAnalysisController analysisController = new AnalysisController("TCPThroughput"); - TestExperiment2.createAndConnectPlugins(analysisController); - try { - analysisController.run(); - } catch (final AnalysisConfigurationException ex) { - TestExperiment2.LOG.error("Failed to start the example project.", ex); - } - } - - private static void createAndConnectPlugins(final IAnalysisController analysisController) throws IllegalStateException, AnalysisConfigurationException { - final Configuration readerConfig = new Configuration(); - // readerConfig.setProperty(TCPReader.CONFIG_PROPERTY_NAME_PORT1, 10333); - // readerConfig.setProperty(TCPReader.CONFIG_PROPERTY_NAME_PORT2, 10334); - final TCPReader reader = new TCPReader(readerConfig, analysisController); - - final Configuration timeConfig = new Configuration(); - final TimeReader timeReader = new TimeReader(timeConfig, analysisController); - - final Configuration configTraceRecon = new Configuration(); - configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_TIMEUNIT, TimeUnit.SECONDS.name()); - configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_MAX_TRACE_DURATION, "1"); - configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_MAX_TRACE_TIMEOUT, "1"); - final EventRecordTraceReconstructionFilter traceRecon = new EventRecordTraceReconstructionFilter(configTraceRecon, analysisController); - - analysisController.connect(reader, TCPReader.OUTPUT_PORT_NAME_RECORDS, traceRecon, EventRecordTraceReconstructionFilter.INPUT_PORT_NAME_TRACE_RECORDS); - analysisController.connect(timeReader, TimeReader.OUTPUT_PORT_NAME_TIMESTAMPS, traceRecon, EventRecordTraceReconstructionFilter.INPUT_PORT_NAME_TIME_EVENT); - - final Configuration counterConfig = new Configuration(); - final AnalysisThroughputFilter through = new AnalysisThroughputFilter(counterConfig, analysisController); - analysisController.connect(traceRecon, EventRecordTraceReconstructionFilter.OUTPUT_PORT_NAME_TRACE_VALID, through, - AnalysisThroughputFilter.INPUT_PORT_NAME_OBJECTS); - analysisController.connect(timeReader, TimeReader.OUTPUT_PORT_NAME_TIMESTAMPS, through, AnalysisThroughputFilter.INPUT_PORT_NAME_TIME); - - final Configuration confTeeFilter = new Configuration(); - confTeeFilter.setProperty(TeeFilter.CONFIG_PROPERTY_NAME_STREAM, TeeFilter.CONFIG_PROPERTY_VALUE_STREAM_STDOUT); - // confTeeFilter.setProperty(TeeFilter.CONFIG_PROPERTY_NAME_STREAM, TeeFilter.CONFIG_PROPERTY_VALUE_STREAM_NULL); - final TeeFilter teeFilter = new TeeFilter(confTeeFilter, analysisController); - analysisController.connect(through, AnalysisThroughputFilter.OUTPUT_PORT_NAME_THROUGHPUT, teeFilter, TeeFilter.INPUT_PORT_NAME_EVENTS); - } -} diff --git a/frameworks/Kieker/src/kieker/tcp/TestExperiment3.java b/frameworks/Kieker/src/kieker/tcp/TestExperiment3.java deleted file mode 100644 index fb0a031..0000000 --- a/frameworks/Kieker/src/kieker/tcp/TestExperiment3.java +++ /dev/null @@ -1,86 +0,0 @@ -/*************************************************************************** - * Copyright 2014 Kieker Project (http://kieker-monitoring.net) - * - * Licensed 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. - ***************************************************************************/ - -package kieker.tcp; - -import java.util.concurrent.TimeUnit; - -import kieker.analysis.AnalysisController; -import kieker.analysis.IAnalysisController; -import kieker.analysis.exception.AnalysisConfigurationException; -import kieker.analysis.plugin.filter.flow.EventRecordTraceReconstructionFilter; -import kieker.analysis.plugin.filter.flow.TraceAggregationFilter; -import kieker.analysis.plugin.filter.forward.TeeFilter; -import kieker.analysis.plugin.reader.tcp.TCPReader; -import kieker.analysis.plugin.reader.timer.TimeReader; -import kieker.common.configuration.Configuration; -import kieker.common.logging.Log; -import kieker.common.logging.LogFactory; - -// Command-Line: -// java -javaagent:lib/kieker-1.10-SNAPSHOT_aspectj.jar -Dkieker.monitoring.writer=kieker.monitoring.writer.tcp.TCPWriter -Dkieker.monitoring.writer.tcp.TCPWriter.QueueFullBehavior=1 -jar dist\OverheadEvaluationMicrobenchmark.jar --recursiondepth 10 --totalthreads 1 --methodtime 0 --output-filename raw.csv --totalcalls 10000000 -/** - * @author Jan Waller - */ -public final class TestExperiment3 { - private static final Log LOG = LogFactory.getLog(TestExperiment3.class); - - private TestExperiment3() {} - - public static void main(final String[] args) throws IllegalStateException, AnalysisConfigurationException { - final IAnalysisController analysisController = new AnalysisController("TCPThroughput"); - TestExperiment3.createAndConnectPlugins(analysisController); - try { - analysisController.run(); - } catch (final AnalysisConfigurationException ex) { - TestExperiment3.LOG.error("Failed to start the example project.", ex); - } - } - - private static void createAndConnectPlugins(final IAnalysisController analysisController) throws IllegalStateException, AnalysisConfigurationException { - final Configuration readerConfig = new Configuration(); - // readerConfig.setProperty(TCPReader.CONFIG_PROPERTY_NAME_PORT1, 10333); - // readerConfig.setProperty(TCPReader.CONFIG_PROPERTY_NAME_PORT2, 10334); - final TCPReader reader = new TCPReader(readerConfig, analysisController); - - final Configuration timeConfig = new Configuration(); - final TimeReader timeReader = new TimeReader(timeConfig, analysisController); - - final Configuration configTraceRecon = new Configuration(); - configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_TIMEUNIT, TimeUnit.SECONDS.name()); - configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_MAX_TRACE_DURATION, "1"); - configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_MAX_TRACE_TIMEOUT, "1"); - final EventRecordTraceReconstructionFilter traceRecon = new EventRecordTraceReconstructionFilter(configTraceRecon, analysisController); - - analysisController.connect(reader, TCPReader.OUTPUT_PORT_NAME_RECORDS, traceRecon, EventRecordTraceReconstructionFilter.INPUT_PORT_NAME_TRACE_RECORDS); - analysisController.connect(timeReader, TimeReader.OUTPUT_PORT_NAME_TIMESTAMPS, traceRecon, EventRecordTraceReconstructionFilter.INPUT_PORT_NAME_TIME_EVENT); - - final Configuration configTraceAggr = new Configuration(); - configTraceAggr.setProperty(TraceAggregationFilter.CONFIG_PROPERTY_NAME_TIMEUNIT, TimeUnit.SECONDS.name()); - configTraceAggr.setProperty(TraceAggregationFilter.CONFIG_PROPERTY_NAME_MAX_COLLECTION_DURATION, "1"); - final TraceAggregationFilter traceAggr = new TraceAggregationFilter(configTraceAggr, analysisController); - - analysisController.connect(traceRecon, EventRecordTraceReconstructionFilter.OUTPUT_PORT_NAME_TRACE_VALID, traceAggr, - TraceAggregationFilter.INPUT_PORT_NAME_TRACES); - analysisController.connect(timeReader, TimeReader.OUTPUT_PORT_NAME_TIMESTAMPS, traceAggr, TraceAggregationFilter.INPUT_PORT_NAME_TIME_EVENT); - - final Configuration confTeeFilter = new Configuration(); - confTeeFilter.setProperty(TeeFilter.CONFIG_PROPERTY_NAME_STREAM, TeeFilter.CONFIG_PROPERTY_VALUE_STREAM_STDOUT); - // confTeeFilter.setProperty(TeeFilter.CONFIG_PROPERTY_NAME_STREAM, TeeFilter.CONFIG_PROPERTY_VALUE_STREAM_NULL); - final TeeFilter teeFilter = new TeeFilter(confTeeFilter, analysisController); - analysisController.connect(traceAggr, TraceAggregationFilter.OUTPUT_PORT_NAME_TRACES, teeFilter, TeeFilter.INPUT_PORT_NAME_EVENTS); - } -} diff --git a/frameworks/Kieker/src/kieker/Logger.java b/frameworks/Kieker/src/main/java/moobench/kieker/Logger.java similarity index 87% rename from frameworks/Kieker/src/kieker/Logger.java rename to frameworks/Kieker/src/main/java/moobench/kieker/Logger.java index 5502935..1ade793 100644 --- a/frameworks/Kieker/src/kieker/Logger.java +++ b/frameworks/Kieker/src/main/java/moobench/kieker/Logger.java @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. ***************************************************************************/ - -package kieker; +package moobench.kieker; import java.io.IOException; -import mooBench.benchmark.Benchmark; +import moobench.benchmark.BenchmarkMain; /** * @author Jan Waller @@ -28,7 +27,7 @@ public class Logger implements Runnable { public void run() { try { java.util.logging.LogManager.getLogManager().readConfiguration( - Benchmark.class.getClassLoader().getResourceAsStream("META-INF/kieker.logging.properties")); + BenchmarkMain.class.getClassLoader().getResourceAsStream("META-INF/kieker.logging.properties")); } catch (final IOException ex) { java.util.logging.Logger.getAnonymousLogger().log(java.util.logging.Level.SEVERE, "Could not load default logging.properties file", ex); } diff --git a/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration1.java b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration1.java new file mode 100644 index 0000000..0729de7 --- /dev/null +++ b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration1.java @@ -0,0 +1,15 @@ +package moobench.kieker.tcp; + +import kieker.analysis.source.tcp.MultipleConnectionTcpSourceStage; +import kieker.analysisteetime.plugin.filter.forward.CountingFilter; +import teetime.framework.Configuration; + +public class TestConfiguration1 extends Configuration { + + public TestConfiguration1(int inputPort, int bufferSize) { + MultipleConnectionTcpSourceStage source = new MultipleConnectionTcpSourceStage(inputPort, bufferSize, null); + CountingFilter counting = new CountingFilter(); + + connectPorts(source.getOutputPort(), counting.getInputPort()); + } +} diff --git a/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration2.java b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration2.java new file mode 100644 index 0000000..b553900 --- /dev/null +++ b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration2.java @@ -0,0 +1,45 @@ +/** + * + */ +package moobench.kieker.tcp; + +import java.util.concurrent.TimeUnit; + +import kieker.analysis.source.tcp.MultipleConnectionTcpSourceStage; +import teetime.framework.Configuration; + +/** + * @author reiner + * + */ +public class TestConfiguration2 extends Configuration { + + public TestConfiguration2(int inputPort, int bufferSize) { + MultipleConnectionTcpSourceStage reader = new MultipleConnectionTcpSourceStage(inputPort, bufferSize, null); +/* + final Configuration timeConfig = new Configuration(); + final TimeReader timeReader = new TimeReader(timeConfig, analysisController); + + final Configuration configTraceRecon = new Configuration(); + configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_TIMEUNIT, TimeUnit.SECONDS.name()); + configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_MAX_TRACE_DURATION, "1"); + configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_MAX_TRACE_TIMEOUT, "1"); + final EventRecordTraceReconstructionFilter traceRecon = new EventRecordTraceReconstructionFilter(configTraceRecon, analysisController); + + analysisController.connect(reader, TCPReader.OUTPUT_PORT_NAME_RECORDS, traceRecon, EventRecordTraceReconstructionFilter.INPUT_PORT_NAME_TRACE_RECORDS); + analysisController.connect(timeReader, TimeReader.OUTPUT_PORT_NAME_TIMESTAMPS, traceRecon, EventRecordTraceReconstructionFilter.INPUT_PORT_NAME_TIME_EVENT); + + final Configuration counterConfig = new Configuration(); + final AnalysisThroughputFilter through = new AnalysisThroughputFilter(counterConfig, analysisController); + analysisController.connect(traceRecon, EventRecordTraceReconstructionFilter.OUTPUT_PORT_NAME_TRACE_VALID, through, + AnalysisThroughputFilter.INPUT_PORT_NAME_OBJECTS); + analysisController.connect(timeReader, TimeReader.OUTPUT_PORT_NAME_TIMESTAMPS, through, AnalysisThroughputFilter.INPUT_PORT_NAME_TIME); + + final Configuration confTeeFilter = new Configuration(); + confTeeFilter.setProperty(TeeFilter.CONFIG_PROPERTY_NAME_STREAM, TeeFilter.CONFIG_PROPERTY_VALUE_STREAM_STDOUT); + // confTeeFilter.setProperty(TeeFilter.CONFIG_PROPERTY_NAME_STREAM, TeeFilter.CONFIG_PROPERTY_VALUE_STREAM_NULL); + final TeeFilter teeFilter = new TeeFilter(confTeeFilter, analysisController); + analysisController.connect(through, AnalysisThroughputFilter.OUTPUT_PORT_NAME_THROUGHPUT, teeFilter, TeeFilter.INPUT_PORT_NAME_EVENTS);*/ + + } +} diff --git a/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration3.java b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration3.java new file mode 100644 index 0000000..a33a4d6 --- /dev/null +++ b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestConfiguration3.java @@ -0,0 +1,42 @@ +package moobench.kieker.tcp; + +import java.util.concurrent.TimeUnit; + +import kieker.analysis.source.tcp.MultipleConnectionTcpSourceStage; +import teetime.framework.Configuration; + +public class TestConfiguration3 extends Configuration { + + public TestConfiguration3(int inputPort, int bufferSize) { + MultipleConnectionTcpSourceStage source = new MultipleConnectionTcpSourceStage(inputPort, bufferSize, null); + + /* + final Configuration timeConfig = new Configuration(); + final TimeReader timeReader = new TimeReader(timeConfig, analysisController); + + final Configuration configTraceRecon = new Configuration(); + configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_TIMEUNIT, TimeUnit.SECONDS.name()); + configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_MAX_TRACE_DURATION, "1"); + configTraceRecon.setProperty(EventRecordTraceReconstructionFilter.CONFIG_PROPERTY_NAME_MAX_TRACE_TIMEOUT, "1"); + final EventRecordTraceReconstructionFilter traceRecon = new EventRecordTraceReconstructionFilter(configTraceRecon, analysisController); + + analysisController.connect(reader, TCPReader.OUTPUT_PORT_NAME_RECORDS, traceRecon, EventRecordTraceReconstructionFilter.INPUT_PORT_NAME_TRACE_RECORDS); + analysisController.connect(timeReader, TimeReader.OUTPUT_PORT_NAME_TIMESTAMPS, traceRecon, EventRecordTraceReconstructionFilter.INPUT_PORT_NAME_TIME_EVENT); + + final Configuration configTraceAggr = new Configuration(); + configTraceAggr.setProperty(TraceAggregationFilter.CONFIG_PROPERTY_NAME_TIMEUNIT, TimeUnit.SECONDS.name()); + configTraceAggr.setProperty(TraceAggregationFilter.CONFIG_PROPERTY_NAME_MAX_COLLECTION_DURATION, "1"); + final TraceAggregationFilter traceAggr = new TraceAggregationFilter(configTraceAggr, analysisController); + + analysisController.connect(traceRecon, EventRecordTraceReconstructionFilter.OUTPUT_PORT_NAME_TRACE_VALID, traceAggr, + TraceAggregationFilter.INPUT_PORT_NAME_TRACES); + analysisController.connect(timeReader, TimeReader.OUTPUT_PORT_NAME_TIMESTAMPS, traceAggr, TraceAggregationFilter.INPUT_PORT_NAME_TIME_EVENT); + + final Configuration confTeeFilter = new Configuration(); + confTeeFilter.setProperty(TeeFilter.CONFIG_PROPERTY_NAME_STREAM, TeeFilter.CONFIG_PROPERTY_VALUE_STREAM_STDOUT); + // confTeeFilter.setProperty(TeeFilter.CONFIG_PROPERTY_NAME_STREAM, TeeFilter.CONFIG_PROPERTY_VALUE_STREAM_NULL); + final TeeFilter teeFilter = new TeeFilter(confTeeFilter, analysisController); + analysisController.connect(traceAggr, TraceAggregationFilter.OUTPUT_PORT_NAME_TRACES, teeFilter, TeeFilter.INPUT_PORT_NAME_EVENTS); +*/ + } +} diff --git a/frameworks/Kieker/src/kieker/tcp/TestExperiment0.java b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment0.java similarity index 99% rename from frameworks/Kieker/src/kieker/tcp/TestExperiment0.java rename to frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment0.java index f4b174b..0460b57 100644 --- a/frameworks/Kieker/src/kieker/tcp/TestExperiment0.java +++ b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment0.java @@ -14,7 +14,7 @@ * limitations under the License. ***************************************************************************/ -package kieker.tcp; +package moobench.kieker.tcp; import java.io.IOException; import java.net.InetSocketAddress; diff --git a/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment1.java b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment1.java new file mode 100644 index 0000000..b4a09a8 --- /dev/null +++ b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment1.java @@ -0,0 +1,35 @@ +/*************************************************************************** + * Copyright 2014 Kieker Project (http://kieker-monitoring.net) + * + * Licensed 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. + ***************************************************************************/ + +package moobench.kieker.tcp; + +import teetime.framework.Execution; + +// Command-Line: +// java -javaagent:lib/kieker-1.10-SNAPSHOT_aspectj.jar -Dkieker.monitoring.writer=kieker.monitoring.writer.tcp.TCPWriter -Dkieker.monitoring.writer.tcp.TCPWriter.QueueFullBehavior=1 -jar dist\OverheadEvaluationMicrobenchmark.jar --recursiondepth 10 --totalthreads 1 --methodtime 0 --output-filename raw.csv --totalcalls 10000000 +/** + * @author Jan Waller + */ +public final class TestExperiment1 { + + private TestExperiment1() {} + + public static void main(final String[] args) { + TestConfiguration1 config = new TestConfiguration1(Integer.parseInt(args[0]), 8192); + Execution<TestConfiguration1> execution = new Execution<TestConfiguration1>(config); + execution.executeBlocking(); + } +} diff --git a/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment2.java b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment2.java new file mode 100644 index 0000000..663b038 --- /dev/null +++ b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment2.java @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright 2014 Kieker Project (http://kieker-monitoring.net) + * + * Licensed 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. + ***************************************************************************/ + +package moobench.kieker.tcp; + +import java.util.concurrent.TimeUnit; + +import teetime.framework.Execution; + +// Command-Line: +// java -javaagent:lib/kieker-1.10-SNAPSHOT_aspectj.jar -Dkieker.monitoring.writer=kieker.monitoring.writer.tcp.TCPWriter -Dkieker.monitoring.writer.tcp.TCPWriter.QueueFullBehavior=1 -jar dist\OverheadEvaluationMicrobenchmark.jar --recursiondepth 10 --totalthreads 1 --methodtime 0 --output-filename raw.csv --totalcalls 10000000 +/** + * @author Jan Waller + */ +public final class TestExperiment2 { + + private TestExperiment2() {} + + public static void main(final String[] args) { + TestConfiguration2 config = new TestConfiguration2(Integer.parseInt(args[0]), 8192); + Execution<TestConfiguration2> execution = new Execution<TestConfiguration2>(config); + execution.executeBlocking(); + } + +} diff --git a/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment3.java b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment3.java new file mode 100644 index 0000000..7a854fd --- /dev/null +++ b/frameworks/Kieker/src/main/java/moobench/kieker/tcp/TestExperiment3.java @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright 2014 Kieker Project (http://kieker-monitoring.net) + * + * Licensed 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. + ***************************************************************************/ + +package moobench.kieker.tcp; + +import java.util.concurrent.TimeUnit; + +import teetime.framework.Execution; + +// Command-Line: +// java -javaagent:lib/kieker-1.10-SNAPSHOT_aspectj.jar -Dkieker.monitoring.writer=kieker.monitoring.writer.tcp.TCPWriter -Dkieker.monitoring.writer.tcp.TCPWriter.QueueFullBehavior=1 -jar dist\OverheadEvaluationMicrobenchmark.jar --recursiondepth 10 --totalthreads 1 --methodtime 0 --output-filename raw.csv --totalcalls 10000000 +/** + * @author Jan Waller + */ +public final class TestExperiment3 { + + private TestExperiment3() {} + + public static void main(final String[] args) { + TestConfiguration3 config = new TestConfiguration3(Integer.parseInt(args[0]), 8192); + Execution<TestConfiguration3> execution = new Execution<TestConfiguration3>(config); + execution.executeBlocking(); + } + +} diff --git a/frameworks/SPASSmeter/build.gradle b/frameworks/SPASSmeter/build.gradle new file mode 100644 index 0000000..105b078 --- /dev/null +++ b/frameworks/SPASSmeter/build.gradle @@ -0,0 +1,8 @@ +plugins { + id 'java' + id 'java-library' +} + +dependencies { + +} diff --git a/frameworks/inspectIT/build.gradle b/frameworks/inspectIT/build.gradle new file mode 100644 index 0000000..105b078 --- /dev/null +++ b/frameworks/inspectIT/build.gradle @@ -0,0 +1,8 @@ +plugins { + id 'java' + id 'java-library' +} + +dependencies { + +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..62d4c053550b91381bbd28b1afc82d634bf73a8a GIT binary patch literal 58910 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ℜA_D?n* z*Df-)`R3(&r*CS?vy;c($e67PGE1;1-G5<;A@}E*oU$5AgEDWQ*|%?w&(tN4_5}yU zzZCyAcca{sm4<gWUhK9@e0#2RrRwCzPr94B(&yia6W`j`bUpltiT|?pioKljIXC)e zEB>F(@<FkKqs%EmJUuwzXl41mn8!8c_x7}Xwype}`Qh_y^U}V(OH4k7f7rgKP$F2* zQs=itn8gu+Z^c()*kld}|A_9ilTi^j@2*}EBAOZQ9v~KJ#dP0~@9A#0z>DTQOK*yQ zNqt~1@MUVeTWWmdf>q1Ui(jZRnla1qtHn;YNy|MyH3nWON?)+kCPMG~HP+f*NuT_6 z5(j(IR98%hGVGd}GIQ#|H#|*_>&|3;WB+^F-5}iWnQ6G5^ua%ArYp?)k{shV6p1t? zKUn6FAz|L1lo)@(z9+hEV}?jK=N6UbUxk~uD<9Z6FOKi>1-6i6&9p?xXUUe=5?HM^ zPP(^eYG1_J=VzlNcJQWel=F8ses|1mPI`}C0{6NFR}1e>cr7P$Xs+KIx1TmvKILIb z&B}jfIdM+!D3M5=@>!uoM)|s&ilD1~Y~7R?wmxGSwz+l<jv7-++1K~AOCJAx<q?aY z&|9Xj-O2|GRAeog)b{`UcEZilYmMe5Bda2jhx?8>95#@0-!R4Q%%o}0CLWUw@;%y+ zyTX}$+J&0TD?Z{}VpAJFmtHaSnySBV&4H~qx2#I~Gi~R8Ju%hmeS4m)D*D6Zbi=Y^ zn$CS4_lG>wKIgkG(A;3u9NoTgmBc!0{=6{0zV#P%?kp~udu6xzg0u}*&8CuT&OX>C z%b$>yBJ%q8G``2*R*PJexiR73vEK&KLd>&krf=N2e$B>omgu&^<Dph7o+{>u?vOaS z>Z)1Kw{E^7-pT2*W*4JndFp2_zAePY{%2L<DV7z9vi=us<}ENdytDIGX~20uw#Zla zP8_&ea6fa-!!>=@=O4*zeZM3${i90V+2mC_SNlJU*R81*T~p07mFpc>siw%PQ|{^4 z9@we#H?a0LuHxBtxBF$@6U&z;76h-dZPI&rY}1~A@4;&tEzfK%EY~Y2x*!_GX4sze zW6{~J$oZndwq0*s)-PO<_(r4e+)0}quXN@lXnC(&{+}PUx%cal#Iscl3=Fp!7#NhW zH}^bY>vbW`JlEcXT!##J+Wwz;`AkG`4_DmRq=T>5Y4NZ)UaY=*>W0SK6_<bJ$ki~& zd%X!sQ&5Tj^!)ti(t3u71@9NWR#f=Wxo*l88%3XGv**NH1}{o!j}@uYyqq)FQ}A40 zOG0V4YhYT`T-z@?@4p^Bvgn>L+r>}mrtA4RlXHWnNzL;(sCBs8N#a@t$Kn3HPqb2R z2kSkWWbmthmcK01K}XpqLQw^}+jXyQO}@N&FY|w1RG(Vrh&&48U|?ty!tK+%;*!Li z9N1Fqxe=8$BITn0|7|+1Gnw&HfRlK}?5Lb#{fAmDhn<`ZbA=QXTUeINeZx0fakKI3 zH#&_~0l914_r9K5H9x|2>5Uwxi^qODWbe(t7`E2k_O<-CVAtCGH1nHxbu<m<pZ|BR z{O`Tr`@aA7J@@zd!gj_rhwPsvGVA0`y0d43^z7Lp=6yY4OH^eh3LffcS!|TDq_U{T zeS7-{rFZdXwDli8TY5+4`7=IA&OJVE=5goF&iz~<9(Qo@?$kX(>ysvhpRVA2$N6xp z&#zqqapyPPQ+V84A-sOiPMPnIbbWq=&D*zDCUDPQ8N)rzvo8v~d;GNgRE79G-Q)>t zJs#NJ*%N-~w^Kzuhdjr_X2lv0H(|Ro((;L!>MAuM$E@z?U*@z|d-zz$&+A8v!%@Mj z5s49jS0ye?Hh<Zswqe2J4OK3^FTz@$OS7JuskUtS9J9M(5mRR0{FQL)qVDGFX3J*y zobCKlwq5vgs*l*#GtN~uxvPED18yhY{OEBfEV)fga^uyMpv}s)arbBWd;NKsWNPdD zYSq@)RhKv$z5Hh`ob}OzUvNfY5{H#@Rn}3j#-~fSY?-a;ZpyRl_LAAVHoHDpH|r(` z_uPQ2Y1Xe*<+GMu-CE81XKh%|o_!mf&9|;ANebBfeMPfO`zb!Y({Wd?RnCk3@>!F0 zO4((Vk8QKOGEMeoO`E(XW0~`BPa)Tpi<WJ(*wOWF;#R)Qi;0}`OH%#U$Eajj-u$^l z#ivZ@q^8WzBpz|c#Ycm^ZkOlTOI@9GQ{pt|Rk>?9{WbemW^N3bZJH!CO-lI~<Dn=o z+a+5?lYI-<q_mg07<2TO{NVDpdMiDVZ;|T3(AIU<)6VQ%zpJAxc%k(+f%kvp+<W=T zS9wl%J+xe9&ZG|vk=ChIUWYOpPZysnQQlSjVS`xe-Op8DcC56@oP8yCuIGewhE#Wx z+}pEWx<sAqT(hplwy1yVw#BoaFNw*SHKWI2^W7e)u&xDHR$4lT`5am<YSUrJdb@CP zlkbf+3EbxA5BG9yOPbvjwng(sBhSfG;Y$-_cC$<qaW09DGEbVdHi0Q!#HMAl$aS^s zh=b`B`<Um4elSoIt?8S6{_`#I53a27ho+0xu*OgQV9FYQ+>-VF0drNGMGvAYLJn>> z)O={owXgd<C(Eo!tKMq-u&Z-$d&=OjYjxy9e$_u72m5EfR{ycGWxnPQ%esXRZ0c4% z2(R!t`1r@xru!TI-B<FPk$IWtY+~6V`N}(+`X??>|6t9zKl}sxpTL8Ye@t$&f2{8k z!!)C1MVNN(kyXB@SNhG~{`zE=*Mh9$i~LMDTXvb6rq0w=`MSR5!TyKux#k^Oa^O<t z`_kpU?*19UPB+6#TIRla@^rJRcBcNZo&!@iH@Q9d<?VAZ=ECNs-KWYDtpYC2jLRrD z(TbTi_w%Iez<JZB#l>hYG|S3f_4wJk18tM0ZcFK%6F9%dG)Cq5antnar<Q;F<glo6 z`m76Gn+txKCEQe-I`P;nq15tYL1NF2NEGShdp@`|D=2mUj=JfuS8kKJ5L3J|kM--6 z^yf~SieD$3GP=~a&AYVigkhG+s--U$MR|sY)|?9ucxd=6VCLqm*^#-2bF#QCf0|g{ z3q2EUHEn5Sck;~kH}jG;-50OEv;1b+Kh}-ie$OuaG%=l+{x$2`p2~BxxD_|9XyJ1T znv~A=u(D8dNkBuhp`M1wnN-y){`bR$?uYK(=C{4j_aXDbZ9j6SSYMl!UYhYzqCDc` z4(@AA1?l=TZXS@`x5A*SCGqHT-{{lJa%b(%d~4aBv&UoZ?6L?AGt)i0P9(P;c&N~# z@m=%&_lPf>bi7X2bgZi`+uS`P-A>NwSIEQFt4`iOFY2;rV%wFF>19*0X5TN_J%`bJ z17mNoVZwrvpL(IPd#fh>mpfH`>1@mOs%@#?Rc}n{|KY7!X~`-baq!sx-;!^;7BQDj z(lPbp46}<}^6ZuCKIJ{y%e|!^s)k&i?#F$?jzwGRhbBwFe%0HTn@_xb>HFl{7oDQ& zD)Woxi~8%VKh!+RTYiz@ltN&AZ0uhNm)OG+r(Q`Nf3TYS_wfhox!I2itl(xpF0e+r z{R>0jw1;U~%}4mx9MQcJc2UaHfqfT4`H@*K91r?4-BPyQ7cH1zoBAoT<=1ODmq@nH z=bYZjyYDm)HkuK?vtbsGSl{K{)5B^dW6Zj~ew7UATQpOQMZZeATdkln{V<DIzmiMr z)s>ecoc@YRwsh8I&R5^^$<E`S@Q2@Km+#m&rpBIjH?&#Jd3w1|#>e)*k%37};c1@Q z>y?_0@vKu@#ItJe+3bj#8})4GKPtZYz9jbc^vxAa+EI7zKIhuPa;VXGhhKuo?8=h8 z3!bO0P>oo!q-{z|bBWLSS!)&*6fkYARsUx_bE?dV1$xa@*WB%I<($ZyQkf;~|6toR zhlwvZI=|?oJe;b%ccs2{u3o^5<J-D)m0DLX=Qz|jN7n9>yDe)A|MRw#mD#$ztJOBN zJ=(bK{M<QK-KBqRb|uM}`#5zpD=AL;V)(w?u+)5A;s5r)=Bq95O<R_4eX)@Lcdd!E z%AVt#_mx{dJ#Kk#&3RXy^Zs(qyZu7@<dx6ZdakIGdYi<VC-%Cq`$ikzM%ma$3T53a z-zF`~OI+-Jr{DIGOx0248|vp4$J;bAeiZrEUH_<IM?-Y1k9?EQujz^A-vpZcgZ#cu zDziVi?s%LOtLLS<FB5Ya-AcuNn?5T1a(Uf>jvdpBvh6?0iGP2<5c%ft<wZjJ2OK9A z$?>jx!jQ=<vgrG_JZ1kCTQ2eZWcudG;rXJDjr-Ysk1|WALl0PWrU^_HsAgN+u4?j^ zoBdxeN1&s!nLVdf$i}Ic^xiF%RmziUDza$)y4)*m{UgB?e*@LFTZ+@;jwf!HZ+rMo zHDS?Yx2apUG2V+eU;EABpFC=-<Oa_ql^P}n21z!YL&l!aRtc1L&PYwphBU>dP66*u zXuF@eJ$Bb!C*3-QMK#{hTG3py1dd90_Nck)8~A?6i)h=l;qQsO)&G?9cU*8;bn%F{ z{-3~O#+$vPy?9N0&!4$D_q*l$n=|j)*Vq4H3OJ<9T=*n4!Y@GM#0Q6E+E!gfF{Tq7 zJdaB?2Y&srPdm;mt0{3y&5`@Xr!yn;Wx{QiakJkkygl!R*uL|tw<rm(DX83=^>&NR z^0=j;RXe&4)`WhKzEirLueEl~rClGk#k~7{DE-EnxRB?kc-LpKs;%Ld%QtIHZ=KQ_ zCw2AWHmTnsDQn(bIr_RR*S{kF=e*T1raAAzc04~}vuDNib3U)@Zg0~}ym4aQ`+^y- zKC1iO&9qIO@xGZSW0g}{bUR<D%(AA3KSUo|viIFc??@|tFA-#|n<t<DIqk-jgQ4o& ztB)!<D^{oONO83j+ubmUC5MOcg}qez0#nXgGEyb~SX9s73aTwNO1*R=bBk^CiA{Hz zw<#&A<vp6#85m=nsFZrh;nES2cdsJSBX%uP78c&2d)T?H<ofN|dzBNnOQ`+t51bux zkY{foXVpig6CUg)r#-Aq)HKw~7YKXZv@)5+c+CGudE`IoFXz2X{S5WqZ{UnszEg6| zA>N|~DU+KyD$N=UO8W$Mbe>>yKBSi#D0O_rACJ19B2oJax?W7@Q*%~5ux#N*NtGKq zZa3#RontZbdBnFMP3YVeA2aEN^0q%WoGF%ix;NyX_Lln>w)$UKq+X(U>v8GE<Jnp) z_ZQdmOnhQIP41vcC~rmBiSCJSZ+OO^e{4HPB2BgZNb!vQ3TnoG`Exc@Fm^K^xwyLX zeR<g)?SFkIQXfqb(l0gJ9ezennEm&hP{Z~uw`zZ-2)3BLl1EL(Ps*4I7K<=2=;<;r zDB$QuK$0;e<*tq7tO>b#)n0w`p2P~B&K83lJ`V-$M0cj7$pR`8OsYD(S6+F4n$&Yf z=>8r<&e$z$MYpb98<ll2Y;Ej|rnM_nGPG{pii)0|m7BeG_g(SbwYTc(miqpGzHjD9 zl}e5uzkjs;zPJ1Po#OMK?4Qr8e%}6n=X(i3-G}?xGxeW)2P>SFyyP=+S%J)~m6t?L zKHs7+waDY~OSwn$Z6uZ`oS(39=A|=SpK|PiXBA9%{^5>-?1RlqW-c!*oUrUe&BFKv zg`N%G%_ZW~Gh^hIyo?cCvU_JxmDs81se5!URTNG*B*XPdC{AjLRh-)V(@P^2&z|~N z(sQ2ggI4eA)QZvx_fBUo`8<bV{nY0>9qZVyv+M|Sd*$-0)G0!KiBg>WgU?TPIzDbw zSo@?`YQFrE&<MV{y_a$(E%W@5Gi_xw(;vT=H&+#IK6aaFkL>~LCCTX%vVO*1+QRa( z^4`*qdA;{_*Nd~ftf}*#VD_n1DqdvC*+aF;(u{di`^_@LvhK(&d7G1UNAQW?yGd$7 zOXglGE}T$StZ|_FiR9F@)CtKl`~^xU?$(^N*k+-rb(7KW<mVv474DDkDU^1G?%t7a zv-e!}(#rM6-g5`_%wAHtU!cz6@oAHNHXhS1#2u2K!YMD5YA>_I{0MLCr9B73GyVwn zu1~on{mAonhuiC2XSUhCGR})C4OE_KGTCQg>DSlU+syNJ7sNV$-nN!^>+S8PIeEJZ zyw7gq^<nK5m!2*a8mN3P@@h`>#ER!x%Q#CpABt};m$*1Z@<FZ7zl=qjFK?NVW}>#{ z+$z7*8U3?DZKqwln;R9{n<Ze({I+vmg-PNT<FjSTIT6$4ribq0-MyMk=~&d_LzU}p zx9ILPnPGDGO>XzHNfW)#ex0}?^76GbwaK%4b}UR;UGzAh{t#!v^LXJ-_cvR8-fLEJ z@4Xi_d2)B`uI7``(=*Ixs+qbyN(<JymKAlIho_5ODA%o|J<;`v_1%|ScPo9k<8ytg zY`pWYgxRT5+ji<r+A=e2XV!+xm4_C}PCPdy^~OY(n$nezzj!S2%28UEaauNA%QiLa z!V1~b(G#ytsmb5I$VXWATjAw(xAtviRB7F*ayItZq^H`mf(@7bS+QcDUV6ae)fets z?3$f<({rs&{u!M$YfheetrQlvB5`i%)*tIUw$~h<cA)d7?&V2R@x0p;Ht34BRu;3& zi#D3%y)ycX!I7tI39C)7UR2z0=63AqCohevFUmLOTVH9aG-Nrc)9!dF$2(GR_xdd1 z3!EA2x=UtxO7F3eWokb3W)<(pcT;+&`Y5YiympKIz4W$&CVX#XIcF^EowzE@Q>ia+ zTkkg8**$r!#=Yw={#Yzk8~M23(0A{ZElRSrJH_tI@?eO3-hZiT&82k}o{vl7^75KE zTz4i!q^sRt<FWm5a(?xZrfrjD|4H<RnYvApY~p*(+bO|gUYc^?OKEzOnoZWDSre1i z$FBW&y#1<A`+6a5&2zDFMqwK#YxSMDmehCo0n6gEev*N#QwvYJoXRo|b?7m#-hI~W zc22l*<BDd_6;fr#gV(*XbL93=e=Fy?>Y{SQ63a`H=5MC79u=S4a$O>uLBsR%y7#Q# zatt4cUG8$7<k`t^<UvMWfQkPG3*FoA8&2ii&ysrUXXJb9ZReD^M^{Hx)gJ1S+_siu zPoRqZhnIP-O6LuqiD@fl?lcqaw3@S_^O9sTXUY*7LB83W19w}!t~Xt**r&QS#Jp#o zx6whypjag_<3}C#vM!w3vZYe-+>_lVSt}RjBwx519JGr&OLdZO8$*7~Zb?(syHR@I z7#B|SS^1VV=#ln?YpkU@!Uyb<w@1(W!0=A$uautO(eG{xKF(ZMIPEp#e97%=_pK40 z(rCDqD{@Voo66dQ%r|8e4^B$lWVt-vXz_+Fj!j)fGp-&FHZ-1n%hpRLf4AoE?rr9i zwYrb3d*?98e&I)T#;e<0%H#c(B}GL%nsx9_YViWL&6OfEYyu4vF9a-`yFKHg(lWp6 zYxOqk|EpJ9z2~0mC7o$$CpU<kcH#QYYp&e-TI;5j=HZN;22sVodWv4J;8`!K{=D>3 z&g6$%gDOJj@vV<NJo)^zlkaU>PcEOG`MGL3-}+5nVUe}BJWlW~|CkxpEk1YKt{Jj9 zVUqVcJAGL91)M0U>XEztviwW+T)748rByTIF21b(vcWI>f_up?f!c`Wby62zO6}w0 zo*#BqYx275FST|>E!WPRf6V;FAI*E~KQI63)@!dU&t9^xGymGp%{9hZC$>BMPD=b{ zIXC}d^g^d~Z5`jA@tRK6s43akYu~@%yzE)dq=JTZHP-cx&-Fh|FZpK_zx=b~Kdz$w zYRN?(!%P23)yF<}u4zAa|3SW2@$z%+Ki%fOUnD+L&&vO#^f_J8L)=}HxevYNG?wgB ze`BB(cDv)qVYfZ}DPr5Mw=CJ*`taA6IO%P|5BX9)ZMfN;Yk5mNZqCxz(H&aJ5j)PV z6<-|veD_bex%~zE&oS4qUuIPoQQBK3<gIdO<97ANbM8Omdf#8JoUs4smXA-Qx?l5n z&qyof-+hMZ`R|`I{N^veU0T;5f92<G1I_Zc6E>+|T2@qTaq*#<>7B#_JKq*}JwEzT ztl{=lwX`p-yL-IP7Oc)Zc6giM>uE{~cZ4_Y785&u_2q%C*0*|x-ICkHcU=3&edul& zlknSp247xG-YU}(woGxCfh}Ki+fpVj_elY_g<c<g`qoG_Cqh7XE_<Wi)|jfQ9f!S+ zB*@?PQavi{XSgjug!{SJj>IeJS06q~DYTg!a5yOT)P&1(zotg-@>>%Y$2hy7SL@p` zo)>>)_X&PIYp`$IvPWeqX=$$oICr%Ni1MW0mpX0qONI6IpV+Fv=kGrrwyKZ6C)ddQ zlC`rlAzNi$UvlCH<`72pRSVn}SQl%3*jjp2NTbq5d%FJhpY0u{1(hMsk4rrK-NI0} zsyg+!NYTwba}DR#AMxi}ynM;ej~q)kO`U(vzuR?Bl7Hu>`6(yd!V0YZhnz^;Un;o# z<N1=hw)%CSH&3$eKK5+J7S2<zgjQzk?vk0Zv*V!8T<LdmdL@TtIagch{CqAhWxxFM z=SLE{6JsRYk1qenZMFY|e&(M|=hlB%ZS{Xred|NH<#tzoUjHLKxBm2gXU|trf-k?M z|J!@6Ucmj|#Q#$^eweYz_xW{|uYV)&*c5LOHtS#UeA&}w5AP^${2zZrw*Kl%`7i!+ z{~wEI;_{#KXQtSkB-xftmc}{<dnOg0d?|m-*e-nCsjA7D$D(B#iVG)2`#meTbuCr3 zYR=>PM<!n7$@*gW(eO~9<yO7RBHM#P<}xgKqnDX6VfpNXck)~Vn965;^LVR1eM;Xx zv6*IF8qXIcdUd|O>hvR}EPdC9l68&uuFds2sIl>CrN-)eA6UHwN^ZWMs(r6)q1mOZ z<!k0tv%WOHq`pP!`sQheSj)m21li4Zui`tzxx+2yi^WqW5gC5gscaw3GIrc}`fI@# zmFw1V3)aMb*t&aLNM29S-M4MJTg9zpPW-&Js8glt&)b(BAEr$?RT}i~gwD!!_Q!8` z@*dvq(5lM2PU6#Jo2!}SnmMOuC0Sc?o!3|??LB|5#VU)9WqD5+ttU=&?pAr7eAmox z?LWS)$}1*cmPp%uJnBa1pPaM%BC@^}#~ii#`gyLo<W26^RS!-Yik<#-Q}<1_FsHO) zLP@@p;<X&<X}WSVRG!8yp4hcmV}qI0i<xihw2fs{BWtHEIX`9b3IAB}{gs@r1Wy*K z>TR3S&GY=<p_6{5YfrkEq|O$4zj)b`W8F7jr~D}_%G`QyXV)oqmg6e~J=dMSvTeii zi+nC~OFvaR>ljKNx+3|}MP_T}m5FItou^wnyV{mSL>)O>dga603D=Tca<0hU;0eij zmhx%Q92V10Vx_ZwKW$l4e(XcQuW8;@%tBjxUuk8Z%~Y&B(>i0x3E!Ew56_v!yL*-w zkMN~VjnB44(FIlEr{{()3kX_%Bbe*Tnb7DLE!RbgzD{}}6Y2eJ;jBK(nfczk8q#Og zdwH)rS5Q=zaWmqHUO{#7H}@5D8n0^2HdU*daE<q5{Y=xM%$VyJ1RB%cKkE}t*yVWF zNllh#XWZ#lucE!CpPX`nrcb;xWy6_YD<qqv1-KtSPFp|spUm6&IZPK5^qzBFl)wEr zrl`GbqUp0wtF^+f3tq2QZ`!b){dTu!afbd>p^5!YUl@1w%+Na?E>}B&>&ZFB_pC*X z3+IJjvirKHYu&NWJQw1e<z0Up*2MDh#o0Wc%6nnQCP%JqB0cAqyR&)NI|-jU)juID ztgz)z>QwiPM~Pbx9lz+OZhvd%49R7hC1NQv+&8b3$p8E@s%MI&%}e1go=RWUj5byY zul#gn_KByC?@LQ;t6XL+7E$3nzxC-~lT6`RCw)`DUvSy;B)r=BUY*v8Zzmu3WZC~x zZ~4<~vUI7=6aJrCr?lBuY?!~y&cn65Z_;KFt7(nJtSM`kNNy3Bq#sn2R}gmk)Xr&n z3;Z3G<kv3x`z5o0^ODgn!Eav^@+529^4ijj7d%gYS-fDDxA9A{JwIQDo%xpZEO$op z;~k6n@AvLwaQi0iW9_xjx7lRx(wc@elghA)&+3=AGhN;1lz(rn$!4P`ub0o%-qU(7 zy6s<-;HOHig-_NrJMUlhX8BEa&-LF<d!P94;A%fN@~!NWg3}CVSAMGu`@#KJ@%_fz znSpk^t$SMkEtR+MDqg*H!ZrW&%KXJ274JWB{cDn+enLI=sP*~}pARlnPucmi-06g8 ziP>Ck#`8<1zJAfz{C0uU7TJK+!XknW&y#jk@Xz%OjB+rPFzTxmTf0ytEi$D4Ih$9Y z@Yf4|ua<_rTAatQrT-qc!#?>9uUk9y!`0q5cycpL*1sU0I7gtOu5%wxaM|O(3Os8s z>P7j*A6&5`ul}0p@0Y6$Ob&6`#xGv4eRKU1=MwgmyhWd1NI!UV^i}rD*(K^fI3uP{ zG-KIT*ZVCiWXZ)?sk>*T?mB-_I~%wD;=}{>8uIt0T7O!cy}sg|?<|8uQ~#PwXnQ75 z@yq3(QN@MpA(i^N304llTwZ&=2WNIKU-VOBs_fEF)`mfiXNtAkwA}eC-z{yeWa;3V z)gN^AyW^G&k%>Gy`+`p@?3>~L_(B~^RXk_!cf|+m*aX%uyeeVKFLsxwI;KTnSJ=zd zDrau3aXvWZ>g~WAX8bXFi>hDR-FRaYQ75oC?w8oH($q-F-SWvvyFH&+`X%=E`P%z^ zPS`7$R>@#xk@iz@nuz<=P&*&fR8i(FOKwGLD(?EC7R9qg?{?&dm|(7H=G!YSZd|nU zX!y-LOjo)NUESvxbyMgQ?}eNEGUpzhzgTHMZTG}u$}g53xS+Vpb77k1ymV&ctp`qQ z)k^vMgYVMzh4cBZXuq_snEWMp`c`LI+a*Cu_IU1iwsQOXRU7QqOw#zz%~NdpN6vOm zY0bQ@hrP{PxB|m<Gc&(3Ml~OwrIxXGOVFIkoL1qU)_u1#`&b?csdJpSbf|Lm*ggH) zvx&kr`e8j~@2(&GFThjBF7lVnm$^Zl`Os>GDBXMJ3@wt+^_JC$vPo%7zxe&7pa#Rq zO<j3D);0|@A3fW%rg-kW-xrm+rcX}i@bo#&a?G%|uED;oGmZO#?M=p~NuJC5AN^1M zvSV}ZfrdKOU(Pqo&e=NLJKP*{B`EGgALFW<M|_(@Za>;T|5cO?>+1(!o2q`utc$;I z<M7<FvWEGSMNz<E#wdFa>1ei>f5d*~$t>_?z7o>AXP@M@drZ>5e!rZnd$qBBrN$D` zoYEv!k&JiCpUpkdpY$l#mpyaY;WGBPjlnWY%fAM9m%I_;Z`~N4(Y!@k=6-B}qy1j@ zgbsK6*c<-hvTbIq92-_=?5?`kpz`QIfw-@0wfq`ej^B6t=YE#ZkYi!l?|Zc&Qa53% zu)!{lh?~s$F>dw;{-_^(8OZV?`NPS{558G6{9*alE1wu&!FAxTVcI{J$}Q3bcRTOC z;Oz1IAlm#-bImo^%?_oK*J8Y)UuFhWZ@l;OOYkqrnquCJ`3vVS&bPPu&11Xzz`p=7 zX8x5M+#I=i{yH`86<ATF$NjB}i=}Ntp2FkgKUXtDR$u%qm3w7Ezzd7BZu1!q&h~b3 z+9IoBt=@9*8*7zetV_v5@1(4%#=<F4?-y;W%gWc$H~76$`F;13&vKt+P8}<26#6dN z@vnHs_s9c(EmM0|^0jY~vhrOrJ>*Q+2}Y-?d1^vWPQKTE8QOnHVAA`rX{!yQJKUeE zoxc?+dV}xz6itV)Gf_+~d=tXAU7LO4xn)T!yW$TakLkSKCgDfFdvEx2I^u`uk!!0z z9MzwgR^PhzooJL({Ry`O!xeEyXNWVM3%)&tz4%%4r|VvgQzPxyEV-{?-@zn&;&cA2 z6&Ld>ugy-Fq`qH#sdvlr4Le*eeQmy?derfV<ENvW4!@ZwtJXAKgSpI5J?#<u3XdtP zC-k#idA&TZ<<RBk63#~_vLp@798NNB3e;`gb7?BqPxco<oh#=xn;h(1H*dnX0|yuS zpIo%}l4L;sLWWNpr|TU!m+xrRo%5CFkb02MyTf{0^s^7BHT1sFm-s8~yX?Q?x;oio zKiPY}`&+gDn|{ynKhyI1=Ia8g5j%JV`GmjNsmwWj!#RAz^luL<b?05*=r38V{l=*O z9_!`*f?~TFc3++U!nC5sD67XlS=Y1XdU|iI?O)Tqmt*-QS-xC<czPkXlEQz!m3vN! zvSt2Xc2a6@pM|wwsMOK631M4h=A7o(Wm?r7pd(W``Pft5gRl4LbaDksN;N&NS)7*C zdB$#&Y|<ZQwSsSgH?vsR9sPNuh}rk)iWh0y)_l0<Bdo0zy7zi{!3$G{VzW)b=Rd@) z@QUD@F#mY4-D{J{>I<W0`h2#qPd~4JE^3j)w|&l$izGtNWoMl)&(h&nh<5qE{MEX{ zTE{;1dFPg#FVuRHxKN$_!P>`}3tt<0>#UtRH94Q3C;VF7)+0QsPB#=An`H$}e)->$ zl#<a+buUYwE0fT4c`m~`rLYjYljq;9DQ!QH*n6__P2tQp_FGTJIh>vuGuJPoF7(XK z^JPMl>{m~{f03)^&xgI-^6wX3ej@y!Fw;1{u~bEuEg@}AvQ2xerRDNf4%31e=FHio z#$auo>f6w)b@_QzjZMPiXXk9br{23YcmC-@^$mxFD;CW*yfODXXOCm0gXxRL*Wb0z zR2LN8@P6<7#!vD2ea3msr}FRAqwR3|u;1!iJ`)3j2`dAGJoW)jpZs+AZl>1B+4+|e zM2`RGpB|c*-1E@khFY<fc&z!JZbL&AZ;ua?HY98+KYwcSy3JeGi1fxE^<U_g{)pSY zLH<<5ydcRwQ}4@{pBJ6`U#|D^y}f-sW5xnWcb@G@JDP4Ah6MC3Zrf#2zGSEN*=<ar z2m6|0+g_Z!A)v=>oe)ux7SZ;5j$)AIif=D2Z~EP&c-K(pW0sAD$T>TElb0zwle6!< zDLg)*`oF;=IZ5TVq~m2Jq2(3#MP9MD^S2)gwBELkd-+KLv)s9g;V)%Ae~&TUxpZ~x zbwi!KnvJI%dfZ~Za}@LOtXy|`Yq|c<3+j3vg{#kRFkXG#>XBdgoSxRDooS`d9<@H# zbxu{f^`b>lUgY=%jw?CanL`&VPq*GQJ6EY<rKr|ghx}z1Zzpw>zumaF)7DvR>WnX0 z(Z^IKIw^OuOyYW{S}4yiV&n5ju*g&7L&PlgOE#*03D+g3o%^w#zrWRub6w07p{Fqu zlV^N<UnjFO$wB<vj73G0y?CN)os|nS4Vw5@OnAe3+~n-SJ2S<at8Ugj6Dik!|1ZX; z?$)c~aE;6N1(;1|-Aldc_bYhO7Qe)aIkU>DIW96E$+ka`b@V+)?ZQ|N?-X%CwQ5np zHIuyLB=etFPL2}$5EeA`Sf}WdnzOa>#<9QKE~p>buM}hN>cZ8Y-qIZqu;}Zro`Nc^ zIm;%83Z1DA^m!J2z;ynF&zv(k6%7?#?q9Q;pFE{=qo-oDanG446Bo*OrT1((9`RXH z?W*j;{IWwHo^F|MMYumt;R;-}B<#D!R?iz#CVkZ`+S<pf->$RnveuveIUi3veekMl zdBC%sT7~5rO9TV%s^$HOzdOzR_H6XD>gBawy_b=J;XM-rg9Y}q8jx6$;aFUpnwyl9 zTBPEWpPZQEl383*l$lgol9`_e8Kj>Yc-!l+gMjVqCB17uioGvqmCq7oK5FhdLCjG@ zOQUID?(L;{y`DFhb=5CT5UlyY{70j(Ec(bQg?(qv%$#Xloc8_g->0GujHe@)7|d;K zmds6yJ+nI^p&)zH)R<FhhYNNd%&$~<{J^0tX?eJo=g|rGrcU(vCNZt}ukYWCzjF?1 z9y2{?5HxL~Mb`b07OTfoCm7XPuKV<1j`qqz{g*1?n~oZ!WvNCjPgy$mghkQ^zQrCZ zl1@bHI_lnj8gaFG*Q2cgEahG1vz=JgZFb&T{)?A4INQGM0&iWcN__CMIT!Ez`X0Uc ziu?Knf{mAVtX;K;`_Der=vmJdn_c;t3v8D>+!c|e@h4u6(@@Jv?rQU6FXs?pHtXf_ zg-_RKMlALBxp+S6!&bJg8r_aPyl%fXrLc3x2DJOusr=`ecK^kJQ~6~H_EM|TGx#Ds zw>fUf=21Q(kQ%nj<WO=$=a-5!rM(vx-8f#6@9PkEJ?N);1poZQm(^CDaae!*g7gW4 zkJ>l?`R)7Pnv;0xhGx&C>&vZXD96r3Teh|3c}ayiI|IW+J_ZIgBBB@?p<yrUrLT(G zCVNX&+Qcoo!D&_&FvlUqbK5Ki-`O*!+%W1quqihG3TJ}bC6{?FvkW(@lx2EnUUvFE zZC&O|r|@0fVoOA}FFC#apRexzd)CI&aumgXEcpJede{3q#na25|NZ^e{613w*Z)Zc z_SdWpxO@+V#!U9m`WW!cQ9SX(H#Yrwf{9)eHk`8-^DdL%JAYlZW5>bUvu$!Zf9z;! zt_VA%{=t)Teo||ojrg(Usy6-SJx)B_taDf7qvbq%{X`D^4<8nF=y&``l8B#FAQI2_ zSbNQ%P`Q1_9OBboN-M>2J)W&or`?m^{!y0m{?YF<j;uA<Cx49p#|K?OeQpbb<R?>u zqBiFQpSIkV_JZk2&$`vmLOeI>Too$#ap=&`FK52o`t<0_p<73HzWH+N(Iuy}Z%qv+ z&V)YQHAzde%5bX(L)FJM4eK<Wx97NS51%q=G1rTE@iVGRs<Kwrt=gTT)jDZc&dO)5 zi_b{O^`tG4yXd9m*rH|<yZJn4Mt|=*4h|nl)}YrjFP4;E(|jIM?0Ir($hPxO!bO4~ zZ{07s;ks#(tx@ufqf^qgN)LyanS~geuD|j6`N`ErnX^(}IOMF)+;%NE<n7*%5#3u4 zRo$6=^0s!=MMKeRw${Jah4t@Oeju~?Po4;)Zeo;_h`>3`X;!NX6b`dCeLdoL+2924 z<><~o>}zXYPTHoJp!e<Eo4x$@(J65yXD+!OjZ*JSdg1wf>xN683c@3|>MUKcZ0n+| zn@nxCs@`X<m!;(|-L(6^+TVn{)6ZVz?6%Q#P>}y!zR)lK*;QV9JH^wcj$&fDs`a|7 zbAGg5N?w)vc$d}Q%+<S|w%IP&eNjlm%Bd~sMR=3=VZr;tv0H;rbI+`GI`A;o%=_!2 zdl%I{@M<v&+KVU%zEe>>>wDtFKgO(>4u<D5`1GXuW`<Wz?yC2X?ETCsDO}-kOmdFs zM`g*(KM}_!S9l%MdX{R_rE~Y~-4jN2P2nj|0vANzJCk(jq8IDcDIbHc{gkZpbM!p< zgLS>y2XD#!NiRe9C_T9HTfgeqkF6c|PyEoWQ-Ac`=$V1PxZUi!fFtrLe*{G(*FW?( z`qy)v^~=sTr&?yty3!?iH>}&|EpONihpCxYS!8ko8JXCmcXRjUWv7;2pYI&p7Odq` zdbn?0@Ig1z+QS<c$DQmk{+3%byJi0aU&-4)R`=}Rc>8va-mkno?iac5<{I5QB)dv@ zzviX6r7QUR#7%;a+)w?}ENt3XA9S;*bxvoHsGF(ws~6Wx9<zOXn`>b_efO$oZ*8Ny z>sHRM=>I;0@3`A+?ym{K%yUYz*Xv)~^kDYXoApZPmzAtqwefq&-@ieR)6%4^?PRiF zoz-m!+q2u{?U~0f^lkXQZ?W0G`||y}N?w^=MJEF~c4cUWUr7xXE?DyQY`%-ny}fF8 z{$Jj?XWgX2{Szt|)fD|_czgTTp*!|_-ideg7X9b8lx97uwj<%qCzah|T0gEiZS2{8 zS^o4EpM*VE(-&;qyd_V{d`J8)!PiU787Jzmm|Yw$v5B?()BeLnMb^IG19UFm(yLec zlN30=aLS~sEzd*0-@NEu&0TYP)74GlM=CEb=(!pFTOe|w`8f^Sdktkg51K7_8RZv+ zN<Z52@58#%Np)9@J^3!nZ4Hn*fALk_EY?}gAEjEZ$6W2dpmC9hN4Y_{Vus4i;6s%@ zm(DN*+Z|9|a&ngt^AX|v1#25G`EF^@SSaJl?iRDedEU1EBSM#xgfe}8&&Z#wI`P@; zk1nEbO<6X5OyNCv^GC#@whJ>4m>miIryb*b+-%8JDXUD?@Qb1^mnAAVIE&hvewoMl z?uFcq#nLwyzxFzLY~cknzIA*o>`ta%LSNnEQF2M<`4jMNA%nbI)1nDS)Q-iR*Q=WI zdfwe7H)0g}tv=}dEuR%o^+3Tn$a=2s<?XLbT+_O~$S>w#;dDR7<EeOQ$@>}d+}&Y} zv;2>ACj8F*5?;8X?eJ#ac$;6za(}&ox%?+x4A$GbgFSe8`JtssJA{N&tI89vExmp$ zUTgk=)g^uYeeUme^)~8A%FOYdv~~A(!!1$@L5EFcUfRYTwVnFLtZ$v0n@0HYcRNnF zYrYITl-=^)rg!oSmF?A<50$5UN=}*k)7C+e<KpN4iz5_%&lOqZs&nyXvWkB4(XVNH z&eh5E?|x(NR>a}tr(&J^hwVdT{L;xWHMN}_fxEviTsU3OCq(G2bLgG$!uQ<8T|4I4 zx^>Q0)Q&8fc%Of_>g#!HqhB9Zy*|rBYWhc($WL$ovB!R~dCcCC|Gm=c<cwyK<-#{r zmOr~!d^p7>(vy#U-a4gg8|pf2*eWGe>{CB&oW7?=ph!8oxs<Ir;_&4Z<&HXyJj0VE zduMp>KE0IrP`#kw#AK^4H$J}H<6<DQqeMw)y;33f!ym6RR;ws^mR~)+UD>Ei`myN} ztvR;)*C@#^C@RW+{p8$Mi_+ztKZH}hcq)AqS(?Rryff@^-SXE*E(g5sRMNZq_sf6L z?H=6~7j%Pv9k|q6#UT5i8Fi^cOa0l`hgcXGYB(7f46s+d!Ii}&sks3~`30#(C7G$k z9*KD=Ik1Bcdcz>+8^=!Cps1sJfr<B$Shwy&<F#EOK^vyAb$(KH)cCqsFLAa`%iSF} zr#uS(TlZ%2W1rd&XAepqpZRMNpHcGh@c&D0ZT$C6jaOyKR({LxcZ%zt-zlztesA{Q z-}mkRv3yY4$Gt!}kX4xRih|SuiF*MCk`4Y+$&4Bm!G8B9-I~&r$!g4%#+>1BrQgzW zpYG8;A|Dw-bUc1oe~ma2WUKe6OXPIX#2rnm>-I<=sIG|b;$N~u?V|j(WRY1-qK(gf z6xAqN)#m2amGvoE3GQ}!d}UUdGxu^+W63`2ZHa2iOuUb$%`7#!9C_uEW$c1)O^H(H zW;Cc@*{tzEc6(T+txf8TUp{%suG_`8Ox>b4Ig(R%?~0pkbHsb&)KgPfe=XOsmh`)I zD=UgW|5lXR;@b~@gk8I6{w$|k`1pm*lV^EuKP%LyQo8(-c7aid#`O({gx#Y0zlbce zJnqrHd@Il6KW!&-U)*YQ*uW!gY;3vwfs)UL4bvvsn@R7TdBM0ZapsrGYhQKMF1<;~ zb2gt_)Rz{1?MsXEm4!Yl^=8g%`*exrRd<JOnA*)%I;InDZr^;Z_T64t_a%#aF0Vb4 z9M^tIIL_k6iRNjBH}C9Nta?rI;j_RA0UK5|oGNYHwPT`*sd~C`{g;<9_MfX7cTC+Z zT-CUwPraljplwwJ<8szn->%KPvPpB@Ql-u*2QFrbaBi_(c-Cm{!X)0;T9=GIPSpA< zmT`Y|m0h~kv9^8ZZ-(t$>TRjKchzmC*udM{-kdu-C9iCmZtm25=k~Uh#ii>m)-p@* zN?dv3fpX-8wMyLXj($gZb5`x>oYJLRqjTZ+oA1r(+R>kQw0^i8UH-%8=<^**A92^L ze575o_K|dr_JxSbvPz~?Qko0isedr^%{$_BYMWVid9}XAvlrW*Md&QPrXg2n#}j^Y z=P6}nd2Y|X0~>9x|C_BLxX<O*sZ-%@?{2D;DU^Ir`6^=|YAv|(fVlpP%OC2FYt5)w z;>6zQ@+E9#!YVG^yuVv(^dId~-oF2T-vtrP$G49D=oPA5oBHAS5+gUy%$t&b)h@<e zmOZsv$JViTs_CaqA8&4(`)1O^5Bs)+Jf4`l%J+3z5YvsV68g1f+b8KB+uo8C%K1?x z^<(<K_7_2^a%B+@YD9k+s~-5w@hP77!On$sUCH9<rWw!uPlPvp;?Yg)Yg)YiyWElY zdP`<+x@O8IxG031;md;Q$+EvL_=_|jjsGCT`Da`Atf$o<e7-(=_*Zb>zTLY&Tnw<@ z%bhxN=3nE#%#~L@ir;9ndNkGRLUq0LT;tsV)5|Y9d|CMHaHWZnYp~o|=I;eh>gwg( z%P%My7;k6}YqZ|sv(z`?i1e3dg===&_CJ5OV86-B6OVs%=)YL}O*raTlil^wrhBq; zz9eM+zUX&9w&H}lIa}lpg>$=-1rAF%+HO}ix9?v(<@m$noHEBeO?Kv#8NM?4dsju_ z$cnr@X9{O*77P+rwDgu}@I9})scQDj`U94KoUW{wDC(T^B>a@-76H=}Qc5or-sx<; z{pOTqRZUM_YrL)gM!rd>PAK-({qcEiFk9frcZ>dT&wm~pby?$EZn1u^KKWn3m&;Aw zaBKKMiBML%*3(?9>unqUPip$r*S;dS;G?{cO~SJ4cc;ZCwH1c%{v(fC9<H)o$-jY# zfx(^~=L$yXR$=G-ytK^p(xOB}7qfSAuD`IO!145jUv542@}AF9!z7x?|8NNxmlCH( zsE?>KtI+)kx^td-?3}cFwOXB)uZr5f56nLn_86CQPf49UL(O=z@#pz}-@f~L{(k&^ z#sy5Lt(F|P^dOPx*`x#q*JgLl3ZI8IGg*!NPuQq#UU6^|+j$8I_CEOvzs159xzi5@ zyzQueHZ7a|+P7<L*NpFeHGOxRXH%em_io?SeWu$rzwdp1P_fymd{x~E?a$m_&lxhm zU0p2XyGY|zufFv<;WY*?^rx0f9Esb)zhT}w%XNR(72nygmw(SiuJ3v8KVRefE)&(A zqGM4~!}c`lc6O9+zx<Y**WJhc{c_IV>iyHb?f1#dG8;dgj@fy)4*ps?Io&Ju=bOy< zJSn}{cZ%2Mm}pr={mZ%YH2c)gRnMGWX06XEDGC47qhYP|wJi2W$NkMq7QcFYv-m~b zccoP>hh1HDUcK$xp1;53#XI*<aU1XDh6^~ZOY~^VwLV+(YhP{8`R5O>?!OfkyFT>$ zw%1qJ?!7)ce>Gc5!i<A6oOV6@#hAZUV#zt9FH?WAr6k^Hu$jp;Q_(|u!eY(f|35<& zjvrOdG3$HtmqG2r`bmfWhs*rRP;#qn5&N~~gXP1|hs2%cGr2u?w{BV;d&c;S`Pumg z&gA^pJaQ)IkH{7Szm~#J)f)1y(JhQyDmxOFJf6Ul)@{&c@35diAf{dVg{0f|BWhw* zt9WPFJNz%R)6ruQf7Dp~F;_zTk?5Oui}Q+qiG1M}u|4Cr;F+JrLW$B&PLYdyFB}uT zQ7EdS*6gF@`0kLcsD}@m=Hg>-7@hc?rTw)WO(av?IE&(W7oAinUa|5E!%40QnyM!j z@EEOU(Ol`smO8=piq2PtlbjPa38^SH+k`jG$ePf?v#D#=Ryl=AMx(VXo~IN-RZlRR zdIYiEbT~U(PJxxtNH{C)KiZ(6`=1s3qMQs2G9nBN8rYix(4_BLk(ykJI8{9Sd%f^; z$^Y|oe?EB}VZ@fhBY3P~LJkiLhxU>iGag-Y-kQ^)xYp7;{kOw4&E>)mL}p#QRI)@n zch-b=B^PGS5X+G=UnqR5<o({?=}#_ytGs8uWU__EU&r@V^S=Ln^W1jtr}yIVY#Uhr zPx{!=<L+GH<0yJh>v1kulf`m}L$`lEDU^KA@o=uuy`>L$?yX%Q=C3iMz1Zm9;snKW zSB0KeS60aLzkl8>|KOqLvO0qn{*Qk|=GV*!_iz8ebN+c{g;`7ghd+U8^*!P8{11g~ z>L<1Pw|<a0KmXZ7V<S81L(d}`xzGHoWG#Qpz2=d4<yY0XTFaL88-ATPKFn>jtg>$2 zN&gc&RwP*OJN0C}rpIHU=D09}=1A7?4_^i1rd-&t-`djR!d*j?8+Y%U8<|`%o+R<Y zzl4{E&zs}B%yqx4x01Tn_vUTURkq$2edv#$@$Bte*VKBP7AfKEO=Xb%Jt<bMr6?)s z{sTw;!b(ZQ%7XhRrsdvtpX9t(XqxOxzaAC#-|V}z1Z}5qS*WJZw7k2C*H%Aq<>IP? zW=3y2A6c&4zu-veffEz{am)A}&UtQIcxB0%H!}?N5}o@qd$;#TM_Dc2K7Z2|nY-Ec zZ_dnZTAq-(Eivt7(A^oC6X!gxI(08U!erL9DJ^R+7Jay_ST^@sFzYV2ghoGO-&wkE z3^!H9Cl-ZlXWJTh&Gb(4vMpy6&l**{m)mrAUCbxVmk*iLw0P#u-?H^eXPoZyd#i6I zr|?#<Z}}=3^=o(DVMR`%*wx=vT(7^JGOyTHV1qhOQO)VOGk2JzzqCAi>AQ5L*P4q= z%{-B9Ev^@N`x@5dZRh7LDR%gjcF=38Q|KZMSJqEP&rY~_U%$k3NoJE#iDGir%NBKA zC%0)rk=NC_%O+gBdo$)>Szr0-A8kF;Q}+10lfRz3zG{i|+$pSaPBy>(r*y92=AWSH zzSuoqPtSfyp58W}W7DrC&N6$s{ArcxHt)?jcZCYMGOk%fMn6|>o?;;5!RfnQSR?V| z3jTk(rw)aSa!oi~c43an?B^4I-$@9_UDJJU%^f!T+R*Ju%YT`;-F#U5-f!ZiUo*l^ z+<6gW{hs4xhknS3OY%Aa3zx6d==0#1m*OEAuDM=gqwnc=rk^U4bZ@R!aTT-Px?{;A zC9_Q&oM-><E<3@MztO8B?1S}fv+~^=ue=N4c{E$)*7{vDzv;@gh15vjUwABbQ{{pQ zTYEkCMq~*^#m-ey{cu7;Q#f+J*?zl8W|^~1-*(i^T9vLm)t7U1{S@n|UGE=N>%5gR zoo~HHPIUd@*P${8vO{HDwsZBC+BPlLTKD+3ippEft9-iaSN~v)3!He|Q`A1iGgXH3 z?7V=F%Flin3cuca<VlO0e&8m9m5<c<j%AA4r<#3LRGz*><3(S~e8aELQ(4%5i2M9d z6@FE-OSN*tWu25uhrI7BQd(XklQnblp@q^ngZBp&_T>IGW&Y2$KlGz@++R8Om4Qo7 z&&p^MRg<6JTB{s+r_Xc!a`SSV+J4tRjz{G`s*Bb?^N~0nC|Mu)G5nA3vHPKanEy}N zu>O2chfDt)qc@!=IBQRJR@g0H-ec(O@7}X!y{36l^Q6Sq@P$u8u3hu1{uA{4^5oMs z78Z#!m(TgW`pE6~ju9b|YlN=-*q5Jrx2Y<vbjoq5iCZc+F5R_m;q#K9&3~&~x9_&< ze0#s_)n6;wlTkC)*CdF!pN_Y9wrX`no5kl9U5ocEdiAO9%v6Cni_Je<EkCVY(Y@7S z$sb)$uDe!APh<+c?(Htr;M?I{Xtwe8_WMaoTE(+C)n?AR@RN1M`S%>P)+xEmnZ@iS zz3vx$b^W$v@@&mr4v9RsmaS+$I#oXHPezgIq^W`T`I(<_EHhHOeWl`c`s5rR!Tq{+ zIWD*Eyu5zU*X&2B+y3-vUryaVv`g%Me;1eY###Rq&n&KY+M017?vDHJ>lfB>&Cb|= zesjFrZ@%+&tZ%Jte}`_l|Nf@=<$b3&$9EfS&yH%}ncO|I%Hr&2&och1&dvR0b5|@B zy<oteS-}^2cw@m=9j0OqzVnOH#6E3lc)k2$VoW<r@2X<Xe1QvFB{Z1&oW-_WyTRjh zKIx}SR{LSE2dZbJ*Y&BccbI$h&uSf=Fulc5Cn6k-1(bU%W?gtT@#?Et6Gip}3HyFY zuyR`Z`=wKZ-?HS*5e^5qIV&!v>hx`mbF&cJ-?PgivsljmSoHb?&o@GWX@U05OOqty zj$P)Nc79PJTkpA>T+i2d&RJV>F3d8$d}6zjal~60Gwb$jmgMf@ZPzTL)z4jvcSxRJ zaG32lZ(*79ZJnfW{Yn1>ZCcX>N@XuJx|-xEWna7S|LEBWr~fmhU+|~0+}2ojyR(S@ zXf6A@<9<F#;&MmxcI}@o@a=)kyQAD9|62+Y8@_oLa<sR4FMoN=Kq2gnhvym#=T$A< z(-*z6X9@B>I5|-D^8T<{i%U+ex9OFM>NZ%Nk*E0lX!VK3Yp+}8YozNf%wx+f*)*{z zo$c-Ak3k-Xm5k=L?2!M%dC}*SaG%SuqOV+!^lTc;C&jJt<+!vuW7^4g<`?xGmMb5r zU9;jO^CKQ5mWLmfN#^Y1Qx&^s(yiP6yx{wWh`hN+x1BokN>%h%fIHU|qwKA#n`TFr z%FX1ef3d@8zM4|>rXs%E?I)SPe>oPNzM;9!THoR2<DI@NTc)L46@R*J(Um75YnKM- zD0n7L3iU5mKI{7==9;onN%YG!i}e-;JzH27dsI4yoL7AG<Ag_X$Cp`)b|rsVtk1rk zZ~KKa*IMU<+zE|5e%wZmW2f8%1IEL9@4vgp|LO0k(~sw!KKSVAV~dBsw4B*kEx)bp z`*L?TQ|?E$Q$4og-5!1peiQnQBYbwA>4=^ieKdwwI5)_HQ<*zB#Ye)@#-m&`=(bWj zYZqUK&|JHHG0fj~+?47%x|BgQXDP3xzgSzBkh4aI-YF0D*d@#@A#WA7{!+X-PvKtA zk=4OlRte2m9((3_hPcR97fGMi&6VK`6bpDwc^h9|%jVeTx8A1zR>T~kswgehLgU0n z0}-FV@`{d{!Zsa??xz(qCcP9~WdH1AvUlM0X^Zr9*Xiw<rNr_rS^1t%I^)C?u2u1_ z5yxgG=oZe^tul7ZJhOe4i}G&s7iOCtGF<=HyDjeF^y9X2d0MY7J$a?{P`By-!~aaE zy^1TT-Q1vgR$1uHS&%EGbju-!4(Wogqbx`)$<Ql+kFscMoI3C2tEaimSKrI$q~}%N zb0?o@X`R(RdB%6^Qzo=)tB~*6)MQ{_Kr_D}u_!S&wIsDjH!m?awHV13W;_P*qqYH) zb22e*;JkXrew_^y14A$?#>t={<&H_9yEl_dobz*Y6Z2AhGV@ZM^YhA5LAP*1=Ws$| z^MxEmY?-;cU*A&NwzbaLeoB9kmj5yVp-UMiifaWg9XXyDc|A8_I*;?>`a|~@>6=_U zBLAS@=$`C^fN5L4BtE}qS^a)z@w0oN4PXD*0^DvoFj-rb@w#kCb~yg|K($~+q^zZE zr7UY(#nrDdk;xrt#mjkaO}xKRGE911x;%e%ZuFLl-QFIn9!Bq}KGiDyMty;r{ch&A zq{HHVCk6Lh-s&B8UH9s3X3ZU{{eR;6tLHYnIr05mu3~Or;*A|=zHa?Le|?ScqO8@S zD+Oog^$NBf&UxH3|8vmvYQLAVtt@M%O1@cAn-;xk61Ve`R_^vKYjhVa$e#4&*0h7R zIwyL+@07UFl$afN;LO4Mt0lVPN>07vxi;m{SDB@{UQ&`h*W-0|>&M=gesLpt$JG+q z{?iK=Xj@0j>RnOP_0D-~sYF;Hw{v(0XX(L=U(Sg)^Y1L^pSk+iHu)=ti4V-2f9-m0 z6nJD`rx2gdox|R3hj`Um6fM_xCRTF>J~T28EPcpRy-j_&@4~hV9CbyqS0~(k^VL|O zCezT=m}k8hUvAz!m(;Sf6)(=+Z}VzhJZ)B;u5*1WiwDPFYo(NxmRn|RSv@&5CHW`! z2Kgs0h3(gNFa<{}yeh+<AnLiPTwhUhQ;*elw@Svl=9{E$o{jIQ+2ioVB3{Pvv^cl& zk#BAt_4C6b6uD1%C(QjOy(*|~j`d2Biq~J-G~e6V3U>KDVw4NYE9l$u=*FBm$uj>l zr2fx%G=IW+!A~ORr+hK7P1bMLP2G;(d%51cb#nv@1H&6G1_o=)lnYCWh+$0JiE?dN zbhvb=$Ui@$lLri*3UPWY6y0#8Wyuk5@2#GJUMqXsx|cQGkh1n^GZ097bcW@j|BrW3 z`+i5oFDhBP>(`tAA04M}ul3Ut5XwAd6lwYVP3^aP&#ix#eR_T0zn<}f*}g!7p6{tO z3lca!*X&rFz*sJ-^GHtJ{>kd!T$g@$96WyFO9JO<+Zji><imD<=wy<&d+W4~y}9B* z=lLHS)RO1EuGdR;J|@m{a7yOPdos=TLb1sc#NO;VcwxGsZt~7O+cPcrx13cfbdrp| z-jzKoxoFq1DSL7+r|y`!ajw&%2N^#XO}x;ZmQ;87tBmjWFxlNH7V|Q9aDTfuFYW2h zo2<8QsV{q|BFV<(7W<-L>64k;jv7dGrj>1})eXF|#!2b5<+4zPixb5z?rvK?(^dJr z!L_vWS7kS+ZH(T&R(Eqi8ONuPCnh(9FNB#MSB<$NcyLmLvCqDUc}w2j3QYG5pEz;L zn(){I1<P4`4QAReoVvzp@tc`Pk4y^la`V3^vU8HJV?rj^rFDfnmWiG|_Q>(1VNAFK z*VfO=Vp!j7bG*~l;HYV;baL`zlct5wo>=Hy6@KEjIb)Tmmv(v|Puz*BS^K=D4)yi4 zvm}0WFkiJG)n?Ixw6jf1E0tE<-?v5D+C|7#{oij{W}#Wyv#s0SsV-it)ApxcG<^3Y zuesd%?rT!sZdxq;-A8U)L^`X@;oOxKqRKpfm%m+A!TVTC%|P$5w`jhC`eSX;en+Xv zHR-~;dTj15WXNBskr3UsGKqb+R@aT-#DmNB>|492WxeErLyfBsInU((Jw?@bdZ^%0 zlcjfdRtetysd~r9wX~*Wmc*>|?S_R;rS~+aeCIixtzvliNB1u-(`zRVU#oDn&NNJy zSpPk;G`jfph83&UyI2|B@s9F6TWa>n-Z5vTKwF6Vw&*WX>M?J9CRK6nm0y%UN#1GV zWY_tIv2iVX&&ssvZ5I5xP_4Df?1P;5x+pU~n~&Qr1#3q(Wz^l5D%G1EcF!W>W)jEt z-KDd>|1?^;Upn*ZyA4xIcBjs}lG4A}Z~5(gn;&{u?=x|%mufp`ZzQ2#DWxwob-~Om z;l`Kq57aGb<zH;V#%kPS_+ghQ(~g$Y4Jse^DLm`EWpgrpQl)HomYcWA+vPvAbUyIx z<NaU4`tMDf%j79*6*h>hSJ)w<9<**j_TL{@1XQHlIbTTB>L+&jJ>fXE`r0avBUxQ_ zJx_kE`0L^^`{Ogmpg&*kzxbkXcBh2>_NI4SQ<T3L=)_w$o%$dvmRZ>N(6VOx5<$%? z(T?|X6l8wLF&8TR?l*XF{1?B3>M41?5CN%)hZtWLvaY|f?cYz!e=U9!SYDle5;Vbl z*$H9eC#~ft_&>MgH&3utiuuEKo%1qJ(wE-LSzRx(T|VD_Cbj)kpus(nediwP{t|wv z>|Of4_+06uI|6|d{~c-Qxw(JBgonxdlYj8v+NH@5*!0l$;f3hGpGztxg^9B=>@Qek zB-?F&Jc0G0dOAz=%0{bgFIPwUKHN6r`9D_FHbL#$bCvFl3=G~(SnE!t;>ocny)-v9 zuf(+?Iklh!v7lw*SubWokyig-#*4RZi^|o0b?DueQ1&}vTuNMr9vqtX?sDb~w=|)X zXI89#y6V9p_74k>sOW}n;Ycf-TwV0O-2cSy<FBO~j7_{X5>B_|ikFJ>GCiNeJ?|UG ztM-4kwM*h$Twi<*KI(eIR!T@j@97M|kXpSPxnlh@q%H(5nL10KS&Db%BenV6ttE$q zn}p+6UEmg#bw9(c^e*<4#j>Ov1#zu2Noto?KX0&I64RyED7{%_;lic=iX1P*J$gIa zXokkmlxNY0k2a)rs$HEPCNSlfQ844~XUFni>nAT~3vd(c;}mT=XCLRf;kW63Jz>rM zn~#KapM2GyF_qa+xTK`?+T}{W_kO#LSt~bw*S4Cr=GK*|))7~iA6w(~I(yoq1wEx_ z4c45RQ@S|)$=7$=td9pjsXO$o<nq2&*)yla49fY8mus1=IqG{m_BRV^tZcsj=$9lT z14B9!0|Tffg>(TZs6~SmD`+j5-audP!wv$qm#-bWvVN8Nc_kArHyg913a)`18Y&g{ zm%ZMkdiO+G@UPo8KbZdnJ~C?+^5Ke&D0_Bx-}kne^Y5?EXZUVWexbC$t6-9k?hdn- zI{i7DSU(3ZYx$qFBkl1NcGWkfHcvY__h`Aiu+bC#mzlEc8Q(dMJeAfYwd->V!qsgw z5+_~^>P(P0QuyGecg4HbnPU4c<V-5E_gwn_*q1r}ZZ~s|T~V2m_59qr@(H(o>?)Iz z4-(0Z5A9I(TDXw;{oD)ENB*w*xS`A|aN6q@`;%8*#ZP(S_FA=|c6XAX-gfK!eL}nb z>vEXi?&ObpV!ZB5T5vAY!p5ta+c<o;<ZMgdJniW1f}AS{>H-V1wPd3$4<rh%pQtP& z{{EyqYWN1Hab0C%V_-<fT<U`szWzu_eQsEExp1h&-O0=5n#_#r*pj(0=800Kll0at z3)bF=(mNV=;hI<%$K@0s_GL2-W)=v(FaN{7=f|==9~AT&LnBW=oy@=Qr}!U9z3Ds7 zr&!Irv*dL9oX>NM_if&P`=8&l@AY;6SPz{3q1KaYq5il=f^kl^tNgU6LdJaVmy0Cs zbv_W#bN#@j*X=lUql}}Jq~xrg^1~VWcTaI;x_VS`gddu-zN=O6&?<|Qod-pn<L>NJ zWAk=%Y}0i#`@Ajh8JCdNvUMx2Uk$l<t@p~Dw0^IQxtBLvUe$}5)pB?0^5msU7e3px z((?AD;+q!_?^(DaY}<}iPv88Eu8h0&<g%3c6{kk6*{i=F6MB@UvRL%ew09QDic#G9 ziff)<I+}X*nOD;mm;allMV`@r^{uOAVb*^i?b)ZIvW{H{%5?VcoxOT>mY(s_=UXC= zcRbFwSo~C1ckQhxH>cAx=3Rb!SSYD*{!h>7%~w*LrQgO+5Rfr9p5-B$nAWxW^ej{T zb1jF{qD;j?yv4K2Hy<rI%y~=O%6QM~n|`6sj&Igoxcd^r<=0XxpJz9}+H&@0)~{Dv zW|glyrEzM9p5o3#mWho8VVl#hYi`!O7w<f4@6~GFIh|`(v?l9CtMDApUU6yv#2ndG zJJnxoS-86Tk#taSO`Xw`vSaoSm%n=UwL<&kt)$G>MF&q*W&8DumntugT%?d?xBjWo z<*0=V(jrfX>{<9JXsuvi-!vhn-xZ~@OXl*0S6Bpf@7l=YD*4**utEM0;R_<~(_iO) z>{}+ebe_4%{H{fp8;jx#EnmKlX$|+EDqX%~n!a?_-Hbh5RZ6nTAOAN#y-;;dCo1#p z61}KZyWO$_7HHk*msY90c_?%11}AN<ZOQFDv$^sTw>QNmy*SRt`u^dzrtgM}A28Qw zEZn?{$H*?|gP~pG#ZwD{s~Wd-nkqCk?X7S;sA3m7!DY_NJppxx^|UNnFLQmH%6IC$ zD!<*~mZtL`TX+0k+O+<|)+XyiU(Tg3U2*8+&8ON?v;Mhe-|zYAtIm~v*-W?HfcrJ0 z)i3U4eqk)n&(F72R9sTsbyw6Uf<0kns!^5OZqL;R=NN~6i#e%!(NA>i@>El2=h%-? zv5pTLcjaE(5$U`w@>bGy$tXST6Q^&eseU<n{Qv7D?z;)=KWKi~TztobXP1(O#-4}O z8?)lBf3W$#WBbR~3s?gWYHhHKVcj7waOBgq>L1F&GBck(lM$Ws`JC_{)wzHD-n~7} zaJ@O^Z=)KE<$O<@wkZ`&2Yw#UsOm^~<Zfc`;$7+Pw@y(dvFg86l<J+MVO)uv`<09) z|KL2>XsW@ebFcc>bLK^?6Cds1R_wdIvuh!<?Tce!zxFaO{_;{~sb|(6kKVao5=8{} zxcr~pqW?!sib*EZn(xB>#8X_)FP-C9+B{{qK*gyEvr@jCv{3on%~3D7M&!fl5UHax zq|>^z3-?C;_|?34LeVBIv+q`MQ$Ea&y{$Uo`i^o5_m~Oh7VH+MJC}I$He?nh96DEK zudgn%;@zZK;%#rHt&(ZGar3e0^A*X@B-|6zTCAPar*ybod&^Q&#`d!8)bpYfTa_PH z*!FCzl5jp^5g?u{Bdm8!R_xrx+NQFi1<74IU;p9t3OdujA=6NCNye9*$8Wsph`pHC zb<(|KYVhXPwgc<039P<+aM2fo<+~-{C^YLW&pKf$ujKAOL3-)0Hif^vax>*uF@EgZ znRoY@m%+B}@AZ;Qu6@=$bn@KX{tLTj$Oz=we&{LRtdwBm*yP3`t?I$Aslub~r4ZL! z6?@oemda|TzLH}LpE$N(YRoV`AAfwx>l1?ZvR2taHolLId0!}4g$fkSl2Y9uoOjS_ z=5eua_sS<Ue;3Hv^`15O(W}|}7M1SmV3)necB`N3L?nOFq1HD76E1FhFRh^WL%>=~ z@V3m6CC67KiU<0!$SXw&e-wHj^I_phxs~6pw!c`_xWlF6bgAOGs=}YumR0*#O*byB zicETbZTFqf+RCNpQYU_@THg`#w@ZRIexl{`!Wrd`CezIf84tOaa?kfwRJ*oeYSPTT zZ_g#qP%mCT(P>)0m*M&CGkz}*sEa(}cc?n@-l8oJJi5`xQ~tc|TECQmf#E3w##9wr zEfSDeRGeA_I|Hw^$C2xhfq?7(jICR_%AW4($Zn2XsKL?Iq~7s1Ao>!^q*o7PDj4`x zm+dHd$n&|K|NZ~#pqogJS-40fxpbU=mR5W(tc!E=8I#^CNB3Q-nRIPq?6psNoR@pg zO)Z?N$A2fzS5QgqOs}qMX6nL-C#!_)A0F*8xS4s@EclXTS<8~w!d|a}Wb{p+>ni>Y zpS(oj%ZIu9;w!`x9@IB1ynZ77jpVBam0xHhGAg2J)!xhu4Es5;_G^(EBv7w9rj?`? zxn&j=mjst4L8T#sEl0y%`w0gM{PWYa-Jlx~An?9JbfNARR>2JoPE)%@xEwt{+}{@a z+Uch1ZPyys`G>*}xHNku{aOBTW>4X{yvC&HZ4yHN=bSz>Cx4%%wQ+Ubzki=Z4=9AG zm?&TJa1L?eRuW2*_>#o&-J;F%9rxK4EPaN3>@tsq_RN@~@KEu%a-Sw!|4%PnmPI^w zJ@1}yEoz%{R(qmPT(8QPwYrg~)k1wEr}Z`^9XVMQb2X%RQsTDjH~-{wd(Y9`*!_L2 z;SS-du*3|(rloV&Zb`D4e7SPc7S*pkbK)oShQ8@`+P>g)LE)>VD<zCq1sa5xUvl+e zyT50drkj$!I2TuBuSF40$f1Q6duJw}<_Zs%<8+?9Ztbj1iOaV6hF-T2;#vFcR++2U z<PC9O)Xbk;FH+IZ-g#nG=87o2IK7v}X>o17GOtpU)%Di#^zWOKcT;%fqzgf=H#6_w z+a}03Y5JLGi}vK!a`heOnf-hc>$#1`*7y|e?d(!iYjbRK(0wkkB((PU2@T^_9`pN* zW-}Is+iiK+#9z0i$mU}r+h&<!yEBh9ou^;EYS3dTRJkrU>({z4MR}{$D{FRiWjEbW zQr)z;xmD|f>{XG!rfM_hI)p?mjdslT<k4(<SifpxRMI9}zqhB_ij0<JbsgL+&iiy< zvDn;MEZYR1&YW{nqtz+F#4FMwWH&D34VtA28XPF=A<m`UsToFt<!Q_6Zms+>>G zXixWcl{tN7yI;$<Z9(fT+lzE^t+tB2ck-=WAGSsQ-1lmwdVgj;vmO6S4Ige^u&BH4 zh3=Qv>2>=v!ndqy_Ab%C;6Jgfc+2|5H^q5sTeKy(-Y<S<`!+UX`Nqf>H*{Xzl-ZLb zC#&*WLH6cjp>+(`x_<GUlvp>}T>7i*UWGd*{w($fzH+|%kbY(N2i|#0|Gm$!W{BsX zxJ>cHw~IT<88ZJe-1{0ZW81!e&aRi|xrSZH5KhPuT${uBR;QIAdgBU~Ty^&lwF2(D zE{<#RE}wE`Y!^Hrd+4QNCi4w_77LrY#+%V9vz68!co_EOjYU;|Lz1!Tx*rp@`|Oy~ zuW4l*)eloFQh&Go{vnA2sk4@!%r&;%Y~@+h{A_j}XE|%j{zkte223CKbt&?FywN3C z`q8L6@z&czOlLi}e_=;$)Gn2DS-gmefkBNO<H8{9#Su7<LK?Wmki5BeDrD)%|7zX6 zMY>y7DA<LwG-?+#bSWKk`JkvG>N~-$B5~7}bj!W(X1-ncL-3E@z6ma>7mx5iXg4|+ zcfRP-B<AE<Z_b@L_b)B2Jn#4C>)YiS(h6@k^aV0!_LNRGS+_Vtq0^H&cteTL>lukB zLiSY6?an$WXm&W@<Yd#;YL!>FuI+jq;lDHI#?_^@^I6-j$huqni*1{@vEutjBj=)% ztA%Wq^Jw4x>KkqMc(z`o-;_OE<)>q;y!d-P>rZDIq`cqzCHLo(-uD$wD^EM!C_4GH zx6OA|sX>uS+JqLFzIV&ld@lW0cRB9s&M&jw+Wu|4r2TJNw4S(W_SNZqD|CDE4ODil zS^4Cam}HfWpyP`fsV}lmon5izMKG_l><QVVqv98jg*|`Y`ZL{T<D*Xdt116ZC2S1N z{rGXw#FCig2)jeF$CJ~W>@JioyXp{YUNc3P=h&+4y4v5I-M=1nn0<cADuZsGO<6nU zxtjCHnoB%OewqDf>xX-teBtI5Hzsu%E`OXRw%y>oLFF2@lo=N1ZW^DF+i&{fbFY19 z+r@3twr}=v71r^{Tbcf<&zO-R|1W!2ZsE(%Pp`gemW}^pRKESKb6kTF*O!=OFL{@` zJA4)KjJ*&tf8x^iE$&M)P11d~v7gncb4;2Z!n@bxo06mT{KegC4<|^Un3%iZWuJ{7 zQ{$2iJ$1`3$U8mH2#bq)l-xa4N%}@NhjX@}$)-7c63rIkMsk<=y87;vt6cAXmaY=g z7CWDhL7Q>Ig_2yxV#NT@=bo25_BD7bRvE6j8F1xM_>wcVs}_dc5W94yb4k{g6K<2| zgtx}?RenF|e$;>FQQHl7nI+e`8u@Is(Bxq~zHEuM1fP)<XIb3R*-SpW)aM?v`()+( z`R0;e-;E0=K5Jrna`_8;MiSGpeAFc0)9ow#hnaz)l$(LU26MO-TJL~H{Grv7Q)*g% zQ7W!_spxiyz`wq=Pj+m&WVOswTHyiPa?hI1;_TTsGQB6obxMohVVhGlS@i0PjZ6D< zF7IRNKM*}da)yY}g@4TtWh+D^zIo&&UH5xpF!$m4oo{Y#{{42j?drdu=f~GE8??6@ z`6Yj3;q^9Z+i+syWW~ftH?ir5cQmb*k?%Uob$nI8ZZ+p)rG3(hcb@D}eQaho$*`fc zZ%>bgnFW_jx#X|8`8`!NZHYShH>dg>4corD%5AmOOw-k2!Drv@Nqkivx_jMi%S&-) zK8JT6Dk#1b|F@Jke9zrQ(`VmGnQ(1Q?%an{1aeHWQt$3tK5ey1=QCa3wRx+yDSq=^ zsPe#wXYDI~-RS*^H%gb^&@j(6(%9}By#4yBti9_d-&&-9q9WW`Bs0P~;H{Hix(*NX zw8)Z>+nP3IJg1-hXi2;fUA^zc1;yy-$v@p+ZO>Y^YSvVriyL`2PkKGY=cn`g4Zadh zt6~MOl-^jJpT6^#%cSie_%fn1Zl_h1?#Zv%(7MX$^6|i%PhN5y;@G;a*uC~mT}+?S z;d9a_wf_sG-MzzYGgt8N8i{8TkM`b4p3oh3_?kw#ixXe@3m@)xqH~URG$qb?xa0T) zJF(@DKGm|${xRjTF{^5h;gLT-LOw9eH`e)CwJZPKjBCQ1z0>B|zVSF{*~1wUZ>Yjw zz9A`G%Jgo@I{T|%(&Xl3&+0KPR*6;JJ7apo#?Ftwj+i(<QHbPz>b~n)LCsnR*T{-1 z5_&(|w$ynz9KOrn600R9{y)0#1?z<8MNd1kUcYVNvz}r7FMGNBv-#`X)%unn*>Eq| z_0`wFldG1!{9090*d}+qhW~x#sn1snda~NO8Z~%wnO0?q-c7W)&vp6ql<@LsS9XqR zEKMKd1ab-m=07wm+yDC5DQOMcwXD0t{gl@$FD&v~85!I;ZK<Axyv*4vbuZ;!6@~x! zeR%$sZ~GhScmChM!dv#ZR?-z~-oVpGl>`I#WQw{tTq!cx<GVY03;(4xDwFILCwMF? z6a3Tojd73jW6#24&n_Mp6G#*Ppm(zEWzQEwuWb+4t(Z2c=OOc){HVX&GPNeFt0#D! z6uIqs-|dk*%e=+*UyUmm^aW3ODPMX&<LeRieeNavMVg+s3!1)6O|O>FaP{}v|0qOr zhMt{!ig>gBHv!$H?n}a>@@<Qmg#zv?Pfze>G42kWc32|Xtt-~8FLvp+f~&3j9yH!+ zUzfx*nI&?~vJ6p&8FfLNOHMq~Sf|*VndN1iH=%L=#K#jXoR%vqFs094DCQBqXy)!a z8=2qzYE3kIZsk{@^}Ek<>w)x`<1(N1s*|=haKF30^Tn+lE#EWaTs!t9OgqG_;P-il z%C9FnldkZc=LnuC;4*&?+eOy&LiR=T&pk@kY|zj67c}WV+L-7Tt<_P!ObiU~Sr{1H zh$&T^6N^(l^NLgRiZe?x%Tj|&iZb)ko%3@+GoJ7TYD<H`2TR(P|K1p|J?M0Mmr_S) zhND=8;j)$$zCN?A^e<`ozEJkngR<#o@;d8}{y)&IKjTM2%{O_;kB`s2V{3NJe&qc8 z+#SpBcdGr;?d$)45Imq}#=Rj>GvSPm<sH-0w$k2edvg}2B_BPerMQ1-jcBg0(dnzP zPTK@aR1+61t@&AV;r`?*_cxVuG`BbPeJE=Udp1XH^F?h@p=Z)cQ+(~G)U8k|Rk=Me ztZu#F7yeeUzy+Lsm%lH~t5D)m6}QP`-Szz2mKRl*-d3DS&58dJd-?0q3k$DI6`WGq zbhp#r=Gdj8*A6nA*M;lO`%d`!&}ZvO(}RginCcI|kYt(@o4;w(x?A_v1+I(Sp7>%< zof=>8#pk>B-mso9cZJ=Ym1enj`VT5E&AZb3`P%GKr>F53T0U-j^;1bo;$w9EtTX}5 z^M9Y-xVGUz?lP?{&5iF)EI;KjTQX~VT9=GS!O4SCG3>7kIG5gEDdUrLitYEW7xn*d z7Qg9KICRCei=%t-T_vAo?^Dz>zWs6VzC7Qc_TX$o{ggjEz7Z0x=ksp-X)P43FOG~j zrfz3hQ)DT0Jm#(Kn({px1D=@XPx`_-z4E;ZgU^C96MI@SH>Q<LORh})$};oq&h018 z%FeF+He>V587p%HzKB*@xi;=QxKQ3OTX&^T<k>ta<HF@e>pq=(Bq<Yfxb)dfUp1?z zk1i#@t5<&ezu~=+O!wBQ{wLOcde8Fn@%|1CwYOdg?9YNGwacu%!no^3<4l$UvuwWY z2Is#^>KyrTJEG^YY)t3#?Kj?OmCrot%dFq~7j3w>=1tJK3v3JwYJv<5w!|b@@4Wo- zJV?tAQZWXXB$lK?+JI*xUX}}oiu~Vec6P~SM(>GQu7xfyCY3ZcS%+o2uG!+cR!m!u z=i~&wCB~&`mzt#C?e6IE2rO_e6t@Xl^PuVu|Npk<Kg=sEUhOrWyd;+?^XHT4-|yWi z|Nd3A{?F&H+Zm!hw)RxrQC-Yf?!Cj^P19_Ou*>6AW&Of9p*=5pc6mA(H8FCw^|;>9 zS<DpuV@g-T1|~HfH>pX1-PJ!YPkV4`#jyewWuv4UTFKJy9?$-rdZ&k7;^RRMxug@{ zxb8HyS5~?lT3qv2BHli(QGG+~p~*hKrnD?qwNYLW;k+(!=H7L=GdwxZ3#Pnf;ixT} zwJfiEiOKPcvW?U9PWx?B$<>{BDf*G-;-!bBWUicXnV$H{JagOP+uiDy;xz@nsdDI8 z@viiDz9ITiW&=Z~x{_hz1dmfP;l-t#=Y_YfchYBOnbrN;igA9Z?6siGZJRb_Z#G-A zbxEx9)k~=sdUvOOm+}lQzHDX~XY;gb>HoQx&ZKxJluK`p&YaP9TdiP0U0a;?yOodn zX3qS`Tg$YNPuua@+@l({FAw(as$IR!&~?HpJ?(W%f0^8V@SZ`Uh@Gb>^sCfmDZ|>e zYL)*#J>n8kQ$2rj+RZ%m%gwu9a>Yc?e}AuSW}Dff)SsbGHw({j?f9sB_f|l{-JHJG zwB5G9!ls7^Mnu^s&)htDS9SBVCpwyI^LHFJ?$c-wvZ`Kr#@q5#%xT#RZ?`(G)Nqco zFrHuea<cea1#Oi*3W@D4;;ePQ|38l@e3Kd%H!Uaj)M=x*sLIH5r@7W0&MZ)9{~ncT zy)Hh#AYt|Af?1ZbA~Bs)_q-9AF?;p9vfJ0T6?T5U>dmEhG?i;nM%aa>rCie%h8`@6 zS@ghdjbO*zsJT8uYi>zhZ(gCtzixI=$@*WhL2IKQU0KQLT^@3|C^Y=`qSdojrcK&D zGb&iG@_OE#HOD<SPyfiZdb{_*)i-oEY`Por^`K&T^fVvYi!!Arwzc)P%nLA&+$Lq; z`XY^Uz2=SPK-Sn7AsfWAMfUWW3f&Xfv1G;e-Mq&a#(etR>cbaxa8FagwMzNIw;Rv7 z1hW4AxU6Nn$e!MEkv-jax%eK~vc4}?xwY%E=Jf?qr#F>d5xjeC`Pn}Tb^#w0qyG!q z&3jV1KSreH5Z`~1`JO*w9CX8MxcDA!IIuMRhA?Z?^2oE3JD!O&n4Vps%VBbE$uicg z<=0oO;C;So&E>1PXSe1^{W!`UwIEMw?b-J-R|+zDgV(T|zS=)se1^*F-OI#8c&9Tl zC&ew)JaQ&@*US=jo5;CWKCAEN;aH<86uiPXDMKveVn>Gm(lry`Oj$5dOY)r7y8D-x zP0e3^;8*7NpT?PcMWbxiS)Y59sy!`;|J{t2KAJC1u5^2v%3-_hMCMGJox2+zcb{Li zC$V<bL{EOn<2(9OgEW3MeUA^Vb^gb_K}~wKPw`BF%^efZK78eQWab?;wo47qK2$fk z%(_=rR_k0Bwc)aG=bgoliW^twYTIr(_rPSfacA}Vb1a+H7(0$!V_*9)XQ{4b><y!T zubRE~TS&b)?jyOX;>g97UCZZezr5gc*{srge#HVI{v~<`ML8~eJ)W!(E|{YJ_lM@< zy=Gc{i&Uz3mi~1Yv})Rv@rL8j#be477Wujhbe>aB_?g)6F1?mpkugdC)DgLmuIq;W zdm5!S@{4!;jZnIG<Z8?2L(hA%3v?gMjR<}?H{!a``y;oeRjFSyclj>6L+`>n-ARWc zY%dy~sNVQMLhIM+DHqIVT#c9dEA;T*dV}8@=YHv#wVgWib<Uq`tLaCN1%@`29?5v8 z_$cC4WT5lCh6?dX77nxa_eT{9<UVpP>FT%PURC=tlDldH*Y(MHt6$1Eon+;HS;K6_ zoNHcji`m;_o=Mwgcf<Lr{gaCgx+0GU+&v#>_xwVNYTD+XkBUROodb@F&r3L(F2WJ_ z_955QhA$<YOSWD*=P}XYmio;bEs}msMLkN4$_M#b=f`C{xh-(eZ$rL&pt)n{{fW=T zN>sYJ>z_ut1!eE5*~I!~p48#Wdx_339FDO*PjA|^p&;Pc$=5IPWYl+izOk{2(fD91 z_VviDV+9uv*8l%>Q%7$3oKp|y&OW&MZDK3O)^`u~*I(Lb^ZZKKCYeVT&${vjgzpE3 z)E}^Y<lfUUe}ng*p1_aXdneT$F8pX+Csh9+yztQH@F_K$x<753{V1mE@spi$r$Wx1 z7jERgy@5HqFn9thw?N<AC+gSFst4*loVGu(Sg5PqV!u#G#&))cw_JQQZz{Ma_xgTz zc30%{=e(gkk15wK%<O5(9WjyKo_z~4Qr2*HxgC2Ock#nY`SJ-pLTkSNxYwz6o;UHx zg9Q`cg<q&E?D)T`;DX=%y=V3rIeETQ;QeQQ<ltt-pJ>-fsvOz3Xeko|!xuIpdyKxB z#l@L<>5$6Ou_zs>rkp!9*Z*>W$npQ>(s!?kN@{iV`?%a>-o!gmaRukOb_w-a2?htl z#jl;2^-e6`deO(;{4bY(I0>~L5wBygpYrj}wlj?0Y^Nu^n{&Ik?)k>I^Y`zsW1ewz zQXfl^)ua>Zo?05EQSMykS8w)A>MES_ct+}lIlAYITx7OOw8j7U<gFJQysqkwv1HG3 zrx}~Fim#i-w(XpyEPb@?N$G8!yjx)#UzyB~xspB2fO-E(<q4`?Mc0L<mCs)|=`H(& z=;V&jxmHh&m+*u~o#hSQ_ek1o?woa&v+u+`z7$kdA@TWM)RcE8icgp7UgVf?dXr$- z)(h6%>*j@c?K)|nH)DyX{toxRO<T)rW{c<QNgWOKpL9DYZ?590ROhGVPt*=CQ07y( zwp(GB!|&I1rv$b8ZtzdFGPuuvx9Gj>vxJ5%%2qydomN-pon3p>@c4&i>pQ=H)BGJR z_%k4Ay3ye$g)tIeLYJ$WpFKY9)})KdX2z=|+1e(AO~1`nGRMfE-;h~UM`A~ZH`}`e zn?BdJpZ}(HB>qzQn>xd`l37x%YI}3yD~ZFLQgb)l`OA9gZ)X0@Wn96h=2b+O>=#|T zOw*>#M?XE~#oMV%zDwD9W=W}JcC6sMc+w!#-=q6Nz1I0}0w=}mly*61wVZK$7WnDT zA%<%Hxt?<tZoYUxCf&11UsGrCeaoKK3r7W3J>}lrQJekQWEcOoy9Y1clHq+`c<}j! zX)SZoMdlkFNchLTXt#uh&wHoebsXPM9#3UDY?fzmMAK7U)9F)cPy2)F#3oPHWipT3 z7tXgX^4YfVWLckN3~!)lJb&Pn$FKjty*$<WcN5F+SC4xR7#vvY7`#KwNp4cANyZJi z8|N0L%#sx?Gt0S@zh~0A$8GT!r@WuJbXFthkqiq}3B#|f+KDW$euo|sy`(OpF!u-A z7-0yDx7{ix28JVSM79*6>ApO%C>5inxHj~5-evGvCWVi7s7x`7Ii<Qp)Az3TEeFlL z1)8F+q6-yRUA6M1kF#7pvhEsRtN%mpiieCUTpeCD4DzireD6-ua?}&mzc+X0=I1@> zX>aH6-}j#(;K*JJp%W`F7-*GW52@-|c_KNcwU3i^vX+RCw#JH%<S@s;gQaaP4^3v@ zSvOVZcFKuqGJ*P6Sl64LX}Y+9%YSFV*;}vV&j>kRsm|QFbEe!2zL?(&CcH>Jy={** z5C7+b9}<3k<Z@2Ax-xK+=gS)zrmL4#99zx%iD!yTv$<AG#HDX@1!w9x|2nxX-SXQh zKJk4~Hy_I#-CBCv>}Xc=?sc9!S`X+H@16M~HrV&ywya62dun+O2kiUOwf|Ww+xFM3 zo78o7?=$%~NAZkntlAyXCDSavwI$07sPw5+?-!3PIOcx&&GO!jUuWe177aS>=PmJU zmTGUw^_Q6|S15K)X}dh*@`e6jsl23!gL~SdBLX(8NaQ@tQ`|Un&7KcF8`C(iYj0mw zHzRSw^ypQ0(`H!7J+IrlqA_Z@re(&rXZ|;W+fLT6T-&spC;4FUyxF<u3(pks@0!CY zRr5+}{Z+X=A6eFaa6A3ybV}&1mAkI2e0aye=la>RXD{f=*&f?FMR@nu_;>FMvp3&c zT2{0!$3Sn=!t+br<Sz-ZJ*{D0Ib}}8rxwA5ic$=RB{zAsa9o~sNxke~$v08O+9L6X z{{JE`M0Rb~2{CI@Ii1*1li77qGU`0@+qqXb1fR3={65p2;vEt)|3}k_cISN>M-P6I zwYlg#PebpK&{0V}<;S1jELh*G^=iJL+A6!Ko8~U}75B2I21gk=%{+cjd1w2NW%;Y* zZ|7^9hMqjIOd$EP?5?BEcNeX%p8Ac;X>q@ZRvgF8vP;Sq?yLPWRbEt@2`!q@r!DyN z|3yRB4vV$MDn*N9yKkV48qQFCaAr3X1H&pd1_pCtx=WBufZm~>8Uil<>)u_v7-%K4 zo@-wN&t0x&BL{&l4!w&ykq1)Rj`XLRY+jP>d0Vi)&Avsyj#0Vu;pYFxR>b!{-^S}_ zrl}Wu{&elR;&-;sztsKx`jflCb&6_=f%3xn`+pf|C;2rogdSq@QWA63@$@LR?p0R` zv#1F@5-galbWO6#%;)wObID1psr`-`*6eJD*RINxwqE;e-@|<uzw3VD37fks@9oQV zC*PjX{PEtWUvYQ!li7W-WwYFOt^VD2S|L2=cERas?<(08r>*L{9U#4~E<rNuu2JYA zv(n!U%PZIJp7+o%{^<pYBUK53i^5y8ISzT~$}J4(xXk%Q=x|8Q0o9s`=Wdx)UP<^G zV1F&td%JYj*>d0A3tO{UPKw_WEC0^lyK8-E)s!v{U54Y=mMr-=PvxGzfzN%GvlpU` zrMJD?UU6~N|69JN&2_)}FExL}z0vbZ(AmtLrH_}Mw6?!Bv2I@Q=@Ur~$Jpj|E|?j$ zH}U#mr)}rYXMATpH(&T;%rUWTnIG1DYf98MOO5>A)Ad$zTl%kO8!yhRR$^03=Fyi> zd%Wsc;bWeq|K<Mf=MyXIOWYCtI-~3H@usNj27e4VYrC0Qm*(<hwXKh>o;IO1af$8z z)Qj_+cB!1To4PmP?Y4Wh4@{O88?CRgy}119%RsG?jj1noE%xrxb717OD@x&=v~*I6 zO0aRdM~#YVqhi(f0`=c*iI<)VGzi{NJXz7b=mEdWG^L$J)m=|4TeiR9S?T{`XTy%* zHwA0CpL-PVF3<C^Xe}w4xmMm&>0h7XH|EN3#wT{k7`aF8EEE6UG<VGdyG$FScJ>(y zZrI4?Ofpg2?Yp~L;%(m4unzH=GjDQ#5q(+D_4COr<+MX7k^i13O){O-xx#Kub*-E8 zfv0}KGma@o`9CUbIKNoHgLS*7U*K6Iji4(QFTb2#b~5;g&CSe7rzOyDaeI>HJYzW{ z1H)owjI*thb29ZYN6{hq0i!;cI_bWbw4=ze{hK2<?^-7H-{k7HYbzKRi(L20_gWIb zytH*etB2m6*(!&vHqD%Rv-1a6t;~8B{a*~VD=rz&Zs=$=*)4v5=H~l9WzWs|`}g@n z@do89P9hrw4;^=FILi>~^f4kc)n1tE>t4Qt`O9iOBXTr#{o9+@nLJ-KyC7}n)Nd}A z1l@Liws?8ld#d2HbL-Z6edSLy%Dfd8@h{}px~(Q>T~cPIoIW0w^+>~P(fkuDrmt8r zlaI~md+hwc*te2P93wnT+mFpV75)3@5yovCpZ$NyT>GxJc)ru&5aVo%3Acp&Uai$G zR9@ur!Xhhramk$-vvvr0|MpGk57~F7dyimvocg6x47XeE{!01K-WJ_lUhT2sZ~yGw zTP`nrd2;=!+$EpR6hAnooyc~S!MbJf%kK^v_Hh>@zk7YFIQ0E;j9_B*Cyka@DwE@% z{=eQ{-Sy#)j{-|gS43xN+JCuwvg~qc#lq?@)t_1D_406hWcpB<9&xHvQhVpRN2%*X zr|Vlkza{an^Q!dWm-j!MI$_ZC{GwId^VIyJ|IvB;=R|(gwpZF8QOchAb?WBn>FA3X z79IQUx|)fBVH+!vvxbn!hm3JTMvSJ0{Pz=f6!`b8>glP%DN!sgfr8yz+)oD{nXe#~ z?bE}dror|<dfoJ*ioMzI_!jp+68@pD!qll|*YJKxVOg|5&Sa;_=iZ$;SM&MonRkDG zeg3Q7U}^Kx)!t|Bku7~DT~4}74HiF^(&61~Wg^n5!EHGGQ0_zP^$*vzRr7GlU6a^! z`t~2??KbbOui0u*^7j^#v;T#Ty9bt^UG#eQN1?+Z`|hs48x)ZqpzU}yQ6i$OHa&Iu zzLzceKbAf3@M%1|w^VMIQ@-TYiqpLkJ)tu<a5}%@zF&T*>-gdm3xl&QIkLlapM;*@ zm~(!smgC-Ye^+^YoYg*2_?h3aV8)lTgzbwLw;i`%|H10%&Kde8T3hOMpM7f&-=p|4 zW5@XkUCqxnwz2c*pARW7uS>lt{q*u0fmFq35=H5q$uAynd+QRo&c@#R;nY8tyDx4m zsMWo}nfrXFcALSSHUniRo*0K?4r0wtHYNrQJcjyHd2|vcCO)aZv)p=Jc&QU}|Av$Y zR>veHEaMN(XgkicwD@D%i9d(q@7^hU^JB`(6WNQZ`CqPk?)v+y#<N73y~U4p+ZOUo z*4?vQ`@A&o@%2J?{rGa1g`K@}>0_RYf!}$3U;prhWkLFx(?xZcnQG=XFX;BV#g@q# z#eT+F<;=_46={X?IsR>YCk;dszEsU<iks#zYo&zR?+Rlc<sCdH=6W1{;-?an;eR<} zY3C9?omux6q)ldj@v~{8`~@?<i9%WWHzjr1FYHhH@?ydJD+l$Cs;exQYdmUl@^HqZ zZ51&~_p_ybTI(jSruNRYyTNsJfzK><gR=hB*-Db?6DIjC=~?l|O}k?1r&UZh=jh2f z-L#hNyKi(SXP1n*%VC$*ic)!}+B#zSCVQj=?Py(TmKO3d&;5mRny^rmW85hwx2H8C zQeS0bn*59x#;bi5N1Z-QcP!jAg^7Wof|aD!FeL4xHwWg1oc9-Y6#17{cDpr|TXdmT zl*5_}K`ELFEmH(MgeR$m`eb>0F`MEW8B=!h-LxO;51gDmJ#LS~qRxw}>n9uTySYw7 zZ0*MjmG;kOf8Y1LG;M!P^?$(wN?|2mlHJ<%#Ca=uH(Q0AIr(&ATjfsQYgaZbSa@VY z%=TF8I|%`wT4UL^K6)F?<7|3+>%47!-*o=(yiu%S9P?S~&`r^Ox{obZwy~ETm~hjQ zFZcY~_I+>7wC`Qq_`&tXPae0crMmkcbtr7$*dF%z&$63ej_ymI$$Q+4vs&d&?aenc zKQNy@9~-~&%mULz9kb3o$!>q-GNZ3xb{c!+yK^F|N{)4}nyT_!@4(Y<N}U2S6?GmK z-#)oJ+zhc5=?(WkQfTvb>M`r;_Aq6g@^r3H-fqDi&o?aHG-b~IxP%jbxo0ihpJyH` zxNQmF>-wb2T)D^pXx^*({zf{)Ykjru{>0qdMO%ErcUM-PXlR_$sH&4)ac0BK$;qxP zVOM!|%r`jyKJsdxps=mLrpHSf15+d}?f;w>@%KD;$<hdSowkXuuO!WQ_1FJ`YN5_{ zNjaDEZF#p+)*DAGC|};3*bujpORsfl#ssCwI?A(W>}9BT=Q}R2)^p|)u1im(Wf}4k zT689VI?`_MywGMts7?E#eT~cZwXVuJ^H*x^ikrbN7Qd1d+B4U7@;gnTtl!L6#NRM= zDlMFxtF_3b_xQ`rjPnjC_$!?@_4#b~WM`j{`~e|<*OqD4zR6CPcDLRZJgIv}v0r$n zYR^Nxt7nwjtDmfV(&(q&>-$ZV?e&_fs_tWw{l_C!_c)oEM*m^S?W=qKBKyDV<dAl! zsAH20Cz@`u5t|aLpRtU2$CLR7YJD#5Yho9)Yj2-8_n7ad<SFmn84o}4^{Cj@zf5yM z$Hw=l$vwfhE|i6dfnf&=1A`GU?Ox0pKKOqAr2vtCewrfO#SOQwSc(doOGsbcE7_wa z<m+=Ht?B0BdwLf(=smr5r_AlYdVI~rBkcbf{%btmsXP0wg5#_$&)xTbp8I~z?SKD1 ze->|G-jbUVxOt+pZvSz!R~1Q#$DNudR6q38ukt)$GV3_YX6c@oLs{o1zkB#I<-scc zqzA>zE^)UVvKKpb`J+ju+wwRMjXmO8C8730g6iGxmz0EF7f*cg>2#TXKyvz;BPYt| zE_`o!H^E4-Xo<B->DQ3T_JCO(`pnanMP+My_BaS#liq9m(bHnzgyiM&n*M#(XN8^a zaqBBcE<6_Xl&5cl&<T;*t!fMB{0J|Ze<sst`P)Z@X*(jF6(_Ve?h*K1b<f88z2*eX z6VjHOHhAC2)Ol8U?V@{bO`X?@|NOHOzBd<}mfWxUb;Uf*AlKGcQ0x=S>W^AE@3u#a zMY+CNn3Fhv!}c>dHn;Y_mEk>iC(*?sqV8?Wtw#^nnRxd#rO)Wds93fC-YX@x&8PN< z@%`GA@Ithqpjo+HcjMW2{~A8_$}*eT7h8F%irmmwW7xL3;iOkUU#C`%@Fc!)$yvKX zPu8^m{3>-e%4hRL2ccOvcDI@e2(NqW=Tjp-dye{@-67YzlJ~9GzU`&CxMkB4&G-J? z^EaC=OFk<yJ*aBa^r}r24ef=IrpN3L`EHwi;=}CRH8ae@a~_-B*5%cIir#!EI2*xx zmx+NPo1KBdo|rThnwO1d@@a4A=^)`i0o(FPo`(z^I0Qbnc4&BVv`pt`**M|SB`vPC zPLUgSs{|L87&-f@oznlIueYSjeJZ#8fvM8*+~#?AUg$@Z`7d*72~gC#Q*!_I_VX|I zEzehbU%$VWJ%MYx>5&OnFSKnmi|XBca^uVg&7QqM%NFmDI%>+e^^NEGjz?_{zm;E3 z<1L@c%=C--w%Hw3?`fyqA`@zE7IyDkq|H5T;_2wLypx(!m&8Vx<u2}$Ue|n{vt>!N zh=-2-Wc`$LlgbRYzuLJhcFE#ze;C6OUKngXAH3qRx<|^rEx!4V2Rvj`bNntueST@$ z_+e7;f@ixdQkMqZGPrZR=&;cbH@~>3>`SJV@+^n%1y6Q)Ri9+PeeU#chkehNyxIT6 z#*zDY<I7)jT@UZpKi!?TF~}&V|BCO@>zZ$FOnF$PeQetH6Gi?@F0DQ1S^S3imNoB{ z+?j@I*)=YHH)l^f=${kz;A;JhxX*7q>kpl}#xmQ}EI4NwYnwmQvh1~1qUQN`j4QvL zRJMFv<1TCaBDFZ!UHp;Nu89{GE(|^{z_w_{WyAjHzzehI{e8Y%(cr4cZH6m%6{h97 zru@2UChnD>QhF(o$E=!#Np@4fj@?gp7Wqbr-uiA@wVHQD-;^T?wXC;acuP7pu{*71 z=|Az^MD>%PhK*f-=&h+4;%fJ&3;qr;TD+Shb<=K+^kZcU^DZ|wsoYcvaj0q0vU3!k ze^GVcg7BK7npUSnI4|@YH|&4ZbSS>i^Jsjbv0~S}qdOOrOtVSXe0Y7Um0({-zTNsb zTiy!RbIA%0&zP3Xy6ODntm237RvV(2;}ud@J&62ts_=olokgVYin|_1UH`i^%`bP@ z>|hzAH1DS3)-r)x&Qs=89av%5{iCz&<LY%wE2d6WyVU%!A$zWfO0D4Op0wlN6u0r0 zem!{nd`NLt?9l?t3zlu#jpqz|epr3hYBl+&Wg?#@?aKaBv1^O)WVvViPfN~Orl)Th zIcNS^o^|b8(MF;L7TdCm2{AC_Xkr{Ui?!DUX=~4o%uI+mI`N;^teNIjRohZ;Zn90t zdC2^Fn&Gw$PlN3kB)!e1ZJfw|CZcMRo80-1nS$FaoOT=%>=Woq5N2vjXlH5KnZn(8 z(|5-qp%d?fZk*kec(d8Ifmbny;rQ{ozxQTeJo7@b^G`sze|czWXzA7KSN+$^R(}&{ zi2M{HXZ3Mo*1vGm{ns~&&CmGJ%%^X6@uTLy6~(`ddH*ke=>PKvuif>9kGW+le*_&) zlvV!tyhi5W#hN$A4X?^vZxIRa{-NrAT;k-_Ba4&wRQ!Duyx;Wd4^h{7eX)yvtHz&| zSS7hI&FxpJNa;kT{XN%~1RO7^IW#x5M=iN@$^+s3A{(a{u994Dp|(P80n3~vPv)(e z)#>Hm{eDV~jsD~t4_2s6F1_NhQEmCF8QQ@nGgqB7k^P*yt1rsZH}KqrB`(L4svNya zudJLZrFnTt%<&@C54kg+Oy{a{)w=36HGb7qJ>$^gU3#0J@R-h8dvZ?AnrTw|=d3&# zV>)N~wl!Z**DU?cv|lG=zj)@R2zO)F(?T*&JziC?oLZA6x&CC(ex2Yl-Rm1e!&Y33 zth0=+d@d9FDs`#e^HW;;O#+1HwVS-!6m{*#Q=6?j!X~RV2FiEN*qHh-!6xq*>*KI; zRi}#{!AfFXTlBl%z2G|5)S2NkxwPrz>88TXc0%UL9|M$1I%oQ-Xl&Sd`R6%t9}D|U zwnBF$H;P|pNiH<LHibjY$M;(C@nZiC+Z+vUrT$`a40P6zdw%U(R_vO)QHyj-b2*LE z&L1<)6zkcVc8=@lqt0dTa<62&8(i{Y^gg>S<II^^*He;DF_v048yY9y_ig&q(|Pue z!QJR4!`0W<td76CW9!CsiAS%QmcG8WHsZDh$C_6>aYAd}`L!InYPk9CozT5%GZutR z{Mi&37=3f8t*7MTODm+CVwarE=GyAs)cH<AH)i6_T?hV2^10nwoy+(++%@^_)wdfH zvTv-(<7{6gdpoREY1!I0e_W?nT1oJ^mz%Ye&0O2Jo8{Cm!)rCiDhpH3n25?6zP|n` zz-EVT&ZW+MtP4FfHhN5m4mwr*MW=h)EU)@^S8nW0o-G-@oP)J>^&;JaAATk1EUB}e zJkQ0wW76`P)?M2+uUxa;yO$+>T8>mse&#lo?zN`Ae5y~j^ZZ$2sh8B@sa>{p#>ope zm1aawatl5GIjD<2-}-RSjgM;*zD;oRlNNbC<&m-S+MZlFAKPYySv@9C1H`|os$9rf zbor!o>9=#dTAayueG)}VQnlX~Ddn-f5?egEG}L+a^voMO&NRGu>BZJM`*^HV4C@CD zuI!uVL^ed2?hM$Fb>q!pt0O0wHJv&Nm^9+VB|T<jsy4IiY+awn8FltgwsaoP?oP?O zljfd`pKIs0ZTX@mE^$5~!SgJ0)Qlb5jE&O8c-VtX-ds#s-Nh3%#ll`L=XoXDCI2Ps zR(CVzstZ0m)RE@!{6@x_t39g4$L58eDm{9}>@~+EW7f=5Yq^e2-M91hS-C|=R1X%I zn}3}((Z%O)T;g}vnG-C}&I*gU_^zePHJo>5!5)RO2#dLzkJdaf$#hH8@O`=`@mEXj zyS@i{2e0JV?{fRJMW@-%!R-E79`irtPv;qb+57O&@{_K!SWIua?RnSJCQ-ocb%{l{ zyX|mVw<trN;ajGlxJCP{-j=XL?_E3DN#tH+_s1(UQ{Epm?wq|c=<xQnyVv^4o@;TG z*4-L*r7ZVV)A>D(>@0d3!Sf>D<V}o{Sr!;?y)<~{O7`feGZi(r=FBu^z3koQ))*9b z(Q<bhU%|Q1Iq5v@#Q~8MMGXBrKj<sWuATkb_u{(<?ri1O6OY+ER|OUE-06zuxzixc zduNT?{ey2^Ry69K<2+`)qgPG0ZA(|?gX$gr0X8CU_$D3PVz|Wj*3RaV6>ZyN&Q7@A zn_aqmhqdX=JdcPn389HA6l04F1yz54;OXQ%Y_NROr3o!1+*<8-4EKHrk&bn`v3AX! zl81+MpSHc3vO{tAlH(J+pBg#qP1oj-RqcMfl<(-FRYuPH6vMR^<x3S!jq$D6a_#D- zsH3?%T0?t`!*?!S)l)d1E#~B_99JE&Udf`~psGI)ws5pYhaTg2yDMy+@ssGHy^7`< z?sqi8C5k53+@3J|X_j-|!MAO9w6;rrl2z6EeTVJnCdKWi%OfLp9$3=VD{geIH1>>1 z<+`TJ?U7=<HtJKd-v^wX+jd8_T)nqsgYl-jIi*bfk(NFWZ}v+#?^FMtG9yU5o3&cR z$XG?Ii+4|Ry+O+M82tvt>L+o|`}DtO6wPlmf6Cr=Xa3Q7OxezI0S}+el$$SivcpQ6 zk@x4qn4A;Mp9H?o%#*#?FX8&}QPR<b6Nj~q9^08bSFKv~uU!~RrmDckHMSCIoHzG2 zmnW^-lbV@4JI*G#s>ZEQBTk0r_?d)k|3dBew>oY{E#2~CW6@{jwm&XQo!)LrP!aMK zVULdPUYxnd@srymV_h>}8^IpcuJSe^*`vl<=^>Io#MWJZvb@bkt3UIT@l?LRgUb@V zbo$&5*&fxs=%FOh6>xD~UqZ{XBTl+Ub!BZfinT?|`MC1ird?}|SM4)OczgKzlS1cj z+OBHTa^h-!K3jMC)uAcXN0(h$QS^G+rXc5e6VzW`QB3Ys{XR*tv#rMNymZi!&bUj5 zJIlY9Z%ep#y?!nadyD@ExB134I<j9<<n!#(?eDOP#y_t#lG$*+=F9Z?Gw!K=<zjC* zShXnPxt-EtzZAnaVUyD)L<*Q2Z7%RhI>nG-SX_H>$6hnr#a@M7>n<HUy5+pq;**vO zmwa(4jd;Kkx?t7o<Gbx=@7z=?k$UO^|K^4AvzJHj7UjFvl<KGP^mC!)Gu87>w$rVe zKDrf$ANsZKVAW~ijdeY`nx)!N++{4)+g465(3w~>MRe+pDb3PXtN%TEmtZl^b%G72 z&=vlo3-NjTj@{nA)Ol`l+@9*_JDpb-O{%&sRMx`v+(g)H*NhL-ZK7lMXZMtt1^aE= zmw!g)n6=ew;U=-JEwgrCX};w=`PJ3JYrAJJi++&2bYa5E+ZSu@?)^OXwnp8$s<K~A zVQoU@F{$$xa4eRnSDIDzXWEWccAM_{Y?vn*5WhWp;f9q3r^L;a-*)n8`@C%Uld;55 z%2O_((RHRta_c4i?XixhGxIh+7rU`@&rC_1w;MCcueVLOwcNn=_0{Q2qUpwMep%{D zn;n!ZUq@!!<%Nm!)w6Cguq~0AP?gz#&LjT!?$%G&i;V9HajV+bm9A9(7b8Bo{Uyu& zvdzbxo=jx!=5>6^v%brG*WLWu+zlCj?$qu5%X{efLRr~w;Vq5r#lJZD8Be^7mr~oM z`p!Y8^7f&-AN!sho%qz|Uc+G?-{&`N-e<p@CAoRsgX6;2)^0M$a}SETI`5;S4QsUF z>p*LT3`y_3YKN9fW*QpTq--|7;qy6G#a!iSuh-;d|86>-$S{4paK_D9RkkZx-al)) zcId^HdHdrhUe=rcxlqe$qgaEu`pQ+)7t4HgYkQ!U{U`U|$DKL7`JuH3S-x(1{9bU$ zL+M#>%YSAI7Fj+jy2)5^>es_uJBItlCn^s;+S9!DoZJj%{%4Q;`gmr`l|Rh;7XEQ( zEx+cJHLY(%bK@d^I%e$s@ZO*EW2BF^4&&n-CHDrYx5wnx-9Npt{qOgm$IWd-7hkwz zo{?mCwBpyq>v#C~?tGK^<cnf_0mCuIo{SgAPdwYiW!Vte`?OZ$0rw%{4_^|uBy8Wa z&aJg+|DhRC`KbqPcW>PNbYsKz4J*VSmn~i(|9H0O>y~4+Me@s;_gZ9{`zfU!@P0J8 z+Hm7F@ef}gi3r8`HF=6Th8~FCut9usc8yu8pk|loTCodEf1d6<@yK?nPx|D{uA?QZ zTwi~*S|TF-;a5<}<oQRg*lH+!H3@p}SZBZNvxZ-FqmIg|ubP{g_t~8}v2gb>%}Bd+ zcW>)GPfx77s^fKb;ht5S<W)sNq9U$!7rDmV>*l)Zzve6ZpS>&Y^d4%k&(sS&=$o}` z)y3$^;Zv5!g#A@`c1i1BP?_lUS2LAL-IvT0io9BpJMWG4zejdD%k(C#Teo>1|K;{e z-hwZ$O+1@(r#vSuRo`#@jeOURuI1{12fx|)BnbJq3cuRGr(I}w`zuEh^R~xKUlvG) zCn;Y}5KhiDmOCb9)64zw`i-vm$4Yy=PkrCOJAX0j@rzo@38yNyoYc&io>bzYY4y}6 zXS!NTs&JWy`l3s%dOMlKPy2S9j63o)@LwI9^;63)Cr<AOxp&0;iF1r*{Q=WYlIteh zKd!QDlP)frF-_~6{Lze8PY?4K*x%l5Aj$urUB<R2@Y)==vpm&PcikwFDxclN{!yT$ zGug1trOzg7>)EKU#rJK}L%PB>Un&;Wy!h}d^XBp!r!D1QJ&Ant_{8c>nlo!<-X80p zSt$HO*`{f}f%)=Nzkg_&o;{j;vSj;;x?>j~&xvekO4hhOVfn)>-rxNReQkzEH>da5 zHwpFiEt<EsE!KU-#Y7#eGZ}w`mOqne>p#3jXM5u-&c69ag85|5KJ0PgT6^X*Ptoab z=?gEc4f(gtMC6i;af|jkrIZOB)*6re#0A3*&E{=%?U=qTd(Q1OAD%I!nNBeelUw!i z$+e2^J+AZEXP$Ds7rAv`SBl@fiOqIr&K+#a-rMv0e(0CPz6BdEu_^YfFELo*rWow1 zf9_8CpXN=C5%UfOGyQ$2{>=B$%Cjl)hj&=?Ki|{%eBZ?MWnbp{o>gCX!Sd|qAJ@Hk zzG&D6N9>Yh*VXxIEd1+(j;`Olg|?T^OP00;KeRj-@Fnxbl@D{;p5NrU`;m2-Y~beK z{K-l)`5v;~R^55N!1~aJKda=6XP@RzkSp9it-@yi%nv&sFo>CjEo<1x-~FPyPG{Ns zX;-SWbjz;@{gG+kv(By0y=L1CE7dg3qY(mLD<Y<eY?|W~CLm-I?G>kRe&VLMUYVTh zqQ63_<qk|~xX(N1SAkgT+rv*9pDsFh`uKOYKdtHVM=bBOYF*LZsIPo~(q8tchhBaa zOqGm#`JX@2`ZcqMqxA5aAT#Z^HCj?SZ`D>#Ts$}IN$7#FS^-|uxMS@}nKEZCO-+hi zyXQi?so3tVKTnFbKChg2{MNIWtrt`>ULCcPGFh*bdH$!#(vFOs`wE(Kr<gbIx%t>* zi)8=(GZuRubcXQ6ojMWpV#@IfPJ_$dlB%0G$Y;-(@Axde<>l7Nl11jlPwI}{RXlbx zUo!rG&+`wA^Nt^%V|gaQvTc5MU%Y^K{1m1=Dw{uU(mANTiD$i+b)Ba5$60sUu0K`X zqqzQ&Z{^&I^5s)+C~H<*zEwR{c-+0?(s?8H@}S-GAB*?g<2T^dFEZ_~p4&8CXP4=c zo2O+y6v`iV^61?i(=olXc^22Tl(>Q~-g}M(oSQ8E(Y#`Aq`-vbAGJR{Pnve8+dRUm za>d8b6_X>MZ{6hfboSbl>w{<g(KS4K@8Nrk^wTf=PyVQ`3QoPwD^V%4)vs*t(!_OB z6ZR)YHCF6l`t^X7*Yw(t-0l|~VnWXRk5iPM1^R6HP~!8h(CXyuqg*nnXOmTRjLTbE zk3Wg6l_(au_3D-Irr>$C$L<}kOSPXRX(TOe(|szwaecwlRh#T`yw=Y)xVv(8*52iB z9OGCIXMS$uDizNUTztp%ci;ZQKXw){99|`2aiPxs-lKW>!57Op^!Gp2{p){Zb9ra_ z{=-7|wt0Wl-}3*j$h^=EQh(epRZfjtQhVKL<J6wj?K)?oy!L(9v7R>J^RzG4Cl}Sv z-}~tYOGRJOmbNrYrn5y%bGLo-ewBFN=)YIZ{qFkW54J}(2hXzzxff8F5t!Gz{6z7o z<{OcLPiBU`-s*7o^%Vccx}03SJtsVE^DjHH@Fz%j8?ox^p8R_4%~$nAt^BQD7uEJV zU!Le&ytcjkXz$+@nPFEyF}6r)>D=(%Z>1Kx%;8A#%cm<nlFnC$nNG>B+~4ME`$6&8 zBjtN)@|y$x+uDBT%wFJsvCaNb(Yn}Pd&ARq>3#K%Pkv6SthOlSO1_wQS1WE^--b^f zceUDswx3db9=3C8`pQqbmF*eFA8gm_Q(lqQ;AhvfGX6ldh-;XMvC49>A0OZU;D4UB zE^R%Z-%g9~7uRe*IA@FX&C@y0&!znH|1+Jt*zeonLvw%bk1d~;_~y)s-}A2sXLfF7 zV&Sr`-Z)phF<stfr+;Er;tz!~8`k0v(JLF=KkZP}J077l=g$SDpB#bQ+3te=i7O+H zr^krTFA(3{zj6L~yK{C2_sxE!m$-lOU%hX(a&!00-O;oE_~!j{{))cY?|4%AX8g&2 zv)`=$^yI@9>q6d_>r?AxUxo>5#(jMH7j0xos{5(kNp=PX1|h5?OW;xc6r@>w$jH*v z@XT`QbkRDu+b2F9>3*eJHaWyMIeOYtiAf9}gSPk0o?x*p_|dUrnz}w~I@g3;(^x!F zc>5H+fQ*|9b24w5GjmQ5nUqizvG3qR>-#^B&0jEQ&Wz`^=_=mWb{M)pKXd2%x!U>P z?>*Nu{&jq>{XfYAjDPf+%4TSN68w>HO|i3EYYj)!xkU<k+q#liO8e4w$_eiX>7Tqq zM^9U8Uie2R7GDG9j3er=KPu_1{1IXscj$EDo<)zYa%``)Y7(n)JDM$6a){^g=12c_ z8pMfzH*Y!m{OCFTE04Q(s7#9&Vu%m>IMraEl%x2*u>SRreG@<P7XDneW6#P*(Ognz z_slgcZdKMc-Zu5*(v>s!EYN?=>}ow(cE+X8hq+#*8NHm7C$8&!@Z_uI%IAz$KflDx zci_X4%%$v?rp-Gg#ms&4%z??fLJfi*Kf5$(p0{sW(J{@+M;|mMN`IObXi&6mu~vw@ zUGfc+$|X^c3m33#>QODe=`poYs^|2!rTvjF9|?V2nX&4?%rhb^U-tQ~(%s;!JTvB) zT<8V4^#&G+($nhnvU$Fr)8govt?68G{=>3v@8>+PH9z_|mRyRtuzB;Yse;+zk<Sax zDYrPDoyoOj&yzEpZjLp(r(6oZe0OvCXF2`X4SQ#3R@}Ju;BuI$_myoG8y75CYjtI6 zjpm)ha^IA{m-`3oPd;`{d|vWgPYu!gVIO5#564yB5L<L2^oE)D(tAShzb^Toba6}X z#+a-_XE=WCz5H&gaY(_$P<M@v9+9^-7sD<DZhq)tIN4Wnnu2+-#k7rFTY}DY)l|1W zkDRT1d)wD9+w%hTr>t6I8kc?1JAal~>2@K1Yg@Ob9l1K&gKpgvT%WO|(0I0~n9BX6 z^5kni{!*viw%wVTd+!*R&^-Qa9DDBn_IZEde4f%Ok-Oi1ud>X&;co6bC1YikR=QVt zZ&5cx*^8A^T;^Qe?3&E|D{|ez)aRA5Z@pXWUnf@o|McJf(A7DGQC90$r!iG7xP1LY zPvjP{o@B|3-*Qbq{BFH0#rK$t^RB|n9dQvU-PtdW|C_}w^Hb_xKeH6y!-ghyvw3}y z)AlKGT>HRS6L2`XBKmOoM_b<e$N5E$ynAj~yw%pu<d1-T(8uI$htjTv{&6|%|IwJ0 z{q9E#k=I%($yfE|-NXO33GLE45d2(kLyPI0LzAWI`a<{RZJQy^RdaGiTl|CRGUB#U z%M8{g@;o>B!xbJHbJ?JOvs7L0{emswKJ4E-qRvm-V^vjou%PnB%O4`IUuu0hQnXCg zTk^SNZPxx1qRD^Ow!Pl5>LJ^_iy!#bU7HkrSZ4R)GQFu&jB0~2XZIYFpPp<P9JVF& zYrx5X9?x@gGmEspZ&=A}xpRfwW4?)7`ZlDW4qm>K>+;VnHv*Tgh}tYy*)ivK`{S(- zwo3W)J3aT!_EbN%!2Ph@-+Kzu??r6qn-{I@ofvL=Xj|RN7V$H4)~36BSu1DA!4$nG zO@rB=+iKTdv&z<+0k$7@%-`%~G0&?vb+gEvOUDoYG0J`3Ud#}9@pXW~fvNoOAJ5W_ zi<5uy>%ubA=skP>3B0Pb?{Pfk++f6KACh&?<4)V89nAOt<o?K4axnBTED?UyCb2BS z-LOdbYi;%g5g*m-8=Mb{&RKF{!GrY~bM`f>-7?{4{gtn{tBqZRht;}iU96ACr46YX zQ-0Vo$u8_WAQkm@Ms)1|>#u%Uo2N`T{K>xQShjlj+CTg97hgGd{^MMppN{{8Z?sCj zY3sGE5aoYpdgOzZr_{qf=Rf?3iy8ZqL=>ZB4<uL2(GYf#JuJv}rogaIok3IfsNtp0 ziKnFA_dT;%Dm>-8;s(ESf3zlPsfGM|f55h6bw<d=BUkG${EZiS8DM?Vc8>a<NfC1% z-eg*<e@pC_@U7>6Io(#@J9cj7&jx|lOC>~-B0B0Fj+b&OJC$!MJ6RyJ{8vnSZPE$L zoribtX|J%aWuKe!=itf%D<)4}*zh3aQ>}-G-u;7j^A#ucyxY}!xA^1>xysiZVQc;@ zUj4e>|K1_z>!&?$=)Ybno~R<QP`vP3;v~_E36A`RqRDIaJzi4LG)prm-pfIz`lFzl zg2o^1$+ffW9m{5XGp^|R=f2}NPuk2Wy(}E7EzKF%ez@-(;=0^v*L$U9i=M`o?C7bV z;x^~H-edI@A3xrk^I~`FjX4Wum)N{HywzyEV5Y*UM}{vmXK!BkCf@k5r0Sfe<@cG* z-tbyG-kAKo@vp?Z!pYyw-ZMJt9{d(&5|qAjV$?F>oCWUd6eM<R+x0L1|JEYETPmy5 zZwPEosqAyL>X-Ya-Pbqqq@R@v-<Q*8rp|eBbn}mj(1qM*)nn$F{&?@CdVIGTSJZRk zebTXVaS!KA=vb8f@{67P+?-in|9Gw6FUYpLB|9PYp1Rggv#NiSL|mUt=W|b8qWNu! z<4>Epu{ze#Zx<a7X10#`vc`XxSX+^}ZH|Rqq(ax>`wdToIlAI*-Lbscb&hk_2R|RS z_0K1kC089fyH?FXBKS`GPU+c~W~H;otnpYKRu-NtvG`LDkKT?BOY^nWt0HEJ9i1`d z@rLQ{U-Ez4R?rl9yz0cnZ93;YEjXSQe>)Ml%)^t%Kz{9P700Ca#XZ+7e|J@XONh_> zFm1I~TwrL)(t2J_`K!E(X6=0Ox%1=i^U_ayELFeRsK4PZdG5N;DejT?<EKT}%8L2y zUroD_aPy+$%Q#m@*N6blzyPjkDJOQKpGaDHpS9!`69a=QD+7ZL<^(N9V*s+e3(_R$ z4UYA{;viyscl|r}#?+qyEQz8mse!9j{9sh-$nXd=jBGx*J+VB9ZTH({Z-pK%|B&;j zn}5a%7SAi`^;16jMJGh6d|Y^W=I!e9w$Japd~biho?*tJ$tIgLR?YBGZc5^k-7#<3 z)3&aYDql>5cFa7e>!Vs2z3=^s9oqLV7wugBXkQmQmr(SXoPu!2ZCg%mn{n?$%gX63 zug_|DOl?gxT>r3uRatj_dh_O!I?npleH(gaT55To;qtC1=33PHF_d+q>u#^3vZ{$6 zr}y5nDv#S-I$3Gwq}aq~TE#6k?FVOUSM2aym}1?QXR#)$Xm1kNU(w>2xY#Y(rfH$7 zSG?{DZ*zS+iS2vXQU=z$tsgf}5!o`;Hmve{)78UrD;INRO|jO>6tk^TtLVGJvpP&% zW^v%-Y0DQZFEI1Anvil_b7%cW?>qzZ5Qk}dLnr9n=3RbhKIh4@2Qn`w3wb*8SBaL) z-4I(KvrShs`-O|&VU1%VJabE8&3y9=ChL6sap^bL_l+9L3}?f0-#yd4eL8=G?!5GC zW%u^WOx|>HLsz?0n!)M?_CD&*enuVs;&S(i<1+7+{SKGUZ_~Q^LE^KNn99P7|E1q+ zPMP}EH%^iNwts)yyB_T_ruWk_mp(idsAC@Ax?swhzDoz9*hK3l?^}H+cGcCrxiJgt zHN5R5czt$xyw|gGz0hm%_GD3%en1Le;4Q|RkL;#AQdG+R-BIWIX7l{oiD5tEo3xTb zF1uUno;a@h<@XQf9WqI8TOuwW&F^@>=&eBK);YWSpPYXreuQs=(n9$|1-~?8Y#r2^ z;xBw#Vf3o}jcVV5IIXWQRQ@==3OEoD{Qc#I-wL*dE>=rtDL(03`DEc`&$Oee|L$#^ z&>}CB*VNf=&}bU2Q8slSd(ylh7q06nCyp@QQmVL|bxOj>WzG5JZ=SbR6qz?=+wtz& ztN7^igfP8=#jywVuH10n^x*QwFAa}fgpbEezG9(tvywCDLuU{AhVPiNV@@@U3=G`N z3=CFS@<>sBR%&tyF^Bffo#gF*$U&s_JS&S!jeWr3MQ;wU%#tX5tQ^>*y+}pkyR-E) z!`yZrX3qa!;c9w+82@QJ7FlI@!{xEgyO(n;?|&&<mj7OVJ;S$+(GFtLl{wEgPIcF8 ze=AeQaZ^~3tJcjUJiENbCwSMK4R?eT_sg-xuFH$OZhkJx+v?2zWG|P`H_p76Cn3-m z6;!!x`Ha`aw?DSt4g1t+eamCMw(gGwn#~QZd0VoB+mw@wN_`@}{z%WLxqRKJt)(|> z?bictXTC+gxGB5V<;Bbw=lWl$UibNNM|FzuHMTyXkA1CuGFt8NohzR1wf}mp!%9P` z-KOzYOH#ep)!uKM;<D@3-smd%l=eDK%lrF|tFm18w=Uz22)*|~Dr~Q8&*D3o26Be= zC$f1D9jxc;EwE^wTh1P}@xDcfLHav;Dan8@iObH-o|!wP=iFP{=6PqFxmbfY3m40B zFB4nNxVT%mhV!&xO#j0#QLhTwbZeb2$G`Amnl;b$bmxmKrdcyxwK-S(ELUIo740@x zuJabQpg8@*#K2&Q8K=Q$*U2GuhtQ7HoIB~X*I@^dw(~bu=WgA0E$gc59aAUafFrHq z6U4-W^aEbj&62x3QAJqoveP}U@Fs5g1MNcUnF1>vk3`Nf{(S!b**QD+)bH8Hcz`iy zx&nW%QjW;N$d<EAIid?(73xpfsGa9bx%F#;!?x4MJr>+bm%Hb4SFo$vs%T2k`{HgZ zXRQbmzawkrY-l(TIG_9W7FJp7j3_>1_C$q?dxh_~D@wA(zT0(0+P%AMr+KhamoSs5 zbZQb;e(lK}?h7tn``usS=G$Ji&2mCh<+e@R>LRK&G>Z#-63kQeHn4by>G1vtiKsZa zsO#(gDQPaOAqyB>nU=UOkU0`?JY1ylF{4-Rx{SI_YmdpBSUSGVs#v@A;s)Nemx~W) zd^^LNer4vOJOPV8$4yt>j$NSV)+lmi(*EKN?3Q021fFK<Jh$l4CaIZP!c&WX>pRQ~ zP3QE|dX~JAFI7~#xcQW};XbabEbmkbmhJnprNM0f!kPLdx~yk)7Fn;%&}BWVw<wBh zm0k9msQ+l&-2dLNUnI)Fz#z;3xi1`gzI<{{CjPVQpAvOqy($Cz#Cnj41&R1ht7l{q zVdi3B;NW0jU~psr0VWW^z`(!>r5P9m7~X=Vd|g8vbv^yu^aH$6wdHQKvvpvAteX;n zYhz$o(x}P6zyR0g>*(j{<{BKL=j(=U0!S0gViphwj6oL9h9-G@I=I2AK?F$0ey9#e zsA4!4qzq;iC;~uyh#y~}YJ^@VfMLK?)yvCvGBPkoGBYsfLv(}5C5^I-3=H{2>H1Kc zVFozm=a+y^?l167%*+ceNh~Ts9HEEqtxQIp)$*(i3@TiZ3)8?RGk}6pnVD$AA&nk% zqcZ~k)h=RSV7SD<z@Q8>7i@Gd2Ueq9^2_sb@)J{F$NixjsIc5{xit#|!wq&=+JTt5 zq_Kb#zkx2PX^EvdB`^yDit^KoQj3dyGK))6^HPhjyZ`mn-@1}a3=BRj3=Ad^o519f zMlL@5)&&&hS5!KdmSm*nm1HI-!cQ_m_s|sO_h&BhGcZ^wFfb^B&4v(58cPN6+JN1` zm5n}&7BVm}oMK>LFoc){CYLm}D&RGaxbRT4tl`+k#=y|R1KIEZHX9tDrHWXMcdbay zDJ{+{OLfc4Np(z4PAx9>P0UM7#}(ic-n8gcGBGf;v7o2L8V#%#xECd+<fMicrxtnS z=cfAP=VzA|U=Ny^$!6xuIT;vu#TXd0U=9bn-9a0V(a;OiK=}x}xxXGsJX^)Uz;K&^ zfk6qyTzyll=6b@?Aa?UCb3`76aWF8n389-OX@=dryyB9?oE%(P<_6Csl^P}n21z#b zAYE^V*E~;%xy~7>$=TSQ`lO7hV6g}TgPtw}g93`z%N+3;joq{l`>np^GchojutKUR zn1M?g!^5ze=98a}Ga-3-tyk}5WMFvD1lgB`FpN18t6>3&B^i#z#i_YTIjKb|KKaRs zIWC#SB}JJ@rHBLD(R1&X=cw1-BW!sVMc5YX!GM0BFT%{kB&=qlH^)$J_eFQ{DqGas zF%hO0reif7n*Ooem5FXN`t5@VqjR$G8SRR47a_W-=ojxGOg&x<Z*)MbJ*-U`bOS*K zz$#-<TLHue;U$ggB^U<cZpq*?7Ig0p$Vf;XUr>VLd(Z+^bj|3u@IW+!s^IyUnqe2A z;BI!K8-Kld>t^JeRS?E&m1DRKW;`)nHgt<>(QZUQSaiD@!y+X2<G3FI-FWn){Sn3& z*5WfBtyh9>Y%to1_6TDy*5NZ2dAJAN%s*)78zamVZ^dUOcuWa?+A+GRDriRuBTQv# zBf?bhp`}<4a74FgDcX6c2#c0=5^E78c%Y}FqFaD|`Xs`FnLR{Ufafeqbeqsmq(j*B zegY9TITLd}9lD)0Xord+>|8LJ2s`l|F@|mx`k^cct4_}%!YVvRw4mD*f_DA|!lqMm ziLeQh92~KphJkJs`Y8hltIjVV+A8!-hUk`{Z{0>%a(^+=mO%0=(!n<9wxI73M%Z#^ zDbcn-c1>b$FQ9M4L|AZR1&J0A3NiFea0si8uO`AOf?<WeAqru>^g1HU$G<%aJz@mV z_K+Yf3*AWAGVF1IzIp&*=K8}JW`ctQb1eb7JJBa05N7T<P1sCGuEXwH^r2gX$q&w9 znoRsaF1ioUhZ7O@Y`K784|;1Bsg*#W8b=@ELRiy&3Er>+4NqaatP$PKAkDB=B4~6A g#0TLejW<yZ!`DJ&Wdmt3V=!ZQCB(oWcNxS30B4gNWdHyG literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..622ab64 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..fbd7c51 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..5093609 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/lib/commons-cli-1.2.LICENSE b/lib/commons-cli-1.2.LICENSE deleted file mode 100644 index 9e1db3b..0000000 --- a/lib/commons-cli-1.2.LICENSE +++ /dev/null @@ -1,207 +0,0 @@ -The Apache Software License - ASL - v2.0 -Project: http://commons.apache.org/cli/ -Description: Apache Commons CLI provides a simple API for working with the command line arguments and options. -License: http://www.apache.org/licenses/LICENSE-2.0.txt - - 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. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed 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. - diff --git a/lib/commons-cli-1.2.jar b/lib/commons-cli-1.2.jar deleted file mode 100644 index ce4b9fffe40c41669797cd806ac989471b2acd84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41123 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 diff --git a/moobench/build.gradle b/moobench/build.gradle new file mode 100644 index 0000000..1dbd5d6 --- /dev/null +++ b/moobench/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java' + id 'application' +} + +dependencies { + implementation 'com.beust:jcommander:1.72' +} + +application { + mainClass = 'moobench.benchmark.BenchmarkMain' +} diff --git a/src/mooBench/monitoredApplication/MonitoredClass.java b/moobench/src/main/java/moobench/application/MonitoredClass.java similarity index 95% rename from src/mooBench/monitoredApplication/MonitoredClass.java rename to moobench/src/main/java/moobench/application/MonitoredClass.java index db4be42..ce87df4 100644 --- a/src/mooBench/monitoredApplication/MonitoredClass.java +++ b/moobench/src/main/java/moobench/application/MonitoredClass.java @@ -14,7 +14,7 @@ * limitations under the License. ***************************************************************************/ -package mooBench.monitoredApplication; +package moobench.application; /** * @author Jan Waller diff --git a/src/mooBench/monitoredApplication/MonitoredClassSimple.java b/moobench/src/main/java/moobench/application/MonitoredClassSimple.java similarity index 97% rename from src/mooBench/monitoredApplication/MonitoredClassSimple.java rename to moobench/src/main/java/moobench/application/MonitoredClassSimple.java index 3227e38..8ea21fa 100644 --- a/src/mooBench/monitoredApplication/MonitoredClassSimple.java +++ b/moobench/src/main/java/moobench/application/MonitoredClassSimple.java @@ -14,7 +14,7 @@ * limitations under the License. ***************************************************************************/ -package mooBench.monitoredApplication; +package moobench.application; /** * @author Jan Waller diff --git a/src/mooBench/monitoredApplication/MonitoredClassThreaded.java b/moobench/src/main/java/moobench/application/MonitoredClassThreaded.java similarity index 97% rename from src/mooBench/monitoredApplication/MonitoredClassThreaded.java rename to moobench/src/main/java/moobench/application/MonitoredClassThreaded.java index 869e0d8..060fda2 100644 --- a/src/mooBench/monitoredApplication/MonitoredClassThreaded.java +++ b/moobench/src/main/java/moobench/application/MonitoredClassThreaded.java @@ -14,7 +14,7 @@ * limitations under the License. ***************************************************************************/ -package mooBench.monitoredApplication; +package moobench.application; import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; diff --git a/moobench/src/main/java/moobench/benchmark/BenchmarkMain.java b/moobench/src/main/java/moobench/benchmark/BenchmarkMain.java new file mode 100644 index 0000000..ff3eebb --- /dev/null +++ b/moobench/src/main/java/moobench/benchmark/BenchmarkMain.java @@ -0,0 +1,158 @@ +/*************************************************************************** + * Copyright 2014 Kieker Project (http://kieker-monitoring.net) + * + * Licensed 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. + ***************************************************************************/ + +package moobench.benchmark; + +import java.io.BufferedOutputStream; +import java.io.PrintStream; +import java.nio.file.Files; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.ParameterException; + +import moobench.application.MonitoredClass; +import moobench.application.MonitoredClassThreaded; + +/** + * @author Jan Waller + */ +public final class BenchmarkMain { + private static final String ENCODING = "UTF-8"; + + private static PrintStream ps = null; + private static String outputFn = null; + private static int totalThreads = 0; + private static int totalCalls = 0; + private static long methodTime = 0; + private static int recursionDepth = 0; + private static boolean quickstart = false; + private static boolean forceTerminate = false; + private static MonitoredClass mc = null; + + private static BenchmarkParameter parameter = new BenchmarkParameter(); + + private BenchmarkMain() { + } + + public static void main(final String[] args) throws InterruptedException { + + // 1. Preparations + BenchmarkMain.parseAndInitializeArguments(args); + + System.out.println(" # Experiment run configuration:"); // NOPMD (System.out) + System.out.println(" # 1. Output filename " + BenchmarkMain.outputFn); // NOPMD (System.out) + System.out.println(" # 2. Recursion Depth " + BenchmarkMain.recursionDepth); // NOPMD (System.out) + System.out.println(" # 3. Threads " + BenchmarkMain.totalThreads); // NOPMD (System.out) + System.out.println(" # 4. Total-Calls " + BenchmarkMain.totalCalls); // NOPMD (System.out) + System.out.println(" # 5. Method-Time " + BenchmarkMain.methodTime); // NOPMD (System.out) + + // 2. Initialize Threads and Classes + final CountDownLatch doneSignal = new CountDownLatch(BenchmarkMain.totalThreads); + final BenchmarkingThread[] benchmarkingThreads = new BenchmarkingThread[BenchmarkMain.totalThreads]; + final Thread[] threads = new Thread[BenchmarkMain.totalThreads]; + for (int i = 0; i < BenchmarkMain.totalThreads; i++) { + benchmarkingThreads[i] = new BenchmarkingThreadNano(BenchmarkMain.mc, BenchmarkMain.totalCalls, + BenchmarkMain.methodTime, BenchmarkMain.recursionDepth, doneSignal); + threads[i] = new Thread(benchmarkingThreads[i], String.valueOf(i + 1)); + } + if (!quickstart) { + for (int l = 0; l < 4; l++) { + { // NOCS (reserve mem only within the block) + final long freeMemChunks = Runtime.getRuntime().freeMemory() >> 27; + // System.out.println("Free-Mem: " + Runtime.getRuntime().freeMemory()); + final int memSize = 128 * 1024 * 128; // memSize * 8 = total Bytes -> 128MB + for (int j = 0; j < freeMemChunks; j++) { + final long[] grabMemory = new long[memSize]; + for (int i = 0; i < memSize; i++) { + grabMemory[i] = System.nanoTime(); + } + } + // System.out.println("done grabbing memory..."); + // System.out.println("Free-Mem: " + Runtime.getRuntime().freeMemory()); + } + Thread.sleep(5000); + } + } + final long startTime = System.currentTimeMillis(); + System.out.println(" # 6. Starting benchmark ..."); // NOPMD (System.out) + // 3. Starting Threads + for (int i = 0; i < BenchmarkMain.totalThreads; i++) { + threads[i].start(); + } + + // 4. Wait for all Threads + try { + doneSignal.await(); + } catch (final InterruptedException e) { + e.printStackTrace(); // NOPMD (Stacktrace) + System.exit(-1); + } + final long totalTime = System.currentTimeMillis() - startTime; + System.out.println(" # done (" + TimeUnit.MILLISECONDS.toSeconds(totalTime) + " s)"); // NOPMD + // (System.out) + + // 5. Print experiment statistics + System.out.print(" # 7. Writing results ... "); // NOPMD (System.out) + // CSV Format: configuration;order_index;Thread-ID;duration_nsec + for (int h = 0; h < BenchmarkMain.totalThreads; h++) { + final BenchmarkingThread thread = benchmarkingThreads[h]; + for (int i = 0; i < BenchmarkMain.totalCalls; i++) { + final String line = threads[h].getName() + ";" + thread.print(i, ";"); + BenchmarkMain.ps.println(line); + } + } + BenchmarkMain.ps.close(); + + System.out.println("done"); // NOPMD (System.out) + System.out.println(" # "); // NOPMD (System.out) + + if (forceTerminate) { + System.exit(0); + } + } + + public static void parseAndInitializeArguments(final String[] argv) { + JCommander commander = null; + try { + commander = JCommander.newBuilder().addObject(parameter).build(); + commander.parse(argv); + + BenchmarkMain.ps = new PrintStream( + new BufferedOutputStream(Files.newOutputStream(parameter.getOutputFile().toPath()), 8192 * 8), + false, BenchmarkMain.ENCODING); + if (null != parameter.getApplicationClassname()) { + mc = ((MonitoredClass) Class.forName(parameter.getApplicationClassname()).newInstance()); + } else { + mc = new MonitoredClassThreaded(); + } + if (null != parameter.getRunnableClassname()) { + ((Runnable) Class.forName(parameter.getRunnableClassname()).newInstance()).run(); + } + } catch (ParameterException ex) { + if (commander != null) + commander.usage(); + } catch (final Exception ex) { // NOCS (e.g., IOException, ParseException, + // NumberFormatException) + if (commander != null) { + commander.usage(); + } + System.out.println(ex.toString()); // NOPMD (Stacktrace) + System.exit(-1); + } + } +} diff --git a/moobench/src/main/java/moobench/benchmark/BenchmarkParameter.java b/moobench/src/main/java/moobench/benchmark/BenchmarkParameter.java new file mode 100644 index 0000000..5ffe44f --- /dev/null +++ b/moobench/src/main/java/moobench/benchmark/BenchmarkParameter.java @@ -0,0 +1,91 @@ +/** + * + */ +package moobench.benchmark; + +import java.io.File; + +import com.beust.jcommander.Parameter; +import com.beust.jcommander.converters.FileConverter; + +/** + * @author Reiner Jung + * + */ +public class BenchmarkParameter { + + @Parameter(names = { "--totalCalls", "-c" }, required = true, description = "Number of total method calls performed.") + long totalCalls; + + @Parameter(names = { "--methodtime", "-m" }, required = true, description = "Time a method call takes.") + long methodTime; + + @Parameter(names = { "--totalthreads", "-t" }, required = true, description = "Number of threads started.") + long totalThreads; + + @Parameter(names = { "--recursiondepth", "-d" }, required = true, description = "Depth of recursion performed.") + long recursionDepth; + + @Parameter(names = { "--output-filename", "-o" }, required = true, converter = FileConverter.class, + description = "Filename of results file. Output is appended if file exists.") + File outputFile; + + @Parameter(names = { "--quickstart", "-q" }, required = false, description = "Skips initial garbage collection.") + boolean quickstart; + + @Parameter(names = { "--forceTerminate", "-f" }, required = false, description = "Forces a termination at the end of the benchmark.") + boolean forceTerminate; + + @Parameter(names = { "--runnable", "-r" }, required = false, + description = "Class implementing the Runnable interface. run() method is executed before the benchmark starts.") + String runnableClassname; + + @Parameter(names = { "--application", "-a" }, required = false, description = "Class implementing the MonitoredClass interface.") + String applicationClassname; + + @Parameter(names = { "--benchmarkthread", "-b" }, required = false, description = "Class implementing the BenchmarkingThread interface.") + String benchmarkClassname; + + public long getTotalCalls() { + return totalCalls; + } + + public long getMethodTime() { + return methodTime; + } + + public long getTotalThreads() { + return totalThreads; + } + + public long getRecursionDepth() { + return recursionDepth; + } + + public File getOutputFile() { + return outputFile; + } + + public boolean isQuickstart() { + return quickstart; + } + + public boolean isForceTerminate() { + return forceTerminate; + } + + public String getRunnableClassname() { + return runnableClassname; + } + + public String getApplicationClassname() { + return applicationClassname; + } + + public String getBenchmarkClassname() { + return benchmarkClassname; + } + + + +} diff --git a/src/mooBench/benchmark/BenchmarkingThread.java b/moobench/src/main/java/moobench/benchmark/BenchmarkingThread.java similarity index 97% rename from src/mooBench/benchmark/BenchmarkingThread.java rename to moobench/src/main/java/moobench/benchmark/BenchmarkingThread.java index 043ad1a..97b1263 100644 --- a/src/mooBench/benchmark/BenchmarkingThread.java +++ b/moobench/src/main/java/moobench/benchmark/BenchmarkingThread.java @@ -14,7 +14,7 @@ * limitations under the License. ***************************************************************************/ -package mooBench.benchmark; +package moobench.benchmark; /** * @author Jan Waller, Christian Wulf diff --git a/src/mooBench/benchmark/BenchmarkingThreadMilli.java b/moobench/src/main/java/moobench/benchmark/BenchmarkingThreadMilli.java similarity index 96% rename from src/mooBench/benchmark/BenchmarkingThreadMilli.java rename to moobench/src/main/java/moobench/benchmark/BenchmarkingThreadMilli.java index 9f5e249..6fe6dde 100644 --- a/src/mooBench/benchmark/BenchmarkingThreadMilli.java +++ b/moobench/src/main/java/moobench/benchmark/BenchmarkingThreadMilli.java @@ -14,11 +14,11 @@ * limitations under the License. ***************************************************************************/ -package mooBench.benchmark; +package moobench.benchmark; import java.util.concurrent.CountDownLatch; -import mooBench.monitoredApplication.MonitoredClass; +import moobench.application.MonitoredClass; /** * @author Jan Waller diff --git a/src/mooBench/benchmark/BenchmarkingThreadNano.java b/moobench/src/main/java/moobench/benchmark/BenchmarkingThreadNano.java similarity index 97% rename from src/mooBench/benchmark/BenchmarkingThreadNano.java rename to moobench/src/main/java/moobench/benchmark/BenchmarkingThreadNano.java index ad135b3..7baf0b6 100644 --- a/src/mooBench/benchmark/BenchmarkingThreadNano.java +++ b/moobench/src/main/java/moobench/benchmark/BenchmarkingThreadNano.java @@ -14,7 +14,7 @@ * limitations under the License. ***************************************************************************/ -package mooBench.benchmark; +package moobench.benchmark; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; @@ -22,7 +22,7 @@ import java.lang.management.MemoryMXBean; import java.util.List; import java.util.concurrent.CountDownLatch; -import mooBench.monitoredApplication.MonitoredClass; +import moobench.application.MonitoredClass; /** * @author Jan Waller, Aike Sass, Christian Wulf diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e7d9c6a --- /dev/null +++ b/settings.gradle @@ -0,0 +1,16 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/6.5/userguide/multi_project_builds.html + */ + +rootProject.name = 'moobench' + +include 'moobench' +include 'frameworks:inspectIT' +include 'frameworks:Kieker' +include 'frameworks:SPASSmeter' + diff --git a/src/META-INF/.gitignore b/src/META-INF/.gitignore deleted file mode 100644 index 5e7d273..0000000 --- a/src/META-INF/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore diff --git a/src/mooBench/benchmark/Benchmark.java b/src/mooBench/benchmark/Benchmark.java deleted file mode 100644 index b3377ea..0000000 --- a/src/mooBench/benchmark/Benchmark.java +++ /dev/null @@ -1,240 +0,0 @@ -/*************************************************************************** - * Copyright 2014 Kieker Project (http://kieker-monitoring.net) - * - * Licensed 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. - ***************************************************************************/ - -package mooBench.benchmark; - -import java.io.BufferedOutputStream; -import java.io.FileOutputStream; -import java.io.PrintStream; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; - -import mooBench.monitoredApplication.MonitoredClass; -import mooBench.monitoredApplication.MonitoredClassThreaded; - -/** - * @author Jan Waller - */ -public final class Benchmark { - private static final String ENCODING = "UTF-8"; - - private static PrintStream ps = null; - private static String outputFn = null; - private static int totalThreads = 0; - private static int totalCalls = 0; - private static long methodTime = 0; - private static int recursionDepth = 0; - private static boolean quickstart = false; - private static boolean forceTerminate = false; - private static MonitoredClass mc = null; - - private Benchmark() {} - - public static void main(final String[] args) throws InterruptedException { - - // 1. Preparations - Benchmark.parseAndInitializeArguments(args); - - System.out.println(" # Experiment run configuration:"); // NOPMD (System.out) - System.out.println(" # 1. Output filename " + Benchmark.outputFn); // NOPMD (System.out) - System.out.println(" # 2. Recursion Depth " + Benchmark.recursionDepth); // NOPMD (System.out) - System.out.println(" # 3. Threads " + Benchmark.totalThreads); // NOPMD (System.out) - System.out.println(" # 4. Total-Calls " + Benchmark.totalCalls); // NOPMD (System.out) - System.out.println(" # 5. Method-Time " + Benchmark.methodTime); // NOPMD (System.out) - - // 2. Initialize Threads and Classes - final CountDownLatch doneSignal = new CountDownLatch(Benchmark.totalThreads); - final BenchmarkingThread[] benchmarkingThreads = new BenchmarkingThread[Benchmark.totalThreads]; - final Thread[] threads = new Thread[Benchmark.totalThreads]; - for (int i = 0; i < Benchmark.totalThreads; i++) { - benchmarkingThreads[i] = new BenchmarkingThreadNano(Benchmark.mc, Benchmark.totalCalls, - Benchmark.methodTime, Benchmark.recursionDepth, doneSignal); - threads[i] = new Thread(benchmarkingThreads[i], String.valueOf(i + 1)); - } - if (!quickstart) { - for (int l = 0; l < 4; l++) { - { // NOCS (reserve mem only within the block) - final long freeMemChunks = Runtime.getRuntime().freeMemory() >> 27; - // System.out.println("Free-Mem: " + Runtime.getRuntime().freeMemory()); - final int memSize = 128 * 1024 * 128; // memSize * 8 = total Bytes -> 128MB - for (int j = 0; j < freeMemChunks; j++) { - final long[] grabMemory = new long[memSize]; - for (int i = 0; i < memSize; i++) { - grabMemory[i] = System.nanoTime(); - } - } - // System.out.println("done grabbing memory..."); - // System.out.println("Free-Mem: " + Runtime.getRuntime().freeMemory()); - } - Thread.sleep(5000); - } - } - final long startTime = System.currentTimeMillis(); - System.out.println(" # 6. Starting benchmark ..."); // NOPMD (System.out) - // 3. Starting Threads - for (int i = 0; i < Benchmark.totalThreads; i++) { - threads[i].start(); - } - - // 4. Wait for all Threads - try { - doneSignal.await(); - } catch (final InterruptedException e) { - e.printStackTrace(); // NOPMD (Stacktrace) - System.exit(-1); - } - final long totalTime = System.currentTimeMillis() - startTime; - System.out.println(" # done (" + TimeUnit.MILLISECONDS.toSeconds(totalTime) + " s)"); // NOPMD - // (System.out) - - // 5. Print experiment statistics - System.out.print(" # 7. Writing results ... "); // NOPMD (System.out) - // CSV Format: configuration;order_index;Thread-ID;duration_nsec - for (int h = 0; h < Benchmark.totalThreads; h++) { - final BenchmarkingThread thread = benchmarkingThreads[h]; - for (int i = 0; i < Benchmark.totalCalls; i++) { - final String line = threads[h].getName() + ";" + thread.print(i, ";"); - Benchmark.ps.println(line); - } - } - Benchmark.ps.close(); - - System.out.println("done"); // NOPMD (System.out) - System.out.println(" # "); // NOPMD (System.out) - - if (forceTerminate) { - System.exit(0); - } - } - - public static void parseAndInitializeArguments(final String[] args) { - final Options cmdlOpts = new Options(); - OptionBuilder.withLongOpt("totalcalls"); - OptionBuilder.withArgName("calls"); - OptionBuilder.hasArg(true); - OptionBuilder.isRequired(true); - OptionBuilder - .withDescription("Number of total method calls performed."); - OptionBuilder.withValueSeparator('='); - cmdlOpts.addOption(OptionBuilder.create("t")); - OptionBuilder.withLongOpt("methodtime"); - OptionBuilder.withArgName("time"); - OptionBuilder.hasArg(true); - OptionBuilder.isRequired(true); - OptionBuilder.withDescription("Time a method call takes."); - OptionBuilder - .withValueSeparator('='); - cmdlOpts.addOption(OptionBuilder.create("m")); - OptionBuilder.withLongOpt("totalthreads"); - OptionBuilder.withArgName("threads"); - OptionBuilder.hasArg(true); - OptionBuilder.isRequired(true); - OptionBuilder - .withDescription("Number of threads started."); - OptionBuilder.withValueSeparator('='); - cmdlOpts.addOption(OptionBuilder.create("h")); - OptionBuilder.withLongOpt("recursiondepth"); - OptionBuilder.withArgName("depth"); - OptionBuilder.hasArg(true); - OptionBuilder.isRequired(true); - OptionBuilder - .withDescription("Depth of recursion performed."); - OptionBuilder.withValueSeparator('='); - cmdlOpts.addOption(OptionBuilder.create("d")); - OptionBuilder.withLongOpt("output-filename"); - OptionBuilder.withArgName("filename"); - OptionBuilder.hasArg(true); - OptionBuilder.isRequired(true); - OptionBuilder - .withDescription("Filename of results file. Output is appended if file exists."); - OptionBuilder.withValueSeparator('='); - cmdlOpts.addOption(OptionBuilder.create("o")); - OptionBuilder.withLongOpt("quickstart"); - OptionBuilder.isRequired(false); - OptionBuilder.withDescription("Skips initial garbage collection."); - cmdlOpts.addOption(OptionBuilder.create("q")); - OptionBuilder.withLongOpt("forceTerminate"); - OptionBuilder.isRequired(false); - OptionBuilder.withDescription("Forces a termination at the end of the benchmark."); - cmdlOpts.addOption(OptionBuilder - .create("f")); - OptionBuilder.withLongOpt("runnable"); - OptionBuilder.withArgName("classname"); - OptionBuilder.hasArg(true); - OptionBuilder.isRequired(false); - OptionBuilder - .withDescription( - "Class implementing the Runnable interface. run() method is executed before the benchmark starts."); - OptionBuilder.withValueSeparator('='); - cmdlOpts.addOption(OptionBuilder - .create("r")); - OptionBuilder.withLongOpt("application"); - OptionBuilder.withArgName("classname"); - OptionBuilder.hasArg(true); - OptionBuilder.isRequired(false); - OptionBuilder - .withDescription("Class implementing the MonitoredClass interface."); - OptionBuilder.withValueSeparator('='); - cmdlOpts.addOption(OptionBuilder - .create("a")); - OptionBuilder.withLongOpt("benchmarkthread"); - OptionBuilder.withArgName("classname"); - OptionBuilder.hasArg(true); - OptionBuilder.isRequired(false); - OptionBuilder - .withDescription("Class implementing the BenchmarkingThread interface."); - OptionBuilder.withValueSeparator('='); - cmdlOpts.addOption(OptionBuilder - .create("b")); - try { - CommandLine cmdl = null; - final CommandLineParser cmdlParser = new BasicParser(); - cmdl = cmdlParser.parse(cmdlOpts, args); - Benchmark.outputFn = cmdl.getOptionValue("output-filename"); - Benchmark.totalCalls = Integer.parseInt(cmdl.getOptionValue("totalcalls")); - Benchmark.methodTime = Integer.parseInt(cmdl.getOptionValue("methodtime")); - Benchmark.totalThreads = Integer.parseInt(cmdl.getOptionValue("totalthreads")); - Benchmark.recursionDepth = Integer.parseInt(cmdl.getOptionValue("recursiondepth")); - Benchmark.quickstart = cmdl.hasOption("quickstart"); - Benchmark.forceTerminate = cmdl.hasOption("forceTerminate"); - Benchmark.ps = new PrintStream( - new BufferedOutputStream(new FileOutputStream(Benchmark.outputFn, true), 8192 * 8), false, - Benchmark.ENCODING); - final String application = cmdl.getOptionValue("application"); - if (null != application) { - mc = ((MonitoredClass) Class.forName(application).newInstance()); - } else { - mc = new MonitoredClassThreaded(); - } - final String clazzname = cmdl.getOptionValue("runnable"); - if (null != clazzname) { - ((Runnable) Class.forName(clazzname).newInstance()).run(); - } - } catch (final Exception ex) { // NOCS (e.g., IOException, ParseException, - // NumberFormatException) - new HelpFormatter().printHelp(Benchmark.class.getName(), cmdlOpts); - System.out.println(ex.toString()); // NOPMD (Stacktrace) - System.exit(-1); - } - } -} -- GitLab