From d64d2fbe767aca9707cafeb29e79ccdc38f79355 Mon Sep 17 00:00:00 2001 From: jboner Date: Wed, 2 Dec 2009 13:46:03 +0100 Subject: [PATCH 01/10] fixed bug in start/spawnLink, now atomic --- akka-actors/src/main/scala/actor/Actor.scala | 57 ++++++++++++-------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/akka-actors/src/main/scala/actor/Actor.scala b/akka-actors/src/main/scala/actor/Actor.scala index ed021c1e16..e4810297b9 100644 --- a/akka-actors/src/main/scala/actor/Actor.scala +++ b/akka-actors/src/main/scala/actor/Actor.scala @@ -418,7 +418,7 @@ trait Actor extends TransactionManagement { _isRunning = true //if (isTransactional) this !! TransactionalInit } - Actor.log.info("[%s] has started", toString) + Actor.log.debug("[%s] has started", toString) this } @@ -648,8 +648,11 @@ trait Actor extends TransactionManagement { * To be invoked from within the actor itself. */ protected[this] def startLink(actor: Actor) = { - actor.start - link(actor) + try { + actor.start + } finally { + link(actor) + } } /** @@ -658,9 +661,12 @@ trait Actor extends TransactionManagement { * To be invoked from within the actor itself. */ protected[this] def startLinkRemote(actor: Actor, hostname: String, port: Int) = { - actor.makeRemote(hostname, port) - actor.start - link(actor) + try { + actor.makeRemote(hostname, port) + actor.start + } finally { + link(actor) + } } /** @@ -669,11 +675,7 @@ trait Actor extends TransactionManagement { * To be invoked from within the actor itself. */ protected[this] def spawn[T <: Actor](actorClass: Class[T]): T = { - val actor = actorClass.newInstance.asInstanceOf[T] - if (!dispatcher.isInstanceOf[ThreadBasedDispatcher]) { - actor.dispatcher = dispatcher - actor._mailbox = _mailbox - } + val actor = spawnButDoNotStart(actorClass) actor.start actor } @@ -684,12 +686,8 @@ trait Actor extends TransactionManagement { * To be invoked from within the actor itself. */ protected[this] def spawnRemote[T <: Actor](actorClass: Class[T], hostname: String, port: Int): T = { - val actor = actorClass.newInstance.asInstanceOf[T] + val actor = spawnButDoNotStart(actorClass) actor.makeRemote(hostname, port) - if (!dispatcher.isInstanceOf[ThreadBasedDispatcher]) { - actor.dispatcher = dispatcher - actor._mailbox = _mailbox - } actor.start actor } @@ -700,8 +698,12 @@ trait Actor extends TransactionManagement { * To be invoked from within the actor itself. */ protected[this] def spawnLink[T <: Actor](actorClass: Class[T]): T = { - val actor = spawn[T](actorClass) - link(actor) + val actor = spawnButDoNotStart(actorClass) + try { + actor.start + } finally { + link(actor) + } actor } @@ -711,9 +713,13 @@ trait Actor extends TransactionManagement { * To be invoked from within the actor itself. */ protected[this] def spawnLinkRemote[T <: Actor](actorClass: Class[T], hostname: String, port: Int): T = { - val actor = spawn[T](actorClass) - actor.makeRemote(hostname, port) - link(actor) + val actor = spawnButDoNotStart(actorClass) + try { + actor.makeRemote(hostname, port) + actor.start + } finally { + link(actor) + } actor } @@ -721,6 +727,15 @@ trait Actor extends TransactionManagement { // ==== IMPLEMENTATION DETAILS ==== // ================================ + private def spawnButDoNotStart[T <: Actor](actorClass: Class[T]): T = { + val actor = actorClass.newInstance.asInstanceOf[T] + if (!dispatcher.isInstanceOf[ThreadBasedDispatcher]) { + actor.dispatcher = dispatcher + actor._mailbox = _mailbox + } + actor + } + private def postMessageToMailbox(message: AnyRef, sender: Option[Actor]): Unit = _remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime if (_remoteAddress.isDefined) { val requestBuilder = RemoteRequest.newBuilder From 7ad879d86f01a9062b2c982e55f07b51f781c66e Mon Sep 17 00:00:00 2001 From: jboner Date: Thu, 3 Dec 2009 09:14:39 +0100 Subject: [PATCH 02/10] minor reformatting --- akka-samples-scala/src/main/scala/SimpleService.scala | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/akka-samples-scala/src/main/scala/SimpleService.scala b/akka-samples-scala/src/main/scala/SimpleService.scala index a1f5e87575..982fc08745 100644 --- a/akka-samples-scala/src/main/scala/SimpleService.scala +++ b/akka-samples-scala/src/main/scala/SimpleService.scala @@ -132,7 +132,10 @@ class Chat extends Actor with Logging { @Consumes(Array("application/x-www-form-urlencoded")) @POST @Produces(Array("text/html")) - def publishMessage(form: MultivaluedMap[String, String]) = (this !! Chat(form.getFirst("name"), form.getFirst("action"), form.getFirst("message"))).getOrElse("System__error") + def publishMessage(form: MultivaluedMap[String, String]) = + (this !! Chat(form.getFirst("name"), + form.getFirst("action"), + form.getFirst("message"))).getOrElse("System__error") } @@ -148,8 +151,6 @@ class JsonpFilter extends BroadcastFilter[String] with Logging { } ("\n") + name + "\", message: \"" + message + "\" }); \n\n") } } From 10c117e848c94c3908d34875189f4f52da98dc41 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 3 Dec 2009 20:08:41 +0100 Subject: [PATCH 03/10] Upgrading to Grizzly 1.9.18-i --- akka-fun-test-java/pom.xml | 2 +- akka-kernel/pom.xml | 2 +- akka-rest/pom.xml | 2 +- pom.xml | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/akka-fun-test-java/pom.xml b/akka-fun-test-java/pom.xml index f6e6a727b7..8f8a6b41fc 100644 --- a/akka-fun-test-java/pom.xml +++ b/akka-fun-test-java/pom.xml @@ -23,7 +23,7 @@ com.sun.grizzly grizzly-servlet-webserver - 1.8.6.3 + ${grizzly.version} test diff --git a/akka-kernel/pom.xml b/akka-kernel/pom.xml index 3d0f0f9313..f021c59e67 100755 --- a/akka-kernel/pom.xml +++ b/akka-kernel/pom.xml @@ -165,7 +165,7 @@ com.sun.grizzly grizzly-comet-webserver - 1.8.6.3 + ${grizzly.version} com.sun.jersey diff --git a/akka-rest/pom.xml b/akka-rest/pom.xml index 9dc47f6db8..85f42b4aba 100644 --- a/akka-rest/pom.xml +++ b/akka-rest/pom.xml @@ -32,7 +32,7 @@ com.sun.grizzly grizzly-comet-webserver - 1.8.6.3 + ${grizzly.version} com.sun.jersey diff --git a/pom.xml b/pom.xml index 4bbf7686ef..d89166c09d 100755 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,7 @@ ${project.build.sourceEncoding} 0.4.1 1.1.4 + 1.9.18-i From 310742a22df00a55c59f35a4e18f291694711144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bon=C3=A9r?= Date: Sat, 5 Dec 2009 21:03:07 +0100 Subject: [PATCH 04/10] fixed bug in anon actor --- akka-actors/src/main/scala/actor/Actor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-actors/src/main/scala/actor/Actor.scala b/akka-actors/src/main/scala/actor/Actor.scala index e4810297b9..cd887a4f78 100644 --- a/akka-actors/src/main/scala/actor/Actor.scala +++ b/akka-actors/src/main/scala/actor/Actor.scala @@ -116,7 +116,7 @@ object Actor extends Logging { * */ def actor[A](body: => Unit) = { - def handler[A](body: Unit) = new { + def handler[A](body: => Unit) = new { def receive(handler: PartialFunction[Any, Unit]) = new Actor() { start body From 5edc93315da3d633ed103fa4bba433ae47510e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bon=C3=A9r?= Date: Sat, 5 Dec 2009 20:59:15 +0100 Subject: [PATCH 05/10] refactoring of persistence implementation and its api --- akka-actors/src/main/scala/actor/Actor.scala | 2 +- .../src/main/scala/stm/DataFlowVariable.scala | 2 +- .../akka/api/PersistentClasher.java | 2 +- .../akka/api/PersistentStateful.java | 58 ++- .../akka/api/PersistentStatefulNested.java | 43 +- akka-persistence/pom.xml | 7 +- ...ge.scala => CassandraStorageBackend.scala} | 103 +++-- ...torage.scala => MongoStorageBackend.scala} | 114 +++--- .../src/main/scala/PersistentState.scala | 352 ----------------- akka-persistence/src/main/scala/Storage.scala | 367 ++++++++++++++++-- .../src/main/scala/StorageBackend.scala | 36 ++ .../scala/CassandraPersistentActorSpec.scala | 47 +-- .../test/scala/MongoPersistentActorSpec.scala | 6 +- .../src/test/scala/MongoStorageSpec.scala | 116 +++--- .../sample/java/PersistentSimpleService.java | 17 +- .../main/java/sample/java/SimpleService.java | 1 - .../src/main/scala/akka/SimpleService.scala | 23 +- .../src/main/scala/SimpleService.scala | 12 +- .../src/main/scala/SimpleService.scala | 2 +- 19 files changed, 647 insertions(+), 663 deletions(-) rename akka-persistence/src/main/scala/{CassandraStorage.scala => CassandraStorageBackend.scala} (61%) rename akka-persistence/src/main/scala/{MongoStorage.scala => MongoStorageBackend.scala} (89%) delete mode 100644 akka-persistence/src/main/scala/PersistentState.scala create mode 100644 akka-persistence/src/main/scala/StorageBackend.scala diff --git a/akka-actors/src/main/scala/actor/Actor.scala b/akka-actors/src/main/scala/actor/Actor.scala index e4810297b9..cd887a4f78 100644 --- a/akka-actors/src/main/scala/actor/Actor.scala +++ b/akka-actors/src/main/scala/actor/Actor.scala @@ -116,7 +116,7 @@ object Actor extends Logging { * */ def actor[A](body: => Unit) = { - def handler[A](body: Unit) = new { + def handler[A](body: => Unit) = new { def receive(handler: PartialFunction[Any, Unit]) = new Actor() { start body diff --git a/akka-actors/src/main/scala/stm/DataFlowVariable.scala b/akka-actors/src/main/scala/stm/DataFlowVariable.scala index 44a40f50af..83ab9d141b 100644 --- a/akka-actors/src/main/scala/stm/DataFlowVariable.scala +++ b/akka-actors/src/main/scala/stm/DataFlowVariable.scala @@ -379,4 +379,4 @@ object Test5 extends Application { setV ! 'exit //System.gc -} +} \ No newline at end of file diff --git a/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java index 8ec14fcb91..059b81c1e8 100644 --- a/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java +++ b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java @@ -8,7 +8,7 @@ public class PersistentClasher { @inittransactionalstate public void init() { - state = PersistentState.newMap(new CassandraStorageConfig()); + state = CassandraStorage.newMap(); } public String getState(String key) { diff --git a/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java index 02a091c1f6..3cac0ae062 100644 --- a/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java +++ b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java @@ -12,18 +12,19 @@ public class PersistentStateful { @inittransactionalstate public void init() { - mapState = PersistentState.newMap(new CassandraStorageConfig()); - vectorState = PersistentState.newVector(new CassandraStorageConfig()); - refState = PersistentState.newRef(new CassandraStorageConfig()); + mapState = CassandraStorage.newMap(); + vectorState = CassandraStorage.newVector(); + refState = CassandraStorage.newRef(); } public String getMapState(String key) { - return (String) mapState.get(key).get(); + byte[] bytes = (byte[]) mapState.get(key.getBytes()).get(); + return new String(bytes, 0, bytes.length); } - public String getVectorState(int index) { - return (String) vectorState.get(index); + byte[] bytes = (byte[]) vectorState.get(index); + return new String(bytes, 0, bytes.length); } public int getVectorLength() { @@ -32,62 +33,51 @@ public class PersistentStateful { public String getRefState() { if (refState.isDefined()) { - return (String) refState.get().get(); + byte[] bytes = (byte[]) refState.get().get(); + return new String(bytes, 0, bytes.length); } else throw new IllegalStateException("No such element"); } - public void setMapState(String key, String msg) { - mapState.put(key, msg); + mapState.put(key.getBytes(), msg.getBytes()); } - public void setVectorState(String msg) { - vectorState.add(msg); + vectorState.add(msg.getBytes()); } - public void setRefState(String msg) { - refState.swap(msg); + refState.swap(msg.getBytes()); } - public void success(String key, String msg) { - mapState.put(key, msg); - vectorState.add(msg); - refState.swap(msg); + mapState.put(key.getBytes(), msg.getBytes()); + vectorState.add(msg.getBytes()); + refState.swap(msg.getBytes()); } - public String failure(String key, String msg, PersistentFailer failer) { - mapState.put(key, msg); - vectorState.add(msg); - refState.swap(msg); + mapState.put(key.getBytes(), msg.getBytes()); + vectorState.add(msg.getBytes()); + refState.swap(msg.getBytes()); failer.fail(); return msg; } public String success(String key, String msg, PersistentStatefulNested nested) { - mapState.put(key, msg); - vectorState.add(msg); - refState.swap(msg); + mapState.put(key.getBytes(), msg.getBytes()); + vectorState.add(msg.getBytes()); + refState.swap(msg.getBytes()); nested.success(key, msg); return msg; } - public String failure(String key, String msg, PersistentStatefulNested nested, PersistentFailer failer) { - mapState.put(key, msg); - vectorState.add(msg); - refState.swap(msg); + mapState.put(key.getBytes(), msg.getBytes()); + vectorState.add(msg.getBytes()); + refState.swap(msg.getBytes()); nested.failure(key, msg, failer); return msg; } - - - - public void thisMethodHangs(String key, String msg, PersistentFailer failer) { - setMapState(key, msg); - } } diff --git a/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java index 3251184789..50e9b7ae1d 100644 --- a/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java +++ b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java @@ -12,18 +12,20 @@ public class PersistentStatefulNested { @inittransactionalstate public void init() { - mapState = PersistentState.newMap(new CassandraStorageConfig()); - vectorState = PersistentState.newVector(new CassandraStorageConfig()); - refState = PersistentState.newRef(new CassandraStorageConfig()); + mapState = CassandraStorage.newMap(); + vectorState = CassandraStorage.newVector(); + refState = CassandraStorage.newRef(); } public String getMapState(String key) { - return (String) mapState.get(key).get(); + byte[] bytes = (byte[]) mapState.get(key.getBytes()).get(); + return new String(bytes, 0, bytes.length); } public String getVectorState(int index) { - return (String) vectorState.get(index); + byte[] bytes = (byte[]) vectorState.get(index); + return new String(bytes, 0, bytes.length); } public int getVectorLength() { @@ -32,45 +34,36 @@ public class PersistentStatefulNested { public String getRefState() { if (refState.isDefined()) { - return (String) refState.get().get(); + byte[] bytes = (byte[]) refState.get().get(); + return new String(bytes, 0, bytes.length); } else throw new IllegalStateException("No such element"); } - public void setMapState(String key, String msg) { - mapState.put(key, msg); + mapState.put(key.getBytes(), msg.getBytes()); } - public void setVectorState(String msg) { - vectorState.add(msg); + vectorState.add(msg.getBytes()); } - public void setRefState(String msg) { - refState.swap(msg); + refState.swap(msg.getBytes()); } - public String success(String key, String msg) { - mapState.put(key, msg); - vectorState.add(msg); - refState.swap(msg); + mapState.put(key.getBytes(), msg.getBytes()); + vectorState.add(msg.getBytes()); + refState.swap(msg.getBytes()); return msg; } - public String failure(String key, String msg, PersistentFailer failer) { - mapState.put(key, msg); - vectorState.add(msg); - refState.swap(msg); + mapState.put(key.getBytes(), msg.getBytes()); + vectorState.add(msg.getBytes()); + refState.swap(msg.getBytes()); failer.fail(); return msg; } - - - public void thisMethodHangs(String key, String msg, PersistentFailer failer) { - setMapState(key, msg); - } } diff --git a/akka-persistence/pom.xml b/akka-persistence/pom.xml index 91a0079611..5447087e68 100644 --- a/akka-persistence/pom.xml +++ b/akka-persistence/pom.xml @@ -49,7 +49,12 @@ commons-pool 1.5.1 - + + log4j + log4j + 1.2.13 + + org.scalatest diff --git a/akka-persistence/src/main/scala/CassandraStorage.scala b/akka-persistence/src/main/scala/CassandraStorageBackend.scala similarity index 61% rename from akka-persistence/src/main/scala/CassandraStorage.scala rename to akka-persistence/src/main/scala/CassandraStorageBackend.scala index 74f06d3a9d..f5719625c7 100644 --- a/akka-persistence/src/main/scala/CassandraStorage.scala +++ b/akka-persistence/src/main/scala/CassandraStorageBackend.scala @@ -6,7 +6,6 @@ package se.scalablesolutions.akka.state import se.scalablesolutions.akka.util.Logging import se.scalablesolutions.akka.util.Helpers._ -import se.scalablesolutions.akka.serialization.Serializer import se.scalablesolutions.akka.Config.config import org.apache.cassandra.service._ @@ -14,8 +13,14 @@ import org.apache.cassandra.service._ /** * @author Jonas Bonér */ -object CassandraStorage extends MapStorage - with VectorStorage with RefStorage with Logging { +private[akka] object CassandraStorageBackend extends + MapStorageBackend[Array[Byte], Array[Byte]] with + VectorStorageBackend[Array[Byte]] with + RefStorageBackend[Array[Byte]] with + Logging { + + type ElementType = Array[Byte] + val KEYSPACE = "akka" val MAP_COLUMN_PARENT = new ColumnParent("map", null) val VECTOR_COLUMN_PARENT = new ColumnParent("vector", null) @@ -31,35 +36,14 @@ object CassandraStorage extends MapStorage case "ONE" => 1 case "QUORUM" => 2 case "ALL" => 3 - case unknown => throw new IllegalArgumentException("Consistency level [" + unknown + "] is not supported. Expected one of [ZERO, ONE, QUORUM, ALL]") + case unknown => throw new IllegalArgumentException( + "Cassandra consistency level [" + unknown + "] is not supported. Expected one of [ZERO, ONE, QUORUM, ALL]") } } val IS_ASCENDING = true @volatile private[this] var isRunning = false private[this] val protocol: Protocol = Protocol.Binary -/* { - config.getString("akka.storage.cassandra.procotol", "binary") match { - case "binary" => Protocol.Binary - case "json" => Protocol.JSON - case "simple-json" => Protocol.SimpleJSON - case unknown => throw new UnsupportedOperationException("Unknown storage serialization protocol [" + unknown + "]") - } - } -*/ - - private[this] val serializer: Serializer = { - config.getString("akka.storage.cassandra.storage-format", "manual") match { - case "scala-json" => Serializer.ScalaJSON - case "java-json" => Serializer.JavaJSON - case "protobuf" => Serializer.Protobuf - case "java" => Serializer.Java - case "manual" => Serializer.NOOP - case "sbinary" => throw new UnsupportedOperationException("SBinary serialization protocol is not yet supported for storage") - case "avro" => throw new UnsupportedOperationException("Avro serialization protocol is not yet supported for storage") - case unknown => throw new UnsupportedOperationException("Unknown storage serialization protocol [" + unknown + "]") - } - } private[this] val sessions = new CassandraSessionPool( KEYSPACE, @@ -71,22 +55,22 @@ object CassandraStorage extends MapStorage // For Ref // =============================================================== - def insertRefStorageFor(name: String, element: AnyRef) = { + def insertRefStorageFor(name: String, element: Array[Byte]) = { sessions.withSession { _ ++| (name, new ColumnPath(REF_COLUMN_PARENT.getColumn_family, null, REF_KEY), - serializer.out(element), + element, System.currentTimeMillis, CONSISTENCY_LEVEL) } } - def getRefStorageFor(name: String): Option[AnyRef] = { + def getRefStorageFor(name: String): Option[Array[Byte]] = { try { val column: Option[ColumnOrSuperColumn] = sessions.withSession { _ | (name, new ColumnPath(REF_COLUMN_PARENT.getColumn_family, null, REF_KEY)) } - if (column.isDefined) Some(serializer.in(column.get.getColumn.value, None)) + if (column.isDefined) Some(column.get.getColumn.value) else None } catch { case e => @@ -99,40 +83,40 @@ object CassandraStorage extends MapStorage // For Vector // =============================================================== - def insertVectorStorageEntryFor(name: String, element: AnyRef) = { + def insertVectorStorageEntryFor(name: String, element: Array[Byte]) = { sessions.withSession { _ ++| (name, new ColumnPath(VECTOR_COLUMN_PARENT.getColumn_family, null, intToBytes(getVectorStorageSizeFor(name))), - serializer.out(element), + element, System.currentTimeMillis, CONSISTENCY_LEVEL) } } // FIXME implement insertVectorStorageEntriesFor - def insertVectorStorageEntriesFor(name: String, elements: List[AnyRef]) = { - throw new UnsupportedOperationException("insertVectorStorageEntriesFor for CassandraStorage is not implemented yet") + def insertVectorStorageEntriesFor(name: String, elements: List[Array[Byte]]) = { + throw new UnsupportedOperationException("insertVectorStorageEntriesFor for CassandraStorageBackend is not implemented yet") } - def updateVectorStorageEntryFor(name: String, index: Int, elem: AnyRef) = { + def updateVectorStorageEntryFor(name: String, index: Int, elem: Array[Byte]) = { sessions.withSession { _ ++| (name, new ColumnPath(VECTOR_COLUMN_PARENT.getColumn_family, null, intToBytes(index)), - serializer.out(elem), + elem, System.currentTimeMillis, CONSISTENCY_LEVEL) } } - def getVectorStorageEntryFor(name: String, index: Int): AnyRef = { + def getVectorStorageEntryFor(name: String, index: Int): Array[Byte] = { val column: Option[ColumnOrSuperColumn] = sessions.withSession { _ | (name, new ColumnPath(VECTOR_COLUMN_PARENT.getColumn_family, null, intToBytes(index))) } - if (column.isDefined) serializer.in(column.get.column.value, None) + if (column.isDefined) column.get.column.value else throw new NoSuchElementException("No element for vector [" + name + "] and index [" + index + "]") } - def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[AnyRef] = { + def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[Array[Byte]] = { val startBytes = if (start.isDefined) intToBytes(start.get) else null val finishBytes = if (finish.isDefined) intToBytes(finish.get) else null val columns: List[ColumnOrSuperColumn] = sessions.withSession { @@ -143,7 +127,7 @@ object CassandraStorage extends MapStorage count, CONSISTENCY_LEVEL) } - columns.map(column => serializer.in(column.getColumn.value, None)) + columns.map(column => column.getColumn.value) } def getVectorStorageSizeFor(name: String): Int = { @@ -156,21 +140,21 @@ object CassandraStorage extends MapStorage // For Map // =============================================================== - def insertMapStorageEntryFor(name: String, key: AnyRef, element: AnyRef) = { + def insertMapStorageEntryFor(name: String, key: Array[Byte], element: Array[Byte]) = { sessions.withSession { _ ++| (name, - new ColumnPath(MAP_COLUMN_PARENT.getColumn_family, null, serializer.out(key)), - serializer.out(element), + new ColumnPath(MAP_COLUMN_PARENT.getColumn_family, null, key), + element, System.currentTimeMillis, CONSISTENCY_LEVEL) } } - def insertMapStorageEntriesFor(name: String, entries: List[Tuple2[AnyRef, AnyRef]]) = { + def insertMapStorageEntriesFor(name: String, entries: List[Tuple2[Array[Byte], Array[Byte]]]) = { val batch = new scala.collection.mutable.HashMap[String, List[ColumnOrSuperColumn]] for (entry <- entries) { val columnOrSuperColumn = new ColumnOrSuperColumn - columnOrSuperColumn.setColumn(new Column(serializer.out(entry._1), serializer.out(entry._2), System.currentTimeMillis)) + columnOrSuperColumn.setColumn(new Column(entry._1, entry._2, System.currentTimeMillis)) batch + (MAP_COLUMN_PARENT.getColumn_family -> List(columnOrSuperColumn)) } sessions.withSession { @@ -178,12 +162,12 @@ object CassandraStorage extends MapStorage } } - def getMapStorageEntryFor(name: String, key: AnyRef): Option[AnyRef] = { + def getMapStorageEntryFor(name: String, key: Array[Byte]): Option[Array[Byte]] = { try { val column: Option[ColumnOrSuperColumn] = sessions.withSession { - _ | (name, new ColumnPath(MAP_COLUMN_PARENT.getColumn_family, null, serializer.out(key))) + _ | (name, new ColumnPath(MAP_COLUMN_PARENT.getColumn_family, null, key)) } - if (column.isDefined) Some(serializer.in(column.get.getColumn.value, None)) + if (column.isDefined) Some(column.get.getColumn.value) else None } catch { case e => @@ -192,13 +176,16 @@ object CassandraStorage extends MapStorage } } - def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = { + def getMapStorageFor(name: String): List[Tuple2[Array[Byte], Array[Byte]]] = { val size = getMapStorageSizeFor(name) sessions.withSession { session => - val columns = session / (name, MAP_COLUMN_PARENT, EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY, true, size, CONSISTENCY_LEVEL) + val columns = session / + (name, MAP_COLUMN_PARENT, + EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY, + true, size, CONSISTENCY_LEVEL) for { columnOrSuperColumn <- columns - entry = (serializer.in(columnOrSuperColumn.column.name, None), serializer.in(columnOrSuperColumn.column.value, None)) + entry = (columnOrSuperColumn.column.name, columnOrSuperColumn.column.value) } yield entry } } @@ -209,8 +196,8 @@ object CassandraStorage extends MapStorage def removeMapStorageFor(name: String): Unit = removeMapStorageFor(name, null) - def removeMapStorageFor(name: String, key: AnyRef): Unit = { - val keyBytes = if (key == null) null else serializer.out(key) + def removeMapStorageFor(name: String, key: Array[Byte]): Unit = { + val keyBytes = if (key == null) null else key sessions.withSession { _ -- (name, new ColumnPath(MAP_COLUMN_PARENT.getColumn_family, null, keyBytes), @@ -219,13 +206,13 @@ object CassandraStorage extends MapStorage } } - def getMapStorageRangeFor(name: String, start: Option[AnyRef], finish: Option[AnyRef], count: Int): - List[Tuple2[AnyRef, AnyRef]] = { - val startBytes = if (start.isDefined) serializer.out(start.get) else null - val finishBytes = if (finish.isDefined) serializer.out(finish.get) else null + def getMapStorageRangeFor(name: String, start: Option[Array[Byte]], finish: Option[Array[Byte]], count: Int): + List[Tuple2[Array[Byte], Array[Byte]]] = { + val startBytes = if (start.isDefined) start.get else null + val finishBytes = if (finish.isDefined) finish.get else null val columns: List[ColumnOrSuperColumn] = sessions.withSession { _ / (name, MAP_COLUMN_PARENT, startBytes, finishBytes, IS_ASCENDING, count, CONSISTENCY_LEVEL) } - columns.map(column => (column.getColumn.name, serializer.in(column.getColumn.value, None))) + columns.map(column => (column.getColumn.name, column.getColumn.value)) } } diff --git a/akka-persistence/src/main/scala/MongoStorage.scala b/akka-persistence/src/main/scala/MongoStorageBackend.scala similarity index 89% rename from akka-persistence/src/main/scala/MongoStorage.scala rename to akka-persistence/src/main/scala/MongoStorageBackend.scala index 8fd7a0c4b5..62169199aa 100644 --- a/akka-persistence/src/main/scala/MongoStorage.scala +++ b/akka-persistence/src/main/scala/MongoStorageBackend.scala @@ -4,8 +4,8 @@ package se.scalablesolutions.akka.state -import util.Logging -import Config.config +import se.scalablesolutions.akka.util.Logging +import se.scalablesolutions.akka.Config.config import sjson.json.Serializer._ @@ -23,8 +23,12 @@ import java.util.{Map=>JMap, List=>JList, ArrayList=>JArrayList} *

* @author Debasish Ghosh */ -object MongoStorage extends MapStorage with VectorStorage with RefStorage with Logging { - +private[akka] object MongoStorageBackend extends + MapStorageBackend[AnyRef, AnyRef] with + VectorStorageBackend[AnyRef] with + RefStorageBackend[AnyRef] with + Logging { + // enrich with null safe findOne class RichDBCollection(value: DBCollection) { def findOneNS(o: DBObject): Option[DBObject] = { @@ -34,13 +38,13 @@ object MongoStorage extends MapStorage with VectorStorage with RefStorage with L } } } - + implicit def enrichDBCollection(c: DBCollection) = new RichDBCollection(c) - + val KEY = "key" val VALUE = "value" val COLLECTION = "akka_coll" - + val MONGODB_SERVER_HOSTNAME = config.getString("akka.storage.mongodb.hostname", "127.0.0.1") val MONGODB_SERVER_DBNAME = config.getString("akka.storage.mongodb.dbname", "testdb") val MONGODB_SERVER_PORT = config.getInt("akka.storage.mongodb.port", 27017) @@ -50,27 +54,27 @@ object MongoStorage extends MapStorage with VectorStorage with RefStorage with L // FIXME: make this pluggable private[this] val serializer = SJSON - + def insertMapStorageEntryFor(name: String, key: AnyRef, value: AnyRef) { insertMapStorageEntriesFor(name, List((key, value))) } def insertMapStorageEntriesFor(name: String, entries: List[Tuple2[AnyRef, AnyRef]]) { import java.util.{Map, HashMap} - + val m: Map[AnyRef, AnyRef] = new HashMap for ((k, v) <- entries) { m.put(k, serializer.out(v)) } - + nullSafeFindOne(name) match { - case None => + case None => coll.insert(new BasicDBObject().append(KEY, name).append(VALUE, m)) case Some(dbo) => { // collate the maps val o = dbo.get(VALUE).asInstanceOf[Map[AnyRef, AnyRef]] o.putAll(m) - + // remove existing reference removeMapStorageFor(name) // and insert @@ -78,16 +82,16 @@ object MongoStorage extends MapStorage with VectorStorage with RefStorage with L } } } - - def removeMapStorageFor(name: String) = { + + def removeMapStorageFor(name: String): Unit = { val q = new BasicDBObject q.put(KEY, name) coll.remove(q) } - def removeMapStorageFor(name: String, key: AnyRef) = { + def removeMapStorageFor(name: String, key: AnyRef): Unit = { nullSafeFindOne(name) match { - case None => + case None => case Some(dbo) => { val orig = dbo.get(VALUE).asInstanceOf[DBObject].toMap if (key.isInstanceOf[List[_]]) { @@ -104,10 +108,10 @@ object MongoStorage extends MapStorage with VectorStorage with RefStorage with L } } } - - def getMapStorageEntryFor(name: String, key: AnyRef): Option[AnyRef] = + + def getMapStorageEntryFor(name: String, key: AnyRef): Option[AnyRef] = getValueForKey(name, key.asInstanceOf[String]) - + def getMapStorageSizeFor(name: String): Int = { nullSafeFindOne(name) match { case None => 0 @@ -115,55 +119,55 @@ object MongoStorage extends MapStorage with VectorStorage with RefStorage with L dbo.get(VALUE).asInstanceOf[JMap[String, AnyRef]].keySet.size } } - + def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = { - val m = + val m = nullSafeFindOne(name) match { - case None => + case None => throw new Predef.NoSuchElementException(name + " not present") case Some(dbo) => dbo.get(VALUE).asInstanceOf[JMap[String, AnyRef]] } - val n = + val n = List(m.keySet.toArray: _*).asInstanceOf[List[String]] - val vals = - for(s <- n) + val vals = + for(s <- n) yield (s, serializer.in[AnyRef](m.get(s).asInstanceOf[Array[Byte]])) vals.asInstanceOf[List[Tuple2[String, AnyRef]]] } - - def getMapStorageRangeFor(name: String, start: Option[AnyRef], - finish: Option[AnyRef], + + def getMapStorageRangeFor(name: String, start: Option[AnyRef], + finish: Option[AnyRef], count: Int): List[Tuple2[AnyRef, AnyRef]] = { - val m = + val m = nullSafeFindOne(name) match { - case None => + case None => throw new Predef.NoSuchElementException(name + " not present") case Some(dbo) => dbo.get(VALUE).asInstanceOf[JMap[String, AnyRef]] } /** - * count is the max number of results to return. Start with + * count is the max number of results to return. Start with * start or 0 (if start is not defined) and go until * you hit finish or count. */ val s = if (start.isDefined) start.get.asInstanceOf[Int] else 0 - val cnt = + val cnt = if (finish.isDefined) { val f = finish.get.asInstanceOf[Int] if (f >= s) Math.min(count, (f - s)) else count } else count - val n = + val n = List(m.keySet.toArray: _*).asInstanceOf[List[String]].sort((e1, e2) => (e1 compareTo e2) < 0).slice(s, s + cnt) - val vals = - for(s <- n) + val vals = + for(s <- n) yield (s, serializer.in[AnyRef](m.get(s).asInstanceOf[Array[Byte]])) vals.asInstanceOf[List[Tuple2[String, AnyRef]]] } - + private def getValueForKey(name: String, key: String): Option[AnyRef] = { try { nullSafeFindOne(name) match { @@ -179,16 +183,16 @@ object MongoStorage extends MapStorage with VectorStorage with RefStorage with L throw new Predef.NoSuchElementException(e.getMessage) } } - + def insertVectorStorageEntriesFor(name: String, elements: List[AnyRef]) = { val q = new BasicDBObject q.put(KEY, name) - + val currentList = coll.findOneNS(q) match { - case None => + case None => new JArrayList[AnyRef] - case Some(dbo) => + case Some(dbo) => dbo.get(VALUE).asInstanceOf[JArrayList[AnyRef]] } if (!currentList.isEmpty) { @@ -196,26 +200,26 @@ object MongoStorage extends MapStorage with VectorStorage with RefStorage with L // remove before adding coll.remove(q) } - + // add to the current list elements.map(serializer.out(_)).foreach(currentList.add(_)) - + coll.insert( new BasicDBObject() .append(KEY, name) .append(VALUE, currentList) ) } - + def insertVectorStorageEntryFor(name: String, element: AnyRef) = { insertVectorStorageEntriesFor(name, List(element)) } - + def getVectorStorageEntryFor(name: String, index: Int): AnyRef = { try { val o = nullSafeFindOne(name) match { - case None => + case None => throw new Predef.NoSuchElementException(name + " not present") case Some(dbo) => @@ -224,17 +228,17 @@ object MongoStorage extends MapStorage with VectorStorage with RefStorage with L serializer.in[AnyRef]( o.get(index).asInstanceOf[Array[Byte]]) } catch { - case e => + case e => throw new Predef.NoSuchElementException(e.getMessage) } } - - def getVectorStorageRangeFor(name: String, + + def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[AnyRef] = { try { val o = nullSafeFindOne(name) match { - case None => + case None => throw new Predef.NoSuchElementException(name + " not present") case Some(dbo) => @@ -242,24 +246,24 @@ object MongoStorage extends MapStorage with VectorStorage with RefStorage with L } // pick the subrange and make a Scala list - val l = + val l = List(o.subList(start.get, start.get + count).toArray: _*) - for(e <- l) + for(e <- l) yield serializer.in[AnyRef](e.asInstanceOf[Array[Byte]]) } catch { - case e => + case e => throw new Predef.NoSuchElementException(e.getMessage) } } - + // FIXME implement updateVectorStorageEntryFor def updateVectorStorageEntryFor(name: String, index: Int, elem: AnyRef) = throw new UnsupportedOperationException - + def getVectorStorageSizeFor(name: String): Int = { nullSafeFindOne(name) match { case None => 0 - case Some(dbo) => + case Some(dbo) => dbo.get(VALUE).asInstanceOf[JList[AnyRef]].size } } diff --git a/akka-persistence/src/main/scala/PersistentState.scala b/akka-persistence/src/main/scala/PersistentState.scala deleted file mode 100644 index f08d2cd925..0000000000 --- a/akka-persistence/src/main/scala/PersistentState.scala +++ /dev/null @@ -1,352 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka.state - -import se.scalablesolutions.akka.stm.TransactionManagement.currentTransaction -import se.scalablesolutions.akka.collection._ -import se.scalablesolutions.akka.util.Logging - -import org.codehaus.aspectwerkz.proxy.Uuid - -class NoTransactionInScopeException extends RuntimeException - -sealed abstract class PersistentStateConfig -abstract class PersistentStorageConfig extends PersistentStateConfig -case class CassandraStorageConfig() extends PersistentStorageConfig -case class TerracottaStorageConfig() extends PersistentStorageConfig -case class TokyoCabinetStorageConfig() extends PersistentStorageConfig -case class MongoStorageConfig() extends PersistentStorageConfig - -/** - * Example Scala usage. - *

- * New map with generated id. - *

- * val myMap = PersistentState.newMap(CassandraStorageConfig)
- * 
- * - * New map with user-defined id. - *
- * val myMap = PersistentState.newMap(CassandraStorageConfig, id)
- * 
- * - * Get map by user-defined id. - *
- * val myMap = PersistentState.getMap(CassandraStorageConfig, id)
- * 
- * - * Example Java usage: - *
- * TransactionalMap myMap = PersistentState.newMap(new CassandraStorageConfig());
- * 
- * - * @author Jonas Bonér - */ -object PersistentState { - def newMap(config: PersistentStorageConfig): PersistentMap = - // FIXME: won't work across the remote machines, use [http://johannburkard.de/software/uuid/] - newMap(config, Uuid.newUuid.toString) - - def newVector(config: PersistentStorageConfig): PersistentVector = - newVector(config, Uuid.newUuid.toString) - - def newRef(config: PersistentStorageConfig): PersistentRef = - newRef(config, Uuid.newUuid.toString) - - def getMap(config: PersistentStorageConfig, id: String): PersistentMap = - newMap(config, id) - - def getVector(config: PersistentStorageConfig, id: String): PersistentVector = - newVector(config, id) - - def getRef(config: PersistentStorageConfig, id: String): PersistentRef = - newRef(config, id) - - def newMap(config: PersistentStorageConfig, id: String): PersistentMap = config match { - case CassandraStorageConfig() => new CassandraPersistentMap(id) - case MongoStorageConfig() => new MongoPersistentMap(id) - case TerracottaStorageConfig() => throw new UnsupportedOperationException - case TokyoCabinetStorageConfig() => throw new UnsupportedOperationException - } - - def newVector(config: PersistentStorageConfig, id: String): PersistentVector = config match { - case CassandraStorageConfig() => new CassandraPersistentVector(id) - case MongoStorageConfig() => new MongoPersistentVector(id) - case TerracottaStorageConfig() => throw new UnsupportedOperationException - case TokyoCabinetStorageConfig() => throw new UnsupportedOperationException - } - - def newRef(config: PersistentStorageConfig, id: String): PersistentRef = config match { - case CassandraStorageConfig() => new CassandraPersistentRef(id) - case MongoStorageConfig() => new MongoPersistentRef(id) - case TerracottaStorageConfig() => throw new UnsupportedOperationException - case TokyoCabinetStorageConfig() => throw new UnsupportedOperationException - } -} - -/** - * Implementation of PersistentMap for every concrete - * storage will have the same workflow. This abstracts the workflow. - * - * Subclasses just need to provide the actual concrete instance for the - * abstract val storage. - * - * @author Jonas Bonér - */ -trait PersistentMap extends scala.collection.mutable.Map[AnyRef, AnyRef] - with Transactional with Committable with Logging { - protected val newAndUpdatedEntries = TransactionalState.newMap[AnyRef, AnyRef] - protected val removedEntries = TransactionalState.newVector[AnyRef] - protected val shouldClearOnCommit = TransactionalRef[Boolean]() - - // to be concretized in subclasses - val storage: MapStorage - - def commit = { - storage.removeMapStorageFor(uuid, removedEntries.toList) - storage.insertMapStorageEntriesFor(uuid, newAndUpdatedEntries.toList) - if (shouldClearOnCommit.isDefined && shouldClearOnCommit.get.get) - storage.removeMapStorageFor(uuid) - newAndUpdatedEntries.clear - removedEntries.clear - } - - def -=(key: AnyRef) = remove(key) - - def +=(key: AnyRef, value: AnyRef) = put(key, value) - - override def put(key: AnyRef, value: AnyRef): Option[AnyRef] = { - register - newAndUpdatedEntries.put(key, value) - } - - override def update(key: AnyRef, value: AnyRef) = { - register - newAndUpdatedEntries.update(key, value) - } - - def remove(key: AnyRef) = { - register - removedEntries.add(key) - } - - def slice(start: Option[AnyRef], count: Int): List[Tuple2[AnyRef, AnyRef]] = - slice(start, None, count) - - def slice(start: Option[AnyRef], finish: Option[AnyRef], count: Int): - List[Tuple2[AnyRef, AnyRef]] = try { - storage.getMapStorageRangeFor(uuid, start, finish, count) - } catch { case e: Exception => Nil } - - override def clear = { - register - shouldClearOnCommit.swap(true) - } - - override def contains(key: AnyRef): Boolean = try { - newAndUpdatedEntries.contains(key) || - storage.getMapStorageEntryFor(uuid, key).isDefined - } catch { case e: Exception => false } - - override def size: Int = try { - storage.getMapStorageSizeFor(uuid) - } catch { case e: Exception => 0 } - - override def get(key: AnyRef): Option[AnyRef] = { - if (newAndUpdatedEntries.contains(key)) { - newAndUpdatedEntries.get(key) - } - else try { - storage.getMapStorageEntryFor(uuid, key) - } catch { case e: Exception => None } - } - - override def elements: Iterator[Tuple2[AnyRef, AnyRef]] = { - new Iterator[Tuple2[AnyRef, AnyRef]] { - private val originalList: List[Tuple2[AnyRef, AnyRef]] = try { - storage.getMapStorageFor(uuid) - } catch { - case e: Throwable => Nil - } - // FIXME how to deal with updated entries, these should be replaced in the originalList not just added - private var elements = newAndUpdatedEntries.toList ::: originalList.reverse - override def next: Tuple2[AnyRef, AnyRef]= synchronized { - val element = elements.head - elements = elements.tail - element - } - override def hasNext: Boolean = synchronized { !elements.isEmpty } - } - } - - private def register = { - if (currentTransaction.get.isEmpty) throw new NoTransactionInScopeException - currentTransaction.get.get.register(uuid, this) - } -} - -/** - * Implements a persistent transactional map based on the Cassandra distributed P2P key-value storage. - * - * @author Jonas Bonér - */ -class CassandraPersistentMap(id: String) extends PersistentMap { - val uuid = id - val storage = CassandraStorage -} - -/** - * Implements a persistent transactional map based on the MongoDB document storage. - * - * @author Debasish Ghosh - */ -class MongoPersistentMap(id: String) extends PersistentMap { - val uuid = id - val storage = MongoStorage -} - -/** - * Implements a template for a concrete persistent transactional vector based storage. - * - * @author Jonas Bonér - */ -trait PersistentVector extends RandomAccessSeq[AnyRef] with Transactional with Committable { - protected val newElems = TransactionalState.newVector[AnyRef] - protected val updatedElems = TransactionalState.newMap[Int, AnyRef] - protected val removedElems = TransactionalState.newVector[AnyRef] - protected val shouldClearOnCommit = TransactionalRef[Boolean]() - - val storage: VectorStorage - - def commit = { - // FIXME: should use batch function once the bug is resolved - for (element <- newElems) storage.insertVectorStorageEntryFor(uuid, element) - for (entry <- updatedElems) storage.updateVectorStorageEntryFor(uuid, entry._1, entry._2) - newElems.clear - updatedElems.clear - } - - def +(elem: AnyRef) = add(elem) - - def add(elem: AnyRef) = { - register - newElems + elem - } - - def apply(index: Int): AnyRef = get(index) - - def get(index: Int): AnyRef = { - if (newElems.size > index) newElems(index) - else storage.getVectorStorageEntryFor(uuid, index) - } - - override def slice(start: Int, count: Int): RandomAccessSeq[AnyRef] = slice(Some(start), None, count) - - def slice(start: Option[Int], finish: Option[Int], count: Int): RandomAccessSeq[AnyRef] = { - val buffer = new scala.collection.mutable.ArrayBuffer[AnyRef] - storage.getVectorStorageRangeFor(uuid, start, finish, count).foreach(buffer.append(_)) - buffer - } - - /** - * Removes the tail element of this vector. - */ - // FIXME: implement persistent vector pop - def pop: AnyRef = { - register - throw new UnsupportedOperationException("need to implement persistent vector pop") - } - - def update(index: Int, newElem: AnyRef) = { - register - storage.updateVectorStorageEntryFor(uuid, index, newElem) - } - - override def first: AnyRef = get(0) - - override def last: AnyRef = { - if (newElems.length != 0) newElems.last - else { - val len = length - if (len == 0) throw new NoSuchElementException("Vector is empty") - get(len - 1) - } - } - - def length: Int = storage.getVectorStorageSizeFor(uuid) + newElems.length - - private def register = { - if (currentTransaction.get.isEmpty) throw new NoTransactionInScopeException - currentTransaction.get.get.register(uuid, this) - } -} - -/** - * Implements a persistent transactional vector based on the Cassandra - * distributed P2P key-value storage. - * - * @author Jonas Bonér - */ -class CassandraPersistentVector(id: String) extends PersistentVector { - val uuid = id - val storage = CassandraStorage -} - -/** - * Implements a persistent transactional vector based on the MongoDB - * document storage. - * - * @author Debaissh Ghosh - */ -class MongoPersistentVector(id: String) extends PersistentVector { - val uuid = id - val storage = MongoStorage -} - -/** - * Implements a persistent reference with abstract storage. - * - * @author Jonas Bonér - */ -trait PersistentRef extends Transactional with Committable { - protected val ref = new TransactionalRef[AnyRef] - - val storage: RefStorage - - def commit = if (ref.isDefined) { - storage.insertRefStorageFor(uuid, ref.get.get) - ref.swap(null) - } - - def swap(elem: AnyRef) = { - register - ref.swap(elem) - } - - def get: Option[AnyRef] = if (ref.isDefined) ref.get else storage.getRefStorageFor(uuid) - - def isDefined: Boolean = ref.isDefined || storage.getRefStorageFor(uuid).isDefined - - def getOrElse(default: => AnyRef): AnyRef = { - val current = get - if (current.isDefined) current.get - else default - } - - private def register = { - if (currentTransaction.get.isEmpty) throw new NoTransactionInScopeException - currentTransaction.get.get.register(uuid, this) - } -} - -class CassandraPersistentRef(id: String) extends PersistentRef { - val uuid = id - val storage = CassandraStorage -} - -class MongoPersistentRef(id: String) extends PersistentRef { - val uuid = id - val storage = MongoStorage -} diff --git a/akka-persistence/src/main/scala/Storage.scala b/akka-persistence/src/main/scala/Storage.scala index 52dc45afa7..5f30cc3319 100644 --- a/akka-persistence/src/main/scala/Storage.scala +++ b/akka-persistence/src/main/scala/Storage.scala @@ -4,33 +4,352 @@ package se.scalablesolutions.akka.state -// abstracts persistence storage -trait Storage +import se.scalablesolutions.akka.stm.TransactionManagement.currentTransaction +import se.scalablesolutions.akka.collection._ +import se.scalablesolutions.akka.util.Logging -// for Maps -trait MapStorage extends Storage { - def insertMapStorageEntriesFor(name: String, entries: List[Tuple2[AnyRef, AnyRef]]) - def insertMapStorageEntryFor(name: String, key: AnyRef, value: AnyRef) - def removeMapStorageFor(name: String) - def removeMapStorageFor(name: String, key: AnyRef) - def getMapStorageEntryFor(name: String, key: AnyRef): Option[AnyRef] - def getMapStorageSizeFor(name: String): Int - def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] - def getMapStorageRangeFor(name: String, start: Option[AnyRef], finish: Option[AnyRef], count: Int): List[Tuple2[AnyRef, AnyRef]] +import org.codehaus.aspectwerkz.proxy.Uuid + +class NoTransactionInScopeException extends RuntimeException + +/** + * Example Scala usage. + *

+ * New map with generated id. + *

+ * val myMap = CassandraStorage.newMap
+ * 
+ * + * New map with user-defined id. + *
+ * val myMap = MongoStorage.newMap(id)
+ * 
+ * + * Get map by user-defined id. + *
+ * val myMap = CassandraStorage.getMap(id)
+ * 
+ * + * Example Java usage: + *
+ * PersistentMap myMap = MongoStorage.newMap();
+ * 
+ * Or: + *
+ * MongoPersistentMap myMap = MongoStorage.getMap(id);
+ * 
+ * + * @author Jonas Bonér + */ +trait Storage { + // FIXME: The UUID won't work across the remote machines, use [http://johannburkard.de/software/uuid/] + type ElementType + + def newMap: PersistentMap[ElementType, ElementType] + def newVector: PersistentVector[ElementType] + def newRef: PersistentRef[ElementType] + + def getMap(id: String): PersistentMap[ElementType, ElementType] + def getVector(id: String): PersistentVector[ElementType] + def getRef(id: String): PersistentRef[ElementType] + + def newMap(id: String): PersistentMap[ElementType, ElementType] + def newVector(id: String): PersistentVector[ElementType] + def newRef(id: String): PersistentRef[ElementType] } -// for Vectors -trait VectorStorage extends Storage { - def insertVectorStorageEntryFor(name: String, element: AnyRef) - def insertVectorStorageEntriesFor(name: String, elements: List[AnyRef]) - def updateVectorStorageEntryFor(name: String, index: Int, elem: AnyRef) - def getVectorStorageEntryFor(name: String, index: Int): AnyRef - def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[AnyRef] - def getVectorStorageSizeFor(name: String): Int +object CassandraStorage extends Storage { + type ElementType = Array[Byte] + + def newMap: PersistentMap[ElementType, ElementType] = newMap(Uuid.newUuid.toString) + def newVector: PersistentVector[ElementType] = newVector(Uuid.newUuid.toString) + def newRef: PersistentRef[ElementType] = newRef(Uuid.newUuid.toString) + + def getMap(id: String): PersistentMap[ElementType, ElementType] = newMap(id) + def getVector(id: String): PersistentVector[ElementType] = newVector(id) + def getRef(id: String): PersistentRef[ElementType] = newRef(id) + + def newMap(id: String): PersistentMap[ElementType, ElementType] = new CassandraPersistentMap(id) + def newVector(id: String): PersistentVector[ElementType] = new CassandraPersistentVector(id) + def newRef(id: String): PersistentRef[ElementType] = new CassandraPersistentRef(id) } -// for Ref -trait RefStorage extends Storage { - def insertRefStorageFor(name: String, element: AnyRef) - def getRefStorageFor(name: String): Option[AnyRef] +object MongoStorage extends Storage { + type ElementType = AnyRef + + def newMap: PersistentMap[ElementType, ElementType] = newMap(Uuid.newUuid.toString) + def newVector: PersistentVector[ElementType] = newVector(Uuid.newUuid.toString) + def newRef: PersistentRef[ElementType] = newRef(Uuid.newUuid.toString) + + def getMap(id: String): PersistentMap[ElementType, ElementType] = newMap(id) + def getVector(id: String): PersistentVector[ElementType] = newVector(id) + def getRef(id: String): PersistentRef[ElementType] = newRef(id) + + def newMap(id: String): PersistentMap[ElementType, ElementType] = new MongoPersistentMap(id) + def newVector(id: String): PersistentVector[ElementType] = new MongoPersistentVector(id) + def newRef(id: String): PersistentRef[ElementType] = new MongoPersistentRef(id) +} + +/** + * Implementation of PersistentMap for every concrete + * storage will have the same workflow. This abstracts the workflow. + * + * Subclasses just need to provide the actual concrete instance for the + * abstract val storage. + * + * @author Jonas Bonér + */ +trait PersistentMap[K, V] extends scala.collection.mutable.Map[K, V] + with Transactional with Committable with Logging { + protected val newAndUpdatedEntries = TransactionalState.newMap[K, V] + protected val removedEntries = TransactionalState.newVector[K] + protected val shouldClearOnCommit = TransactionalRef[Boolean]() + + // to be concretized in subclasses + val storage: MapStorageBackend[K, V] + + def commit = { + removedEntries.toList.foreach(key => storage.removeMapStorageFor(uuid, key)) + storage.insertMapStorageEntriesFor(uuid, newAndUpdatedEntries.toList) + if (shouldClearOnCommit.isDefined && shouldClearOnCommit.get.get) + storage.removeMapStorageFor(uuid) + newAndUpdatedEntries.clear + removedEntries.clear + } + + def -=(key: K) = remove(key) + + def +=(key: K, value: V) = put(key, value) + + override def put(key: K, value: V): Option[V] = { + register + newAndUpdatedEntries.put(key, value) + } + + override def update(key: K, value: V) = { + register + newAndUpdatedEntries.update(key, value) + } + + def remove(key: K) = { + register + removedEntries.add(key) + } + + def slice(start: Option[K], count: Int): List[Tuple2[K, V]] = + slice(start, None, count) + + def slice(start: Option[K], finish: Option[K], count: Int): List[Tuple2[K, V]] = try { + storage.getMapStorageRangeFor(uuid, start, finish, count) + } catch { case e: Exception => Nil } + + override def clear = { + register + shouldClearOnCommit.swap(true) + } + + override def contains(key: K): Boolean = try { + newAndUpdatedEntries.contains(key) || + storage.getMapStorageEntryFor(uuid, key).isDefined + } catch { case e: Exception => false } + + override def size: Int = try { + storage.getMapStorageSizeFor(uuid) + } catch { case e: Exception => 0 } + + override def get(key: K): Option[V] = { + if (newAndUpdatedEntries.contains(key)) { + newAndUpdatedEntries.get(key) + } + else try { + storage.getMapStorageEntryFor(uuid, key) + } catch { case e: Exception => None } + } + + override def elements: Iterator[Tuple2[K, V]] = { + new Iterator[Tuple2[K, V]] { + private val originalList: List[Tuple2[K, V]] = try { + storage.getMapStorageFor(uuid) + } catch { + case e: Throwable => Nil + } + // FIXME how to deal with updated entries, these should be replaced in the originalList not just added + private var elements = newAndUpdatedEntries.toList ::: originalList.reverse + override def next: Tuple2[K, V]= synchronized { + val element = elements.head + elements = elements.tail + element + } + override def hasNext: Boolean = synchronized { !elements.isEmpty } + } + } + + private def register = { + if (currentTransaction.get.isEmpty) throw new NoTransactionInScopeException + currentTransaction.get.get.register(uuid, this) + } +} + +/** + * Implements a persistent transactional map based on the Cassandra distributed P2P key-value storage. + * + * @author Jonas Bonér + */ +class CassandraPersistentMap(id: String) extends PersistentMap[Array[Byte], Array[Byte]] { + val uuid = id + val storage = CassandraStorageBackend +} + +/** + * Implements a persistent transactional map based on the MongoDB document storage. + * + * @author Debasish Ghosh + */ +class MongoPersistentMap(id: String) extends PersistentMap[AnyRef, AnyRef] { + val uuid = id + val storage = MongoStorageBackend +} + +/** + * Implements a template for a concrete persistent transactional vector based storage. + * + * @author Jonas Bonér + */ +trait PersistentVector[T] extends RandomAccessSeq[T] with Transactional with Committable { + protected val newElems = TransactionalState.newVector[T] + protected val updatedElems = TransactionalState.newMap[Int, T] + protected val removedElems = TransactionalState.newVector[T] + protected val shouldClearOnCommit = TransactionalRef[Boolean]() + + val storage: VectorStorageBackend[T] + + def commit = { + // FIXME: should use batch function once the bug is resolved + for (element <- newElems) storage.insertVectorStorageEntryFor(uuid, element) + for (entry <- updatedElems) storage.updateVectorStorageEntryFor(uuid, entry._1, entry._2) + newElems.clear + updatedElems.clear + } + + def +(elem: T) = add(elem) + + def add(elem: T) = { + register + newElems + elem + } + + def apply(index: Int): T = get(index) + + def get(index: Int): T = { + if (newElems.size > index) newElems(index) + else storage.getVectorStorageEntryFor(uuid, index) + } + + override def slice(start: Int, count: Int): RandomAccessSeq[T] = slice(Some(start), None, count) + + def slice(start: Option[Int], finish: Option[Int], count: Int): RandomAccessSeq[T] = { + val buffer = new scala.collection.mutable.ArrayBuffer[T] + storage.getVectorStorageRangeFor(uuid, start, finish, count).foreach(buffer.append(_)) + buffer + } + + /** + * Removes the tail element of this vector. + */ + // FIXME: implement persistent vector pop + def pop: T = { + register + throw new UnsupportedOperationException("need to implement persistent vector pop") + } + + def update(index: Int, newElem: T) = { + register + storage.updateVectorStorageEntryFor(uuid, index, newElem) + } + + override def first: T = get(0) + + override def last: T = { + if (newElems.length != 0) newElems.last + else { + val len = length + if (len == 0) throw new NoSuchElementException("Vector is empty") + get(len - 1) + } + } + + def length: Int = storage.getVectorStorageSizeFor(uuid) + newElems.length + + private def register = { + if (currentTransaction.get.isEmpty) throw new NoTransactionInScopeException + currentTransaction.get.get.register(uuid, this) + } +} + +/** + * Implements a persistent transactional vector based on the Cassandra + * distributed P2P key-value storage. + * + * @author Jonas Bonér + */ +class CassandraPersistentVector(id: String) extends PersistentVector[Array[Byte]] { + val uuid = id + val storage = CassandraStorageBackend +} + +/** + * Implements a persistent transactional vector based on the MongoDB + * document storage. + * + * @author Debaissh Ghosh + */ +class MongoPersistentVector(id: String) extends PersistentVector[AnyRef] { + val uuid = id + val storage = MongoStorageBackend +} + +/** + * Implements a persistent reference with abstract storage. + * + * @author Jonas Bonér + */ +trait PersistentRef[T] extends Transactional with Committable { + protected val ref = new TransactionalRef[T] + + val storage: RefStorageBackend[T] + + def commit = if (ref.isDefined) { + storage.insertRefStorageFor(uuid, ref.get.get) + ref.swap(null.asInstanceOf[T]) + } + + def swap(elem: T) = { + register + ref.swap(elem) + } + + def get: Option[T] = if (ref.isDefined) ref.get else storage.getRefStorageFor(uuid) + + def isDefined: Boolean = ref.isDefined || storage.getRefStorageFor(uuid).isDefined + + def getOrElse(default: => T): T = { + val current = get + if (current.isDefined) current.get + else default + } + + private def register = { + if (currentTransaction.get.isEmpty) throw new NoTransactionInScopeException + currentTransaction.get.get.register(uuid, this) + } +} + +class CassandraPersistentRef(id: String) extends PersistentRef[Array[Byte]] { + val uuid = id + val storage = CassandraStorageBackend +} + +class MongoPersistentRef(id: String) extends PersistentRef[AnyRef] { + val uuid = id + val storage = MongoStorageBackend } diff --git a/akka-persistence/src/main/scala/StorageBackend.scala b/akka-persistence/src/main/scala/StorageBackend.scala new file mode 100644 index 0000000000..76a7ccdfdf --- /dev/null +++ b/akka-persistence/src/main/scala/StorageBackend.scala @@ -0,0 +1,36 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.state + +// abstracts persistence storage +trait StorageBackend + +// for Maps +trait MapStorageBackend[K, V] extends StorageBackend { + def insertMapStorageEntriesFor(name: String, entries: List[Tuple2[K, V]]) + def insertMapStorageEntryFor(name: String, key: K, value: V) + def removeMapStorageFor(name: String) + def removeMapStorageFor(name: String, key: K) + def getMapStorageEntryFor(name: String, key: K): Option[V] + def getMapStorageSizeFor(name: String): Int + def getMapStorageFor(name: String): List[Tuple2[K, V]] + def getMapStorageRangeFor(name: String, start: Option[K], finish: Option[K], count: Int): List[Tuple2[K, V]] +} + +// for Vectors +trait VectorStorageBackend[T] extends StorageBackend { + def insertVectorStorageEntryFor(name: String, element: T) + def insertVectorStorageEntriesFor(name: String, elements: List[T]) + def updateVectorStorageEntryFor(name: String, index: Int, elem: T) + def getVectorStorageEntryFor(name: String, index: Int): T + def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[T] + def getVectorStorageSizeFor(name: String): Int +} + +// for Ref +trait RefStorageBackend[T] extends StorageBackend { + def insertRefStorageFor(name: String, element: T) + def getRefStorageFor(name: String): Option[T] +} diff --git a/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala b/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala index 305763eba3..2142311f76 100644 --- a/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala +++ b/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala @@ -1,13 +1,10 @@ package se.scalablesolutions.akka.state -import akka.actor.Actor -import java.util.concurrent.locks.ReentrantLock -import java.util.concurrent.TimeUnit +import se.scalablesolutions.akka.actor.Actor import junit.framework.TestCase -import dispatch._ -import org.junit.{Test, Before} +import org.junit.Test import org.junit.Assert._ case class GetMapState(key: String) @@ -31,35 +28,35 @@ class CassandraPersistentActor extends Actor { timeout = 100000 makeTransactionRequired - private lazy val mapState: PersistentMap = PersistentState.newMap(CassandraStorageConfig()) - private lazy val vectorState: PersistentVector = PersistentState.newVector(CassandraStorageConfig()) - private lazy val refState: PersistentRef = PersistentState.newRef(CassandraStorageConfig()) + private lazy val mapState = CassandraStorage.newMap + private lazy val vectorState = CassandraStorage.newVector + private lazy val refState = CassandraStorage.newRef def receive = { case GetMapState(key) => - reply(mapState.get(key).get) + reply(mapState.get(key.getBytes("UTF-8")).get) case GetVectorSize => reply(vectorState.length.asInstanceOf[AnyRef]) case GetRefState => reply(refState.get.get) case SetMapState(key, msg) => - mapState.put(key, msg) + mapState.put(key.getBytes("UTF-8"), msg.getBytes("UTF-8")) reply(msg) case SetVectorState(msg) => - vectorState.add(msg) + vectorState.add(msg.getBytes("UTF-8")) reply(msg) case SetRefState(msg) => - refState.swap(msg) + refState.swap(msg.getBytes("UTF-8")) reply(msg) case Success(key, msg) => - mapState.put(key, msg) - vectorState.add(msg) - refState.swap(msg) + mapState.put(key.getBytes("UTF-8"), msg.getBytes("UTF-8")) + vectorState.add(msg.getBytes("UTF-8")) + refState.swap(msg.getBytes("UTF-8")) reply(msg) case Failure(key, msg, failer) => - mapState.put(key, msg) - vectorState.add(msg) - refState.swap(msg) + mapState.put(key.getBytes("UTF-8"), msg.getBytes("UTF-8")) + vectorState.add(msg.getBytes("UTF-8")) + refState.swap(msg.getBytes("UTF-8")) failer !! "Failure" reply(msg) } @@ -74,14 +71,15 @@ class CassandraPersistentActor extends Actor { } class CassandraPersistentActorSpec extends TestCase { - + @Test def testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess = { val stateful = new CassandraPersistentActor stateful.start stateful !! SetMapState("testShouldNotRollbackStateForStatefulServerInCaseOfSuccess", "init") // set init state stateful !! Success("testShouldNotRollbackStateForStatefulServerInCaseOfSuccess", "new state") // transactionrequired - assertEquals("new state", (stateful !! GetMapState("testShouldNotRollbackStateForStatefulServerInCaseOfSuccess")).get) + val result: Array[Byte] = (stateful !! GetMapState("testShouldNotRollbackStateForStatefulServerInCaseOfSuccess")).get + assertEquals("new state", new String(result, 0, result.length, "UTF-8")) } @Test @@ -95,7 +93,8 @@ class CassandraPersistentActorSpec extends TestCase { stateful !! Failure("testShouldRollbackStateForStatefulServerInCaseOfFailure", "new state", failer) // call failing transactionrequired method fail("should have thrown an exception") } catch {case e: RuntimeException => {}} - assertEquals("init", (stateful !! GetMapState("testShouldRollbackStateForStatefulServerInCaseOfFailure")).get) // check that state is == init state + val result: Array[Byte] = (stateful !! GetMapState("testShouldRollbackStateForStatefulServerInCaseOfFailure")).get + assertEquals("init", new String(result, 0, result.length, "UTF-8")) // check that state is == init state } @Test @@ -127,7 +126,8 @@ class CassandraPersistentActorSpec extends TestCase { stateful.start stateful !! SetRefState("init") // set init state stateful !! Success("testShouldNotRollbackStateForStatefulServerInCaseOfSuccess", "new state") // transactionrequired - assertEquals("new state", (stateful !! GetRefState).get) + val result: Array[Byte] = (stateful !! GetRefState).get + assertEquals("new state", new String(result, 0, result.length, "UTF-8")) } @Test @@ -141,6 +141,7 @@ class CassandraPersistentActorSpec extends TestCase { stateful !! Failure("testShouldRollbackStateForStatefulServerInCaseOfFailure", "new state", failer) // call failing transactionrequired method fail("should have thrown an exception") } catch {case e: RuntimeException => {}} - assertEquals("init", (stateful !! GetRefState).get) // check that state is == init state + val result: Array[Byte] = (stateful !! GetRefState).get + assertEquals("init", new String(result, 0, result.length, "UTF-8")) // check that state is == init state } } diff --git a/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala b/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala index 10bf943dbb..051cfbfa12 100644 --- a/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala +++ b/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala @@ -31,10 +31,8 @@ case object LogSize class BankAccountActor extends Actor { makeTransactionRequired - private val accountState = - PersistentState.newMap(MongoStorageConfig()) - private val txnLog = - PersistentState.newVector(MongoStorageConfig()) + private val accountState = MongoStorage.newMap + private val txnLog = MongoStorage.newVector def receive: PartialFunction[Any, Unit] = { // check balance diff --git a/akka-persistence/src/test/scala/MongoStorageSpec.scala b/akka-persistence/src/test/scala/MongoStorageSpec.scala index 4adf61ced2..fae6d7f00d 100644 --- a/akka-persistence/src/test/scala/MongoStorageSpec.scala +++ b/akka-persistence/src/test/scala/MongoStorageSpec.scala @@ -14,7 +14,7 @@ class MongoStorageSpec extends TestCase { val changeSetM = new scala.collection.mutable.HashMap[AnyRef, AnyRef] override def setUp = { - MongoStorage.coll.drop + MongoStorageBackend.coll.drop } @Test @@ -22,40 +22,40 @@ class MongoStorageSpec extends TestCase { changeSetV += "debasish" // string changeSetV += List(1, 2, 3) // Scala List changeSetV += List(100, 200) - MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) + MongoStorageBackend.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) assertEquals( 3, - MongoStorage.getVectorStorageSizeFor("U-A1")) + MongoStorageBackend.getVectorStorageSizeFor("U-A1")) changeSetV.clear // changeSetV should be reinitialized changeSetV += List(12, 23, 45) changeSetV += "maulindu" - MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) + MongoStorageBackend.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) assertEquals( 5, - MongoStorage.getVectorStorageSizeFor("U-A1")) + MongoStorageBackend.getVectorStorageSizeFor("U-A1")) // add more to the same changeSetV changeSetV += "ramanendu" changeSetV += Map(1 -> "dg", 2 -> "mc") // add for a diff transaction - MongoStorage.insertVectorStorageEntriesFor("U-A2", changeSetV.toList) + MongoStorageBackend.insertVectorStorageEntriesFor("U-A2", changeSetV.toList) assertEquals( 4, - MongoStorage.getVectorStorageSizeFor("U-A2")) + MongoStorageBackend.getVectorStorageSizeFor("U-A2")) // previous transaction change set should remain same assertEquals( 5, - MongoStorage.getVectorStorageSizeFor("U-A1")) + MongoStorageBackend.getVectorStorageSizeFor("U-A1")) // test single element entry - MongoStorage.insertVectorStorageEntryFor("U-A1", Map(1->1, 2->4, 3->9)) + MongoStorageBackend.insertVectorStorageEntryFor("U-A1", Map(1->1, 2->4, 3->9)) assertEquals( 6, - MongoStorage.getVectorStorageSizeFor("U-A1")) + MongoStorageBackend.getVectorStorageSizeFor("U-A1")) } @Test @@ -64,25 +64,25 @@ class MongoStorageSpec extends TestCase { // initially everything 0 assertEquals( 0, - MongoStorage.getVectorStorageSizeFor("U-A2")) + MongoStorageBackend.getVectorStorageSizeFor("U-A2")) assertEquals( 0, - MongoStorage.getVectorStorageSizeFor("U-A1")) + MongoStorageBackend.getVectorStorageSizeFor("U-A1")) // get some stuff changeSetV += "debasish" changeSetV += List(BigDecimal(12), BigDecimal(13), BigDecimal(14)) - MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) + MongoStorageBackend.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) assertEquals( 2, - MongoStorage.getVectorStorageSizeFor("U-A1")) + MongoStorageBackend.getVectorStorageSizeFor("U-A1")) - val JsString(str) = MongoStorage.getVectorStorageEntryFor("U-A1", 0).asInstanceOf[JsString] + val JsString(str) = MongoStorageBackend.getVectorStorageEntryFor("U-A1", 0).asInstanceOf[JsString] assertEquals("debasish", str) - val l = MongoStorage.getVectorStorageEntryFor("U-A1", 1).asInstanceOf[JsValue] + val l = MongoStorageBackend.getVectorStorageEntryFor("U-A1", 1).asInstanceOf[JsValue] val num_list = list ! num val num_list(l0) = l assertEquals(List(12, 13, 14), l0) @@ -91,14 +91,14 @@ class MongoStorageSpec extends TestCase { changeSetV += Map(1->1, 2->4, 3->9) changeSetV += BigInt(2310) changeSetV += List(100, 200, 300) - MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) + MongoStorageBackend.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) assertEquals( 5, - MongoStorage.getVectorStorageSizeFor("U-A1")) + MongoStorageBackend.getVectorStorageSizeFor("U-A1")) val r = - MongoStorage.getVectorStorageRangeFor("U-A1", Some(1), None, 3) + MongoStorageBackend.getVectorStorageRangeFor("U-A1", Some(1), None, 3) assertEquals(3, r.size) val lr = r(0).asInstanceOf[JsValue] @@ -109,12 +109,12 @@ class MongoStorageSpec extends TestCase { @Test def testVectorFetchForNonExistentKeys = { try { - MongoStorage.getVectorStorageEntryFor("U-A1", 1) + MongoStorageBackend.getVectorStorageEntryFor("U-A1", 1) fail("should throw an exception") } catch {case e: Predef.NoSuchElementException => {}} try { - MongoStorage.getVectorStorageRangeFor("U-A1", Some(2), None, 12) + MongoStorageBackend.getVectorStorageRangeFor("U-A1", Some(2), None, 12) fail("should throw an exception") } catch {case e: Predef.NoSuchElementException => {}} } @@ -128,43 +128,43 @@ class MongoStorageSpec extends TestCase { changeSetM += "6" -> java.util.Calendar.getInstance.getTime // insert all into Mongo - MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) + MongoStorageBackend.insertMapStorageEntriesFor("U-M1", changeSetM.toList) assertEquals( 6, - MongoStorage.getMapStorageSizeFor("U-M1")) + MongoStorageBackend.getMapStorageSizeFor("U-M1")) // individual insert api - MongoStorage.insertMapStorageEntryFor("U-M1", "7", "akka") - MongoStorage.insertMapStorageEntryFor("U-M1", "8", List(23, 25)) + MongoStorageBackend.insertMapStorageEntryFor("U-M1", "7", "akka") + MongoStorageBackend.insertMapStorageEntryFor("U-M1", "8", List(23, 25)) assertEquals( 8, - MongoStorage.getMapStorageSizeFor("U-M1")) + MongoStorageBackend.getMapStorageSizeFor("U-M1")) // add the same changeSet for another transaction - MongoStorage.insertMapStorageEntriesFor("U-M2", changeSetM.toList) + MongoStorageBackend.insertMapStorageEntriesFor("U-M2", changeSetM.toList) assertEquals( 6, - MongoStorage.getMapStorageSizeFor("U-M2")) + MongoStorageBackend.getMapStorageSizeFor("U-M2")) // the first transaction should remain the same assertEquals( 8, - MongoStorage.getMapStorageSizeFor("U-M1")) + MongoStorageBackend.getMapStorageSizeFor("U-M1")) changeSetM.clear } @Test def testMapContents = { fillMap - MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) - MongoStorage.getMapStorageEntryFor("U-M1", "2") match { + MongoStorageBackend.insertMapStorageEntriesFor("U-M1", changeSetM.toList) + MongoStorageBackend.getMapStorageEntryFor("U-M1", "2") match { case Some(x) => { val JsString(str) = x.asInstanceOf[JsValue] assertEquals("peter", str) } case None => fail("should fetch peter") } - MongoStorage.getMapStorageEntryFor("U-M1", "4") match { + MongoStorageBackend.getMapStorageEntryFor("U-M1", "4") match { case Some(x) => { val num_list = list ! num val num_list(l0) = x.asInstanceOf[JsValue] @@ -172,7 +172,7 @@ class MongoStorageSpec extends TestCase { } case None => fail("should fetch list") } - MongoStorage.getMapStorageEntryFor("U-M1", "3") match { + MongoStorageBackend.getMapStorageEntryFor("U-M1", "3") match { case Some(x) => { val num_list = list ! num val num_list(l0) = x.asInstanceOf[JsValue] @@ -183,7 +183,7 @@ class MongoStorageSpec extends TestCase { // get the entire map val l: List[Tuple2[AnyRef, AnyRef]] = - MongoStorage.getMapStorageFor("U-M1") + MongoStorageBackend.getMapStorageFor("U-M1") assertEquals(4, l.size) assertTrue(l.map(_._1).contains("1")) @@ -196,7 +196,7 @@ class MongoStorageSpec extends TestCase { // trying to fetch for a non-existent transaction will throw try { - MongoStorage.getMapStorageFor("U-M2") + MongoStorageBackend.getMapStorageFor("U-M2") fail("should throw an exception") } catch {case e: Predef.NoSuchElementException => {}} @@ -207,11 +207,11 @@ class MongoStorageSpec extends TestCase { def testMapContentsByRange = { fillMap changeSetM += "5" -> Map(1 -> "dg", 2 -> "mc") - MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) + MongoStorageBackend.insertMapStorageEntriesFor("U-M1", changeSetM.toList) // specify start and count val l: List[Tuple2[AnyRef, AnyRef]] = - MongoStorage.getMapStorageRangeFor( + MongoStorageBackend.getMapStorageRangeFor( "U-M1", Some(Integer.valueOf(2)), None, 3) assertEquals(3, l.size) @@ -227,27 +227,27 @@ class MongoStorageSpec extends TestCase { // specify start, finish and count where finish - start == count assertEquals(3, - MongoStorage.getMapStorageRangeFor( + MongoStorageBackend.getMapStorageRangeFor( "U-M1", Some(Integer.valueOf(2)), Some(Integer.valueOf(5)), 3).size) // specify start, finish and count where finish - start > count assertEquals(3, - MongoStorage.getMapStorageRangeFor( + MongoStorageBackend.getMapStorageRangeFor( "U-M1", Some(Integer.valueOf(2)), Some(Integer.valueOf(9)), 3).size) // do not specify start or finish assertEquals(3, - MongoStorage.getMapStorageRangeFor( + MongoStorageBackend.getMapStorageRangeFor( "U-M1", None, None, 3).size) // specify finish and count assertEquals(3, - MongoStorage.getMapStorageRangeFor( + MongoStorageBackend.getMapStorageRangeFor( "U-M1", None, Some(Integer.valueOf(3)), 3).size) // specify start, finish and count where finish < start assertEquals(3, - MongoStorage.getMapStorageRangeFor( + MongoStorageBackend.getMapStorageRangeFor( "U-M1", Some(Integer.valueOf(2)), Some(Integer.valueOf(1)), 3).size) changeSetM.clear @@ -258,35 +258,35 @@ class MongoStorageSpec extends TestCase { fillMap changeSetM += "5" -> Map(1 -> "dg", 2 -> "mc") - MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) + MongoStorageBackend.insertMapStorageEntriesFor("U-M1", changeSetM.toList) assertEquals(5, - MongoStorage.getMapStorageSizeFor("U-M1")) + MongoStorageBackend.getMapStorageSizeFor("U-M1")) // remove key "3" - MongoStorage.removeMapStorageFor("U-M1", "3") + MongoStorageBackend.removeMapStorageFor("U-M1", "3") assertEquals(4, - MongoStorage.getMapStorageSizeFor("U-M1")) + MongoStorageBackend.getMapStorageSizeFor("U-M1")) try { - MongoStorage.getMapStorageEntryFor("U-M1", "3") + MongoStorageBackend.getMapStorageEntryFor("U-M1", "3") fail("should throw exception") } catch { case e => {}} // remove key "4" - MongoStorage.removeMapStorageFor("U-M1", "4") + MongoStorageBackend.removeMapStorageFor("U-M1", "4") assertEquals(3, - MongoStorage.getMapStorageSizeFor("U-M1")) + MongoStorageBackend.getMapStorageSizeFor("U-M1")) // remove key "2" - MongoStorage.removeMapStorageFor("U-M1", "2") + MongoStorageBackend.removeMapStorageFor("U-M1", "2") assertEquals(2, - MongoStorage.getMapStorageSizeFor("U-M1")) + MongoStorageBackend.getMapStorageSizeFor("U-M1")) // remove the whole stuff - MongoStorage.removeMapStorageFor("U-M1") + MongoStorageBackend.removeMapStorageFor("U-M1") try { - MongoStorage.getMapStorageFor("U-M1") + MongoStorageBackend.getMapStorageFor("U-M1") fail("should throw exception") } catch { case e: NoSuchElementException => {}} @@ -303,14 +303,14 @@ class MongoStorageSpec extends TestCase { @Test def testRefStorage = { - MongoStorage.getRefStorageFor("U-R1") match { + MongoStorageBackend.getRefStorageFor("U-R1") match { case None => case Some(o) => fail("should be None") } val m = Map("1"->1, "2"->4, "3"->9) - MongoStorage.insertRefStorageFor("U-R1", m) - MongoStorage.getRefStorageFor("U-R1") match { + MongoStorageBackend.insertRefStorageFor("U-R1", m) + MongoStorageBackend.getRefStorageFor("U-R1") match { case None => fail("should not be empty") case Some(r) => { val a = r.asInstanceOf[JsValue] @@ -331,8 +331,8 @@ class MongoStorageSpec extends TestCase { // insert another one // the previous one should be replaced val b = List("100", "jonas") - MongoStorage.insertRefStorageFor("U-R1", b) - MongoStorage.getRefStorageFor("U-R1") match { + MongoStorageBackend.insertRefStorageFor("U-R1", b) + MongoStorageBackend.getRefStorageFor("U-R1") match { case None => fail("should not be empty") case Some(r) => { val a = r.asInstanceOf[JsValue] diff --git a/akka-samples-java/src/main/java/sample/java/PersistentSimpleService.java b/akka-samples-java/src/main/java/sample/java/PersistentSimpleService.java index 09676cb26e..7e0e43b6bd 100644 --- a/akka-samples-java/src/main/java/sample/java/PersistentSimpleService.java +++ b/akka-samples-java/src/main/java/sample/java/PersistentSimpleService.java @@ -12,9 +12,9 @@ import se.scalablesolutions.akka.annotation.transactionrequired; import se.scalablesolutions.akka.annotation.prerestart; import se.scalablesolutions.akka.annotation.postrestart; import se.scalablesolutions.akka.state.PersistentMap; -import se.scalablesolutions.akka.state.PersistentState; -import se.scalablesolutions.akka.state.PersistentMap; -import se.scalablesolutions.akka.state.CassandraStorageConfig; +import se.scalablesolutions.akka.state.CassandraStorage; + +import java.nio.ByteBuffer; /** * Try service out by invoking (multiple times): @@ -26,21 +26,22 @@ import se.scalablesolutions.akka.state.CassandraStorageConfig; @Path("/persistentjavacount") @transactionrequired public class PersistentSimpleService { - private Object KEY = "COUNTER"; + private String KEY = "COUNTER"; private boolean hasStartedTicking = false; - private PersistentMap storage = PersistentState.newMap(new CassandraStorageConfig()); + private PersistentMap storage = CassandraStorage.newMap(); @GET @Produces({"application/html"}) public String count() { if (!hasStartedTicking) { - storage.put(KEY, 0); + storage.put(KEY.getBytes(), ByteBuffer.allocate(2).putInt(0).array()); hasStartedTicking = true; return "Tick: 0\n"; } else { - int counter = (Integer)storage.get(KEY).get() + 1; - storage.put(KEY, counter); + byte[] bytes = (byte[])storage.get(KEY.getBytes()).get(); + int counter = ByteBuffer.wrap(bytes).getInt(); + storage.put(KEY.getBytes(), ByteBuffer.allocate(4).putInt(counter + 1).array()); return "Tick: " + counter + "\n"; } } diff --git a/akka-samples-java/src/main/java/sample/java/SimpleService.java b/akka-samples-java/src/main/java/sample/java/SimpleService.java index 7702396375..7126621e60 100644 --- a/akka-samples-java/src/main/java/sample/java/SimpleService.java +++ b/akka-samples-java/src/main/java/sample/java/SimpleService.java @@ -13,7 +13,6 @@ import se.scalablesolutions.akka.annotation.prerestart; import se.scalablesolutions.akka.annotation.postrestart; import se.scalablesolutions.akka.state.TransactionalState; import se.scalablesolutions.akka.state.TransactionalMap; -import se.scalablesolutions.akka.state.CassandraStorageConfig; /** * Try service out by invoking (multiple times): diff --git a/akka-samples-lift/src/main/scala/akka/SimpleService.scala b/akka-samples-lift/src/main/scala/akka/SimpleService.scala index b4bbd52157..8bec513bb9 100644 --- a/akka-samples-lift/src/main/scala/akka/SimpleService.scala +++ b/akka-samples-lift/src/main/scala/akka/SimpleService.scala @@ -1,13 +1,13 @@ package sample.lift -import se.scalablesolutions.akka.state.{PersistentState, TransactionalState, CassandraStorageConfig} -import se.scalablesolutions.akka.actor.{SupervisorFactory, Actor} +import se.scalablesolutions.akka.actor.Actor import se.scalablesolutions.akka.config.ScalaConfig._ -import se.scalablesolutions.akka.util.Logging +import se.scalablesolutions.akka.state.{CassandraStorage, TransactionalState} import java.lang.Integer -import javax.ws.rs.core.MultivaluedMap -import javax.ws.rs.{GET, POST, Path, Produces, WebApplicationException, Consumes} +import javax.ws.rs.{GET, Path, Produces} +import java.nio.ByteBuffer + /** * Try service out by invoking (multiple times): @@ -56,7 +56,7 @@ class PersistentSimpleService extends Actor { case object Tick private val KEY = "COUNTER" private var hasStartedTicking = false - private val storage = PersistentState.newMap(CassandraStorageConfig()) + private val storage = CassandraStorage.newMap @GET @Produces(Array("text/html")) @@ -64,13 +64,14 @@ class PersistentSimpleService extends Actor { def receive = { case Tick => if (hasStartedTicking) { - val counter = storage.get(KEY).get.asInstanceOf[Integer].intValue - storage.put(KEY, new Integer(counter + 1)) - reply(

Tick: {counter + 1}

) + val bytes = storage.get(KEY.getBytes).get + val counter = ByteBuffer.wrap(bytes).getInt + storage.put(KEY.getBytes, ByteBuffer.allocate(4).putInt(counter + 1).array) + reply(Tick:{counter + 1}) } else { - storage.put(KEY, new Integer(0)) + storage.put(KEY.getBytes, ByteBuffer.allocate(4).putInt(0).array) hasStartedTicking = true - reply(

Tick: 0

) + reply(Tick: 0) } } } diff --git a/akka-samples-scala/src/main/scala/SimpleService.scala b/akka-samples-scala/src/main/scala/SimpleService.scala index 982fc08745..a351b79614 100644 --- a/akka-samples-scala/src/main/scala/SimpleService.scala +++ b/akka-samples-scala/src/main/scala/SimpleService.scala @@ -4,8 +4,8 @@ package sample.scala -import se.scalablesolutions.akka.state.{PersistentState, TransactionalState, CassandraStorageConfig} import se.scalablesolutions.akka.actor.{SupervisorFactory, Actor} +import se.scalablesolutions.akka.state.{CassandraStorage, TransactionalState} import se.scalablesolutions.akka.config.ScalaConfig._ import se.scalablesolutions.akka.util.Logging @@ -16,6 +16,7 @@ import javax.ws.rs.{GET, POST, Path, Produces, WebApplicationException, Consumes import org.atmosphere.core.annotation.{Broadcast, Suspend} import org.atmosphere.util.XSSHtmlFilter import org.atmosphere.cpr.BroadcastFilter +import java.nio.ByteBuffer class Boot { val factory = SupervisorFactory( @@ -81,7 +82,7 @@ class PersistentSimpleService extends Actor { case object Tick private val KEY = "COUNTER" private var hasStartedTicking = false - private val storage = PersistentState.newMap(CassandraStorageConfig()) + private val storage = CassandraStorage.newMap @GET @Produces(Array("text/html")) @@ -89,11 +90,12 @@ class PersistentSimpleService extends Actor { def receive = { case Tick => if (hasStartedTicking) { - val counter = storage.get(KEY).get.asInstanceOf[Integer].intValue - storage.put(KEY, new Integer(counter + 1)) + val bytes = storage.get(KEY.getBytes).get + val counter = ByteBuffer.wrap(bytes).getInt + storage.put(KEY.getBytes, ByteBuffer.allocate(4).putInt(counter + 1).array) reply(Tick:{counter + 1}) } else { - storage.put(KEY, new Integer(0)) + storage.put(KEY.getBytes, Array(0.toByte)) hasStartedTicking = true reply(Tick: 0) } diff --git a/akka-samples-security/src/main/scala/SimpleService.scala b/akka-samples-security/src/main/scala/SimpleService.scala index fc8b18367a..e9468ec75c 100644 --- a/akka-samples-security/src/main/scala/SimpleService.scala +++ b/akka-samples-security/src/main/scala/SimpleService.scala @@ -44,7 +44,7 @@ class DigestAuthenticationService extends DigestAuthenticationActor { //don't forget to configure your standalone Cassandra instance // //makeTransactionRequired - //override def mkNonceMap = PersistentState.newMap(CassandraStorageConfig()).asInstanceOf[scala.collection.mutable.Map[String,Long]] + //override def mkNonceMap = Storage.newMap(CassandraStorageConfig()).asInstanceOf[scala.collection.mutable.Map[String,Long]] //Use an in-memory nonce-map as default override def mkNonceMap = new scala.collection.mutable.HashMap[String, Long] From b01df1e11b4f385d3b5d961f384fce813b7b9d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bon=C3=A9r?= Date: Mon, 7 Dec 2009 20:26:22 +0100 Subject: [PATCH 06/10] added memory footprint test + added shutdown method to Kernel + added ActorRegistry.shutdownAll to shut down all actors --- akka-actors/src/main/scala/actor/Actor.scala | 11 ++-- .../src/main/scala/actor/ActorRegistry.scala | 9 ++- akka-actors/src/test/scala/MemoryTest.scala | 35 +++++------ akka-kernel/src/main/scala/Kernel.scala | 59 ++++++++++++------- 4 files changed, 71 insertions(+), 43 deletions(-) diff --git a/akka-actors/src/main/scala/actor/Actor.scala b/akka-actors/src/main/scala/actor/Actor.scala index cd887a4f78..0f9cb05979 100644 --- a/akka-actors/src/main/scala/actor/Actor.scala +++ b/akka-actors/src/main/scala/actor/Actor.scala @@ -723,9 +723,9 @@ trait Actor extends TransactionManagement { actor } - // ================================ - // ==== IMPLEMENTATION DETAILS ==== - // ================================ + // ========================================= + // ==== INTERNAL IMPLEMENTATION DETAILS ==== + // ========================================= private def spawnButDoNotStart[T <: Actor](actorClass: Class[T]): T = { val actor = actorClass.newInstance.asInstanceOf[T] @@ -848,7 +848,7 @@ trait Actor extends TransactionManagement { } else proceed } catch { case e => - Actor.log.error(e, "Could not invoke actor [%s]", this) + Actor.log.error(e, "Exception when invoking actor [%s] with message [%s]", this, message) if (senderFuture.isDefined) senderFuture.get.completeWithException(this, e) clearTransaction // need to clear currentTransaction before call to supervisor // FIXME to fix supervisor restart of remote actor for oneway calls, inject a supervisor proxy that can send notification back to client @@ -897,8 +897,9 @@ trait Actor extends TransactionManagement { case Permanent => actor.restart(reason) case Temporary => - Actor.log.info("Actor [%s] configured as TEMPORARY will not be restarted.", actor.id) + Actor.log.info("Actor [%s] configured as TEMPORARY and will not be restarted.", actor.id) getLinkedActors.remove(actor) // remove the temporary actor + actor.stop } } } diff --git a/akka-actors/src/main/scala/actor/ActorRegistry.scala b/akka-actors/src/main/scala/actor/ActorRegistry.scala index 327a7e6395..33ead73448 100755 --- a/akka-actors/src/main/scala/actor/ActorRegistry.scala +++ b/akka-actors/src/main/scala/actor/ActorRegistry.scala @@ -13,7 +13,7 @@ import scala.collection.mutable.HashMap * * @author Jonas Bonér */ -object ActorRegistry { +object ActorRegistry extends Logging { private val actorsByClassName = new HashMap[String, List[Actor]] private val actorsById = new HashMap[String, List[Actor]] @@ -48,4 +48,11 @@ object ActorRegistry { actorsByClassName - actor.getClass.getName actorsById - actor.getClass.getName } + + // TODO: document ActorRegistry.shutdownAll + def shutdownAll = { + log.info("Shutting down all actors in the system...") + actorsById.foreach(entry => entry._2.map(_.stop)) + log.info("All actors have been shut down") + } } diff --git a/akka-actors/src/test/scala/MemoryTest.scala b/akka-actors/src/test/scala/MemoryTest.scala index 083b964bc7..bfdb5b8d37 100644 --- a/akka-actors/src/test/scala/MemoryTest.scala +++ b/akka-actors/src/test/scala/MemoryTest.scala @@ -1,10 +1,7 @@ package se.scalablesolutions.akka.actor -import junit.framework.TestCase - import org.scalatest.junit.JUnitSuite import org.junit.Test -import scala.collection.mutable.HashSet class MemoryFootprintTest extends JUnitSuite { class Mem extends Actor { @@ -13,20 +10,24 @@ class MemoryFootprintTest extends JUnitSuite { } } + val NR_OF_ACTORS = 100000 + val MAX_MEMORY_FOOTPRINT_PER_ACTOR = 600 + @Test - def shouldCreateManyActors = { - /* println("============== MEMORY TEST ==============") - val actors = new HashSet[Actor] - println("Total memory: " + Runtime.getRuntime.totalMemory) - (1 until 1000000).foreach {i => - val mem = new Mem - actors += mem - if ((i % 100000) == 0) { - println("Nr actors: " + i) - println("Total memory: " + (Runtime.getRuntime.totalMemory - Runtime.getRuntime.freeMemory)) - } - } - */ - assert(true) + def actorsShouldHaveLessMemoryFootprintThan630Bytes = { + println("============== MEMORY FOOTPRINT TEST ==============") + // warm up + (1 until 10000).foreach(i => new Mem) + + // Actors are put in AspectRegistry when created so they won't be GCd here + + val totalMem = Runtime.getRuntime.totalMemory - Runtime.getRuntime.freeMemory + (1 until NR_OF_ACTORS).foreach(i => new Mem) + + val newTotalMem = Runtime.getRuntime.totalMemory - Runtime.getRuntime.freeMemory + val memPerActor = (newTotalMem - totalMem) / NR_OF_ACTORS + + println("Memory footprint per actor is : " + memPerActor) + assert(memPerActor < MAX_MEMORY_FOOTPRINT_PER_ACTOR) // memory per actor should be less than 630 bytes } } diff --git a/akka-kernel/src/main/scala/Kernel.scala b/akka-kernel/src/main/scala/Kernel.scala index aaf1246995..4c4c444c08 100644 --- a/akka-kernel/src/main/scala/Kernel.scala +++ b/akka-kernel/src/main/scala/Kernel.scala @@ -14,6 +14,7 @@ import java.net.URLClassLoader import se.scalablesolutions.akka.nio.RemoteNode import se.scalablesolutions.akka.util.Logging +import se.scalablesolutions.akka.actor.ActorRegistry /** * The Akka Kernel. @@ -32,10 +33,14 @@ object Kernel extends Logging { // FIXME add API to shut server down gracefully @volatile private var hasBooted = false - private var jerseySelectorThread: SelectorThread = _ + private var jerseySelectorThread: Option[SelectorThread] = None private val startTime = System.currentTimeMillis private var applicationLoader: Option[ClassLoader] = None + private lazy val remoteServerThread = new Thread(new Runnable() { + def run = RemoteNode.start(applicationLoader) + }, "Akka Remote Service") + def main(args: Array[String]) = boot /** @@ -61,20 +66,33 @@ object Kernel extends Logging { hasBooted = true } } - - def startRemoteService = { - // FIXME manage remote serve thread for graceful shutdown - val remoteServerThread = new Thread(new Runnable() { - def run = RemoteNode.start(applicationLoader) - }, "Akka Remote Service") - remoteServerThread.start + + // TODO document Kernel.shutdown + def shutdown = synchronized { + if (hasBooted) { + log.info("Shutting down Akka...") + ActorRegistry.shutdownAll + if (jerseySelectorThread.isDefined) { + log.info("Shutting down REST service (Jersey)") + jerseySelectorThread.get.stopEndpoint + } + if (remoteServerThread.isAlive) { + log.info("Shutting down remote service") + RemoteNode.shutdown + remoteServerThread.join(1000) + } + log.info("Akka succesfully shut down") + } } + def startRemoteService = remoteServerThread.start + def startREST = { val uri = UriBuilder.fromUri(REST_URL).port(REST_PORT).build() val scheme = uri.getScheme - if (!scheme.equalsIgnoreCase("http")) throw new IllegalArgumentException("The URI scheme, of the URI " + REST_URL + ", must be equal (ignoring case) to 'http'") + if (!scheme.equalsIgnoreCase("http")) throw new IllegalArgumentException( + "The URI scheme, of the URI " + REST_URL + ", must be equal (ignoring case) to 'http'") val adapter = new ServletAdapter adapter.setHandleStaticResources(true) @@ -83,19 +101,19 @@ object Kernel extends Logging { //Using autodetection for now adapter.addInitParameter("cometSupport", "org.atmosphere.container.GrizzlyCometSupport") if (HOME.isDefined) adapter.setRootFolder(HOME.get + "/deploy/root") - log.info("REST service root path: [" + adapter.getRootFolder + "] and context path [" + adapter.getContextPath + "] ") + log.info("REST service root path [%s] and context path [%s]", adapter.getRootFolder, adapter.getContextPath) val ah = new com.sun.grizzly.arp.DefaultAsyncHandler ah.addAsyncFilter(new com.sun.grizzly.comet.CometAsyncFilter) - jerseySelectorThread = new SelectorThread - jerseySelectorThread.setAlgorithmClassName(classOf[StaticStreamAlgorithm].getName) - jerseySelectorThread.setPort(REST_PORT) - jerseySelectorThread.setAdapter(adapter) - jerseySelectorThread.setEnableAsyncExecution(true) - jerseySelectorThread.setAsyncHandler(ah) - jerseySelectorThread.listen + jerseySelectorThread = Some(new SelectorThread) + jerseySelectorThread.get.setAlgorithmClassName(classOf[StaticStreamAlgorithm].getName) + jerseySelectorThread.get.setPort(REST_PORT) + jerseySelectorThread.get.setAdapter(adapter) + jerseySelectorThread.get.setEnableAsyncExecution(true) + jerseySelectorThread.get.setAsyncHandler(ah) + jerseySelectorThread.get.listen - log.info("REST service started successfully. Listening to port [" + REST_PORT + "]") + log.info("REST service started successfully. Listening to port [%s]", REST_PORT) } private def runApplicationBootClasses = { @@ -113,7 +131,8 @@ object Kernel extends Logging { new URLClassLoader(toDeploy.toArray, getClass.getClassLoader) } else if (getClass.getClassLoader.getResourceAsStream("akka.conf") != null) { getClass.getClassLoader - } else throw new IllegalStateException("AKKA_HOME is not defined and no 'akka.conf' can be found on the classpath, aborting") + } else throw new IllegalStateException( + "AKKA_HOME is not defined and no 'akka.conf' can be found on the classpath, aborting") for (clazz <- BOOT_CLASSES) { log.info("Loading boot class [%s]", clazz) loader.loadClass(clazz).newInstance @@ -132,7 +151,7 @@ object Kernel extends Logging { (____ /__|_ \__|_ \(____ / \/ \/ \/ \/ """) - log.info(" Running version " + VERSION) + log.info(" Running version %s", VERSION) log.info("==============================") } } \ No newline at end of file From 708a9e39fab2fff0bb1a4fd818b89b6dd774848b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bon=C3=A9r?= Date: Tue, 8 Dec 2009 08:51:10 +0100 Subject: [PATCH 07/10] changed actor message type from AnyRef to Any --- akka-actors/src/main/scala/actor/Actor.scala | 16 ++--- .../src/main/scala/dispatch/Future.scala | 10 +-- .../src/main/scala/dispatch/Reactor.scala | 2 +- .../scala/nio/RemoteProtocolBuilder.scala | 61 +++++++++++++------ .../main/scala/serialization/Serializer.scala | 7 ++- akka-util/src/main/scala/HashCode.scala | 23 ++++--- 6 files changed, 77 insertions(+), 42 deletions(-) diff --git a/akka-actors/src/main/scala/actor/Actor.scala b/akka-actors/src/main/scala/actor/Actor.scala index 0f9cb05979..ca5b9e225a 100644 --- a/akka-actors/src/main/scala/actor/Actor.scala +++ b/akka-actors/src/main/scala/actor/Actor.scala @@ -471,7 +471,7 @@ trait Actor extends TransactionManagement { * actor.send(message) * */ - def !(message: AnyRef)(implicit sender: AnyRef) = { + def !(message: Any)(implicit sender: AnyRef) = { val from = if (sender != null && sender.isInstanceOf[Actor]) Some(sender.asInstanceOf[Actor]) else None if (_isRunning) postMessageToMailbox(message, from) @@ -482,7 +482,7 @@ trait Actor extends TransactionManagement { /** * Same as the '!' method but does not take an implicit sender as second parameter. */ - def send(message: AnyRef) = { + def send(message: Any) = { if (_isRunning) postMessageToMailbox(message, None) else throw new IllegalStateException( "Actor has not been started, you need to invoke 'actor.start' before using it") @@ -500,7 +500,7 @@ trait Actor extends TransactionManagement { * If you are sending messages using !! then you have to use reply(..) * to send a reply message to the original sender. If not then the sender will block until the timeout expires. */ - def !![T](message: AnyRef, timeout: Long): Option[T] = if (_isRunning) { + def !![T](message: Any, timeout: Long): Option[T] = if (_isRunning) { val future = postMessageToMailboxAndCreateFutureResultWithTimeout(message, timeout) val isActiveObject = message.isInstanceOf[Invocation] if (isActiveObject && message.asInstanceOf[Invocation].isVoid) future.completeWithResult(None) @@ -527,19 +527,19 @@ trait Actor extends TransactionManagement { * If you are sending messages using !! then you have to use reply(..) * to send a reply message to the original sender. If not then the sender will block until the timeout expires. */ - def !![T](message: AnyRef): Option[T] = !![T](message, timeout) + def !![T](message: Any): Option[T] = !![T](message, timeout) /** * This method is evil and has been removed. Use '!!' with a timeout instead. */ - def !?[T](message: AnyRef): T = throw new UnsupportedOperationException( + def !?[T](message: Any): T = throw new UnsupportedOperationException( "'!?' is evil and has been removed. Use '!!' with a timeout instead") /** * Use reply(..) to reply with a message to the original sender of the message currently * being processed. */ - protected[this] def reply(message: AnyRef) = { + protected[this] def reply(message: Any) = { sender match { case Some(senderActor) => senderActor ! message @@ -736,7 +736,7 @@ trait Actor extends TransactionManagement { actor } - private def postMessageToMailbox(message: AnyRef, sender: Option[Actor]): Unit = _remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime + private def postMessageToMailbox(message: Any, sender: Option[Actor]): Unit = _remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime if (_remoteAddress.isDefined) { val requestBuilder = RemoteRequest.newBuilder .setId(RemoteRequestIdFactory.nextId) @@ -756,7 +756,7 @@ trait Actor extends TransactionManagement { } } - private def postMessageToMailboxAndCreateFutureResultWithTimeout(message: AnyRef, timeout: Long): + private def postMessageToMailboxAndCreateFutureResultWithTimeout(message: Any, timeout: Long): CompletableFutureResult = _remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime if (_remoteAddress.isDefined) { val requestBuilder = RemoteRequest.newBuilder diff --git a/akka-actors/src/main/scala/dispatch/Future.scala b/akka-actors/src/main/scala/dispatch/Future.scala index 1f9a1a4726..5b9e90c604 100644 --- a/akka-actors/src/main/scala/dispatch/Future.scala +++ b/akka-actors/src/main/scala/dispatch/Future.scala @@ -18,12 +18,12 @@ sealed trait FutureResult { def isCompleted: Boolean def isExpired: Boolean def timeoutInNanos: Long - def result: Option[AnyRef] + def result: Option[Any] def exception: Option[Tuple2[AnyRef, Throwable]] } trait CompletableFutureResult extends FutureResult { - def completeWithResult(result: AnyRef) + def completeWithResult(result: Any) def completeWithException(toBlame: AnyRef, exception: Throwable) } @@ -36,7 +36,7 @@ class DefaultCompletableFutureResult(timeout: Long) extends CompletableFutureRes private val _lock = new ReentrantLock private val _signal = _lock.newCondition private var _completed: Boolean = _ - private var _result: Option[AnyRef] = None + private var _result: Option[Any] = None private var _exception: Option[Tuple2[AnyRef, Throwable]] = None def await = try { @@ -79,7 +79,7 @@ class DefaultCompletableFutureResult(timeout: Long) extends CompletableFutureRes _lock.unlock } - def result: Option[AnyRef] = try { + def result: Option[Any] = try { _lock.lock _result } finally { @@ -93,7 +93,7 @@ class DefaultCompletableFutureResult(timeout: Long) extends CompletableFutureRes _lock.unlock } - def completeWithResult(result: AnyRef) = try { + def completeWithResult(result: Any) = try { _lock.lock if (!_completed) { _completed = true diff --git a/akka-actors/src/main/scala/dispatch/Reactor.scala b/akka-actors/src/main/scala/dispatch/Reactor.scala index 36a1dfb989..c790928ae5 100644 --- a/akka-actors/src/main/scala/dispatch/Reactor.scala +++ b/akka-actors/src/main/scala/dispatch/Reactor.scala @@ -38,7 +38,7 @@ trait MessageDemultiplexer { } class MessageInvocation(val receiver: Actor, - val message: AnyRef, + val message: Any, val future: Option[CompletableFutureResult], val sender: Option[Actor], val tx: Option[Transaction]) { diff --git a/akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala b/akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala index 1c846a42cd..18e2e62d9b 100644 --- a/akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala +++ b/akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala @@ -4,14 +4,14 @@ package se.scalablesolutions.akka.nio -import akka.serialization.Serializable.SBinary +import se.scalablesolutions.akka.serialization.Serializable.SBinary +import se.scalablesolutions.akka.serialization.{Serializer, Serializable, SerializationProtocol} +import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply} + import com.google.protobuf.{Message, ByteString} -import serialization.{Serializer, Serializable, SerializationProtocol} -import protobuf.RemoteProtocol.{RemoteRequest, RemoteReply} - object RemoteProtocolBuilder { - def getMessage(request: RemoteRequest): AnyRef = { + def getMessage(request: RemoteRequest): Any = { request.getProtocol match { case SerializationProtocol.SBINARY => val renderer = Class.forName(new String(request.getMessageManifest.toByteArray)).newInstance.asInstanceOf[SBinary[_ <: AnyRef]] @@ -26,13 +26,13 @@ object RemoteProtocolBuilder { val messageClass = Serializer.Java.in(request.getMessageManifest.toByteArray, None).asInstanceOf[Class[_]] Serializer.Protobuf.in(request.getMessage.toByteArray, Some(messageClass)) case SerializationProtocol.JAVA => - Serializer.Java.in(request.getMessage.toByteArray, None) + unbox(Serializer.Java.in(request.getMessage.toByteArray, None)) case SerializationProtocol.AVRO => throw new UnsupportedOperationException("Avro protocol is not yet supported") } } - def getMessage(reply: RemoteReply): AnyRef = { + def getMessage(reply: RemoteReply): Any = { reply.getProtocol match { case SerializationProtocol.SBINARY => val renderer = Class.forName(new String(reply.getMessageManifest.toByteArray)).newInstance.asInstanceOf[SBinary[_ <: AnyRef]] @@ -47,15 +47,15 @@ object RemoteProtocolBuilder { val messageClass = Serializer.Java.in(reply.getMessageManifest.toByteArray, None).asInstanceOf[Class[_]] Serializer.Protobuf.in(reply.getMessage.toByteArray, Some(messageClass)) case SerializationProtocol.JAVA => - Serializer.Java.in(reply.getMessage.toByteArray, None) + unbox(Serializer.Java.in(reply.getMessage.toByteArray, None)) case SerializationProtocol.AVRO => throw new UnsupportedOperationException("Avro protocol is not yet supported") } } - def setMessage(message: AnyRef, builder: RemoteRequest.Builder) = { + def setMessage(message: Any, builder: RemoteRequest.Builder) = { if (message.isInstanceOf[Serializable.SBinary[_]]) { - val serializable = message.asInstanceOf[Serializable.SBinary[_ <: AnyRef]] + val serializable = message.asInstanceOf[Serializable.SBinary[_ <: Any]] builder.setProtocol(SerializationProtocol.SBINARY) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) builder.setMessageManifest(ByteString.copyFrom(serializable.getClass.getName.getBytes)) @@ -68,22 +68,22 @@ object RemoteProtocolBuilder { val serializable = message.asInstanceOf[Serializable.ScalaJSON] builder.setProtocol(SerializationProtocol.SCALA_JSON) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) - builder.setMessageManifest(ByteString.copyFrom(serializable.asInstanceOf[AnyRef].getClass.getName.getBytes)) + builder.setMessageManifest(ByteString.copyFrom(serializable.getClass.getName.getBytes)) } else if (message.isInstanceOf[Serializable.JavaJSON]) { val serializable = message.asInstanceOf[Serializable.JavaJSON] builder.setProtocol(SerializationProtocol.JAVA_JSON) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) - builder.setMessageManifest(ByteString.copyFrom(serializable.asInstanceOf[AnyRef].getClass.getName.getBytes)) + builder.setMessageManifest(ByteString.copyFrom(serializable.getClass.getName.getBytes)) } else { // default, e.g. if no protocol used explicitly then use Java serialization builder.setProtocol(SerializationProtocol.JAVA) - builder.setMessage(ByteString.copyFrom(Serializer.Java.out(message))) + builder.setMessage(ByteString.copyFrom(Serializer.Java.out(box(message)))) } } - def setMessage(message: AnyRef, builder: RemoteReply.Builder) = { + def setMessage(message: Any, builder: RemoteReply.Builder) = { if (message.isInstanceOf[Serializable.SBinary[_]]) { - val serializable = message.asInstanceOf[Serializable.SBinary[_ <: AnyRef]] + val serializable = message.asInstanceOf[Serializable.SBinary[_ <: Any]] builder.setProtocol(SerializationProtocol.SBINARY) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) builder.setMessageManifest(ByteString.copyFrom(serializable.getClass.getName.getBytes)) @@ -96,16 +96,41 @@ object RemoteProtocolBuilder { val serializable = message.asInstanceOf[Serializable.ScalaJSON] builder.setProtocol(SerializationProtocol.SCALA_JSON) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) - builder.setMessageManifest(ByteString.copyFrom(serializable.asInstanceOf[AnyRef].getClass.getName.getBytes)) + builder.setMessageManifest(ByteString.copyFrom(serializable.getClass.getName.getBytes)) } else if (message.isInstanceOf[Serializable.JavaJSON]) { val serializable = message.asInstanceOf[Serializable.JavaJSON] builder.setProtocol(SerializationProtocol.JAVA_JSON) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) - builder.setMessageManifest(ByteString.copyFrom(serializable.asInstanceOf[AnyRef].getClass.getName.getBytes)) + builder.setMessageManifest(ByteString.copyFrom(serializable.getClass.getName.getBytes)) } else { // default, e.g. if no protocol used explicitly then use Java serialization builder.setProtocol(SerializationProtocol.JAVA) - builder.setMessage(ByteString.copyFrom(Serializer.Java.out(message))) + builder.setMessage(ByteString.copyFrom(Serializer.Java.out(box(message)))) } } + + private def box(value: Any): AnyRef = value match { + case value: Boolean => new java.lang.Boolean(value) + case value: Char => new java.lang.Character(value) + case value: Short => new java.lang.Short(value) + case value: Int => new java.lang.Integer(value) + case value: Long => new java.lang.Long(value) + case value: Float => new java.lang.Float(value) + case value: Double => new java.lang.Double(value) + case value: Byte => new java.lang.Byte(value) + case value => value.asInstanceOf[AnyRef] + } + + private def unbox(value: AnyRef): Any = value match { + case value: java.lang.Boolean => value.booleanValue + case value: java.lang.Character => value.charValue + case value: java.lang.Short => value.shortValue + case value: java.lang.Integer => value.intValue + case value: java.lang.Long => value.longValue + case value: java.lang.Float => value.floatValue + case value: java.lang.Double => value.doubleValue + case value: java.lang.Byte => value.byteValue + case value => value + } + } diff --git a/akka-actors/src/main/scala/serialization/Serializer.scala b/akka-actors/src/main/scala/serialization/Serializer.scala index 4e596a4bcb..643855a141 100644 --- a/akka-actors/src/main/scala/serialization/Serializer.scala +++ b/akka-actors/src/main/scala/serialization/Serializer.scala @@ -4,11 +4,12 @@ package se.scalablesolutions.akka.serialization -import com.google.protobuf.Message import java.io.{ObjectOutputStream, ByteArrayOutputStream, ObjectInputStream, ByteArrayInputStream} -import reflect.{BeanProperty, Manifest} -import sbinary.DefaultProtocol + +import com.google.protobuf.Message + import org.codehaus.jackson.map.ObjectMapper + import sjson.json.{Serializer =>SJSONSerializer} /** diff --git a/akka-util/src/main/scala/HashCode.scala b/akka-util/src/main/scala/HashCode.scala index 0ce21f6a92..fd9e46a682 100755 --- a/akka-util/src/main/scala/HashCode.scala +++ b/akka-util/src/main/scala/HashCode.scala @@ -27,19 +27,28 @@ import java.lang.{Float => JFloat, Double => JDouble} object HashCode { val SEED = 23 + def hash(seed: Int, any: Any): Int = any match { + case value: Boolean => hash(seed, value) + case value: Char => hash(seed, value) + case value: Short => hash(seed, value) + case value: Int => hash(seed, value) + case value: Long => hash(seed, value) + case value: Float => hash(seed, value) + case value: Double => hash(seed, value) + case value: Byte => hash(seed, value) + case value: AnyRef => + var result = seed + if (value == null) result = hash(result, 0) + else if (!isArray(value)) result = hash(result, value.hashCode()) + else for (id <- 0 until JArray.getLength(value)) result = hash(result, JArray.get(value, id)) // is an array + result + } def hash(seed: Int, value: Boolean): Int = firstTerm(seed) + (if (value) 1 else 0) def hash(seed: Int, value: Char): Int = firstTerm(seed) + value.asInstanceOf[Int] def hash(seed: Int, value: Int): Int = firstTerm(seed) + value def hash(seed: Int, value: Long): Int = firstTerm(seed) + (value ^ (value >>> 32) ).asInstanceOf[Int] def hash(seed: Int, value: Float): Int = hash(seed, JFloat.floatToIntBits(value)) def hash(seed: Int, value: Double): Int = hash(seed, JDouble.doubleToLongBits(value)) - def hash(seed: Int, anyRef: AnyRef): Int = { - var result = seed - if (anyRef == null) result = hash(result, 0) - else if (!isArray(anyRef)) result = hash(result, anyRef.hashCode()) - else for (id <- 0 until JArray.getLength(anyRef)) result = hash(result, JArray.get(anyRef, id)) // is an array - result - } private def firstTerm(seed: Int): Int = PRIME * seed private def isArray(anyRef: AnyRef): Boolean = anyRef.getClass.isArray From 753bcd5c666e12ff6d66f4fea3a5bfeaee44d510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bon=C3=A9r?= Date: Tue, 8 Dec 2009 10:08:29 +0100 Subject: [PATCH 08/10] fixed bug in storing user defined Init(config) in Actor --- akka-actors/src/main/scala/actor/Actor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-actors/src/main/scala/actor/Actor.scala b/akka-actors/src/main/scala/actor/Actor.scala index ca5b9e225a..ba5125717b 100644 --- a/akka-actors/src/main/scala/actor/Actor.scala +++ b/akka-actors/src/main/scala/actor/Actor.scala @@ -865,7 +865,7 @@ trait Actor extends TransactionManagement { private def base: PartialFunction[Any, Unit] = lifeCycles orElse (_hotswap getOrElse receive) private val lifeCycles: PartialFunction[Any, Unit] = { - case Init(config) => init(config) + case Init(config) => _config = Some(config); init(config) case HotSwap(code) => _hotswap = code case Restart(reason) => restart(reason) case Exit(dead, reason) => handleTrapExit(dead, reason) From 81a0e9473af51fa45259903752c46dd13e144550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bon=C3=A9r?= Date: Tue, 8 Dec 2009 16:17:22 +0100 Subject: [PATCH 09/10] fixed actor bug related to hashcode --- akka-actors/src/main/scala/actor/Actor.scala | 16 +- .../EventBasedThreadPoolDispatcher.scala | 5 +- .../src/main/scala/dispatch/Reactor.scala | 12 +- .../src/main/scala/stm/DataFlowVariable.scala | 189 +++++++++--------- 4 files changed, 119 insertions(+), 103 deletions(-) diff --git a/akka-actors/src/main/scala/actor/Actor.scala b/akka-actors/src/main/scala/actor/Actor.scala index ba5125717b..61c70ba10b 100644 --- a/akka-actors/src/main/scala/actor/Actor.scala +++ b/akka-actors/src/main/scala/actor/Actor.scala @@ -17,11 +17,10 @@ import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory} import se.scalablesolutions.akka.serialization.Serializer import se.scalablesolutions.akka.util.Helpers.ReadWriteLock -import se.scalablesolutions.akka.util.Logging - import org.codehaus.aspectwerkz.proxy.Uuid import org.multiverse.api.ThreadLocalTransaction._ +import se.scalablesolutions.akka.util.{HashCode, Logging} /** * Mix in this trait to give an actor TransactionRequired semantics. @@ -215,6 +214,7 @@ trait Actor extends TransactionManagement { implicit protected val self: Actor = this // FIXME http://www.assembla.com/spaces/akka/tickets/56-Change-UUID-generation-for-the-TransactionManagement-trait + // Only mutable for RemoteServer in order to maintain identity across nodes private[akka] var _uuid = Uuid.newUuid.toString def uuid = _uuid @@ -959,5 +959,17 @@ trait Actor extends TransactionManagement { } else message } else message + override def hashCode(): Int = { + var result = HashCode.SEED + result = HashCode.hash(result, _uuid) + result + } + + override def equals(that: Any): Boolean = { + that != null && + that.isInstanceOf[Actor] && + that.asInstanceOf[Actor]._uuid == _uuid + } + override def toString(): String = "Actor[" + id + ":" + uuid + "]" } diff --git a/akka-actors/src/main/scala/dispatch/EventBasedThreadPoolDispatcher.scala b/akka-actors/src/main/scala/dispatch/EventBasedThreadPoolDispatcher.scala index da5f6cce1d..297c1f7087 100644 --- a/akka-actors/src/main/scala/dispatch/EventBasedThreadPoolDispatcher.scala +++ b/akka-actors/src/main/scala/dispatch/EventBasedThreadPoolDispatcher.scala @@ -126,14 +126,13 @@ class EventBasedThreadPoolDispatcher(name: String, private val concurrentMode: B val iterator = invocations.iterator while (iterator.hasNext) { val invocation = iterator.next + if (invocation == null) throw new IllegalStateException("Message invocation is null [" + invocation + "]") if (concurrentMode) { val invoker = messageHandlers.get(invocation.receiver) - if (invocation == null) throw new IllegalStateException("Message invocation is null [" + invocation + "]") if (invoker == null) throw new IllegalStateException("Message invoker for invocation [" + invocation + "] is null") - result.put(invocation, invoker) + result.put(invocation, invoker) } else if (!busyInvokers.contains(invocation.receiver)) { val invoker = messageHandlers.get(invocation.receiver) - if (invocation == null) throw new IllegalStateException("Message invocation is null [" + invocation + "]") if (invoker == null) throw new IllegalStateException("Message invoker for invocation [" + invocation + "] is null") result.put(invocation, invoker) busyInvokers.add(invocation.receiver) diff --git a/akka-actors/src/main/scala/dispatch/Reactor.scala b/akka-actors/src/main/scala/dispatch/Reactor.scala index c790928ae5..befa25e807 100644 --- a/akka-actors/src/main/scala/dispatch/Reactor.scala +++ b/akka-actors/src/main/scala/dispatch/Reactor.scala @@ -67,10 +67,12 @@ class MessageInvocation(val receiver: Actor, } override def toString(): String = synchronized { - "MessageInvocation[message = " + message + - ", receiver = " + receiver + - ", sender = " + sender + - ", future = " + future + - ", tx = " + tx + "]" + "MessageInvocation[" + + "\n\tmessage = " + message + + "\n\treceiver = " + receiver + + "\n\tsender = " + sender + + "\n\tfuture = " + future + + "\n\ttx = " + tx + + "\n]" } } diff --git a/akka-actors/src/main/scala/stm/DataFlowVariable.scala b/akka-actors/src/main/scala/stm/DataFlowVariable.scala index 83ab9d141b..2a2bcf8e0e 100644 --- a/akka-actors/src/main/scala/stm/DataFlowVariable.scala +++ b/akka-actors/src/main/scala/stm/DataFlowVariable.scala @@ -4,61 +4,59 @@ package se.scalablesolutions.akka.state -import scala.actors.Actor -import scala.actors.OutputChannel -import scala.actors.Future -import scala.actors.Actor._ - import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.{ConcurrentLinkedQueue, LinkedBlockingQueue} +import se.scalablesolutions.akka.actor.Actor + /** * Implements Oz-style dataflow (single assignment) variables. - * + * * @author Jonas Bonér */ -object DataFlow { - def thread(body: => Unit) = { +object DataFlow { + case object Start + case object Exit + + def thread(body: => Unit) = { val thread = new IsolatedEventBasedThread(body).start - thread ! 'start + thread send Start thread } - def thread[MessageType, ReturnType](body: MessageType => ReturnType) = - new ReactiveEventBasedThread(body).start - private class IsolatedEventBasedThread(body: => Unit) extends Actor { - def act = loop { - react { - case 'start => body - case 'exit => exit() - } + def receive = { + case Start => body + case Exit => exit } } - private class ReactiveEventBasedThread[MessageType, ReturnType](body: MessageType => ReturnType) extends Actor { - def act = loop { - react { - case 'exit => exit() - case message => sender ! body(message.asInstanceOf[MessageType]) - } + def thread[A <: AnyRef, R <: AnyRef](body: A => R) = + new ReactiveEventBasedThread(body).start + + private class ReactiveEventBasedThread[A <: AnyRef, T <: AnyRef](body: A => T) + extends Actor { + def receive = { + case Exit => exit + case message => reply(body(message.asInstanceOf[A])) } } /** * @author Jonas Bonér */ - sealed class DataFlowVariable[T] { - - private sealed abstract class DataFlowVariableMessage - private case class Set[T](value: T) extends DataFlowVariableMessage - private case object Get extends DataFlowVariableMessage - - private val value = new AtomicReference[Option[T]](None) - private val blockedReaders = new ConcurrentLinkedQueue[Actor] + sealed class DataFlowVariable[T <: Any] { + val TIME_OUT = 10000 - private class In[T](dataFlow: DataFlowVariable[T]) extends Actor { - def act = loop { react { + private sealed abstract class DataFlowVariableMessage + private case class Set[T <: Any](value: T) extends DataFlowVariableMessage + private case object Get extends DataFlowVariableMessage + + private val value = new AtomicReference[Option[T]](None) + private val blockedReaders = new ConcurrentLinkedQueue[Actor] + + private class In[T <: Any](dataFlow: DataFlowVariable[T]) extends Actor { + def receive = { case Set(v) => if (dataFlow.value.compareAndSet(None, Some(v.asInstanceOf[T]))) { val iterator = dataFlow.blockedReaders.iterator @@ -66,73 +64,75 @@ object DataFlow { dataFlow.blockedReaders.clear } else throw new DataFlowVariableException( "Attempt to change data flow variable (from [" + dataFlow.value.get + "] to [" + v + "])") - case 'exit => exit() - }} + case Exit => exit + } } - - private class Out[T](dataFlow: DataFlowVariable[T]) extends Actor { - var reader: Option[OutputChannel[Any]] = None - def act = loop { react { + + private class Out[T <: Any](dataFlow: DataFlowVariable[T]) extends Actor { + var reader: Option[Actor] = None + def receive = { case Get => val ref = dataFlow.value.get - if (ref.isDefined) reply(ref.get) else reader = Some(sender) + if (ref.isDefined) reply(ref.get) + else reader = Some(sender.getOrElse(throw new IllegalStateException("No reader to DataFlowVariable is in scope"))) case Set(v) => if (reader.isDefined) reader.get ! v - case 'exit => exit() - }} + case Exit => exit + } } - + private[this] val in = { val in = new In(this); in.start; in } - def <<(ref: DataFlowVariable[T]) = in ! Set(ref()) + def <<(ref: DataFlowVariable[T]) = in send Set(ref()) - def <<(value: T) = in ! Set(value) - - def apply(): T = { + def <<(value: T) = in send Set(value) + + def apply(): T = { val ref = value.get if (ref.isDefined) ref.get else { val out = { val out = new Out(this); out.start; out } blockedReaders.offer(out) - val future: Future[T] = out !! (Get, {case t: T => t}) - val result = future() - out ! 'exit - result + val result = out !! (Get, TIME_OUT) + out send Exit + result.getOrElse(throw new DataFlowVariableException( + "Timed out (after " + TIME_OUT + " milliseconds) while waiting for result")) } } - - def shutdown = in ! 'exit + + def shutdown = in send Exit } /** * @author Jonas Bonér */ - class DataFlowStream[T] extends Seq[T] { + class DataFlowStream[T <: Any] extends Seq[T] { private[this] val queue = new LinkedBlockingQueue[DataFlowVariable[T]] def <<<(ref: DataFlowVariable[T]) = queue.offer(ref) - - def <<<(value: T) = { + + def <<<(value: T) = { val ref = new DataFlowVariable[T] ref << value queue.offer(ref) - } - + } + def apply(): T = { val ref = queue.take ref() } - + def take: DataFlowVariable[T] = queue.take //==== For Seq ==== - + def length: Int = queue.size def apply(i: Int): T = { if (i == 0) apply() - else throw new UnsupportedOperationException("Access by index other than '0' is not supported by DataFlowSream") - } - + else throw new UnsupportedOperationException( + "Access by index other than '0' is not supported by DataFlowStream") + } + override def elements: Iterator[T] = new Iterator[T] { private val iter = queue.iterator def hasNext: Boolean = iter.hasNext @@ -141,7 +141,7 @@ object DataFlow { override def toList: List[T] = queue.toArray.toList.asInstanceOf[List[T]] } - + /** * @author Jonas Bonér */ @@ -158,8 +158,8 @@ object Test1 extends Application { // ======================================= // This example is rom Oz wikipedia page: http://en.wikipedia.org/wiki/Oz_(programming_language) - /* - thread + /* + thread Z = X+Y % will wait until both X and Y are bound to a value. {Browse Z} % shows the value of Z. end @@ -183,7 +183,7 @@ object Test2 extends Application { /* fun {Ints N Max} if N == Max then nil - else + else {Delay 1000} N|{Ints N+1 Max} end @@ -224,11 +224,11 @@ object Test2 extends Application { object Test3 extends Application { // Using DataFlowStream and foldLeft to calculate sum - + /* fun {Ints N Max} if N == Max then nil - else + else {Delay 1000} N|{Ints N+1 Max} end @@ -248,20 +248,20 @@ object Test3 extends Application { import DataFlow._ - def ints(n: Int, max: Int, stream: DataFlowStream[Int]): Unit = if (n != max) { + def ints(n: Int, max: Int, stream: DataFlowStream[Int]): Unit = if (n != max) { println("Generating int: " + n) stream <<< n ints(n + 1, max, stream) } - def sum(s: Int, in: DataFlowStream[Int], out: DataFlowStream[Int]): Unit = { + def sum(s: Int, in: DataFlowStream[Int], out: DataFlowStream[Int]): Unit = { println("Calculating: " + s) out <<< s sum(in() + s, in, out) } def printSum(stream: DataFlowStream[Int]): Unit = { - println("Result: " + stream()) + println("Result: " + stream()) printSum(stream) } @@ -269,22 +269,22 @@ object Test3 extends Application { val consumer = new DataFlowStream[Int] thread { ints(0, 1000, producer) } - thread { + thread { Thread.sleep(1000) - println("Sum: " + producer.map(x => x * x).foldLeft(0)(_ + _)) + println("Sum: " + producer.map(x => x * x).foldLeft(0)(_ + _)) } } // ======================================= -object Test4 extends Application { +object Test4 extends Application { // Using DataFlowStream and recursive function to calculate sum - + /* fun {Ints N Max} if N == Max then nil - else + else {Delay 1000} N|{Ints N+1 Max} end @@ -304,20 +304,20 @@ object Test4 extends Application { import DataFlow._ - def ints(n: Int, max: Int, stream: DataFlowStream[Int]): Unit = if (n != max) { + def ints(n: Int, max: Int, stream: DataFlowStream[Int]): Unit = if (n != max) { println("Generating int: " + n) stream <<< n ints(n + 1, max, stream) } - def sum(s: Int, in: DataFlowStream[Int], out: DataFlowStream[Int]): Unit = { + def sum(s: Int, in: DataFlowStream[Int], out: DataFlowStream[Int]): Unit = { println("Calculating: " + s) out <<< s sum(in() + s, in, out) } def printSum(stream: DataFlowStream[Int]): Unit = { - println("Result: " + stream()) + println("Result: " + stream()) printSum(stream) } @@ -332,6 +332,7 @@ object Test4 extends Application { // ======================================= object Test5 extends Application { + import Actor.Sender.Self import DataFlow._ // create four 'Int' data flow variables @@ -339,20 +340,20 @@ object Test5 extends Application { val main = thread { println("Thread 'main'") - + x << 1 println("'x' set to: " + x()) - + println("Waiting for 'y' to be set...") - - if (x() > y()) { + + if (x() > y()) { z << x println("'z' set to 'x': " + z()) - } else { + } else { z << y println("'z' set to 'y': " + z()) } - + // main completed, shut down the data flow variables x.shutdown y.shutdown @@ -365,18 +366,20 @@ object Test5 extends Application { Thread.sleep(5000) y << 2 println("'y' set to: " + y()) - } + } val setV = thread { println("Thread 'setV'") v << y - println("'v' set to 'y': " + v()) + println("'v' set to 'y': " + v()) } - // shut down the threads - main ! 'exit - setY ! 'exit - setV ! 'exit + // shut down the threads + main ! Exit + setY ! Exit + setV ! Exit //System.gc -} \ No newline at end of file +} + + From 84373454a00fd203d363d217f82c6f3914aaae3a Mon Sep 17 00:00:00 2001 From: debasishg Date: Wed, 9 Dec 2009 00:09:38 +0530 Subject: [PATCH 10/10] Upgraded MongoDB Java driver to 1.0 and fixed API incompatibilities --- akka-persistence/pom.xml | 2 +- .../src/main/scala/MongoStorageBackend.scala | 4 ++-- .../com/mongodb/mongo/1.0/mongo-1.0.jar | Bin 0 -> 231839 bytes 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 embedded-repo/com/mongodb/mongo/1.0/mongo-1.0.jar diff --git a/akka-persistence/pom.xml b/akka-persistence/pom.xml index 5447087e68..10f90035b9 100644 --- a/akka-persistence/pom.xml +++ b/akka-persistence/pom.xml @@ -30,7 +30,7 @@ com.mongodb mongo - 0.6 + 1.0 diff --git a/akka-persistence/src/main/scala/MongoStorageBackend.scala b/akka-persistence/src/main/scala/MongoStorageBackend.scala index 62169199aa..ae8d1ecb7a 100644 --- a/akka-persistence/src/main/scala/MongoStorageBackend.scala +++ b/akka-persistence/src/main/scala/MongoStorageBackend.scala @@ -49,8 +49,8 @@ private[akka] object MongoStorageBackend extends val MONGODB_SERVER_DBNAME = config.getString("akka.storage.mongodb.dbname", "testdb") val MONGODB_SERVER_PORT = config.getInt("akka.storage.mongodb.port", 27017) - val db = new Mongo(MONGODB_SERVER_HOSTNAME, MONGODB_SERVER_PORT, MONGODB_SERVER_DBNAME) - val coll = db.getCollection(COLLECTION) + val db = new Mongo(MONGODB_SERVER_HOSTNAME, MONGODB_SERVER_PORT) + val coll = db.getDB(MONGODB_SERVER_DBNAME).getCollection(COLLECTION) // FIXME: make this pluggable private[this] val serializer = SJSON diff --git a/embedded-repo/com/mongodb/mongo/1.0/mongo-1.0.jar b/embedded-repo/com/mongodb/mongo/1.0/mongo-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..81402ed07504b797682cae90ceae5f25afd0b430 GIT binary patch literal 231839 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

a*S1)Gw`f#mCS*KT&_O zSLVSJBae-r4yP`0uhY1+UiMa#Ow-bpKfal#?J`^*;CyV`0STt$`oq>O{V^Ex!2B z_u>uS9ZO?;^Rn-3y3tlLUG3S14h~a?A18ins9UCGTQ?ywjpwX)y=C?W?LDD_LMvss zj_h{ZnxG+YPf=%^=91Rmk9R$NFz3=ehx-5PR{T4{(3Tm?SDu!2vMz7E!y_}z%eD%? z43ys}H!~QobNyxB*Q53!=j-qADYrJN#zj8cRuHDLD_A-r|HpE*@QinYRafU`Oo(=7 zQ%u<~d){l#za}$0tXWoYIe5(8dgNM$kFf&lgL#g+iU*r|H*IM#TA7u2Y}wuVw+sF| z>MmP8eYyC)+sm|r7Oe2TEYRDv^|(Pw*sQD3soR(Y6csG9B3?1+D}Vo-bj#yQLtS&@ zgo4f72m7m^wr)LQAG$XHK#_o#ZSTUfSouWtM8UyGccL3WwYA7Lhy8 zVkVlX+`ahQ*xa6@`ljLZ%^qvCBc8tP>O0zWYuSV)@rg!OQ7&y>-!I%>DY8^>s@u!5 zsYxQ?nvTg@vJ)OI;Av0EpToDhq3cp3N-WG?hd6ckmQa;GaNP)F_F>Pz!4i_ds=<6W{BBZ7L?(Su<)5I;12X zQor+#n}@&jXf(ynFK2r+1mhTO$=yhwj3 zak=L6o@pOms?3eG3$8tudMl|pSvg82aku~0qxbEe^yv$J{hGPYbakz_z++9@UyAWD zeoq6gO|a4lRS-8@t|E2rva(j~WI5k!yX+PoVr%r;Hs2x7e1@vmLs_l&PxPjif6V)k z>@1|x`hCS0rSjD^!i#^e-H;xT67kx+>50bQ)>GAjDtr3#!+wZO{TCWy?`?mwgH<^q zKs;pM)auZx3335H&8obX=3jPgW!C!cxjf*O_W$k&b7z<>Snp`s-ng~$Z?hufsSKXl z#)N?G7C9$adchF^*&dIXmC`p)Vz?SYm7Pj6{Af zw-;I0>&ldPTT$g^#E$rPoMPWOOMh+IpvI``C?ELJlki!!#Y(|wjZUzzV?=aaWgP(I?}f6clRi(>v7{V-T7-MDzu)?5vvR|~{4 z{Y^9f&B;xkmcR7Um3zA~OxCb25s~9)Ilko_V`k>}TlbCpJy@k=n;oyG8ESZYPh5LS zWa+nUY)c$=N#DM`^vrIy3;9O5C$1h&xtp7R{$iE*i~F4?@9FUWo!^&|8O3Y%>&T)n zL0#p|7d@DKgz_gh#a+&*KKw0I`R+XJb>79QC!<)&M`m7sU|O?ymcL?k`poyDCGAx z()m#5wbG~!H{Yx|bx!xDy;hF(?zW_h&67l`PVD+>GTHxJNuhSHUH;yS3%ArQP>3i| zKD$)%ia+0_j0UfjE?hQ(X;%ts`(A8zp2bz`7QgU(hVB>1yRCNe2G5(H)tsp5^J|{* z&msQ5;=j9z?-swm@O-z=PWg-XwI_!iwyHO;Tl{)M-G9!j$-Qh$kB@g&s9K(ERp{@|IqWZKey%Zx*w zgVc^v%w+H z6;_ouER)sCD%+9S>AdhMAOG5tCzqq#8FLF)Y-zuC!ETqF$9h(?+%KFSpQXPq^1oE; z^6ORb2kzIa{h1Bh_x&`G$@2j%D5f%+=&oG?U+${az)Eb6c%O>wCX6c$a zWjS+@<6M*OZNbcM7o^?tJiWquf7sN8NB4xW-l=5K7Aeh?`{0w4d9_}6j=7_$=Ecfi zY1{SOO!;Oc_1yTO^lhID{|s?12Jyg9Ug^*JUCimj$~F4Zmx z5cs(M;1R~zE3ZytU-j~|!|c*6bB`>Iu*+C!owF)BBRpLF)hs>9!e=&pJ73D2o%X{g z)10B(>9@v~<12&&1KNFN^w)SrZoIH5NzpbX@}XLKW@D3l{Kh{wbeH+=|0eVImR{%o zm)HMkh}`ErD&M@QI_HAg`nhE{_wNzfR_d8ESJKOlS#^Hvr1Q=v|5|SNs}-Tjdwcyw z!{FHdmFwIdEnLj`y};B|kxABBs9E@l_tB1p?^ioK%YM?@z-5(pIXwAQak9N++3}a_ z*Ojc^`D<-ftLL)&uT=6%xwije_pqP)IIN!6f7#tv`8uWFXT6Hbij5ac{c4-~`CQQ9 z)~M^vPs-MBk~Xx@beVUyqv}&a4a@YOYND4H@3_P&@j;^Lc_GWm?GsA_WeBsFY!MfP!v>|=L5zsFug=2E}(&U598f95J33wUm&dZ&0| zALrkgCHl?RR2OSmKlpV_dCT!75BchYZz|m^_njc0J$J#JW4j_fvYNz_i)0s0TDD2- zx@FefC9CIL>9y_Ow_PRo{9Y;Nd(0u)uNQj+|B0%db0u<L<*bM4&o8}8p*(*AP0iD&-9)6dGk zi0oaP{H}SQ<%x~!U*GwVc;W4R=Hm8u^Fx%TPkyx1$GrLXY5mJS-~PymHXvhmcGsC;^yN%v&(maN-J ze{XPw2lr-A3bQ`&vGVxxd7t&?Eik>i-0x)<>(ZqPvWql>4%o<*1xQ*4+TRUn|Fw12 z=S*es3uR#|ySrDkcW3H1dF1WoQOjdVw(F58S@`doBL7mkUoW++n7yX`esBCfzFo?? zvDhd5tc2-3n|AZw^yg0+Ze^ zl9S~7yK8cZ?P9$hvFbc;dRkw%h>CCa{brrS%$iPtdDbA6hG!{(JVf3ws_(Gd09Ie z(>^oJI?t`^p?K5l9&5r>!Mn>?KfHKrwS@bCfpXO~J%;l~5_>b3?~d92nUh;_v8DF4 zw=Je_hnDhOl5Cls5Ma!c<#_)}*6Z3XU1carJYqj_v>y=%%b6(X>tCIgKY?bQQ6!YR>am~-! zXD>yk9o&EZ!uzlGKGNzL!X3q%FW%+yRTU1ZlioX*t834~+xLrSam8-;{Lh`Y+oROz zW^+W}>d7tsK7#)Z?pE|XOAPI*R~6p!RHoGDQdqm+BGsajrfnyqd_y~*hIHJ{JCtjF zc>miIZ*@(Ytuqw!m!|INz4oE()?w=v)60W9zF&~N4D#QAQ1xwgE# z>1yVM|J|&$t1{cS2~WAUW$~$Wv$s0+GF$#UGn&n(UA5bt|o}`|Z#49Xh6f8D=+E&t6Z`?SbYBxk@YW%^5=dFJn4UnMN_h=$L2SG>;vv)2iB^kE%mI< z_AU1J+x+$ShOg`#Q_^!kOo{q1Wf8wf#WL+`&ezk|-jO<@^FGuvd?EikQKN(5{@?GO zIllbfnz{EP_IU8sajJYX`teP4)r0WdS*v}{@`-Gnk}OgbbIkiw?WeA%6A!1w=uYn{ zJo(3Ir?1E97r&TJ?%nq!?vp>8u*jbDU4iSF+u{Q?_d9O=lU*Xcf1~0)o4Gf=P6roE z*>duK^#n)5%=1609d^Y@I=;=SfTrU^CW>{pLk&$a!`pHP7_7~a;?TSMu zvlW>c7>=+qFks%>80nM+@)M(O9iJsT8I z5RkrQ@nd0L0fVVRY)!`deyY|r@@KK8*L-09qfz>P@{}-k`5V=#>GQW}vuoLb zjDH7evZYFI8wS0P(Z0GaWX-c(4jG5n-F`RCL22ge+eY7;+TL2FdM9Y)Utg>K_VA*s zcZ|DDSMfZbJ1Md{(JZ&_TlcEpxAHi9o_n8LSoq?~YQLQsOM?5?hMis$Wnx_AHUHH~ z>6&-5mYVmUZF@4|_Hq`n$+fC~!E0=54WT`K&Y1n;#J z&G|l|^2qtcb#kALD;+Fd_OqOGPMCB-Fhpa@_OJN@zrdO~-)v z7Ya-2T~~B}VCSjO_%vzPV(!=@->fBm_=s@n1|4^knlVf&vz8e}<`+ec zKlMx|Jx)J*e%1WFz7g3DS#y=78$~be;^NItxnsL({pB9tGZRk<_g48Y_LKJW=(Sqs z-Rm%Em#wLpZEIQMnWLI1 z&5v`&_v2Dib_zY&{qxFV-jhjTmonm<`_mfV9kZ_K-t{wfit6RL)9n8_Pq23t_{ynN zvbN3NK>I#};naO|D*kW;-t+Njn~^_3OLv#z%=~|hsDqipKf2E~GBGg7vN13yU<{l? za~Al10?3f&+$qt)mmNfo|G#~VEs25Aah;a<&Mg--I_w@8IDNcicr;LC{^hilg-+9M zs`S;U$A57I<*gsf9zVTpG0%77<)l+RTP}Zj^K8!l_w{9)e}4LXIh{c}!gzx7y#tma zyDs*tit4`Bc(p;IsC>_XZZnBCu{Yu8vX6h7yCCna+a>N-ue+;xqC9uZS$O^%(>`JO zkexNpLTYD8Zg4&O@w?2+l^;JY5!?I4sf}~D8s8db!7HuNTeof3vf-I)wSBI#-gQlH zEAFXyNoqPH?`g*asVB=1O%P6dd!zUPXZCB2N6{bu z*)jSZNRKw1G;h<@iuqQ4x@i}(>kB6@*D{p&e(%bU#3!8!S2j+nxc|(qze32)zC>2^ z+m1&QpZ{JO(dIPi^~93vr)IqCQa7CL&U0Ee%6qL&u(#4O(X$m#cHI``uLu#GbmQg) z#f{P2PdDpMakGA7EMk4NyeRoiSH!g+wf?rk&2N9lhq$Vhl+2uQ)Kqx2grQ-3W!uJc z{=A0^exE(-tiN;NW3|ISG<)YvSi9o?vwasCZ&d!-vMJN}%eL%{;1Zvrfcbg9CdO`1 zx#iHd&p|K#2gkR*MLayaq)xt335`8g+0`Z;X>f7!iYFJk?Jiv?U=)8j@6x8sDWO|` z*8Po6e93I2{&ksVzS_mzw@&1|l9W(l^IqgFvG7e`m+36Y#jh*09;a(1_kDVH{=f{6 z)EeK^Cz|UE*p8{JO>5rhtGqNt=yCW%+fABNlmypIyJ|jLKm~4^X_T&G$ zKiT=SPwhN%JB$5&u^Ho;&XSr_wBQ{W4!ZVQPXCw zbCO+wYb5i|o}9COhic`6sBK|!5BUCT=wIGh@TFjbwxNWG!K6tKkIb=HnEx~JLEGk) zrgb-V+>@}1tXpH7Y5Q42w0qrxSF7i|y0d5#-^r5~%-Ew7c}i9P6sXGCDyAQqV{qXP z_cZ^cvlq^5SER4#bzRbOc&mbUa`H)~p4N!lCqMt&KG7vN^mZ}xx@1)ez3tD-cjtb8 zl38^+eBGAgPv1Lj**9~~qSwV+C7zyn;b3arGu1iTQ!6WnuWIfS<1e53&R)2+Z_dF3 z0S=$8dQa&Qa)@Y~n5cTxHY9k>!g-JCj!9c6)EjRU&KC6E(95?nR*3tB;QPl0SNjWm zr2cZheDZ}Iwdib^#7kf*iJpJ(+r9dfM&14Hs(zA2f{9_>H+RYBdDERvYpJ|Bv)B0f znVrUy|NZ;?SG}Pyhehz*~$-nj!dY=8j6e#IPH4 zEn}6OZs+=DF zDwyZsrESMnX9cb-Y%53%uUwz9x@+I$*wwRV?Q@pgm+5=`l`+rDBS#CkbDK*%=X&KC zRXpRFs$tDN>s&YcRwMK4Q;V)@C523RwJa&?QBHi-tM^-K+wPgo)NWgLeW#~Zj8$vw ztXu!4r1`da9r`(O`igVU^-gD0PJh2;X=8D3@ygV;0Bham5Ob*(o{27(R_?wh>vx8y zR^;FD-BAI!X4lR{e}c3uVtf>*dmM{akbYiRjXEp_11Pb?nxs zd|4QOjA32i``cHa@@-jl%6Fp0F@^e$qwPNXWcz)OJu>2|&|R!iaIvCIX_gk#@>Rl9 zHui{4{MObc?SIVfq=&L|e__><9>JbV>z+I>mhN7>q^5G^4!ixYj<4!5U32<{qrPa- zonG$mt81*6zX|46yY>BG<~ebx?6VO!Z$Gy3O+AwMRKM?Hp2*oFu|nCe^g3;Mt$EkB ze%SJ;o@4hpC(FYtid>g_UOHvMAE@3MEwN;Nv&P?ZJ2DSkvH9ebbY_W%kl1#_Kc^h zD^{KUG|3}!meMq#{->O(ai^B7-8^+o&^8CPx&yzzvFzLMUn1z0HdD%>gKhOsC5nD% z{XG8S$DNSpn+v|{xE3`Z4m)z>*{wg1Q(VtH`q_G}>`!xX#mYwhvqE;+k2jm$n{DN` zLiSEM-YWpBwA|LhY90yxR-W{dA{$4NM>!ao>z56L072FIA zS40^YBrq!Efczq8dDa@vSrKwo^q>CBGkbjG1llIFxEeD~J;@aKx{O9?d-}8RIU+m8ivE)@##&KE4l7w`IaM8)@lZS7Cz z>@~WjzIcm?vZLJg_$78qi`|h@1S0Iad*Q*xOO(=t8AGO#82V(BAm?X-|vl_KXVG9d&CTnoHGbXRl}bC{<@( zbwq`Czc_RJ^$+ZV|Bo~LTk`Nc;~&+A{aQb+ZQoX^vBItOr1o2vQ-(t4*p%&3#2Bt^ z<#K(#)x2c8PW!yFY}&eX>F%`)7q4Btd-2Ad3wQ6FyZZHsyLa=K{0hHi z7`$-9?T(|9xQb_)Nk{koYI%9Zd{gH3#nC?LmebFKWUbu5d#fyF;Udi}{ww@9I_<2l z1@F%~T4num&2z3urn`l^*PmaqCUV{y#p7MqxzBoixoW;MJLPk^^vNX~eHXrIIx}%v z?Ea+L$?GIuy)Cum+8t~YyHIPp+*@-YPUCs2zJG~&>3cHz&fG1z%QcHP{O8e5v`p6w zaqCO<`^r{z#kf9e@>GN9HnyrWDeV`9)m5*gxcB~GQ_ehT;GSC%tetjsIzT0e1K zH+^O5aW?Z!59gzx36nOQo#ml;u{LP_*%=>JY+GZp_IO`z_IACe1x34)UACJ@H?Iqy zxu%J2UbYoWSV~Q^#+C)?E2iHw6<)b;$xW*aHIJ?nPKn#!p4G8lZuZ@LTbi=t*6v4c zr!qa%aybLF{Hk{Ez4c&8hj8(R!%`DW61-Gp&F{uNu)lh4DF=V@y`R6{ihR}S4XJ*9 zgm=-dyPiUK9@!oLc1-456sPh#sWnAeJKtDtopJApjk45v2D2M^{HlweWqDr+d!v}N zFz3ofNzKf4K{M?7+DrB{@>>0CGcTR-;_AiT?h=U?oDbex{cEg$^+Ws~*Ms|3c?Zg5 z#hd!H<+BfVDQe3JCyFI8?pgcT{>H+`vNFqfxl8Y;Y%c#8FB^EIB&Khz)vpWdA7{lZ zeVqJbN1t-ei8Upro}w&M{KH#M$ppX?axYapC6k z9s2&?czI`Vs=u~sow;#dLD!NEQ*U^=A3s!ReDV30_USDvH_g)dwCqKe*0#;7CYBzs zR-2RLaVSjd&5g1h$6s-~zxevxcIiR@6lAxW0(dkSpji)2fhgM8%yI{L-Bf7MWHjbGZ+zSh?9am(SoxTs(bQ>-iGf%1MW&G>Xjp zbu>FB_7ID_$IGmJvxEW!V?$Rd_SejG;;&w~cK6DKP0NyXw z3a6ud5*?rHUHWYARrSfcgI;PRh1@yR`Ms}RU!0fEGTZm?)*IKQx3fte@YpwTFx~|N^7`Ov)}`I&v|;+O<1Ph1 zEf`W)Jhi-XW7Dpw1(N)S4k^AD77___Q%kAL-|1Z=64|6jWAP?^ch{t2Ii^IVN`L@tnD5 z^Jja$VK&{G#gcX7uEB#%+?95JIus5D&OFX0-Tcnoi$VU$MlR33+BefTJ%6pD{LN6r zX`fA1mYc!KWgiMfN<`l@=G$}K-d(e*R{oFa*54HwckMDvs~_q|Y+-lJWUc3=oYk{Zbzh#0P*QH+@9BQiq-Cw-Y^fdV4-|*qriH2g7mU=OJUKVjeWrT& zURSC8+E;CUZG9y9YTmIkQs*CMo>?U;dsa^N%*!bg`{V4^#cn&H)BE^*`g&QXjV1eP zSFEXKYt1V6yP&b!=g?fsMD~EIPtU&Cv{To#^hxXn@y{Kt)d8gp>Lsa7GFB5Er%pBT zOUiLK_@B_GUp6bht^c>u_eW3u@Ls)RaM=BuK<+Fx9;0<%Hz@voow9Y^WNq%Uq*WOa z>ZjgXePa9F`seEX-jnPFMd2@|2=!&LKs@)TX z@JX#PoOX`AKXxtl3r}UZ^Wwjz52VGG@TSK~Eizi5$e4Gfqv~gYz{OqLHI;vH zO`jjn`SVu1ZB<)USCnVp{ISp)IY5Dc>K5L-=v4C z|Cl3Y9X%uI(tf-&?S)QXy3piQhr*g8?GJB zmFk`Pd*ixIBF`gEm&wlb78emNGc9R(ew>$OG0TkjJ1>=nITXq|Uhw&lXy9rERg=I@Sq?_k$|9Jiut^B2_#?bQ<5cUtJ7^`VLS4d;K{ zh~XDKkbeK5YrEhl-_zY|C!N2*WAxhi$3%k{{Cz9e@;^yjYOuI*l77#bXRb5P&Jy47 zGCBLRbLH=?Z~o2R^gDcV^tER_Y%3$1=DT&@v059KaqLu$h5xfTYr^f^H&hvIPYYUm z$h+gEoYwXCP3u>>32r?6gxlcmvW+t;HqL!oRncWKycQV$@lgjA%wt_EIPd-2->v8T+gJpcX+n)DS%zK-=E^+&Rene~ia9Emk zPk_ZvZAJ!$%Zv;Rx>#H50r~kkDt`IC`9-PD`FVNB*L(I(jQ3`86ghhSNB&ivvzOv@ zo36BrHO=ec+UgMDYEUD8{h(Ue^J8zMYS+$dlKaI_yW+(GUKHG?CDP#6+?i3MCwWxXi3#BJTUZ{EYZFlmfk25qZ z{@LCX)bPv5tSwzVx#d%vZS4gApaph|+)fzx)@|Q7v)k*$qGt>A3O=3JXk0x1iNQ-| zVeRacg3oVOA2$ujuJYUR{oJT@$tJ2R_<9(E#9uG zaDCO9%2m0}_1yu{=Ia_8wALDa+a7-A+^T6e{UiQqglud*B#s*DJO1;pf5OhdkS2ib zFh)=x2^8v(p@-h^-{I27MgL7}7wEI^yYKDM@(;0szvi*Cf7p}rt5$!1-GWE$T6H1K z;;e^C^>2Ml7X005Vn6j+x>nu0qlGsgiT_yI6|cF1KiYX(?w81AnJ#m8q-tGY`&(l4TmxB*( z-m5(AZBIe}I^!*o)|T!Tg~norlelVJ!xm4IJbPnXqLt&imn$WM7CU`i;Z`|zU@doFLha^%F{9ROo7Op3~k5F3oq>x^uXDDW#pF3gZvtzz4$f?w zAbM3ed6(?;!n{pd-Rmp6YenYd-RApcW-(<-Q*E^Vbypc%tJ4WP9A@0ns$2WWoF}vV zPLFlEh|I0J=Y~z?X^(pL&N7)a@rQBB<(OCcH#e-F+j%)6&+*{BZACmsx;4MqaB*cN zO}m_bTWs$Z{dSFovo|LEuesvkd2d&M$h&(XWucC(rn^;5+M*H{*aqIdAgi2n#_&tw z>I9uUR`z!8V-*)fDn2Jq%2#PVwC!;4^vW4K(t~gR-MlIC=%2!qEk;tNcQ3k}`#d$* z>E#u*19{WjADs+2G=ZaRda|v|V}jJ)Xi6x8-3_jqspcNWJ9DMxZd|)Fr!`wE`euegSWwW5hrOG(gw9=eyQEjc zBIwCWjJd*5i@ShDeDLcqq-Y$uz~eN(6EuT{1@ z%oDKjdzHA%&gs&>+YUecx9{S?hXpA`Oa4E4^7G*djn_98L_d9JY-I7`+AFi|pRK+* z`G4_J)4Oi;`i!b(sQ9U%uw3QD7nwVsIv-|c{wwae?8PzPh>a3w*`43SE<2lgtzxZF z_$s!;&)Y<|Ot~z^srCN$DTBZwC&&2P({6na=9_xb<@>A^eUpT8-x;h+DXH9Uv*)eq z_N!ktms$Pye>YXFX}?d#wj(z~9^6V-6}s7^c7Dy5Cds8sPQEU?Wy`cLY5$4StM{hx z$ltGD{zGW(u{_Pa4=f+7VEURdRl4D^UiqC~ww0Uytebx5&AzzEr8l!`LccxKQT=`Q zyJ2x}ZErp6soW5qUALa!cvtY8Kl#Ab!qft}=DhRV>dXJB#c&w9nG1kp8o ztoNKs6D9@=JLgZ+ThZ88-JQK+-iP%@;;E(u>{+VEtl!;r@ZIq^?s-+h#IWcKFW=Sn zL@bqmFz-_Mt`~g^r@all^09J{bln@r_SJ^`;KJ^9gEdM_IBH99eTeg^ymj+Ew_JOh^t{z*}-|Q7LBU+aq+}(8R z0GCOb_KN63e*e}dP2Vs0^>oIEaJ}Sy`wcyAS|+{)Ytzz1tEXSAF@FCfY?tJpPY(r7 z+IR~wTR1k@mXt6S=_|2tefK`_Ss+P7{`5mDU&)E9KJ1AR+7mFbw`)%?*Cn~)!{>f0 zr$08`wKXWnh4W|r!b;ZP>lT;s>MpstORpwu!+$;bdpD0Zn+KRr`TZt>e^0DH>JzOC z9!76XuATGP@?7~@`}DUQ*Y%C&D@~DFe1}E3tTRZs=c>BIM)jF%C%bN_F4~}N@xO&T zdePS4MORlOB~2;(7d zokwvf9T&hQ4th@O`fqO}9LcnvMp^&gHlD48CkV+R;?<{g-J2N48n-;+NmetyQcW?4(S8F>Qa*#;@cV_AEtq zouJT?tNn~lg4cNOOj#WoW$(cwc<0z$wZrNysn1Hx1b?(8Fzgq&6=Qd-z)W!3zh|cm zC(Z0sF8R~2X=Z?@+Y^pkjMfvfTBqs#V$yVyKPqx5y^8IGRicQ!_CoecQio!b`jeKd z%!$ZKu0K+*?Rt&l;hYuHlSCONx;zhmF<;Pj%2}Z$vPE7~EYxOC`iC~N=H;xqAeV)K zft?fE%vw-tnp0vibh%4y=<6`)P>H*fxrLW8FIgDVmE>Gy*y62~wK`xmZ=;AWH`CH4 z4L>7c39Ff%hnH*#tL@+C8qFHBY1+RM-T0&B1v}5H2yh&f|9S4`x$?WeYtlb`-@pGq zV*-=C_Kv0)>w5=l6`!^Ii0RO8IdQr|;Gi?B(X-Zl7y9%!Y9xC$cEzxqPO4Qo($#eQ zhu5)HO%g>;YdAk{Z7Qu<{2)5V_0X+`k2@6z`gO5#P(L8;BR?CC7mEIjs zw{Kk@b?efbvtMcwZ);QqA4+*Y$4s|!U1t6-wY>_8v-GW=mfYNEF1vTaxwMRqyokPK z(!ZLLZ_Qh%Z!I*X*UR~3E|;a=wX)+|eBZBYxqb54nsjN4+iyQ~wOrV;SXyY;r)9Y| zYo>9x?Or3QYr$k2A+-I82zQ>pOAD^^bbiU06t*>Ir^MaXm z9ty4Awxj*SvWI71o_)r)(nL7mtp038;q+O{!=LzFTs2wVhf8Uy>hf1&y^+Bt7c0-4 z+_7Ro5=*40C(p_qjpd;+hf75{V?qskL>SF(MXb3sFVZY+o@j5E!wIt-^>yMdT*0m~ z&PLlpZ5S(GX0uISIcr+p4xvY?K~LU%>R9;kmd4J``TA0u}4bI>(ZKc>PF~Cp7W|J^dEI*`^@a{KPDU^y!eXm-Eh}`@*ciQ z|0cI^-<)}7@f{1xnKP$;bUNDqAk+V}n-2N24Pko({%D(A=rwp?~=e6&M^OJS(V*M`Q(fdYmhSXhW4byGyAF}OB<`gv? zZE)PR-r>*ml1&BX!QVF*%$gRWE137l_P~AL4U8x6?>#?_>EAnMGs!0}+joTKKa_uU z=-IM5*9WRfF}LCZS^hg6SA23c;t9js`hAU`gv{?hIHY*xDs#yZtM3o4GiAo`!fw=3I$wH|l2wGL_Gf6J*<_!h?dc=hAe8J{1k{r!}s>%MnI%kG>V)9lZN z-Z-S>U;JUO@WF?VADr)-Z7nI2#kcRi(GNKz-KOTV2S4jJDbH}*CTH^`y5ZZ6+xrtg zh-<9>`=*zLd5Uq}rJMg55WVn2VQJQ~>u)_-#>l|1hlznf5=%Xso>~E^X>$Wl``vaB zu}yBj!4lk2Df&xcOSc+hqC>1g;6{d)T^`<77kI3>a71!v+mYm%j33=|9GMh1CPa7k zJKdQnk-;i;_xPRTmgy$t-_5r(gniiAqI8cpiQ)a$-wz%wZjNLZWh=LT>eZ=}_(7We zPYZkOJQv5{)Iy=PFZcO`>P%K{d$ir6^QzV1>90!!pdg6fZ+7p~Xc z6npO-*I8BPd$}KVu6^GV5m2A>Xl6#sCh;#RLMQ#KZ`}H!t5oO}6yc>N=`}H6znp7- zc=q~}*Nm>m&F&`mk-U%yLh_)XDeWMH_;h;5T=aAj^%ehxHt1AP6P9RzB< zGdFtJuhFgg>b6?<;_73~v*vZk8SIr>Abp4JMoWZcUmSS0r*wd~%R z>io3lpI`rFKEV0S_r;CeMQ!^U8yROG+!1ZJY@v@t)jg#OjyozRlCJ9)O+31sr`LF5 z=c74^5B}uyr}O+;I;Xg;Pu-|)ub1<@`)rAaysaf!PwJd-?OeSm?oPLA^IKP=(%_j# zi{y5Ni|>nSJZ6|>mK^uvs$XsTj!f;#(^uO(3J$E=R`+G{q|Ac{=CxW$ExBjXy72e& z3Sqs95Q8go9`dl4h|hiJvU_^fDU(yYIe|GsvxKg_Fm=yQSbR7<<9t_gP|jpA3#Gp^ zb_nMPZ@Qink-?~yJz2X}NVY`VKRj`PT~*_^FWJ`vjwYujujQP|d$=#@>prwVUUk#7 zV=E&A0|zs<92DXlpkfFKl<; zSmxmLS3EDf^0?YQt_pdy;d*Arieu7>ia%HJRYW|WX!4wKhS_<;hJ(MCPU+B6d|$?@ zcv=4`cXrAFA(+K2CCZ)%hOY|xpRb*MurAlFSQbw)+u?1Ng8!Xvx$owJu06{t*Pn0qB=LI!h1FE<$3!n+&88tosxE+_if8Zi+~$Su7@lCC(NC) z{y^TueHF_J?Up?JYFhMriJ|d@51HmM%W9g>e14M1JX4){^U1ZAXViaJ*LYlDjZ)8e z#<}_8e;udg4eqF=W$9DK?w2eK49=X`4w(kUwQnV81+mGk!>@s2}CUrS-XvO>y$8^ErJ;vGnRU9YRf&GcSq&gz2EAuGV-r{+-B8kW%YRJ zxr&!djr*(~_w-p+J$~`S((d^iKMs|tKIi6rp4b2UaqaoG^Z)*SNM;b;Aa$`fSnx}N z*SBSjjZ-*aN-c^1YW);ztf>oU{bPN~m_r?WO0 z`yCU>n7cjavr}gA-ID3OUuBeKKl|M}5o;FX-S;;k;Lyh#t1}FO6xu zcjQm$W6@-t^cy!f-VDE-wlBkSTa;3T!2IA*nx@OV@;a^g$?wG8S@!;E zK^2qjZ5BtkPMb4nw%PfpON%=$*=i-4@HkyBU^s62C24+J-Ivx4iym6W2wLpeE$}7t z?~1$|lCe*twsY-@J@u5YWy7k6m3tN_s+q@M{h)NsX~!}}PNp}<8`=uj1Rw0%uyj%O z&6}51wWk|qdY15C(5#KIcZ|zSNlDJC;Ed#zwoo%L+`XfsurTC0_qk;|AKtkVn)u3` z_flb3*Q7j=uXpo!-ZO5<*?UNS?}mp{iX?0AUWr_>mtRY;ahoiw`1SRd>%$UDx0SDr z-W94bYqpQj=6Jt#PkWYTFx=d^Y~#r%W!E^kTRs&{N$y%a)%5Yq{1Qs0$5VWwUtPc1BkUaqrMe*c^~@2FnZJngQi=85NLm$?P5corx6DZ7#VoBFeV z`BpI{dj#&gcD`yYa=oT`?$mC!x%vm>_F2FFnOf=mZ==W6&G+j!*)?u6s}!{0`dH22 zEKt$0SM$n8<}GUO+Y}~!51h`EqxeD2xwK<*?~0fD7c?GOoS1j4H>S^7BCK8A@R9si zOQt^z+9$QY3vk3eHuSt%DQ#%iJb%&C+AHNIIm%!34jC0q_x&M!mH+g<9}K;>J9NI> zRhwI#vFq&0!_jfVHZ{}T*+rIePGZ=nvUUB1#`P8ya;qv{CR)b>?E&6`_y7#E;<4L1cxnQBDWUsztZOM?w8YUj{EAEeDZMR{Pz zTW9lb-F>%u>+Wk^U#!3Ho#~@y{HLDv-tPB$&*weeec!UY=G$3)8%Gy$t7E%gq|JM9 z?C|47kv127%Ri~~YTpSt6P&UpNG{I&*s@)fQvTDg@${yjs-8BR=iAAa&n|~@D)+cP z)-tdBQ8QP6!graKFm;Zb+3|)40*UrAzOHIS&c$eDrKhLgNxJP`)Po;ekkG)Iw zg*-o968B=+%|)S$&voB1X;*)_C*rwkUfikECUNhURmCaxPyLiJ>9|(!?7Jn3>&re% z#l2p%e243{oiWSrPn&cye8fY;WGJ1GRcKPEz@k z``_m6>N;%oz1v$!%Kh$^sprc-GTeXgOyYQ{U&opyJnsuW``rsY)x0PA`Sz2)-%9Ow zeqR2n#O<;4-7Ck8Y(=o&J9R=eJc`%3sth zpZ)&P_t$?I=i0CM+R_2d8B-1Zh9lm%k z&iI(g*3#$%_XUbGIa;Nc=!?9}%?M5Io^h;{EjdjgaoerQ-qy`0Z*;wTH$$?0g67(T z8THQfCYPk&zRQZ(dP(kpmGiTc$6hbKXb_xw?#LI8v|U!r4?o<>uwkrx8o6pq+apfN zdlIjDS%gl`I2kh8c+ZXl-@L^;7j@cY+{=};KN=;;cVL_Es{N)?JSVLewEc{#mzHMa=OY6zxud#VaLsRZ{8av&vs#(?7nh`r2zNI?RQ`Ld})1fs54o# zUF#gf6Qx!XUw<)(o*(O>b8hJ8PU) z>kq3aP*__M`|isjMN!MtxzuczOKtH z;hV_s)s{lXEi=0wEnrujGeef2C#yyvXxkAdPD!p=hF{`??k24i<8+k{<5N2`_2fJ` znIAH`t2TwN|HM%%OuL&I4zUK4;?!|pC7?zc&RvQHug)o@1 zUd}pavD{AJn!UoG&<`t^B$!|Q@jrFgzTsHe%{uXX~CR z>o>C*=ya)VoT`AW3RadS=MX^-rl*|0;>z3r&v zJ5yoFit5$ehcj)|ZgE7)^ST}}ziOJ?&ug(tc(+S3S7CJP#|;~9zVe*k8pHoY^fJ3w z=*-8bmPks+WY>p2)v^%C;^mpOan+j0rllFz%~JACsxvQq@J(z(nudUwc(`YPyI(l> z3X2IHr=-dar1+NeJLp-=GD=pmRht>WfAn{*mVW2VzZZ{iR87^q`C{$q&8hDeZsR`` z^x(B&Z@YSlEq`JuJ*k0|)3pf1WoGN#Q zkEJ;x!ZiP$&9YxH8z-?9IZm9~BD;HoN4yNr?aGsT4QKVRp1rE5n7KX5F1*bAh4Poc z=6w#wdF$r%NqrHJXM5Ri+wgg&hg-iyiGJ;!1^gG;dHpV)mg1MLnZhq!(-U{_lwkR~ zj-yP?PLtT`8~ab+(wF*Txa;_W!zL*gR+k7JU(~>E5Z$Kz*xI=>VZOfLS6&7C8F%;9 zr3Az;KL0@fqwpsS#^b+VP5;HSYqniZ0cW<c^D@ z!GCz0_j{g~{-awLcdbU6g?sYs=jYj7c>nR$oBw6qaOUK+YijR%9)_--#QZQo!1F&> zvB2|;FVC+W;^zG)S8w0D@nYwR2jV|moB#Q&m-xe6B{$FN_`kPlN$DorWP4_3`ficw zeeSK=RA_mS=59B}l^Ze7C&(^WVS9N{Qn^hmr7i~H3ziiQ6Z?^w)f*5?h zec^4Kn|aRYhj>kt+CQP=OSrz|UugcqsgTSvQ~Q$WS}#_q|ECsA|8ZUF|FH-6KfO zzB#*Ieo+5$wa@BmV}p#2c4ljz2s!^*`_`p6X-anW$b}ve?foHCyNrL0j@l9DyBas+ zjep!XVL7e4Zt~fxq#LI;F&8*JZb~qbd?zMa?c@-8K-{qW*RO)3K_MHA1%qTHul^{t zoc`bN2d@=Z|BovR^S>zGy!}Npm#uoyd zkn!-t5)tPYcNT=^Wb_FgUT9fz_MwqXp8Lv&1~QLRem^fhSJ37q(&FBF<5A7oz_#pD zmRyHRc-*I}uLwK7Y=7XR%Lc1;LW~@a-1uV8Ww^u9tvo7x_9MU7enEk@+jN4;7wyrM zVy;q}<@a-HYu>YhB8^MJp+`?wiE6)SV>+9)-s3rQN!ataS>m3xGpd8yfRAQK`&a(I zG<9Fs(PO^SQL_r<4HLq&UmRSwU;Fr#?~=NDKkOGxoB5*ebgj`o)hREu8v=J6xS4xb zzj$g$TW8zRw5Y{ImKxfyw@m+yu`lfF;LUZFE_1^+?OfpT!!N{}`(7vJH8`r|wqnHtBD{rqZ7`S0p??Tb~{Dd9!DpK;{Db z-%NYu&K>$HFYqRQO6a+i(!+g>Ke^nw4oF7#1dHz%)S5k8T=V%3T}#!O25V21w(oWS zcW>IXS%0>htkoCDH!nZwtFb7~>dSo@4t3wmv>l~IrHx;!WZr1mOE1f3T^xDoPGZ|r z2Gjh!dl%;HwCN{PJ9vC6D>D zJg)wlP-XpuYt_9SL66@~JgsN=HnjHlhu-euXTR-cX?-;btXz8K$&1-N8{1z@mbl%& z-hQI6?xMT@ZY_Rd;p2Mv$rt(MkNEx@OqEf5EAVowX3^3Uz2Pt8vJNh|*!XQnqL#JO zGXBVfisS?-1)V$r+h1Eu=8CK zHNUZZhMeQ>IWp-R4=lX6SV~r<=yLkS*GFC$-C~xnIrr@#*B;j{?;3;L8O!)JuXlRo znHC7nsV}@%w(d-s-Y*+lwnpWqqdT1qJXq|rthf8JoR@eV^U-PN(}3Hv7w?IfeZ5-w z-z-n5dEB}6x{F?JVVM`@Rk~$PRN~c+L%EWzw-;`W;k?r5Amd@E4xwA=ih3RZHeY3QIc>A;pnt*_mLt(@`p2TvrZd(@b-nTns_lCAOs+3Z%Dpyn_tcyB z(tkdD9y3X*NcE_K=DhGrlb=sB(GS1G=W%PM`=rT!7cWn{{!`)4GpGA|l_yEfjazQ) z`dPYr@6qEg5A|i19^RthDt=XdQMdfEt^Y(~FGW1k{TNf#qgNcT_}SHY%eePO?AZ|b z{nfl(Xk(C7{B zpASEgvGQAOZIiu6_3)N&M+BzKck#UCs-4@Cd%*nS?SyN$FYXddsTA%gHVT7 zb1%BU;GS>vOS4zYzBl~MJN|38;zPfH$FVbh*6kAIeCoGk((VZX-x#MpS|(?aXL{nX z3125)=IIxbD!oD{_H^v?I^UF0Ho1S^;`J*RSL8oyxa%E%d|~p{Uu?C(mjB~^iP`ek z^1k_+`-^Xm9p|l@>HFB*xgUrHoQ%|X!KAy{?f&%_ti5qpUa(934OlGyP@pL+UOBwm z&AzT#%jDO|*C)7@-#l3||I+z4lZ%(0_0s#lW!JAqiCLC27@ayVy_(14*pv2l%Qd~K zlhlRc+|Jjk*l+Z8GBn`c65AYB@euC+xMFU}`;4ZF{p-o`X?Gb5i-?;_Xd7?-_#LF?M#=vkNSUobXTk zm+6Ec=Bj_ZQC2Btm+}qIw@&>mTBVZs_WY5=dNsb^#)UWXk2^-~KfFTt*1g3AAv|;K z7ZijnD!AfvZgarJxd$(Px8z-NfAxNbOD&rtmi5kbTyvn5@qnpT>Ho%m8J~Tc&l(?{ zR4sqn@oJ||mgcz$SLRPpS$kCcR(Gj(;qIdA^G`*sPv7$~z3OP&*Qn~h7Mcs^xy@zR zVZr}w$;|WzXVxG3cs`9&I-Ps-WuI>w6@NzFy!M_mL)SC;Vd1R{57)a!ZrZr^ok4Dq zox{;THwt&HS}bN+`Pm>hbN%<2+=;R)K5pr$a-6{J9&|59!olL#QjS|LGJm*Qvdo%7 z+a1ojuMoSy?X|yq4X^Pry^xZF5$4nXx&3c=xOw8vf1H;z58WzkIJ-F@=FJQTK3C@d zR?fycT?d|oPZXH4UZz@6LVa>Je;|8T{Kp@cL#pO%Tl8$lvzCf?0ldg0UL!{U_bb<9)Z4z50sh*DqSr=PcPL(yCWz zr9FqgX~%2Z+acdGtKXGnue++L>9oLP-{Or=JS*juWA3Un-}rRh+xxAhcTwk)j(@cw zMGxM12iV6tx&|np^k`Mr(v5xPygSe9Vne*pnJc>YCIvhHC~xp`v{qfdXPq$nialQi zj`9WGne5;@Q)UwLk)>}MZ}Z5lzb7|ODgV=@UK{52ziK^?dq1vxb$gX*(h9@Q*DITz zPn<4(A^L~Xr_V=A4C9@&e+FeeJ)L2!zr-(ZiGcnx$2g`+Z^c~8yXUlDDBp46|ETrm zp3nJ@S-<4gFBGrTHQv7A-1Ow_VQ;q2OE0iK|D^QIb8XS8b*!y6?Oor(J;JR#GPw7; z{b&34m*MN{FY*swBng}o{9+lvXzQAWJd>AF& z`*N4Z$pp()O}n3(tb4?BHS>&=bxi(+l7{!Zv(8MuwD(gK%eo6zyoyq= zsjJ%cD|@}Ti#<=x1tIQ_8uCe*Gu}w;G^${`xK6%Rc>DgigrMrI7h>$M-u%vD6fIx8 z`P-E1D^H1>&%4O#6}D*G4(6_R3%{@WE}L-Q+K9bgvn%b#RSidy1Mt1E(zpUr4GsVjSU7V9jg*VSzSa)!) zPrUZQ17Z2{%gVQ0tGdVeK7ZqlnxM7Mk4?P&aT>G9S~J--v)>$$U1n?4viX&4VpJ*j zBMZqn3p(etR9UZ>Rvsw){#;P;+O^9VkJmNFZkwg|@IqAY-QZKDGC9irlOEquG1av` z`O!i(^!QoT*v|d&sfvqUt6w^+S#{m+(j4{^kzXv9>esZtm?p9}`o^m;?rQg!+m0J+ zu*SW;_&uffmHW%R^WvTdR>gPa`CpXnzx-8s>t6S%g_kD?ra63_dF9x4&DUKg4f8CO ze?3msn(l0R@}O!+|EeE)TjoD_*sX!>MQ!u+53$$ zTP`y(FvzenFvwy|Hb zSTsdUXItDQFQ)nv+wNXDTDDy?`u>3K0eC{zBh<4vMJ4TZQg3$x$oyLI9|0_ z-he0FJI#0HOt+&t;!{I5Ii#>pi&`zb&wScRj)Z8&%aTjF(nOE+S$M|!-wX22FV4E_ z_%+b(@Y3J9#`&ftiw|9ppS^KwcDMTMYc<6mB2aF!IxGpHrY<>fyrQ!*L?GqRj2y_rt5_J19N*p;1_J*niSo zrMs7xd|cMhe@lSR=DXTUF`tUyCxurphhzuuTlCq+T;e~^_wtIn?RPQ{`tRAw-@ZtG zj;>0;W0itwdc~_BD>d^4`&`+?z?y#R1J~L;C%jjzJG`xIK8Ie(f{NR37nHw}IcF(5 z&%!m~Im^KlOT|*6mpC#^Lg7pTZ~3>HRF< zB^mVR2ru}&A8kth-@?m&ml+rsq!_W~hS0o})U?dJ)D%c=DD^w&cgR7YmU-#bpoJe7 ze0;%cv78f@6y>If&SDH#+QE+7WtN zDQdq~3s+av>a}Yx_4#L{uelta&Z)UfSV&F9>Yw&pO^e6Pk2l+&`j~fUOH+gX&AZj- zZNI;{IXiy;{{IXChrM~ZcT7Gsi;cJZ@`(jA+&Fi&8C`q&F^)@g=IT{D^w0B~cwK+; zd|{WnmYngD`_k)jtrsO5J&{s>w0Om>Lz&_Hwdad&Me}qD9N2Kl;Evzc$5y%9udaD_ z{kuk%)V`-yEJ2(i7IpoK_Drk0=cT^6&Ob|?MKz}Ac9Bkfd*Wt`xp{2PFFPD>7Dua; zEljk0HhaNklfC7OGTT4JI^S?VwE0P;M93e0v6EUo6ZVPS-JYgxaHjddd$yn%MQ?V> zw(U^2yO?XUS^UN)Gw-99cAPu#dgr_~8I^g{wYq{Pm%U({m$+|J%ITwqzq(4MJ~qmm z#3*QboNZn~N}=OXwd27y!5fcm?0qg{8KV;OMEy8lndG$PR);orc+2Q-I92FucH;aF zb?0w?8W&edHEet7-hXyO*q?GHugPsmnYSLFtjz3^+c`njxNnuwV!^h`SAWZMQcBZp1=Q-xMCUb0{K)$se&2ZlQBCY--k1x#49EmP!0`4z)<(XMrF zTTVRI5_rd@(%iZ`TSdj~_v@Cflq(ricZz%sVSf;Ru1e)_h1!!Rf@vpCJ_+D?ZSMB^ z`FYcMJs;#hBh6j{P?*s6FURLIX=wkK;Qhl^n6G*>omQEL~J3h(w zQpzKXqRCf0=U80H67?)$mV___6a%lDBc_5WYo{mxh; zQy-e>{vabD;DSL9_om`h&8!>T`d&8|>4=-!^m%LPo!+gV5z)@AHSfX&zI@qz9qQK~ zdRKT&(?9(&GqA$#=w>OigWV4-dE*a;KmAa{63+4>TWVk5YQa4Uhr~l`oR6BDe(CtM z{mIWsI{K$Snwc090N^fOlU{^bqq{%#*?E&n^5*&}q2KlG2s(SFf2^QGzwo*kKa z<)QG&BWJcSsXE?tJg!&O_I7E{pGA^M54tqemW7MBo;VP7UgGAO)d{Cljzvnu6}*`< z*_U5_mc;TaI%4jkTYgHpvdT_=-rIfb!=m)3?doe69WTGQWa?(#{EMcdZ!#-vx3wK* zPAWdLN%wt2Q$UTsm*bBGlb5#gPM((Qr?0of_xqBG=YoZ1ml(O(rS6zEhdJ@a?9DIy z(&zrwth}_T>_^ZsoeHtX;U9%rXFp2a{;6%Qv|rV_)aP!sCoGr0;5@KuJC~XH&dDG2 zMP;T>-*)Ue$Jy(epLgc#&b=LbcJ}j(eOI>@6@NN2^WH*E*1cz)G7Oy8i#j`YUtRs6 zZ*%t2q>Zw!fjjx{PPn_|WWc|P9QK;y8!?%yx9!h2|&hV4w zR$JMBRC==R4?o+v#xFmoxy7{@aYwS=eq}SypeyXzg(F>k+GV?Ey<~ZIxYAqb+U`}S z!U~HMrsSSj7g%s!%YODM?F*aN1+QQ^`RU9u)u1rpWdE6Y6Q8=oXV4Cc`r4weJv8Qe;31*cr)FL+WH!GkzFKP2tsWVJ-YdR3 zQ9sw547-`NYu)2-90o^iZ*o7qXe(9d}O1?R-qGjJdW}X$hIO)Wuvm&o{ zwC;Z~qxsCNTIXu%6<_A2bee~)ZOV&JnSJkr^0z&2ZSv$F?^(gQeDA(>5x-W?_B;4a zZSCzExudhs&Uv;SFG? z?Dew(7oU?nn)!Ls^Yh<>Cvp7`xbL97_k8C~gB99+pYzi9T&#YW@VG1Q(6=*ljx3Cu zV!wN4@uP@EVwx8ORvc3Ld!zpMnk$>b-e*_a>ar|NIJiObK)~Z8>u+UhrCplAyldOF z|GrL_qBLeCRd2}by7pqlMYg|cA5C7l+bq{na{c0^_WUj5YR4a~A~ApCr!xtbeaz0# z-*0#5#UZ=8Nt!=c{B?Isf9`*6j(scN%+@>QCoGoKT$$dlc*@pY_51vVDLvCf>~8;_ zw(!icsA&RGPCs(vzca3rntwpxnsE6X>%D7wIc1)F7O2m?VsWNlZ)26phANS@|Mv3k zyIN;>`__>+wI(KyX5Wno<3Driokriq6lDh`1`EfPHLayn7`JgdMGLna-coYJ{e|Z1 za6v03mYcR7kD|g7ZAB8!eu(5t2e#}x{=n()$(tV>KCx|4Td+CCU+{~`w#S=I3(LYCcfY(* zXMZkl*LM4k%}nR(mDe%-*FP2Y)935n<`efX?CdGsyy>mJWBj3C*{3t+#~y0aJhjOD z;=+Wg4{Byw6|B}fIyL`n4sbif9GkeaKzOch#h11J{{*k$(RtXHZMW>l-l;Oo=?fm| zY*X;nH&Rjbmh!p(zxw6TzdGB6znGrM{~o7Oc&T4Av{$p${m-4ZDV@tB9FK5$ZPt-o z{KRnnhYQpAHwGSE(-r*xSZs)e?<^;w4MkI)g=)pd9#eDMR=LT3n`#Yn`LqjPGvafy zId4mx{1$z~#8lul-_#Atf27KElApgZs#>vM``bpLcTyS)x3}z`UT~hBdE;HxBl(Hv zOB}9xRBUM3H}TrKYYi)6Hz@}z=f*xxCLRB?rq%99py;1XruK*CYMl%9xEmYn|5R}DsPzcZHeWeAd10 zTFei?)7U=HXKo{Y&I_zUh)nVSUlb9{p^xX?UQ*Y+h3gjq*C#L z{m0@X(_c6W9&Ei^nO}DA%%=SJ`s*3^HojZfYAPNpZrfD6Xp5G6OYhzfes{VRM6Ed0 zQrDFjz47P#cH@l7LSZf4^{aIz{p{@sO53%t)746J=c?cOm-O;O9Y6T5u3VKAc*^_d ziMOrSjO3Ru(onho?eL8h$F!29w7`PU$2XmIo-Z}3dj9*#gbSy-mYn{Jfk6YkO$=(3 zAVSwKwWK`1C>s*6twE>#4mpU}Dkm_m*5FXucVUMHYwjbl$88x-Exc>ZIE_n$u?}6*qbbC$tx{oCV6Ok zj0MljTYLYeM8`y2J$?E4w9hY!A5N2e*1z-gUtzY(9BR9^-QFm*@AzH6O0DGu&Wl7Z zs$F#H-R)OWZVF51V@!L!;eF^I47 z*Au~CtP;~wYgRpb(Wm6*F=v%_%L}HG%@I}X#@_2^R0jrge~AgoW;5izGW){H)9jxk zR9shNv3dqg4(*a*`g?WaKTBV4l|-@o0$N_(k3_nexk@~?F4Zw&OwE}XaH!|PmPe@^ zj3qPdms;Non_uTunu;=~DS&X}Gs=fXF{?EMc zw#)y1{e8Qf;rzzL!-u+fg;(E-+I(R~OXITEX|3*J*Cgjm|C^`6Jg?LIk@C*po=TVY zc6_f|bUZ<}>rK#7ah_+~Gf(79U%2h%{>Sfkihor3aw}46a>4VLoXs1TpJQ>pI=$24 z&2ia@a-aQNCR)a`+E_hYd8JO!WK*%{pI!1RZghtVt=imIzTp0PJC;SWJ*U1gnDRJo z1>=7XqaDh(c8FTq`CnZ+?NoKLs;_P@Sgo@&X3+B-kW z_wG*5pW~(4CapSk`~Ppx3@$8Lf1+vMse~$ls&f;zcMIKZc$pX5T&uRaMa%ZB&8`kk zoriLf+|62NlJu6(m~p%|DI;uc!p|dmueZLt_APwMy1;+4!;hL1Nr z;c!)S?`3DB)5V+L`Af_1s5Bdc)uyHL9cVlz%Q@=9&;tkV`RWa}utH5KiI(Kl9mStA)47$)J$?w)xisYQ8-Iq+-`Nhhrn&w{dh z>v@K45rHDCKYg$4a8NKS>`qKJF6{ znSUG0Om4$6j!$Bb&%M1OZ+Wnx&t|2FPGWGr2lKK|tus2+bW|+1CihseE|Hd4v_BX#@W|OpUb4-k)j_Bs^cD&B7ywc~UeR?ev zDx;)azvx$x!l~_dHXFS@X`|}D_UgRGJ;%P5?v&mbHO*F3l6mP*-5dq+V3V9AZzB=y z{RxpCr&X(?-=32WGG6lk(<`IABYT>Eo|T`s@xjUrY3q%ro$l=YjdmGZi-rH8^Nb7( z`#>X@Xr(da_*c&q*e;6PNoVseI|v;AKiR6#kWW`tv-Q(eA%)C^oVGznmNK23>depi zbkD}{lVa7eKba3oe^8raDOmV`u|mi%W(V`;b%Il0c*LDQbM8-BTG{@;zdnf`&?}R% z*b(Wj`Q`FK-8*Fk?9x-SAMS3JzOkk7x?B5&id9=q%@@2C`#)lj=wFW)ne|had-;E_ za%ai5=TuER86LGy=TWE6@g$**=|}yU1Z6uzBzG4@{q#va!hZPcmT52RR5tl+NpffBxBD+!TDM%-Q|2psHc+q0+_^Al?vtKLO1w|F zQ+uApKj>Rnu=RYYfU0D0o6&sLg}v2!dWW_a-apD*lKUklC-L@CXB(w8^Wvowf5rzs zj?{AX$e1hc9bx}kuShhMbA5#BmCYWfgysCdANW$lW?eP^sgYU?Uzf>LEBVzCe4!#U zHH#jz-&w)IG&6PX!G!A!d*-z>>U~g^UitBO?Z-W{*VrcBu8@kpJ>PNuslVRG+I9-@ zd#_nP&n-bR+{=kscT45``d1vWVso{V zGSRvCE;Fb#PW$l*o$IH()+NvVFSg$b36>Bb zIkPu{yC(W-<$w9TYh$c8C9&HJKhO0p%b6sgkZ&#UC_%m9u7r9(k?#E)Op!&Yl0r9_ zWH&G^X6D+$!qqb6>g`#56B?3d=`Gx_F7~$Jtz|uBx$g37)@WbITf9N%;P3k9aVO0t zeqY^r?seVsn)m<9`R@PvpsmiJ6D-SG@X)&MPx6Gn+KxXy_+Q%d>UeqcjmGyUKYd?n zsd|<_<*lfF+~>#hn>CJTGw#v*%g_8{;ujV3mP_sR6Q3P-{KI0;`zZcnTTh+Z+4D<( zwif(d+H-Hpv->H(v?cedF0SW)aQ)C*`;<@8nfInWlg+$Wnk-Ym{P?lcr`rm3?f*si z{;U4^Z{6@c<>&XJYrikm2psr-;#6klzw7*%<5?x}YiUh5h$vM^k4>_|vcJKC0?Tw#0VX4;F)i)VKBH?1!AT?bJ=1 z?Q>`DUHx$MTf zLd~komR0S{Oq2eeCoA`2zrEN)Mk zk)T{(_^&NvTVIdl?uB<{O7@BK&v155n}2oYDXxVAGtV4|i?dyOK+E(h3*X+Rd|w;M z^J`|i-Fq8idRczC%jV_Qm1Xm4ty7W%=H%#KSXmNT_U4`BJ>R--+fr<|Wij9N&M_ncLvv%$s$gkB{4y6udnr_VB^lyO&nEZaI8%t@6oOZSQxD zdu@01zV4Xg9{+u|^WSZ^Jq{Ioj+`%HChRPK(I(rY>eTF0U%X$4qy}w!p&KRED#YeC zZ%6Plr=OPcQEiVq)VG zG@P+$iT9@)yG-}%^gL3!T{d^6&gP>(W9H09x^L&7l{wGpY1U`<#)!+RhVRqw zZMm^;#oFYe-xm3z%PZKC5nP zw23mBTH;$*d427-)ju!)hz+@U`N#{?WW(%?jKtu}Mjt&_*Kn-qRGpKfsjy?9npreZJOHR_j=x4%botNGqQPRg_h?&)jPKZ-+RxR`OxH~*&OXdOQ!bT`nKrS zmRSLp`mPjMxy=z~7D=<$of^z@haqae%KbRz?GF>3bq^%BMXeCiY_ZF#Vm|+%p^>Mp z_1ol2cNQAdH?1+9xZ&3sm*QRd6$iZ1in6rknEQ$ev^+W~&8m>Ssp!fZlPgJETNJC; zF3bv@Ya*DoYvH0*_ts1CYz;A$TID%6e?@B6&V^wQESYyFNWEg3xo!#53&%47;;XuO zzC4PGQp}9pYx-P&^~=OKUdbQcHVFzRbvqtcG1tB@Pe|O}Xn#ol_tm3qQA@+Tg%|c^ z@w#RjeQ@oO$XdI~{EF4qc?)MwwO;ykUFY|8s|-I}|1qg?d0_*GtzgA$P7@wG=H?$P z%x43nKkRTi+TyuR%FioxR?7NUYfQ6VXZ>2UWU85Q$bmJU(aqCl8ip9lnSZFXJQi%6 zuPZ5kY;$CP=DhHkC+}TpSQzy|BK0Jz7H2vq*H0P~dioqQ} zuZlUxuDiu^RqtP2NZ*X9>QzTAqG#6pT$K6nrW&LCR-U$FMakO_g`g(tW#fcFwIsngI?5UJ)nv`Pj2> ztTVnlXXE8ruGiD~_@X=yg&&r0>5p^}7m#=-SyWI|mYZFtqPO|~6XCi7B-esw~nr(Lr7hda#+&Y?RnemGZAW2(-QeEviLpQ7JoNsrl;nL$)+>6)NrXFj`k&*b$)-=(MTKf5xa*z>Hr$1-CNO_%7ijIt@Ym6u$??_Ze0zembD zBYLK{PqxE>lfkRs7sthZGU(UumG${LcSfU8Omnv7Ka2HW^s+;(A!?ta(j=qPu=@ zf9Oqc3_Wq>^4+SaAknOAmwl^Fy)D-;HTt*c`2?GVCf`eEoczXAv0>7rm?JljY8=Z7 zN#b3*Rg8B@#-XZnW*c&kJT~g-R z(RUBUb29CFAgNKx7P@N13zI9E6)R0o&shAm*2aC!6_u#fhbOK-xK+OKM0df-8{6em zL+;)elXXt8=P^wABEiMC`mklL*k_vuURlMWTVFnT{Uw=WG56CcDSW#&cHE2iTHkeL z^T}+!y}CkOYkY6CN6SX;E%==lQZzH1-F?T`zJh-qS890will@#AMnp*2=W<^ey^uCa`7EpVsc1JxVn^ zoBhJx9-kao-f?--+Q64y;gwFQ$ustzdL8#t`>Uye&YsTZh=6yw8ec1aKYf1J^;JLy z&vRRYu1)K#Yrgz@{q$bolycW4t1INDUJ5ULseH=zoFw<@y-(-;e?Q^6nrzTtn`b=> zY*T7XH(cF&Dfm^UMWH~qw3OeJDx2L^iiAuG#b$PKmQ-lY@0V9z&)jCNaH=FbWmD`4m+12>w_R5GsrgT;ZF8(JKK#CH*T+1z zYsw|B0>9~B=vUwQ%Xim<+dqQ$booDY-@*NUv;FDxnbP02nCFKr-QgelpziGn$D(Xi zbIvsRcd1%87IS}Oc(+6+uW0}5^jQCsW*6_ye^eP)BQNOtT(RH#=U=%Ul~oe;$JWag zR+<@D6gl-Tu9lplCtIbfA)y|;U4H(z$LD{R%3S?mZT#=c{@*+5q$V0$^m~Tw9fl=daj?5DY3)0}!gb4(9= zQRiDB&A&bM?L$GiMy`pbM&VA5r>FF?TR%*5{?~v0@sgURm;Y3{K8QFzf1sl1Rpc}! zAR~BrIj3v?$JIBUCAQzUw(&f-%k8r@Q)&8&wD*EKKU6H`4<35AZF*lq;K#L(*%M?A zCY@i$-j`&^zVO1l50h%Mf3Cf~`SroY5hCmEZr2M6t(8vg-DlJEK+FHj)1vbyJKRsd zU9|JohTfWO3!T4jOPqdb&V$gq&4Q=?s|Lv~+PL56xxKT4osWcVlWxzww-xhPvrU%Y zXWeo?ePwsINL`IzwyUhn-297TMczC&-RfBOs3!lV%^?*>q5^j+%#{0yPRu8-?NHyj6ZCZ zKkQIH<;Na)YtHK!n5k`|nsLGxq=IX$sk#)SU5I zh3^K_s-$<~=a0F}F?6}*GR4s4Hfy5u!sHd(7iy^(ynboh5#T(7LF(0|6JK7lG2Yjk ztrReS`l7gFF&zFO^HW7QTBbAXb54z0IBESNzWb@El~b>NtzNTmd4zrafmS(dS2W0>Dhsiq_G8B?cEhzq#reIa7qS%tz2uVx%P9c#AY%n_}%d$gtB%P*Qyq2x9H zsM5ic{3Sm=DZW`Tr?8-4-<6eSy_H{uL>6bfnZ%eM>>De^$NzlN!M;oPC%nIX<&|vO z%iU{S_b=VEf40cd&&8KQtuL`==1G5I`czY{vZH-DXYJfO5B)r5&J|x7v(GF@vUARg zl%+BEUh=H6`fB=CU05QA`;#31Kih}zYTZt-r~H=7dih|Df@{l;{f}gi9Q`l$JTIX% zN<~_X>wy)scyprQ(?_rGPh35-Y`V60;*v|Z<6nxr;#9uTQBZd2?y?IzubzA{;aRZ5 zjbGBwcf?!XNO1eIH|^Y$>a#z4W}P@PRZYAiSMmR?RmTmqrB+HEHj<56_i^IKa%ba; zgSU*6)c}R}*o%PPuuZFYAW6e@(SkTdA>81wVcC*<*2~Ea}ZvgAnty)v_xBtpiuDJIeL7FzSodjI40I zH$3}1zP)1F)+BzaR>pJPm!uxk@SG~%;@8?&UhG)Bdhe&uldTzxMU$AubyzK z1>%*xiJ!SMLVb4WZojv6m(#0&6*=bvFU)_t_=Z(i?nCWwtxVO|LRy&2!|#dhE4n|| zePaSk>-6r=6_Z~ptSc#Nw=d(l-M{EH$F3i1cFek~u}k&ww9kL%CGgJs@-Oss;F7Qp zkyVU;%M=$T%g(x5b;!+FaWQLQsie@WAf6SzI|4UKtkf>tzN>5dhd!BKX2RX^*UEOZ z{rpxgCCZ+0bN%D@>KDG(s{Hxk#&~l7O5R`mKc>Cge>P-F`;tf2ZvUA6qaFDr=dz5k zg`I(+l9z!&6>S_VD6!nd2{MME;+m71o0Bt0(%SIsu*R{Jp5KA(iuy)P za-SdRIc|=7!gBSmfq`PlJ@q$FTRWS0E_W}Ie_a?e=Z@|&;YSsh`l}6|9{>H3QBq!H z&g8l+kDTLbA~f!4KUS{GIkrVy{_7(caiv{3j{`j;V9Zb2%9DS*`IAOZlNW zb1qcK3TMZj{b*%T;A6Y4EG@Kl&F2L(&%a2HWvN$MJL{EW^yRr4Den?JEhh#AKaScJ zlpg#LT(h?cUgKZV6O(@K!ttJxO`jX8%KdX(Gt%A8&$!z%?L_F(N4f2s zm-3X)mS5vfDaqY1!#nGzbCyx|&+H{v-XxmN7p!i7DR=e>_nTGA7cAwOYdfXI_)SrM z*y&8G`5J|>*FWvvoV9SlN5|J!^X@;%*swlNy;#pTVvXc87Oyh3R~E)AcYj+YeC=!4 zD)~tpk4M!^dLVr^`yXkuyuY|1L$&(9MER9K*5w=G zk3Htv*R@{rMqe)1yaSWD<{g^ck{$L&PUBUY+VZdSJTisTj$Pn9o4T+ic-6k6Jl!_8 z%{w}7+~Z4p@3zPJ;B`ao$I@K;I`dCfL|wQ%XXB@$Thkt8vfe*t?DXHdh3)pc9jlga zj0#jAf*@(;gU z(v#k*p1yOVw#m-vlU{C_#wR_^zcuxArtgo0c8?n$>UT{%y?2-VjYnG_wvB6c=uYEEQ=$CF>4&GE$j+)VpPkCC^zmWE z)o*3rzZ`qFqxW{wic2$3Hm!VmV^N^V^t}&m=cSuYo@#2UevhLx=}=RQ`xCF*;c?GP zG_=j!S5<5-dSlwVG-u7)BIEsH!b#Jg_VI-7p85It!;mAT>e4*7Zn<>%vzyeOk=d?z zCs|~zxF^S#5SINVO7h{GU32GaI4@a#CqBACHaFto$J9I3b6zhybwkFE`*h9A2E`_! z@Nb3hlxweXN9BjE>JOc^h%fZC|MY-2!d$7>kMSt4Ub$;W*@~E>56czL#0NzGoE_xm zU}Lt2tK<98MSoUBlfhp7+dyT9excGh`k!!G6S z2;nvH4h^b*e42Q_-P+ucP@ubB{KAfg30EH8(#l!lUgi|;_^LTPR@N^^5JfqJvLr8HGTW;Tdq%?{8fP8 z_=8cu)$w;y?boc!m~H9~EN*<7pCDE8W{yZ%+Q%zfTsB*n>J}EIEmO@DE*Xc_4n=EW3$V4tPMS3t7JBBf=E%j&9*aQukT&s zj;K#r$#i{9%3R@n9p?4+Qj@$g?2@0Znf;u-K=*vQh4N>ax0^E#M*eFIesnJ4iM-eS zqax=X+u68Ve{|j@X}?UO&S~!t$+ri+uk_EqtPr>C?+;elL)sYL{mRz8-0+r z>b!qx?+;nqru&z9;+Cp^V4rnZ{-w=7m-~m~U$Dk3k$;%~MeCoR_(%RbXXce0K3sJ7 z#?jcO}}{O=}OZxlQ-u7el6qHJKNs0_u#VLcVgQLtiRnpkx(-6YHr@e6UAYtOQU;L zXZ+t16PDAc`u#}xp2ao?E_{Gzp8FSPVEpUk$YFNGdAp3mr-8ePY=UZL1~M)JS7i#N?)?Koz({=Vbg z#eA>gHV3+Izp-Mo#^S!HoGX!^m`e3;tXQne_v+q;!1TG?SJswZD7)x*JDcy8o>fNm zF*otAo9nmqbZ?(?xNRrbxn0E^=VKjSPvm;HHFbBxbj8hig3`}foSJ6qn0(l%`!noW zUfj|>9lG0cTuwx--ln=XRr7nYpXGVQEbr~ylC!jrKfJx}z{8@qyVn-PKTp|vP<8j2 z{mVGcPwsyBb>IfJJXi;GMkmxTJ5FFR&JV?>9Y5e{G6{F?nj^{>MM}&$xR4{Y*Ufe&dcpCI*HK76t}Q!qvEE zNoo;vQX(kU|8jyz-M!MqIVA=^-HtQdOnE(pX;G7pOTc7RVWD)74{WOp7!GZr&}<@%-i8sQ3Or(dA;M z9hzVD8yi7T*m`LCf_7#kH;1riI#V zouOT*m-g*KO>)+Y;|*<&cdkx2AS(LZL}#JDvwnB#o$!r|7B;Xm35ypPo?6w`?vWYs zxaFnynRc&7Mm@VS-%F?G)%$%p?q;>*@`|##QD>*h<@+rS6_(KYsj%&-#OwFAJMXQ! z`sX75pW{B(VcVsyN%H32sd&Cuvq-Y5L`JD-Ex*v@Ef));Dq8t?IsRO@;-ON}*O)Hg zEFhtl+r7`Zr2pklvzEH93G22jeDO26Ktv*-B&YpvEzy65{{*@y4O^%hV5RxHRAfUX_vCPl{zK3*KWI&Wxo5?)pxhfZYv8n`1`I_Uw^WJ=ARkW z_jiB4Q@pSET=}`$&u^sr<(W75usBCF_lp<&XpxcQcsTh-2nYLzmjc%wEr|Ku6Z3n` zlxl;PDw`z_ixov4Er|J9qsaI0p_5J1;i8I=!xII%p2P{VHAzhQoLpp~wNzgJh`_uH zA6gaqS_9f17k%uO+9z^IM&`-z8h5_?ypO7je*TuKQ+O`V_R&eep6k(Z#Xl_e zQ>E&cJ$x<|cjW_j;~`$o&DVX>W*Mh>Ipq7PoxSp_Wuo8gOy2z>7v|J5)<14*(-r6F zIL%UX+j?^>(^6gQ-n(wOMtN7w-khDmdvl$hap-a9+iTaY+j7!*Q6$&wlQSF&s<+rq z&YJMt=C%|IQ}&~i6=`!1obiY=_11fO@oU%_kr|hS{AaDbdC$*y>&+KF1xt4v?UL&B z?hT3AXWhNe$KOUb;F{3Zs_g2uDceO~ui1O##^oCquI;?slh$!&b;0zf+i&Rjvbim& z-u-mP4MAUtlkcJ)^{elGJ?)83Z`QrkcT;!xO-vK$$i3&XK+KA9*_|cddIaxoJ^3Q| z---{vjm7S>b}98;%u$=S;_0N2*>c(ETa~I(PxuM;b5D7)=2VZgq;}}?hv8CnzWl#7 zl~kn4wfmb+GG|FLKkTmhwX>zGaNY4dzLcI;RRi1qX0cs8&3gVK%g)4QZ@(#GF1#ct z@rqYkPlZwK#GcB`eIgT=EOgtfpX%1zb5eP-Tc3s2pV)6Q3Ab*gE;{Zu!@K3t(=!HB8ZeqR%0KYx-g<7{mDR#ATGL`tyD_6(a-d(hGeP+5zRjPI8a{Xn`3zZYSFVwjR zrA4iucq?>%dOr(K+8RM~Z>7p+(HLQ03t8POd8xsHn?jdWW${g0`e{y|SkASJJ=~=^ z4wKvNzpUWY&;GHu&;CJw(QiFj@e^9cR8B3}oWUR`P`8yXq z*8icsI^y{Kg5`bTOTYAdRFK~E(dCTK%OBSN6d5f42Oqz?!~OWu8>h?`EN1^NG{dy& z!=xM|;rFI@w@i#QdYz~}^M-cgzi4;1mBABMc10DinJSh3aewr8ecyGJPuEpv30tgu zZ1v^!jgD@W9p)_0`kS)+RLe53yIXT)d zhwV7+k(-=!?6`ZAq?+RT2h8uC6h9cTKU8FTn7TLT=ADquLGOODh|S|XS^Ds}r&umu zL%|h~u#`h{({6Blzv;pq&3Bned5U&O_}fdz+IrvS&f<9C#H_qkuGi-ki=*u0b0>m4 z_lap2T+0+XoM*X=d9(Wbs@xvIpr7;1xDtx}Pu)r`-<4UJ7j?`?@O|&?qeoxOo63D+ z+pg{N<}0k^x!s?)VmWVkS}#ld--&6z=RNy+M`xqhhl8aSlfEZ$9gDqi`M62IcfKd) z-u)BvOxK?}p|@~Z!^P{%t>S&3{J&qH+_gGyPR%_3wvV5*Kfka)EN%Y&>hT9>`h0%y zs%#f`IkzOb%D4M_N#ib!=+MVsq&D8LSgahSzd5?J+2_JGwoI4DIm@+9WUJ(fXLMGJ zYr6H+7)-mpNw~)E+=IM2d*)?_yB1x1%XZpp23u~c2hVfX&p&SN7Grw-z&#*L=s&;D z)Vtwl-)zmw3;V2dv(#exhwDwgHdjwA-+q9b|M{g;TJIHHo-Y3I;kj(Xd&3{{&)V2? zWz>UtB6=9KRwy)e|1`U6=OH?s;nm8yZLLB3ZwAhPU|Cs|_f&ytYN-2zwR37&qLyws zINz+{fnbH(Tc7314yrYOj_5m>zPsD1nVu*u z8h`Gp!V%6FQtKX^yS?GA;pr8cYki$H-bl3E3$kqRbT^Dl2>u%ABY2}f%g$$MNvQ8r zfi8`Z7~_V_qpHjrvIo8}p0Vhf8JA;g@Tcag#Z#8hT`})YBD*Ytr`5`=+r-7KGP!vd zu321hP2p7kZcVNg6U?8uXgzV$dg9_`_f~~#=A>Aa#J3L!|(w*tM z))-&gTF4Yzro!?oX4Ray@YgK6a`IW%xpY+rUC%lfq@|E){`+8I)wU-uICoSr_08K- zCH(2~VaIJJFPcS8{E?ZlkNHETd`V$);zH)udaR#N|7tcJsbZ6<= zzjlGI9>3c7yFFgw&?LU)r@C))d9?>zJ-F78~ZE12|l))&gFe`&H*FN4K7?B?<7@HTU=Ht zt(`VGDBR$C?3p_K=AHeFa-Qyt-|xB3R~7$t*W%0W!WYMTcbv?W`24`SlZp4e*!sn_ zrwo=ISpLxVPtWd|*$-;CTkpM2dmyScwK040LCy5l-;Z89SEqC%E8ZY~)8mMBhH2^f zQ~OQt%}QpD*mkvVY0Ol|6`FSG0;gZ@uS$Ht7x-7J^yb{xKk|YC~WDg^E z$DV2P)+%jsyL0ARQTL}xSw+*pf3+3+cV*v-nSWbmKDXw7#?tvd2Y>!h(D&6hU3Z{8 zWJ-#Rmtvddlj-L!zvkzD`Fri19lYDE_kFjN-Lj@;ZAtpJMP82k-DM=|uA1+**_OPe z<8Ahfuv@!(L-xsD{&78H%g$*#f1Hx3k$d*dt@VA;(TMY$6-PqsKFLo_{>!&~hxRei zuV*GMiaSwPbg%A5HlM6SooCPfw09{rcE|YJcfWXf_edfC`l;0$Ilk{)qp5mnqSCqo z!LSF5S3MO8=#M=zeYM$3TgAxYvp$uwZQn-<^R-B;%5Qf{d} z{qnj3>2F;&yuTCr+9s@S{Ld-NYucBa|MAqv-iHh4ERNf5fA_W2`atVHS{iX*CBo$0 zVkh$Zv+yr|l$g5MH*!jBDr3{4PXF(k%-<(_8(o)+yO8}M&F*?}9s~MK3*VcgW`d5m z7G-8&&_nO9rKaUTu4{vjzPe?m=A?M$rR75#!a=dw!k}ZB@4hiB{G7NZZ1uGjTh*cq z4_@!;nCheuYOr*He&VK?%P!}orELDH|MjT&L8TuLlI7QM{ZssS?#-gsh8+gq@9lj4 z&N4my+w1k`;~8w6wsXmE*ZOe5?BO=fa-SWqAJ6MIZTl4Pab-frSN`=g%shiN zrO%E&W7)Nv=iM^7$=luHwLU(|uo8O7C$D;KZC~Z4)4`eFTrZ#frdqi+$8%y&b(X&| zi|taEEKXL(MEh%(Gge)7>36@l`p&8=uYPWxzL;4n{Qn-WV|V`~M4Sn@)Xw9#{CC?z zvlA6HJI>x0TXeP2&MSGN>e;l+d7l>kT*ttBhkrwZSA&)w3r7HVfcshZ_JyDKFO!&6 z@2|pxtSnG|M4u+3KPChJwE= zOFtasoWozX!F8kSlmn7S^Id+=^{9IwRC?=YcEpiMs`(GJ9-axi?s4OU&f_Y@%Zqb1 z9Q~ktC-{oyRR4#&j~C4Sex-cPwDk14sDBFc^?&4F&{}+@%B#F}_O&})>jKtYn$aE_ zbL>z)>Rt-VKi9-7IT;ung&7zO2qzG)#InTjqQrs%SigR51ZRcFQ^~sY^0M^JlItc2 zh&hT26%-4uQ(}|SVmzhA=_J52@lcAfr`pXkOR5XLOpsH!dQB{6E$f?BuT@J;J@}HQ zEZ(|w>$Pifw=Tzh+qZtXzx;%K|KFtD^quDLTjl5T|NH;{-v9V-U%lG-{r|pXGH`$J z*YDbB&hEYOe0TMR_%rvGKZw(h;rvwF^rueWuHmm-MBJT*-?le2=gEs4Zr@|k(7dyP zL0-&8Uhr`9&L0|bK_3kDKNWiD@I5ambK&9F{;^|0%^_}iJI!;oTH^DM1sd8cdJtIn z#PDFjneMzAw}=lrn$%lvoY%5g_n?@|?!7BRwQWU^O|^~1!-K&|RhPP@FKY9=3cm3E zV1xMQ!c)zT{PV=N@pV3wOgw6L@XMO%hy1lIln?IJ6}h%3kaP02ZQ0gaPHjlr7Iux} zQV{35+-28RdY|yVy}I9(XY5BCapy~d#m2Nr&pxcE)(l^udqnp zn!r6vcN&Xn#;mF%V(ULAY z^*b3Cm3#a4!uN8C0ej^h`vt10cB>WM+k3{KH)3ncp92~uUS^&Xve%@=c9{F@)w_3d ziMv^rZ=$q<_L5ffOhM;0lU*zs=gHi@d$fJ=(Fp-nZ~u8ruu}E$-mE++Vf~t`$+=<1 zk}0}En$rqmAJ6bfysI)c2Jh<+(xztORjwj9(4DxI-m3~ zG-Os?e8{p|DJrALBDGa)0GCTCKvT|)Fi)x0E zua9obc_#|DF5Wv+ zn`ITpBTLcKAKcVByYwHP)>^f3j%A_c4{7CH=W>ERs@+-i$Y$RmpP-MSC95jr;)6dj z?OXT2RrJ1tb+GqQ^N*9d@*m#T+SmME>&HAUZhdc#nCwKZ*>Qm%YyUVL^1{d^Z)USD@UNO~j?W5&CW_H>Buq>42T-X)gaW?)@D(m`{ppBGCruXI? zoN3^CH2*_1=j6>x#C{)5ebu%@(%9|} zJ-@^F)ju)qNBJQit^dpu-FY>C=0CS%`K!C^J0e&gj(zWc9l`SWeAq6^!{=Q&l2Gpkl+uIt+WV7=0m`rwb{f1Hor{>b<3V)lFQoa@R( z!H2GBfA!wByl2~?RT6h~XC7lLl-4-1;#}UxpN*4p%$H2(;oNz}QaQjVZT>g64z95Kd|RhQmMEHzjrxcBlc#k{^8t)sJj@4VSEt5@uI*jC{y@)CvCefxCpcHWv) zP%M@rwO&wa`wF$mqCtgI|INP`RdGRh^Q*}#W30*)%(uC&nS01k`u4+`x%!_>UtiVD zx?nK-YwYW&bq54R3OUo(&wt5Ny2+g-T2K5;!A_m?pSXVP-@})vc7J2{&!vjVi*_8e zn606w|NG=_E}^i3cL%iA-FzAR+O*)a#XI7d+!ZF@Mq`=606u(w~16pL88vl2>um`25ZVUYc)Pm2Rk87l{1~ zm7D+EW}UoKUGw?3!E6BmPdy8M*fh_0bmUn{=HnW<`K$R`o#xrj-W5J=m;PF*ruB|< zq>h+yGVfTotw!Lo>XlHQq&An;&x(uoy40G7oZMDY8BuTlr`<4dhS}xDvv;S*Y51PB zYK^Sbuu5c4(LF9!*Vx?!Jnfxzw`3%5xh z|6n%fiEasB`D53(XX_u_t(f{e?r_{6?%zv1ceu~${d-C2j`rFkwNqH<1!!jLzmljk zSG}4jE9|szPu8nQe*Ud;$JwrYzFe#}@37mQgDx7&`h0KjsPBL4_t@`Tir4qsK`Aju ze3zIOOkdfkyQ916NRGCu_m&jddxw@3B}kvl>e|#cUMieKCqtDUjbF`Psnu_*upGdd4rgg@H(|YFQ zZPh`7rCe*-{SxCUH#NMBXxkjR$=|O3l;Rox%Iyg}@7Xqd=<$Dd^or5U6DAhguX0Ob zUcS(g;+72;nrrp!!8Z}B%`@I6JX>wy^b_NR(k$-r1DSfp)0{V|7$uIJP8QnWWTd?$M|1VmSEoMR zyU>4hQK_6`-OSAmd3Qph!xT>6zA5|K$T7v=_sN;cCqH8LMqEnnUtX{|WAV3X=Y2U= zx!h8ZS$B-3&;QZ|IjORyb@oTgiYM`|n7)p`qyB1wA=^e4=RKP95)J1(+i6_#SSR|B zrF5SuXLhhc&Oz(9GUXdM@8mWsY>s^M@Qmlr(u(OB;!|Rh%q7I1_NFi1)xCf#p=Lt- z_S19rUt$#zSU87!#tEk73%=iQ{T8?8iE;ntnnlrvSLi<7ENJ;3?I4rl;3Z0&91IK( zg%}uA2sY#Nz-JxJ4X-Q-377r%&gaBzpExNa7A2Dd0zwi-oSeF$EMC$cLCbg-s(N^> z>eZh-{mI0Wvn{y2V^?kM+Px_3XzhCMs|=|Mz1wzdjk^A8|7lCTfM@SHyP}-_RCK`EUEc<2FvdqZT>7DPAZr^2xhE_Vybn^`n6`tk2!7U z**~(@1m@YVd+0ss&h+LVT>Dl%>{QtH=pw^Dwa{AIhI|$S@dK8;&rM@4d|2Y(yFXR! zSn@ZQAcy{&+h*RHZg45nST~@0d*K}kKgrFT)4UW6s*(zC84CEHD>+G_GE?X1duk^@UZ! znNyb)voDz$-JGIn5K*&hH-oR>y;9{l-vsvPm0f>u(7AT;-;Mhk?=4LF>by*4`^Jjp z0Z#+eQg2S?T7K=QUHu98b(&JZKs^gw)VJew#vu69H?@}v!QdQ;%PmTNXVw2A# z6Yu2bBK;dop0I?Sky!b1-lf-DHH+0M@09$NQ}JAXZoAOywo|(;>#fZuPLB&Ibzib3 zBtM|B6i9ylvaW4;iOz%BK7z9Mo7O(gjIf$_ zP_**(Z7a7A4F^75%9+;AUV4Y`Q`U+0-2D^h1zpV1+PlF#TlLu4DShuB>}Hy9|Gnpj z_uOkvo|ZdxOEUY|8*54P^re|hYoC@aJ6w49-W<;UnGYk?RhO(hziGO~Z@;(}^`Mh8 zHwfzOU!N>q_PT=4e!@LV%?L}XMUR*Nh@81N z^1@Ho4z3Ff zX<+(0F?;LB*SYsHGhhGx&wi)0?Ch>ZV&^w)v{@V`YC5gSZl$l}OUKVDOIPQ7 zckNQx^SvgswMut%*#;iFpBDdW&#~S`uWp1Y#UEU{^pmyLgLw7hUHLM%OB>Dxd{r;I zr(~{Uw)WQ~-DNALzVlrER9|+V*#{BZq^(Z7T=^@cym%8z%rg;|`hviP2; zfBntkd%OBy|65e5{5)rqO!A$bQ{%Up>16L``ERLOWPV&>ztFBO+b41-t}SmdXkh-s zb<-oZ!S;jp&4g;c(6<+5rk$3|gfhGVQEpG=DuCY7w1e?RJYq^#wYDYtH{J#eUR27B1+D(`b~p7VcO z)QifMB%T-8=5??4oU(>Ne^ev0?B@%t=aO{QOM4=!)A`I@t)BR4jJyP|oPMmp@N51VVkN5jlUzmL$CABJeLrhg{9H&j^u}cMa zA`SocC*Ja|*T1T_XycZKs>V3h7_i_%McY^+*m5%i#a!Si;XO5-4owW0!U>u&WZ z)K~6`;9sG{JZq*{?)gpXAC0g39nagG5ZuGxEb*>sc>0z9`O!a`>WQU3a{}rqgPne#dXEujl?uyZY5S>xZp;ll=nTdYun< z)57y*&&Qqqeq!ZDh9lh>mp|-!%D87n)M;=uf2_awGt-Ql(K}!4VvrAQ-SvFq+4jWzU;)#T?#-IZw?A8cd+tk1|8(xH zjP;9Z>(g}pANm>}Iln$R`;Ybg8}$aW{;M>buX5sGk4p|mUo6{bXk=hyVA#N*%&p99%*@?!^Z=L2OopS~+!dgC@6(Uz<|L;AUmTn};bWe4F?_Y$?;fduN`NFyFs^cKY{cd;iy-x2gYdaxcRx7Y}FEb=n8QV%9%m z<28SzCThNVhwIU`T6w{R)r?Vv?M>EC>!!Ck@!u2QXemp|C-Q=SeQn^^K=U)$0OM?L*hPuYdOIg9Fh?$clW zV`7{9V|A^#z>mSA_Q4-kHS9lLX2f)Gn)lhSX}*_yO0RE8ztkD>U6N^E#d3!SkK(Ma z=5kNja^%fDsqX^s*JMt$E}YW6`*LT+bmf9CEIZ1hH}^ybTYqHg7Fy|&*69$pBg^!t z*^NT)geq^P)U_|(zuj_a^_g=^R7E!?rxk6T>35>|+okz0Jp-Iv^*DKT&!(*Z8u)fbD%-WT$;Ym3n^hahd26P0a#*}t;&K^QdvOf~ZvXPe$jKEx zW@qnbs|7JVeQ5f=e9@NBfc{UMGE%Q^Tj_62l6?92NK9i;{|5WX9@k9L*KC=&@v@NG z-B+)b@-M0uyt(3Ka?MM9!+r ztuil(V}e#9iMx|I)1S@$RTY44bGF-F8Yt=K(#`|rz!-cbju-RkB&S^79;P1uKQ+5HFe zUox9>_pI2cCiL=6|JtoaZQGZgiF>VdxaXvX_K&%J_aB!wF6K#g?w`7?N9Tx#Mcdp> zJiE2EHXJFaKiM+bu;||+y)%YqQZBt%6xBD;Lvp6v=>iESt(|9_7f+Ab5Rz!bd`M=x zi&9Ub;oP?$=Y&=LICDC1&aI2ft)>eno~uZ>_3rBmUSm;n8Ew(!3e`Ox2~&?x$uwA6 zRXE#irl$Dv<0VxuWDb8RIXg@0y~&~2vRfw%Uht$(?c+~g>hSURE5GAhTTW)|UAI_v zHH%Yl+UmaU4}!AKJ^t7~;Pw3CE-UV|t(FIh%@<=pofOvcBI&abvt3k<%NW0bWq=Y}K#Qnd2DzslpVD61Pjb2T)w}5{B*~6{@Ro?#*6P(H`UwL7cSegfA^&g$|b>kTMlnI+F4{~DY<(3yUk0d zpN?|7Q`0xcbMf7cD#uNqFSp(?Nz-ywQGb7pnv1gZ%R4b2Jd<6!IQ{oc_F=lVtIqhP z&!kCnokGP04qk0eP7CBS%r3g%lbEWwb?UopPY?Cb7WM2K7v`7Uc^Ee9^*qnX61@SH zJG8#XgxqKki;y;ccbcX2`|>-^FFF2I*s}Vac)4AsgVi%@^DUom(Rz=cGPx#4=x#fs zlDd~=d#R_nzWjNYrlo0{ByI<#YnJPaNd5^4@aiYV0}2J;V{=E z(PKS{{-^lYubjTyK1MaZPV4a5_U^Eo75jHY*6E2CoxG7ADSbEm)GrywBOCuntbB63 zUw)R%%9=}0R+N;Viz|QL@Kmm0LcV*<`Nu2Uc0ZUGZ_Bc=ncr^Cd{-u(l7g$YEHMqH zdb7FRJAIQ*$G>H$Ik?C1$J2T9?=s(vJ^3!HO#gu%D`)tH9E}+NhAv@4=ERT>n@>2H z&i6Z1GsmZJ&My(=qq?s1wDX=ZY^j~GQMy%@`9ixvuDVH_t>LQLiQN@kYa<$jbdDUg zdFnXjfzWm5rmpNyr3$CFcb0!L&t`D_9k5UOvUQtbGQ-hk4!(sc>RlW&&eRI-)OX|X zcH7Z@tWe)UX4>()^Ov=@F5wM*|J9x+Rbr{Ni}$@pr(W&l|2^f^sa>KI6K*P;dhb|R zy7d2~U2`?=Jrcfs^!3CCXE?9#s{ZSw67eu@caPG+3DptiJ&PBuEAKy7&ox!H@?hj! z*?$k-d~=j3jyqw`kt}fB?X&aG-3IOtSu*J!z+x}jV>$1HmdizCJ=~w0A`i_PDF3bxL*qxC(u;=cImlB8mB)nC4 zrLrPVKz_nTe!*mc^QDs%jj7jo$dY8&hdfx7IO5oMvtb2!=1cJ9bw3FGs)S=~y(mx+F|i!`FRPZ=8=so;xtAkrQIC<@w@nWsgO-@}JTqMRSS0G)?Gq9%ZeI>q zTi^MUn8qm|ER&ItW@^-WE@jfZqpza-g65n(l#x1deM04yjXLKNA8vbWBK9Rnte9DQ zQ|H!O$E0FUYUQS%j5)E#LFi9b)+|8dzzop%D~ANqY%dMA{hIJ-jn z`>(FT`T8AC_i@=gD4R1q&~5JXz{h#Nl8mP2(wKraCeCl1T z*U-!p5>+bq%QM>H@8O7k-k!kL8~*y+4clDpcxQ8bJy~=-bw^B@|9z8~gDW_;`$uqO zu^%Y^*xyy2sIg;HjD15Tm))`ltNv!(;+Hv+^u1zf)9U+fiD!R&c03cdA#&mK`$u)W zbS+%ee~RWz{L{ho#y!J6*6>!g*lVBi;HV35b&wsbGbOmPc_HZLQpYed3D z|Eb-4qqBQ*ON#)90&k1^CeE8tx3pT4ZmJxZrV`*3#C)w}lQk#v?3*R!)22t|9u0c6 zI3!wk?R)o?VY(Tc8;?!97A`8f_1gE}xvzi!{rxlewPm^bcTT_m{ij0x-qXXo|5otdJ1zhI^TWS?{x!(UA8AjybN+qsp9+U#?X?nL7W2t} zeC${=Mcw|`F8g0T3q~j*}iqL&2OWBS8e<1R#xscK}qP;ZDF@lA-tR8dzWtws$k$04LW);*uK1|sJqi!wkzAmS}^qS->jhL`Pr9}-(3wB5__)DtMc_mf!3DR zxY^a6E}XNs6}4@fnV0bQ-kO~$KRVL#)RK395vkS9$tk)$({GuOXH$Nua=!d6_hZ{c z?*x=3M|sOl3z%ImA8EQq+K}^gQRC**6K8N+9KY3P5S%vq>x}5ez41+FxVA|@IiM}| zdB;MI8u{amib+Yaf#06DM@|giJHu;smCccJ>KiTh{_0pb>!r%d+d)UB@orvq&tpX| zYv*}|0JTH&gj0@95}8{$>099SXKZgDZd`dF_IJIZ-h0!lFaG6~`YbrHL*wykp>3j> z?uAx1Qy#U)G=60A3-NjqCSko|X(H$8E`|?kTQ44AEDDTW_+h!u-1+((ztZ2#EOWJA zeuRtDlyAO^kM7D@C4NTx)DFt~X02Lj$j#Sl`|$Zjv!tG-zTNB9m(9{z_@2{y$DKt> z)t!>IdUSN%i9NFPb3lmn-ncV)->CM*)CqU>F3_g5~D0xSB2G!r#haP_Has5_J+yw{+cfw zmN%Wvn7-k_T9rB19vkYed>~yhYtgFElnqV!k9PFrYyL3Xw>W`&TaaOnsBPCZr5jq0 zcXRD)e;+NXXS(8e${&Y={2!HB?T`6u^zpLVA3dM)C+48O!_1O#d;piSbKd zjaBO5EU$jQRt@Pd*Hv&$FerhJGV4$?fIwm zynI?en9DRg9#3epf8;;KaLtqRHlL@os0J&F*yUt3bt_M+_#ZE_N6LM<-$|~L>1X0o z|M(ufUpObV-!sClde6sg^*i>=QuY+R9owaGx9GIe(Tshsd^cKd4)L*^yE%3D;qIlq zkKQfl>&?8g^Sa2pKx5@8yI0OU;U~B=M(<`z(Y^Um>2GhWvyP}eIAb$MfZ3(BhM7gy z=Uh*z`*wt0W>IQe*=x{J)9`-I?Ug64o4L)|79~`3JS6$a?6s9Y&R@&o`k*0u@l)K{ zH}f`cm=L{UO@>?7J7GcPWr2L*OH7P+ueM#cEGTB1%$y^0UMQ~aRzCkdf=hApkJAf% zBk!$VR<*@>S%;=qeZQjJv*+2z7g_NLN6*hYo}QZ=yie@8-jQwljNX+T*?#Kot_;7z za{^l@u3U8QX2cH3Euy#me{JlkyA$KO|HGay#o5YnZuVj8maP}cS@hoE*4uog^Hb*? zGmUw3bhg*_3imbJU6v+D+wOkxI%~=$y#wMo>!zs%6uB)ZxqMmwne&7~&8m!$*;5af zyX(Q{QFZZAUZp6Y1?It#iU_r)|u=E_hl`?&~C;-zDO|bhr;|2xoIgrm}IX2bu@$ z?KtU^P{`)(cl*~~r*}~colm~oSYi;jzxBFr#hdF^$Fk2oaNW%Ku29BpuJ10s>kpqk zGGN!YuDt0c+(}>a4hXU*Eai=O z$xxG8cfggE;kzh;xW7nMAwb6xUYS;t^5xcB;`+j(mB_nTNPx>PHeuWpH!mAsKKIbY$rn&(TQTeFp# zH?!Dkd_1@Grpe6tswNq8gPC_4vp}eD`D32BEX$hA zeCy6>-JWEw5q0dd%=FZ$-Bu;)fxb~4qu0^}R-xC>@?cS<$TzGlobQ$H~<@0%#$3p7b!z zY1=-N=F+?q?J^TW%~C`qON`gvS8{S#q>=JrvDkGp?axmWHcw$UdfYH2*JEbV`>^h( zhTIxX$4}ew`Xv2z*swE|DK~G!=e`8q8wrfuJ?_n6yLa#&*S#?zfH|x2%GEm!;xc;| zo_WW+{c&%lS@oUS`p@qEQB(Z->_5^$vWLUctQ8)d78Yk=VCZ3IU@*qlYI1RM%gjkt z@vZdCD<~}qE-6Y)%!Rb1riSDOONWZo<&_hITh+nb$p5_^JY@*@Jz537ReV+5& z=KGs}AHVy%Gc5a9$y8fm-&t3q5Wcx+$IK%#&z`=TCSzw(uv?njvn1K@6KJ5%kv zJ?|X;tFr0Gi37*kikMFNt`Cg8lUea}SHlUd=Fci2VvNa`@84Tzz0jd%b4L3%hn!@` z1=@ECUkhJn(R;>KXBzx<@1*!Ur=~D%-w}KM&f_gp_HW+sBy3Kk)%_A%^Eu)(Jm$W# z-Kn-f|Cg)#1D|tW=dky_nkH(ZQYhxx~a<5fdbN z&)r-TlevejPxScW>;vAXe)leT;PH&<@7z|Ox07~sey+HBghOw(#GwV9n=R54ZXRLw znISP@S|SfukH>SLqu;z{UTqWK75e<$*iOUta>OS(sk$J&ciEXc8fXfi1RcJEFedJLT_?ACcGE@b8BA1)tMQo+1E8&Hs7o_ z+{kNi?)$p=`MGn9UEBZgx_&M&`JC3U&#p4@j_Qw|2c{f7MO)h>{vTK|)vjT~JjJw3 z_6s_N40pZcmFgPS$ydl7p5fG0yvMgE|6;f8BYlBP!S$E3geF?-Xz-rHdhdYCl;qZn zpK?z868!bPBl~wz;gN$H?=G*?d=q!>fDliez0i*Pjg}&b`&QPtHXYkuV9DgaI;G~8 z&h9CS*Bce0)&$MyVS3)Fs_p-;=iS%FBgQKAwv8JW37j+AtHiQ%Q-t|_!DV)8g|VN0 z`LDUkXLeF-w)PGw#hAd3o{Qi7UF=?U^lVjH9`(vBW9q57*Xv)NJE>irn)jvpNb>K@ z+-36rYp#dwsH}c{;o}S$vlTzY-^|h%{Z}EZeCYbh%C^|U>lya0+jwtA(ELmPTkV+h zxm^>j78x98&iQcV zjeLChYe-mnq3V*S0=ApNZ*FbddT#GO(ck53?k1kUSnWJLdZ%|k-|O?8Uhc^eRYf`6 zDH~%BB<@rdy0=hc_mYTbU&C(b+1clsp89I)&lGy$tJ>8t$EPb4R?Kh=&69jzu+*@O z$9%`7sS^q_nx9F?-V62G+uprO|3~J68IKQe2f%x0pmJt@tn;aARtAR2+zbq=gv%L7 z$WnxwcFo$$G$Q;cV(vE3Zvw|*CdbsKl;A!_D+36Zk1-9Io0--{B1Xuv}He;BkxELyNSd?m-i#u*k9v5B~yKu%tt|dISiAR<*b#4)xe~yLkQc*%p{D+2VA?*@j>LHsC^@pw3FNv8M&NNF< zLwJIg{lsfNUsoL5aBghX=|QdpDM+3>EC3-(sNgMY!81l zabCPV<5ZD*!iLPERg=zcShz&u+$`1QYnY|}_698KS#$D2Q0&Bm%Z_Wje7sC(wrub- zuFj&MFNcjIYo{$dXZ>h4$0e!L_1i;K^5YF`N@IFwI?Fs?X_0A~dggLv=A9GEl2?70 zv`EwcZ9{?cF|nM~7x4>uY(>{9@Yy>54VcGtusZCR!Z(98`r=dAHK)uI_Bw2&_n=a8 z@s8P#Sta!!sY>cU7L{E8$h2)+P-ad(}_RP80mcA7{lXY^( zth5^v!C&Go8?Sv?*#Btbs*7(wa`4+k)m%`1Y#bx>r1+Dz{yF3Q6F#c$TlB17dzn+J z(7l*tyZl*FYjhXg2zcioa57`#|5aXRlUcX3-ao$uJ*jL%24Tm-3I3OO)Xzw2 zy@o^18CLcG!^Ra~>4F33HZGBw3{>UX!qClWTM+Tm|z?dn;% zM00ZcswEkgOZ2x0DMjY$$Vy-IHB~(Gp;C2b=;0Fgtruzqqn0@yf8%B2HziMOR_OZm zzf7GLMR_VHFZzDi>T1e?=)V=dSE^F;{H~s?tKS+Hc}$BndSU#Qpy>UJjs7f6TAukN z@=Dpgr(H`nX0oz(E3TcpC2#&GmaqTzE4i;}UtGnc{9>7TJ;S5+=FaX}FU)@3a?@VC z_1u1jZ_K$lJ9=0A$Y=g?zfN%=xSPxP zekIcx)(yt&*MlD1lR8i>7{g{0!?4dm(K_SnkKzesx5`V)Vw$Qq?>BA_wLJ0s?VC^b z`+u)rlds%W8d+8eZZvq9qJR(PIg{3zp$ahH1PW^R+BjKp4A1rXJ=fl;eCBa z_wDryvkw1~F?({s>{>bVlr`U8C|NDyeo>NtW})|rXAcU?FYmK$pIx-0lF|11?>pQ7 zboiS6X^Q)`H;89zuMqdGLaucanQl7G-86Snc~92XyIiM=)=E5CBf2Bwq+^Rg7{?{n z=*ROVo?7_GKTO)LHHABHtAm}ud!?Gd?eP^m8qQjN5q-4zhOcVb%Jt#V*Zdbxo%fA# zj&Al@hl9$}?>4^J8zMI`rz&`51mgp=%N!m>>@hgQ#lSFIoPj|ZU+E2MBSOpW@X7?4 zRMG#wWt)v>&RueH39s$lVDa&9?9FWItmmRZX-mE1(d4OfKJZ+dPj>EB>2t)U^8 zz$!AqSwLhfmy6&A)}kp)u20f`2> z&n`6gGeqcJUG?J7JgGTNpz*7w+o3-S+bwcu5N{(NQs8jV`BACU4LhA_?jbTq7C(A> zI_YOu#6GQQ$B%s4(W5S6v+|L|orMXLo0f~%tbHIUd0y+ste*9&Bf6f8)HokBPp$Dj z_}OUR+6Szx_X9t~vg)t;A-8Y+19qdj6-lPwRa%A^Pzv3 z_J>?-j9>Y~v`+c)cB4A=gV)VxOf3lc?qGFup3m~OOB?@vTj*nBHY3-5YX7Int!1KA*8N-c`z#X*S1-#qm}d~|c43YD|d zw99utj=VkDqede&Vkb{;e_`%=+dG>}w|(}!Y?RcN>XET3VL@@Nrc-^qQ5no$F|k>=Ra6b|E@MbLO)X2X0kp<*ij-uIpXJxld8nm^I2KHSeVA@3UuS zy44?gW@MY7Qq}7d^GA>4@3n$C2lZ#zMaKHHeXz{#3EFR#B*|=D-7~RiuaOs1vf18! zJqrT8HqD91UZOPBJ5ONeiCgP(AISylm3pm^Gg|9gGymqMBdZyj?!42Q>aa9uCC953 zTMkCDnTnK%b2T2{C}OfONUtsGpUvq&zAC{Rkpfy%t-4eLR|aZy9c|}aezKcmar@B= znc|0YX88v5F)qAuvgt$b6CKXgQGCa(=cxHVtFb;CyQJdEyCY7SSjC!@1L?oF?xo@8+D(w|BT7dCDE6K9aDc6o7H_#K}O5>1O%_Eupn&@{&?xW4qMU2Hqx|RpC_{>bxIkHk)r%wMdztq1D`;!%}&OG&Mjw?&* z%)9c+`hFZ`6gd_3vPbgr2k}2sf0oH@xOd_hdza?(7E$JzVp3*_n=Kya8~t1NP@d^_ z`swn=&Qf`T|m9(2Sekt)7(TcHv}m^2dXY#+!9Syo%gfw`Kn@|L3e%*0Lti zc;3mjZN}%VO>z!~@!sALdaT~`5C8fs3*Ng@RY!`f&Rq~VI8*A}G0P>(YaU4MoFeK! zi?1qevz^n;hb4M~+)K{{8VkQNcV0PXMNxdbm&%fwhb-Fbrd5^8JlRxn)8gBwkyr}Wss@@~h^OoOac3X9mi&uJO#33HhBMV~}y%L{xT1~{8 zd+pqnUs@Fx+s}Qh?W{hxxU5A&!g;%d%L%XcF8B5nnM)t6INR0ch%UByA6sm>Z*$Pi zJ10D>l4ovQtDJUBV9T^0R|}ZeT`thuc6!nh&rqfR?$7s%Zftk^G*`H&Li5Em)%j{a zmu8ja&Ya%sRyIRd%bU@6l4|QxwW}v4t@3nKO1>w3FHlrcQ|N`ITUG4UI7U~A-@lc2 zE6(*0IJ|Cwa_r^}d$zkRNtxXZCE=*8Xv#i#zU)((UE0g>^D#3h#CGX$f}De7g0pbJ~-j zlP2zq{zj&`OJo(sCcn!*yMMy`$FXm2igFy%&*SK@_e=kM(lFD$n#-Rr==aXGAD(>J zGJnqeBNpBHp)a1E3d}mac-!5aidPN~>kz2@n$_L9Y_Z#S#n z3mMrt*4oc&J!r1GzO#`GrgO@uZtz~H&K#n@;N?`%xm$&Y$HZ%Kd_Cdz-5s~0o49Wr`r5}5 zI^F95Q;JQG_>SJ)HocqY9aG%?G0i`jd*`IW(32JKZ1o=N&O5ev-m%Yjj-^*f#dmbu z+=+Wpw)^_!3UR$<({BIB*#2>++_9f*`&u@YKem;V(s_43qu>5jELuR~Fn3~Y=ihr*Zhccp z$>cG*y{b@#`UG zkq>vXsFUG7enI})^y#VE$2Mm0MBn%)s(!U6u{0unW_wOGllNQBqNW!`&s{2{XWQ#6 zJJ9)5^TM|6ChWg%{!G~Y>*l)BoEyqF61Z<9C7Rvv+IC~*o2j`=>a0)O9eZ_l1B-s5 zV%*89UGqdsrM(~fi5<7|l22)qPw$(bylI~LbNz=#d%8}`8b1k8RDSgK?;M#)f4?z) z^QvpxvS8ghyNX>sr{k9I^FQ`fM%Bo!L#yjY)ZH6buH3kBV@t!dKQHv3Y?-(#$>+_t zb1Re1wuZ(_l!ET2C$P4@c5{ax(x;u}w+eR`6vFAjND z#x1oo&M|Mj%J%SyxA~Lx><)E5&hopPZ4tZv>5AVPRt2*9=U?C4ZoZ*8PsLgOam?P% zGxvR#+54&GD|XK>;W=_wRjypTLgWo=U~qVJbaedr)&9mb zR%d>*STI#+i_`S;8>`=PS^c{jBZ*yMl9 z=G`&vRj=Hoa;YwsF|(9W^TH{+$m;Ff&*Rwr7PJT_?D}M3KBeHAXu*}=1w|G1*Fq2W zZav?)blQe1Lf3kIYU)nuX`ivM-*`tk@6N%V{YfY8x!gRfGh>f^E^Ck0{M-G1`C3*9 zZQnk{E-XxJUw6pvnfLT&ooxLu;raBdYvqiqxZW4Af0%K+=i6i9H6Of`W(xH4?_Qqq z`HP9?&ffWp{&Bk9s?=-wWS~s^{f9)=J>z`d4bo1|X#cq9zP2b&Hi!O9MUHAIq%cs0;>mI8v{o5~J>NGDh zvQgA@&81fkjizmR)=#EAss5vT*d=qFtX!crUu+oD zyj%0gvT2%c{qq~obYFHgyx41+c{6`in6~C5sZ$0&)ZLRlM*f{}+bd#yr^S|?T5T5M zr=mj`ubiBF;G2t!Y3R)sXo zX^|0KJlUgY{|x~fuC&yRnX(@j-H(_b(kU+`aoFPUmr}is#4k3w)7GV5i`oD5<8!A9 zp5XBA2}kPl+7}*wxJkz45?9V6z4%Wi>v!Edlxp}pV$t^X&VPfx1Rj4m^_x(Zl6U=q z8SxU*`b)TH8gKC5^6n6?)aD~h_ZIdaJ8Q=OcgM^Z5)v+omgWX6(IN{k9{?4h2 zT-R32v7X`agIPBC=(eY^yp#Xlo|3m}^0_6J7w7)(x$|=ARmr(Wau0F%H9ky-nYB@{m$n# z&*!|KQ~mc=ef&O_2W5XE567Med+hh*$%7M$`t8X~$4!59XREJLsJC;d^W~UxWr6r~ zxk-nsS^Y9s=$_l-|Mzq_wiNX1|Jz%y?u z*S<9mwJZEy{atnCx9QJsrH%P3eoSlA{ju#pIm^882fdM!tOx%YKAv$g?Pl)9GZptF zi#9Er_%7%{|I?o2G^fTQhej!H^;_>ZzMax^^>3l|-D%s5J*^EdO)Fm$a(lv5IschO zGk>pYUz2jI;8SF<!_3o?o}15m&9YpcJ-g*XZmLfD>?YZV zmR*w~wGC%w@1EU1*Ev@7qqusoo7&A|lG>BsWZhhT;Ci+?M|R}?sfOR5TvkpiTW>h& zk*p4p>DgSKH0RR19nSTshdjGCO!*wO&9Ysl+1l^O*}~(SjAK)_GWmLamphr> z_w0^sppoind%M*|eG{j0UG6cSD*xtTOiY*7is%!vsVz=@ZzZ10*c9!g6yR^AD7jrC zP-M;A?Qt<0>CLBq9A2Y8O>E-%DyJt|Z*HTnG$ zH$S@mXwl+^I$8FDfP-CJD+4yHs(If~Gfh`0#BS<|oB}7KNJVp2%a=!%^!+}lvwqjP ziN8Nd9`~A^x;wi^WbyPF1?KA4PSt*Yb)zenDcEXRVPj3aim_GPG__fI6J%DFxgB@? z)6lrVY>6}H>=@psZ?>HL_4xKjoxMUkmOM6!6a2BT@B0JyrBahJh{)5wUvfz)E zee)lN3h5twG*RF?$Df$v`X6Q;&|i9b{p%m1_XK`y?YsYAyH%a~;@{PO9FNPV_RY$V zd3koWs6(UN*_1Om`KL}i^*LF;&Hd$x`66p}Z{!QAa$NXmm$}+*&(b$l>k~Hnop~#< zdFtY$caHEys;7!~JUt$~ZQ=x(;DFoq(@QtmAD4(wepn`ME2jURX(E^H;+(Yi6W7$n ze3RNf(M0dkEzaq&J%5tFuVUDtmHq5VQFX<{dwU&r?#_+56x7He|EAL|_3=vGX4{Fy zXH4#zY>G@)%Io((^LcfPQdFXr*3@<}on!O%O!b=arts|NSw*UvyIz_Kx$MmTxL{h& z|9GzH@%P12Z%q>Fwn$s@>DdDf>uifCxwn&CuJ8F~)SlB5Gtqi)nU-tt(LST~&hhb! z*Zpd}CX&Myp7)kpF5zFx?4W1Hca-`&9z;u&+OvNTxsf_=0-xNQ%#|f6zn;8x3EMk& zX8otw!v~IZNn~rjlu2~ZTB0IlTd*KiK0l`X(RglPj63u5clkY;LIkWk75rxw}?IH&Cxj^zH@8CsuMha4hIXcu9!G=gK<(|Y)JZSrcE{QbebN&j-U=;Z!ROIe@2zU37Amixu6=u1b7*DZN1c+A_Y^~KWXJa^|G>H3>qDLu!rz#`zf zRqJd$(DO0{o9>cTwgDJUf|xmKXf0fYm$(8`3lFcKAwr2LnK1x zxBb_d#^xGedq?qHT&=B$NWbLmXzS3OuOruRbaiJfzx66NV6UTLZ}hT_b{iU}UGZ#T z)^)s}Ip3(a<4;EJgyP9JZbY6feP4O!R)B4%@9%DhjHC76UPZVp%AI{Imo;Y@|EJgA zJXSPVE7?tRyYT&w&T+Za1qT?o+OjPXm(Bd5pBJWuw<$jy>|0$IF7Wqfk@(*+6 zAK~L4^kvE~o1co|F}(PGnOx*6{}0m&J68A=nzbFCv)kdC^c5ZMFK2^_UVkvZWqD@L zwa4o{4y5Ese-zKMcGX z`L4R@UCTSN?&!{C|LD8DLS$OspOyd7)?Kd8yO!O~$iT3RiGjfhtvQ^TukTb@lIm2N zmX=!NmY7_UUsS0QoS9pYlj@P0Sb!l1X=5y%bk^&zgGlT7C2KR2|E!K$yE5vi>+M#? z!sRS@k!}yT$aKn`6b{ zglo0&Ex+a7e`V?XE@S@U#@qw>?9Y9p*}nBp>Wwe3E_rdFc9E`9TWiqGolnB=eA_?K zBh93#?nT$Ep5AA54Q7wEgeBL^xG?eB#;iphrfqls-$p)m|<%|H5Q4D?K4VX89VoooK#HqQE%#$b9{XzDzkG(+>0ywx^ob`I6P_R59dkIDpF zyB;-SU!~}Mcu$vQ5!X|F&sUl$c1R0FKn=!O!DqZou)Y<{a21KEk89WWcj5nTdpW=Kk{VKpG977Y;x!K?75=!e9nq&2r)IqW|2KBR5G% zyC>{9zDV`p3A1Gnc62hTcBmSfmStP-XbUi&bo`q{=CO(HEvhE5FZM07&fLY2c~_PH ztmV;`BEMVLzvaIOzF+-op75)>@5?XV5c~G>VL^TP{-=8P|Gty`|9F4>Plf}Ie*)_p zvt?{IJbH07N2Iv0#W4Ex+)BZ19jzLAMczYu*s`=j5_d4;i<>?irzc;*%P+sbEP0Me_O`CF| z!+Gb<%s1`c_UD`V;d^_0%XhaI=Pg|Sz^eG2&$fK$5dED$C666j9qXJFAMW_Fcv|?q zQw9;UrTtbqtZZ5@{r$|HrN++|y z%yF|sbiP@7n$glbswXw48H=Bt^EP(rtDTSI0&m{ExpjSxMZQ&W?bEx5Kh^M`zb0CK zVsqEB=Uj1Cr?d{*aH0hjGDtAcl)dTORKWCeF^s~~u%Nvr< z-rSgUagSDs(FXZiw%@NOG}g&ny0Gh6$(kn>We2S)Rnv8+O^0;&B51$>L8W^H3=I{SEMo>BIB)#9Z|7mM~dGVedK-sR7&1C@J{9+v<{*A|%geJf8*iwc^%&$wb$UWi|BWpQRs@7p&Mi$(XJ zIx2a2_H;4Pu+6*Mmb5DUG`d>7Eu&YLX{DjKxNiI1OS>a?MQ@67{(WrC>i*YfYvwhd z*z9-1wYBi`v5@P>7i`vF{o$MAls(C10h3~i*IhL?pPanx0NGR{qVlFw>$dgdMs)^DHE7}s_VVu7V(e=vrP8Cf9?Bg(iHwJ zOaJw}$h~6g@-{@NPX6}4Ti;xmKe@Z=Evt;U{Exwnqux38IM=KDPo-;PS*isN2YV#w zKYV#;vd2n}pw!!rEbIj_t{2YKtFLISFm9ZDrDRT!*wz-V_pbJPu4l&hYkH+UE&LZxEWZ3>iu}n~yJ;@Jw=-z1ZII&N4w4mJB6aw!cE*et?oCslvd=ws zVkwK{6`y}4ldRicI5)l3|IOj_<~yTsu0*;-lCfrq)6z>PIaC`zRK2iR_P618$kN7+ zBfs+;W=L(VERkhZW@L5O61mc{MrfsSNp}~kD_gwg=ZB2*9%St3w#b|n5%>2zTOUtb z^r0sw`%ZrQaJ11QS*4+6mem)CJlwtLIg`6k`q*QjrY5C7QC5Eln*+c!`tZ6GLkzG>7@G^7H8|SFQv5h4Qt66)uC$KKq z#(v|D+La?k%oCLNYTr1jzWbj0WrrDFpB335{Wa1#yM+Ij6T>g2xBZ6SgR{Q9{K4UQ=%-Sy59{GiZ1LQ2FRyUj z;ymWMOs<-J_tNchi<*nypLBW7HK}M%(_QT!Grr7zaQO85$B+3psJEPaC7Dnxq_-ht zx`cOKZ0M!BoVwi}y60J^)?S-``>Uhri==(KPQ0@!{^~gKCwp)H)A#=@_C9d8zZ2{E zSktrlYNAx<@|DKor%rC#zE|qp7aND^ZP6KvH~9xIeV_I=_|>;3pI+_XC4Bd3dHt$c zd%b1U<(B7lPT6-xYroi;y_0hm7j5O+bWi+8>O}oRto9!yW*VHGrg43R+(LH?iB?J1 zZ_ahDCZ8N8&HsruIIGmE@qp(jX*_cb4?dsN=u_|@D$3=$ z({aAJ)?eK>T=@02INv#{%jksV?{}Ny?{EKZslEUI=g+bXvp)vP^gphUc`MNsXr*{s z+q*#Mu=fWozmr8)UB-nbkJqd?fAZ6;ntA<6OC-Z&ybZPPS9Y4Hb;};NP;)WY>{dR_ z8o6wdhD%_G!8!3&^A2?#dHz#MdKGCd+S~x# zpWM88>&L>~m-cUte>C;(s-{z#CcGA^$8WFPuqi$9%e~24?!4|Z{PM|hd5Zi>QTMl} zIJ37n_?})cdpno<+Aih$jh8;C$sUU}pHbdDb5ZoHg5z$+pD#W4dOFMeNodaM6IO?$ z!fyWwn0~7GVGy@>m4wpDEngdd`FC5{L`jEx=)77XP;~9m=7WaMZ;GBSetJei-y(HV zNmSy?3F%Ll^F^n|&Uojg$rY~ncZKMys3e;rF1u|7{`xn=`mR zE85?$deVlCO~EA|;Y*UjbKiL%OD}bpF+p2c}hgU*#5w_ltaAk#Snc-tNgYt;*jG%1`Y#W_X)( zRS3s=oV=9($g^Zt1=H%2(>smg)HBtzZX_?_a*Ei=5vgXhV&;rvX2SUo7Ik{xI979O zQ^Hg=qvP4C=QVHr)_?YP)AJo`HoMMvp|vwEytI$+qM^On=k{29Hg3YLh>n!D@9wadGITya%j`%3V)lCy;B z-mT{%vp%@H>))u{`9u5pm05dtR+_CkH`~Zb*hqo%+_|K6GRqbnjgFrsFq@5g(ZZnn zYJ9z2W+;MYx=y5;S zL^I~F7FS^F{R?~UW|*f5NbfWJJv}7t#i@BIY64vcFLoOqH)_gEoaSp&+ql(hYxIm< z;cWk8=C_m9tmc>Q>=C^pn8Pp7F=b)t3dYml7)~48eTr-|Sad_?=w_``4|aIB_J6jF z$~|hfuIY2|vk5vgKQI)wmaEj36t=$hSU0WzNv;kj=Qhb1%FOcZS9)*Shu>dw`QEb3 zsP)~Ms-3TQexK;Zc-3{bMtA+Z2TLVqGI(`}=?6TYe)`y7-(Oc^=V>v$%8;k6>YEP-K@&r$5W89)cEVZnr4p|%W68y z)|oeFmOa;=aVN~C?PhuYGQW>kBqr{hdocO??WgA-G3ejsJNH2ERoUjq>JK{Kf;O*j zoSqYKQL1RtHH{^ahAmO=7HWGHYnH|byyD|qYjLzf`*L~Og-rsl54N4yX!Y3e&2h%F z{P7v~Q>tdk`P%IM^nbIOMT*1QB`C@M(!`D)!%HV>KbdWgJfLvW+UHZB&?Q5m;yKqdI~ErUS@Hy1wQA0B z<4i9Ud~Wh)uH6EwH`dO_I;7*C z{zjqsn+$SQ4wvZMmfZcz@=oQI*yBIhJG!?_=Koyu{Hp$i>u*noZM!V~=I+~H7KY8+ z9{%2PXU5-cyDy*mmA+c9JZk=l%J1cO?_d3S^VI(B2Q)tRoV1VTyJj(eHs_=HDb=z@ zrHyNR9@^YIdH894qmj)&NrAo~mpMxJ{vOfOKUFe!ZRV!h77ynwwqBZRen#|tux;t7 zw($0P_vvL|MdbNA8|%@!!M7%B$ri9OFnDk?FlgiJ2K$$m6qKUuljseLE*B0J`KLCy zWL8OrcgBLPA>1M!lP@)JDXn$o5?Qr(g=VkFMxRNZ)&?`LoMg$^`&z%?XN&*3r_JjZ zT!@P8e!98-uy}nlxBmT^Gnc$nz1BX@GJXEu{k6ZpdDj2_{d_q?+>z;tC5c9dQoRmF z3!d>8djGPE74unRGHr~odl>KW%EuCB?vv4JPurAg-f{L}_B8GanTha-lu1RW?oy^ z6sf8IsrtN`Okv-B3DH?WVNMT@Y4~bLl>a@s)Twdx%IKJ4(P*cfVwFXxjE~+nF{I2ZI#oXSX z-BMyc$(@HTUvyo{OK} z&8@c9xDX=aw7%=GL_ok4gFVs7zc0BJp1iXD)vZh0tgC*Vk1oBlspR*fl~YewMgDjr zep+x^>0$}-oaksV(ZGwn&028+7v~;1t+npKDlTqSR&Oo4hP8`$+;v1*%R}!Rt`!SE zY7`by)6u_b#q8BfA1T>|O?2=)s{SM7X!?(sH~SP;|G)0A;i#UDs9E>o+tT_A%eNPO z65RN8(Xn-r-0y6P_e9021aB4#nmp@p=EUwc)wI^;gV{6vA~W*?qzo1r+ueGxs?_-7 z38}?m@BaBN4mcj48mR66^1H105z9|Ei}+_T=rO^9(<#FX;VX;|vB$nr<*%;n@YZ z!+c)mF-NlWk}M7~v~(Ygdgf`){V(@`>CUE#*j+)ocdxu_J1NWS|7c2n#liK#789pT z_74}l8MWAPntAAShaJ-#X4wDL-^uxb^TR_qWtZazR`}FX3-(Y6}{?v-or&YPcJezabc%W<*A*}VOS)aInFdj2Bg1aIn* z;vnv)Q{=mD%uPGTSYF;{J=20yX-?|Az)kN$PdT{=J@l@B*wLh@->g-rcQInd>O8i) z@oN|9Zr-YHR->@f(xuWBL2_ z`|I`#yFDvE%59|fQ2I-!?f*lsZ|En=vNN6Fn7F6!Tm#3ih3g+kvV0Exnev_Cu)ILyDY3_I@oA?+*JAj6PxXiHpACC{U6b;&3cx2C!&s(fgzL&^DMB; ze0|UYl+cpQ9LRv|(y-`o;c$_Ed^>%N`b=2@nU`oSHBp(e<;pFtrqCl|JPVqXyt3O* zGAvdUp4_?pUUc>L@9Mvw6s^^Z|Ejv-Rn)%*yYKv8_`mFYo0YrYm{UMu8^7MX$$YdFl#o`BRxI$0O zJGLb!ZtCUhDaAorb0(jC9ppWIu_S9-*IJL$oto3rmtLCFR4FPLvB`4%BPJs)u?e9G z+9x=Fe2+$>GQNX;bMEw z?Fkj=Si)1SxHBRB`I|33mo`myU(-{0X`|6zCcEQ$QlFW=ZoE?YchbH+x3v!*S#uyc zdpfIGzxA%dM3?iS23HPhx6Lfpv5pQX2vm4*&Wr?KJn9X>^Xf!F)IN9o1qISMi z-`xGD7QFmfBW-?e-S<1Q4L9FevH6zB7r}7<<*a<68RC-Xo|tM+w@H3_tjllR3xT6o z#H-97rCgY^#Ya>rD z*_|{)JuOXEa)qpPB+n_?td)<;4D)APa!fl@w5!y!l6UupXva8b#=fRSZQeW9JmgxJ z_2Q5z@A(Ijk9@Q%oDa{g=zc8M__p67mN);gEbseAw!H5jGxJ`5nDIkEKJ$gE&*9?* z)23=Ot}pTrT6ku{5&I5hDZ7KqnQmuQtG3!-{$QD>@x$rx^dDXauS@MaxSgfKrIxcL ztg`>?ob)bElQk?=IZI02Co_SuWAbhRK zGAY$)(>={I$+v~-HnaCH&(aqI;j;Rnl#~@#ihSZ zd*)f0U0J+8W*3v!y)&sL&5Lt4HcBx}$z4;r+u*k-n`hfP85up7|64az_{sFo3ZHYZ zh}Y!0#?c}{kK~D^m4RkK=XmnZof6!p9k%&HnAr6zrN;%zJ|EpE{AszviJ+w0ry?iq zO?cm}?{w$!0zUr@Uw3y~UpN+~&Hcc0%Vz#ZnnyHLr}iIw{O;;;?-jc_-|zh)WTRT4 zzErV4TZ2dcw%8&!L4|gK$Td=H-Ps?#5ni{4W5Hx*{q6JA{HA-ayIQ+JK(Q%>uLa;|gl6 z8pSuR7h2}_<8Zy=iUsa}Iy*T2^!e6ba0$2|Gi z>^OE#Xq#^0?<~JnZye`VWqB&?J|!h_Aklo|;hwj4=5dMQTk?F(J}z39aCgDHl8v^4 zv-niKYvk{`r)X{LSSA;LWc%)xXB9`noxIgITUzbxisw6Hkh}CkgJ4~Gui?!8je33S zS=`bN7|s7CYWKE6a{Z1sw|`!fP^)A9@1A)){Al2XWk;m`q7~dnmYrkT#KOR!z=gF+ z^2y9g4N6UfPbT$-Mu$s-2B`FWjCcgzeK*^-t!0VOk+9VYtx5qVF)AV~t1UeF5;Kg1 z+dbF*m0b6iLuR|Nr~g zpTXE7bi>M~MDL@fHJWX?hD$`>tjKVV(vj1?5h{2rdE<@XLfQD%%x(H@%!MDeHmP&% z<9rw`de?&Iq4meRK?_z(2&~|lDX>Ya=mA$>NKaVfXRba`2`)boo74~TQfh|-Ub)mS zQ|HzGxuK@yNbbDb&#L-vZ{|7ZJlVcnqH2{I>)kWzm-}*OR9fZCHugC@GyO%ssl5L? zBbI4vWYS-FNvhq~5I4Sa@1ilQ-h(x3;%;2cbzXD#Y(sI*9HX9Po5Bnux18BC^)yG& zq1|p8B`G31R*IjDi>;gYRQ31kzk5DuqGC>)$79B)0=vC}G`&MF@4Jzr9V(gn*j%Ts^HiE{_@);g)>YqL z?uwgqC{W!%Rp+i=2vk|af#38W$Esh7PLfP`tiTy z>Xy)Ln_~h>qBlp)(o8(NptATvfwXXvM^;6Psp0HIiM)y7qRtX`lzXGaS~=e2=Y(Zonz%Tv6}Ddnmj*?K(2YhGqzm*xj3}%m0ABhtEZDD zCQE#I_DFH{K_SP#!9T^hyrlNAn;xr(Jt*#`xwC4+w$hVNlOGz@JiWW5`a*=wuIFd3 zR`0G{84}0%%5Y`AYnf78#>r0E`*SR3^7x&)3T$oaIe?qjr+lzh^ru{s1yj_2s!#QG< zEq8f##XYj~Qaom$-RW{NOu0KU@`>TAxt29v#$2x_&0apADgOPcCiapI4yNlr{l59s zJoc$L&z`Q`TRI+jSM9X9vr5hDfhyC#@F((a@@&!_dKY$hsL#K6Q`su^pg@@C)brV0 zyp=C}t6ywYmWWfYdi$zr!Ux4^F%v)y){-SuMEbK#twa>?QcRrs8iy3I4we;uRAN;5@=pw-(?ltTT408mq7I%==H=?E58=hG$9WGku z-t8Wy7PnZX?9LJ1D-)lt%@h_cNQ#nPZd&2_=*l{dDPEsW%nP};VsYSOmKTSvP1~E= zerc1)At8m-jjngi*68y8VYmC(d4Iz4hqjA1md(6%zWDvz>hquG72hvT`*MDJd@b{V z*dOi!$~#1k7+edD2`g0PkhhaNqW-~CQjY%-r;X-u|C6tRjcTHfrZfFmlT+t+^s?iY zN0OBlVPW&bKej4ZeRP%Fr*bke8*+OWVNJ~M`xs-*u4AY=J4J%P0Yre z#knbGeb&!7{Za6+OymY#+il+(a+e$vVfj*OyHUV9=$}W$v!pj0Z+K`;ixX5--fMKN zeqmXE2G8VA3l9nE`knV*tNx`YcSh#CRbRG?dFykpu{yO|{7uB8i8mvTHJ zbWT%p=&aID0q4UU{MFB-uH)3rTq0T$I%B3^dQq9;%||mbetXxQ;(smm{lwkYSEsZk zR_DKveWqPJS9cl^DROVs_ke@m~tkZLns zM{TQ5sZ#n9E}?xQ+Ks6vw4QC{5?9l^U3E>>CA_&Le#U|{n>3???Oyj*R;*7ws(1eR zn@=IXjojK&Pi?-=bsm)T}zMB%n&&-*6 zVX4ZE-ClRoBScK@bS{><*Dt*0uhm}{$MToI&Og1hZR0X=e%GJrT6OClivL(Dv2)p@ zaH+c9`x!G1&1rkRsfyKIbW7;u4$adyPYNrYIP)euV8^3}+m(vL4!=L*7w-J8`^Edz zAI&H9Coq2P)K!vJ+O*^CwrRJd%qCv{;J!!e@U*t;6T%B__r+WlaCbWVy23eZO_#LP zzZUz|Kf2rYKgwS+F?ZJ9!em#5Ke3MI{X_(2n!EnjHOnzteck6<+TF?S2Yj3_x0KyXn`o=EV#DPq>(?#E zoDZIUvcb_)`&RIJ&yPPQrFvWr)HJizEo^($7+=DxYZdQydBBaVag;%(kEcyb^ovq;a+i^<%@$;GPK5m~r#LU0hq;Iu> z^FOcqL3dI8|3_oE(-*W`vuFOAkX)u8Iy>Xt-irCk_qz<|JgHgrpw8>4h5yZO8tUif zEpnBA{?BHXl5{{io0-6g#g)^FCw!K99{cb5Lf5^`+=2Hm9QvAMQvFh52Q%ZBg}m+( z;WH9`$x2LY3cOy~(7B8KyHJ4iE`x)%{7Y{eo}4N!UvMbNjWdU9d2E8ar8h&?lH_tZ z-Rr9-S;S0p5&izK?%dS2WwFj|^I3f|xYq{WbHDxOfrH%J;%4a=5?V9g7PP!u_R3K0 zt;PO5?x&SFcj~2lbzJmJTw!iKhw+s>)g?ErCZ5^J@UBETvrFSkwCst9NCn>+$7jxR zIJc|J?v(9A*YgLWGj2L9XW9H*%Ou^it>x1V?Q45euf5ltDx=We z2&|bgFWO@xH{Vr1%dL-gb~beN-#Jn@b*0Yn?*iWI8uI6DUb3o~d+(9*-##rNmU~X0}Ic#^;`2dlvsYae?h!N8c|S{e}4nC!{~+F3^9%|5Hxx z>-Rksuk97<&!67@Z!c^9md7X54w*as%Rbuk{h}4ej!wJTFI}A{{ftT679RPE?eu4* z!yc9%$GPWqdmN8lvdJsR-RcsjTGrKrHFIuhyQ~)c?z-;Jxxa6kp66z0$pub%*d-7g zQS5B<+Qe?#7Tqu0qRM`X@_MQIFH+tFYDK1=$#9)D@8KG*9kV)*yR=<;+V`XKp_SLJ z>z94Y_~zJrU@Eh=l$s(Vn{j;Y@%h?MS6(pFGwdq8wZn%iMsxSxyk8UN{J3d$sVDU2 zyTj%eBP%CI-Z)yeaK~Gv{)Nw1@BHZEy4zs&t=6VF%KvZtM_c;lQT|rzIx7RidoBhB zMFs|jhy zr8y>KQEN z0RO4ujQV_!Ca|~ft>AEfl6=CO$^EI{RHnmnE_*v1r#z5w^D^LC%aSZHoj=xb4~uuA z#*0q}z9=<54!SsL_Y(GP?3zF8oPO0r9Q4$`w%~p<=T5sv2N%cLv>mstaN1|Dxz~2- zgG|=*1{GGnf3;OvAHK`8@4}2KC*D`94261bOiSz8VyN-=;l72kw!b}s-j#i8@z|uJ zymIEjxwG^vsHb)}fOVb~wD)>i$*7 z&DFE=bU?MnaizImqq9OvUMuPGL`Pk|xkuDttNC1`52{voaC&9Oguwx8$TQh!A# zYfbJ)5$jtbHme_4E;4^8Zx|dFlJa5wjQBrkna#=_w=Jav7w9}ceC}dPTIFw>%>2czSw%~BJ}fY1w%B)I zx(u(;m#5sGTWpuUG<2-d<-7IKrQl7VCT)KQ=t;WffaLAt+j)_sSjr zGS1EwdLhk;m+QAbX>wa8w(-rA1!?_4ou4x&?the$Wij(?(#-wp>lOX4nB=VDXN@$z z?{j@cmg|v^Qw$azG7R&&dw+S)e$2S89XwUpZhh|5K+~JrezzuFKR3x**_dZSN5Bc@Rr40f zWQ)B#%cGQ-*gtFI8Jz;*m{s#)0{Yj)aw@8~u9Mz;IJ>jOkBw8lE%$%=yl2xctW^^_ zq_AOjUZ?HNx>IYzQtopV$S*4Vk=~Y+ zso|F94X>5B^e&uw_A<|HqfC6{$-M;=Qx|;V;^L2K>E0vS%9Oc-omqUHweI2-j(!$9 zS171ostk4GUF*ju!*xr8J45iL@m-H6>{=9FK?d1rg=At&q5Q7#b z;}3>DN#?m)l6A)}6+Gsdb}}|J|FVAZe)F^Q8mqJ3ZC|!5GCaq7_37<3s;WDbdZ$j- zn0`AezBfNqYV~)Yvwv?CaBdCX@a#b9ny+iUllSHyHhJ}A*F-t-K<(`Un9d}j8>g2pT< z%2#I}-72+i^@@NE;g0u1e~8*FSn$e!&F}7a+#Aj>3}V?mm+OMVLjKFK?;h1NqIT!F zc0TLTVPar-!_2^7h^1C2$}CAt%1H&S@psNh%*#v7an8@nO9kx#fYuVhxAQJL2-v<} zQuuh*vL(45`VN=5eIIRU{1kD-SxGCD>&ZfmsV|r}-OYWa_0jFytkd>iSvk8}0_+?5 zozCQ4DhPCNy697u_I%D<2qLht`#ghx^j6&|6+$#UB{|V&VHUJ@hL8N z!uO>eD<)6LD|w|GD(G2w#m~cmHA5vm-R9PMnV>|OpFG{d-z8@pPncsOu_pa}jopMs zj$~mz!{4@o!o{oBsH8USuzj$QFFx?&L=UC;@+@8sFXQLFTa}!9CgG}^*tE`By|Qm^ zt$4h!)7|XZ#^VqEw3oG6>MniWcDL&G?gc7`uSLwY*XdU;G&plV=2l|$n(u1Af9FVS z5`4eA9ECbidL@sw0d3Mcp+(3S*@j=qW_%(vwrz;?Cf*>qli4Achg9LMOcZ^yV1wtazvvVHz<(h3Vq8I2JE% zEwfw(ZVulSx$22Rd}_vpM#|#3TVq#$y=(rPy(Tw)!IZ68^M75azqtP*`&&C<79ppl zk=oDCSXS5nev==6?o7OX-EY|g(Ldr2X2xV6DD5e}!|@=QHSUO|U0^`Fzoift(~Jq9 zJo_|Rd3R`v&o@nwGA^1iwR-!KZ!*XCG%47HPjK;iB=+P(>y*3CeoT72nqgnq1;$?G zvlA0nNQ<>?aF^Kg@PthB`&Bzv7|VEbIL|NP%Dg-4>ZQtCoN8x!rp>>sqj=qVwq3R7 z6bU~yqcp`ZgWfqiXY_FzPZK&Cz3l}5M7O+H5y^F}!l!T9>OQ-Wr=#fgExIcr7ZQ`c-i^`+o!MBjwYW0KLQ@65c=r8nu+M6HR* z6PxF44)NysYOIu=u`PLG>}son?UMigSK8lkO+8k!rpHcC#kh3&3$`WOx{NKn*R48{ z*qQV!>O{7ip4j>4U*}Ad-&*A7X#VEzjo=Pm<1H(0>V+A6ksW?q9^gp=_?Azj59N!Bst9tPbst zjkvfZ=-Jtq+iVo&JVP!oJjJb(xis+frE4+aL0c5dGPkxWZ+)-ex4^S@>X~0W{d+FeSK5;q?2{=dswg+nBv z-t7I974?5+?uk@l=3-qcf%27e|F1nEhhePB~i(|0tHU?+=xIA9#N8UvW{l zLZZ&;vDu!J3-X2kJ-@xeJMIR{{2OixH@A2GI=P~pyNkVkK_c_3;24zv<--fsAKu=o z*0$V2b$*}WO2ZfLUw_Dd@Pp0Iruyf1<1Km0GkU7bFY0{#UGI9j=0981%lp@!-*)(Y zzQo7f=!Pfz+$ul2?T^|2bWDD-IK`wxP0D}q#1q?v*9&~?6qv4kBu#Gb38k*xI~qcH z9x%2(71R^_m1}b>)tu|{m!kRV-}Z6@>$qj=J8{S-S}gqaLes_U7w22WlewD;ChpUf zyZro+>aPzUPH0TrdODA5-UHb^-g5i4OUG(f&wr-<s4``eVlLlCNmTrkQQ&Zxv)^U|7M)z#xrQMV6Li=IA>Xr9-<+ zy`i^*g~Mh3`Q=GZVpWkc5W5n#MX)1cO&DiTzH1Wm4X34E+IlIx-8)M+Z_LPE|Lel? zZ%fZb+@8MA;PT9KH)e88wmSUfrv0Mzf5mkcFTH=WWroA8mj^7X>%QME_mlho_cm99 z-JOq#=I68|z8!4b%zLACMpLof4(}tgnwfl)Z4B*CYk1skFF8t%(PwV5MB^^z| z;u(GCv#)Qx*Oa=X%6&^r$b!T>9%&}46J9a3XD?+|HCmcFY477{nJJSlo}J_PD_~ji ztd&b&)_YHF-!XB!#+y3_Ry_{=^?^r1^01Uh2CskawHx)02THAGUr6P2bCcIyl3r5m zG~08ca7TLj)+?-MO;lpjta^_$HFOj{U3yAwddZ5JY0D2>v-+sv^HP#amd$*+Y5E1v z=o+)x?|jpZPv#^o3%THFJX62YD`;Wiol9x!Hx`%imHqy0VQXf&GCKJi56idK*HgmH zn|r3EDaL6>CvoO*Uk??zzOzUqywob~<+8NYvn!aSejVG)S{x>Cl#(u$a*2J(sxE_P zEK&1j^Jf3Fe763P>z*U$Y{ci7_`YqEncubd#_bnj zrh({_&vxxp&*H={44KX01pz{`_l=t4Yo~VMgI;3ZI|qp55|ka@)~kEU$ZC30cq3 zKl9|YF=tzHY5O9HnJxPa%D%?$5t!a=Zh z8+n$h3P}q^m!J7G$K^HKoPXgF=S}|}+p#4hvVFO1=b8-PiQD?FuQ1uO)om|R#I`)Y z)BUfwr`b;S{-kunMfcbI_UlEKwug(9{=ZI|nyA8Cd3bWsnI0kK2jw46vdw?3EA&U; zMso1nC7nOG{u<4(Y2P@%T3kWx$1?3HHJ7*YT>Q$>*L}LcuBF@EynkMMz%KWyFt)kw zF^=KK`)9o8-1Y0%UB&VPyIb0-CHQv6dVjbn^IzzS^1KDlt8-re64fh`>dq)iDiWM1 zbXf9>&O*y4d{r^w8C&&omxXZd?7s2nz?0nR5iz@ea~Bsanq6%_Ye#-Nw{pfYjj|8# z8EzGd$XYbc?b!G!@S5G(Rr#AvMX&j${i^1yRCR{snO{j2qJmMCJCr>$=6_gEbTXo6HlxY_2dHPu;m~nu+$r*#;+Kemb0B zUu?5c{Yv5I-P#u_jtG^356(ud?xGq$7 zW7@>8DZgSB`98M3e-IfHy>i=!>06!GIas$>%g?=fi7)TchLTBD-5INcHl&(W=lc2W z=$ISo8MktNO7%^(puQdH$wxeL4_wo#Tq5+o{T;g~1MkAt-;P1Gd$`&yW*qL=d{9{C zwMyT|rTvQzG~P|!T%WYK{+OrDvm5^oWd7+ib~-rW#etn%Gal{m>1}2?8Fy#lye~2b zYMGv!xPO*-etJ)8jP7TPHJ?1@F1p(m&*>v*V&mL!A+X??r%MN)CLz_cjC?f8j^%Y(#n==Rd>Bz+l74z@Uk(By~zGPBk-8!PwO?HS}$MaH`0E z+r7*8#@^0Njc&Xs#>KOJ>xOB(Z3iR_;jrRp|38W%FaLc|sdru5_vL5EuB%^v%aA{Yh_0*G-Mrk6Irl+G;0Az7Q&yx?{#X zsgwO&7Qw9><&u}Y_K7>sX)(#oYksKZqsUlm(PYl-99g$hC(5~Wa=YeUnRoe+o0W`j zD%a0>HqpJgxpry}yU&QMda8c6b>ohCZ?8V`oOb2NB~IN+pVLy4^tm}(|gjJvcvoI%eT@}a=mA#O2({CKX`=YmH0Ue zt>CcBlAI##tKOWy>+n1Pm%uCzbXR4LzoxC_% zFGcuQoHNriovHVfly?g_cubnAx8{J5xS01N=e^vgACxAp+@m{viKOGYBduREL|4Qr zWQ+dQ<9U!N{^!y^Nt@S)IC;3%bo8Zedf7A2cOGZTmW7J78Ud#i5J1p zKDQ|+Oq<S@(fg|1WsHyPDG!Qxtdp+~uo!7hD@v|38|3@Ujr6?ey#p z7bTu~oW}oWJrz2$>YBHx>DkF!y&_vpreC`w?q69qDJo0lOyW)*x$-qn{(k;YwR(fc zm!D}9H_TT5e!!+S^tZL#&Trdpkaj%iEk zPp5r zoYp@quad35ApN8J-XYs6Y5te7iOavc+WK~|%@R5LrIF+E@@F-CpYu!?aOK)`xA^Yy zl-}X>h&S8O`n1TE4<&hzUa{)`PPEB8m(%!s=h-XsTH4MoGdtyfB-32V}@{q&oI%goXJ z=fZ+n&U@FIT-kB(Vs4F_h~?&gr!#os9CLSHO`hvgdgA#)$NsM|`GS1>z6UaAT6xY|43;4Lp#B0 zDTCR`*{lo-PDFw-Xjd1-cB4m94s83 zJS!SocAT8Vf3QZtUZN~LaZ+k}cDb39u4m|}OT~QCiVTl=b&B(QvU;pc)eDP!dUNwn z?maKgMjU%L^CoLh=Ti1v@!wy+{8#$_UiIno_4U7*8|qS&GY)O!nDsGhMi{5q@yIy| z6H^QiK2qrp*70lC{Ncm0K5>$7l<&h*v-6)`$#j3ti3>24J#>^KsiL{tr|pB<>+L&k z+}279kq~N1(@S0M%Xw)_OTaz7sJ_(aCwwm4%h8-{$SuSq?yj0KZ>mXg@wq)M9@kFI z6iwciAT@pR6V0G6Zx*!NN?JL?y!hqfIrmPT4cwNfoo=b`dE?r|Jt;AURl2*shnze) zeU4}QzBr33m0?Xr&ze>~4N>>z-kg?rYR1_~%k46k_q>T*oUrk&wP^aiMNPMknWU%{ zS#CC%X4>W2c6px9P42ziWqIfP&VQRGqkY>tOXTdrgWG(ss-7r2Iq|}ek^-Sw^BAoU z?g+I$U%a^J>g2wOyKEAl#P+JYPEaYDjak~4H>&Pt2-rH=df_(WE&iCto2%DOos%HaBQxtUwMTc=p& zeLS*iPk+@8VczNs=NCCUOK;20NZcrVKD%Ra=wZINw@DYzN$e4nh7h}4$#KP%0u{B%a^j;Y<%Gah9gHms63 zpUU;6Hmr|L_WVshoA?c%(-f;s=b2y1H1=(5H(Zs-Q(|)aANS!S36jERo4oSx-T7ov zq?%LfmNjejM6a1glWsf2&u=jhbemH8$yIPmn%gPHYDaBY`}fJ6^IzAysOI`z zo80o&P45yeEm6GSCBAK@T$cco5C2-GGu^8@Rl?tYc^kVg@AKob-@o6klWjT@GWm_l z>(molm{(Ly-^BK^PkP1Vo(<7IWgVaLmrT6-qIIG4-iFl`-d?&Dvpu;TKzQ%Xma z)~tThYhZQLb-Az|2d`5|^6C`_%R#P@iSoVp9o@}pvNgn9LT?Py=!^lwl9 zyl`fdbqs8owQL8EfAKn{^=+lZqI)54>d%;-?qjfAGWq{uZ`BuV0abG6OF6`kIcFK~ zVd)JC{j9ac`ksW*lBQp+)d9<=N@nf%{G;OcP`r?Bf7eQ`)#ZWx;<0R* z8$|2m9|`QeCWqwWG zQ{VIjFYk_$nliI7)TC~O$Laq1==@^#Shfz6tur0x&T!tlqa|(P(Y#BshsqZ61^r`_ zI_}Nl{m@Hv#oZG2=(~$=^oIX&+jVzZig+DM(cgFukNQjBr7vDy{e1EMXTKW$`rLp1 z;(K54YhiV_ul_ym^NwG?cDBY;(W5tJsoOpG-X9FPNrHDDS+yN;&l8>%eyrW@MH6R9 zyZJ$>)dyxNoc(B6D|-HA_KjuUHJd#{*4rER+LRYEcl}^d{HVF=Xu8S%rMyp*>UQ?J z-qLn$`>Q0ly~8R0Xw^HZeYs6LL{D>cuQz|vW25?9@YKt_oy~QA-$l9XKdNx;l1oZ; zUbkSrcEjRzGVcA--uA{{QuY$d(A(msZB1BoN-_RgQKG}(Nu)LjBl`q&5A2lv271?X-jx)l_}Fd=2MSd(|c}aU63ny6Ap%(HW7+J8CDo z$Glm*F=>JBcI3q04m^3IBcb(7L(9@E!;`m984dgW0b!^YKc7%I^(tqU3cS?Q>1i6!w_*Gea|f$vOAZBuo9gR?VdUf22g_^OU* z#a+zm@A#1+%O9KE#TLBgYvAULFM-16cl)hLzVt-!>^s-`JInrk?9hm=-RquXaMUe0 zN9alX?dk7cdYdl~{&+*rh!A}swW~g?%X%Ab(X@;oLuKETeq#u zJNfFGN3C6QQJUOG3OL?^yX-CQ&)OvMoZM;xsUhca1iw)w}H|=nnuzX?O z;!DrA`3Ef6xH7LYHaPh1rm(FozuH6v+{%uW9ZxGcE_6FRK|Z$gEw@3D=aRywlWy%= zq44%p)SBg66Fs-oImf=9aA)gp;>(=yN+iGU67a4Ut`1OZ_ksZa;ri$_>9S<*2 z-F1nZ_2tuG^Mw1}lVuAv+;<6mY}*%``!U4i+BMndQ&n##-<3{Ush4-#N%`(g*4^z& zZ%@V=m#GTho-CVd{OeNeUE{3ey&pfw=-d-NaoAfNE)Oe-EjO!WQsvl>(=tch|T*rh(tF8j)%^~yu-($)!YQ#8KK zTEtp-U1YXks$hX&q@dT;`pG_pOMm5aF(g)Aa|o;Poqw*7wV{n-Y0CD>B# z-P_2us&e-imF9r=eas6Kmrjd+KZ#p*;mN~i9%mQlG^OUY)f;@Dqg9q0f2(QFiw04} zxx8=lG~6C_zJ2MpM7z|j;(76KRnTwUP7{br{0M31k*c953BHtciT*l2Pf>B%4o2~SnhR#%jc#E-zR*M$oOWodHK&~hs2i;S;e1n zgz{y1ESs+WTS#`N`nn5;qTI{M{5R#c=L*=Kl-86iD>!$zh3{+e<)*(?OHxu?mL#gr zbDey8w}pnW-{&_B0UyhcT-uni>73jCbm=d`8)FN>bTO*fsq(bu+Xj_>9f#WG3tW*?%Ht)?Za#qmpLo?`8HU$-+Pb)(Sc zXg0~J)w1GmG;0mFUO#D^e$GYe*6I^FYMW<<7|t|aV%oj6r>OPHnjEv!n|ihKD%NGZ zKc{wSU);8g?CjZF<>NPd#eVZzlNx{Q_V>%~FXjJy(XoBL{O^|Ov$y|vS!MNPx$T`j zlivxN{HuMudBI6}wY-F|jjZXf|2FGq$Es%BX=UCSAEO)fH%VJo$VAJ3k&&fB@2SZv z|0o?xeo}DehwJQu$1dyo_2%34-@o4{TRS7>*e=;RE5~^8mPZzT`o)h|KWMqFzpeA_ znhPgWc5CkX^JUTjLn-4wU$@rA-j)40CH{@bU7rO1wY$#f3n^uG$?f0awqX7AcE1(9 zrBfoO>Ap@nF?DPCv7n9LN^C;Kyr&l$u;%P8JGyK6FW0CqKVRBcc-~+3e4^BS{Y9y^ zH47b%Mc;TUUd_Ta{Q|3UYy2DG-xK5PH53%XpUUldc+Y?1O992dJH6_vLSwWutUjm4 z?oEA}vT4oQ?CP7_Qdaf6-oNQvN>aJa#a3f6{oA7cZ3^S& z&;M3fyQ9MM?WNSx)8T8@#Ba6Qv@9|A@vddhUi{*fHs6}lw{>gzk?pzf-`v``xjJ0w zX0h)o^Sj%t&)=*4oqldstZ91Qk584KwbK(8ir;u+>8>za$nE)R!Qvy&<$la57Juub z`aR;*<5Qofr+-9?G!g)sB zxg`m;2k#suJFn!D&_TU2~( zS$ms$^*7$TUPZQn^WB%cF)KT9aOcl}*cU-zXAeJfpZomrGUh#>_LTDGHLboOw))}JzPI~WpwjZWF1y>;72eX^QeAv2bIb3H?U&`+>nD~S?0;;qVBYVy&$n7W=37u3 z>-Srsm$iQlZRimTv}f*as4%sl-6cz^Zl$-`O?zVcji(r_bXmAcT3I*xN|&#*VnhU+jMJ%aPaPr zU#7?{6%CeYN*u)ai}ffyg0}GTey_|xl5B?%{*{y?iWpIALEZ|-zLqTn8Nq) z#M)~{hU{H=ySm>Uo9uo+x%XQ9AuldPYwc?tY=OBQS>c_p6K=#R*|HygCi!X09HsZO zjGtuBOk+9gynMw1#TR9=izgXB$)8!*#kD#%eZ>mZCswY?t9t9So?I)r${{JL?%CEe z*<{oFn5*+9yjJNAy7OhSNtEGbzn~5Cw}n>!(qv;j?=U#(aDTeHf3^(%f+o7%Qx+ZM=j^;o;AGGCpS^IN1>e!)bBBcWSF88V$4ZZ)Qx zGkNRJtK|@3|G?w)*g*90jJte~SrbnDeqmfuH_gty|G`fU+2#5-tJD+D9lr47xu=!0 zzvDmNU*a;$8EpOaFL_t&^I3mkb;Y~}w%2?8-d|k5@=Dt)UW+d(Vuzl0pAhIiDdK%X zecDBiKzGNDTm})oqKg{Sy4+TYz0O$L5j6RR!)zDrtqaTEyXoFjzx854#`42S!gn>y zE(;c_-fjA~`@;XoFZNykgfr@y-#))sC;9fetNP!lHw*4}HU6AQ zPk+h0TX6VpYO&o7mD9Gb3gXLlNN0-e_-*h=dfOTP)hRot%f2&h|IPdFjz50_OG1|O zjGgCKJYM#YL;k3>smwYa*~RRM&cg106f2G$_+97DfB8A%C&3LLlqDXv_185v-(%FZ zYx?i^m_1Xq(kJ4`68#xpW_bS3xK!xEz;J&_y^!_{o%54Y)oKd`IzG;|Kd?l9risI& zKaLh>qV9z+`1{mR#-o1U_2kz6|MSz7*L>HW!FydrJyi15i)!sJUCRaJ)p+{(*^3@E zU++teYxp$9)=__prF`$|ifMNmJDEir3)NS?G4Yk^cu*35gvZ2pl7Z)ewtT}gzK;YJ zR7+ggJJGGHKfs|TWbaCe&8!c+%GL(V{BB}oq8UD8$;_`e=HEIf{EaDV1GDb#=1Dfz z7SGODZ()9>Q}H1re)ICEzLi(n|8`BfRI}|zkl()2M^-zG!(!OKFX?)1^Zfc+%h+VY zZ5+w@vga8uOZ4A($+b&BVZZLGyNhm#$Yg~GtSu`R;oaH0;9%mEr~jr+Xm?&AX|!?4 zDmF?PnIPHQ?>312`%PB9fE%<#oM8G6fsd)7l z*ZfbMJUdUWzW>Dd7yEqPDsTBkhFKYz7j8f7`6ih)QO@?o<4}Le6?!Es%U?`lobxSo z%d}YxTQ#;WDBxV6lIz|m$?za-;RYQyp4edCmEa%AC8!as0#JhG*so$V zrg&B)byj%HGSQC6S@BmgT$6U1IbF#Pa=EZQPFi=}l`hxqW^O85IUg+uQ{&4N|ClK7 zc*EiqvYmT3Bu;x>vg37b-|0&_<;xGhU9?i`R&}DicNhnE+Rn**-);UC^nAaR@oQSw z^E|0$o`V~2xA^blleck|V-fXUKcS8<--eghd~dhMf8W06ix{@mvmL*t+_hm{zT-1d z<%#>>vpyF-s`34wWK1K+!>kYb5B}5?%w>9a?TsV*_a(6h?yfr2!Ds)k`IID^+x-Qf zInsYVItlKihd*yJ(Z!!OE`Zs=cB&Ip)^~P1WN%|6XdI?!A1e zEQfhNgheaGoRdwK3wbvSPg-SNtg2yi{fRK&BLNY<&YZrCZR$rZD}ViTFd#6<`>^jE z;l8Nw-dV{ej|(pq+OCxHY-UeQSfBMUD{1TBYW~*V%*V}a>om(-ScnYEpVZm~tJ$z3>Q+thVelfDG5?d{9ptm2ES^L)Md`j)$2 zmTj9}xA5)a?OXpUEr`_?%Vu|R+U;kvKsLm38|Tg~LJuEGmM#h6I4<^G#&^Tc?Se8E zCK5eT&pYHw-$l4zJ?j;GNBxT6UgxWZRX=prp1u$oCiyX!MeKFlALR%9$LG$|DJ`FM zm;1P~zv9xJJ~nr&Zd^HBc1?@3x@q2|OKbTrKI~es+$*mBL*EARZCq8W5A9pvKd*Me zGq&1W&0AET@Xa!xsq~_k&G-9Z5zbvsdA2DmvCBPgOO+*FS}@%(`l|oK-pf#-#E5r^am~f#(Il$ z{_-vLi|pR6F7dJUMY5AXTSAR0<`}g99{%W?qFOTaEm=-JvT3_?ZG2n{Z!}HYP-*|}BF}n-uASPy*zZ3)ou_fgBqMfhA@91AacjlD1-Im1 z(O#onUf0WYZAO#VrKfk6Z%k_*gV`2JeD zOLqT)U&VO`Z+(BTNM4cQFN4E>MbEeDCSkuNW0&k@P59rmYU_5!cjXxqzv*4g+Rt?0 z{^E{r(NXLF_N}{C$3NjevtJ`-G5zD9_uzafzm0e-U@UDODtk!?0 z**0>{-nYz7)M$>qS8|x5?*Gu*V5ud&bI!4^x%@?Va^0$~X8%V#E$8-rE_xVbAG0V+ zApYLR%5`gES~8|>+BIWupKWyN!NfNc^1qgU5bV7XzhD!4;#tY4D@Jccbn_VGriVyh z&I#FdVa?m+t5?PT-Lmr5QHEoo85Q51-p$J|)wkYXtyJE>x-9+ZGF3L=B70dQi7%5^ z%2;YST+S3bBkj;K!{;;Or=?q*YQ1{`lud7c@}00vQLB96-pP|rWK65!H#3*7{d0$f zx9;8Ht&atM&h(->z5q;WfH|z$@1yzg#1hTi_iY@$-0^zDE-7*(cgI=`ybv1`Inz-C*1GO zzEmPzqQ_-@hpE(lKYz@TiEGPuoL%+Z{@~k^l+57Ovijqh-tgSuld|Ms-=XtFW6Iv#M-w_?GR&Tt+{?8QUnCb3 z*xp-uVP(V5^snFIFIJcJ9=O>RzB_2WAa6~iy>ltg(Wh+n-{$m1>_4<(<~qHL(?4uK z=c%Firp$1=yH?3c?QPais&;*`NYi!|*ewxfc3>*A?d1Z)HJfgK{;;md<42?~cP8hP z&j-#HUl4efzq!gb^Osi4y6X(A*_m_hc`U8s_PuBxyz`!m=&!0-ZQo+HJb$<|=KiBA z5y3g~5+RLyH~I68Uf5 z89pY-Jltup`s%ua+&=?87Yp`mkohE4V0!q>KH;?YZ8s+y{5CZS^uMT5Yk#IzmoH&f z+Kb(pVz;hlTz{}LYX3RI>el2(l6^N<%icUCvw8i(|6%OSJJ;L{w@zCxpZBfE?Dqlo z8MP0X(*8Sdo8-7KW0lu4)5ZnWZDHF&<}9k}+iP`wZC*t2)r_dWD;I}M4c@WNvGbIz z`bxzOWh-LVnh82fua!D1lhCRh6Fq-nX+fIsKa*lpVcXUdC0%A~W*!s$#g((k@0$2j|xc51*UAUH?g^p7C3PrTy=VhtG=#{;ie&tKU$4(9vDGm$h2@!bi>p zkNvc+*t-Vp?{<4x9=!2i=7J}6tFFo~u=>lg_Hw_Hh`opAU%_30@0Uk^Js!~fM>%VP z@Rtq$LSJ3q@6rE?`HSzC{k`9~EB0|Yr*gk%Tb`tG#PoUni~fja7lFSMwKlmcHtt!~ z^(IMWa?h__e>d1Vxo;H>x^X#BK0S54g(=&f^#aG|JH#)wU%4P>!KEL@e_4gxV!Hk` z8_ZXib~!)m%k?+!1I5-Yh&0Qa(6q$bYE`nP!_KQ!S^>Y>c3rjSGuUZzq1bxwm+d*a z>w8t#?eDZJ=ktw&VTtOuucSFz3Z zeEZGcooxq;Oc6`oua>*d_>(w2epHH|`OomAylMC3b3aRi>ctjR@hzxgT<}Y8>I;3P z=l`V{zRI8Yy8eRJ-*%C!^*(QZ%|7umKhWvFrs`MofE)Wfw=b?$pU3}df5?NE2O0I3 z@S3G~36$uZ@L{;3d&0-bGt)6`IdlIK=9#x;Zw9hA6|^$XWPkZyD@Ibovt2=0{k;O0 zoc4RZCk|~I?CQ+ohdR?&SlfH8(R;b@;2ZvXTUetX{uewL9vEb0n=wZ%`9^xJOP$#X z8E|HuLYD z)1d<*uUB`Zg=|Z&uX5d7fCTUgtK6O=h zo3~TvR??|m8Qt!B{o6dY$1rA{nz}$PlK<7z)ef~qrWuVr4ZogBU2wX|5T$axsc%B> zf}nNGvYN9Um^Vq5OzCOroA%nVxrjMq;~fqww>&0U?Pv$*BI6eplFYgja~CY#BwMoQ z4Z~c8#|wm?nq4s3DO)n>4a;7Svc@=_@&>KN zc{7&!H2O{6yWn!F)EA?h>{ib2*yd_}Z#Xxp+A;lf?SjxE`xi2n!X@kGuu4ta?5ICI zbiwB*G8cXp>1Ax?Y1W%Cy*WPcKNoPPs=iRNRQ@G;OK6AJRh!knPYPGg*|uig z53Ze0zn;>REc0rcJ1KE_$_)_H%~EyooJoOxCpDJO3H7sFjbNYDSe`N^*yxm|aSNZ*!mo#WD%`+RN>8U)p3*Fy8hq%K=5+1lXM+7^uAdXMcFraT%copVr$|9< zZO!amRx>HkE^$}HMO7=0wTzptux>iT8{(2~`Q3@!P#_)crsb~@++pQW6Mo_a&xWMRkcr;RT7S#oaij$_&7 z9LKXO*pKb)v|xwwlim)(pMowd(P4i(G1zhaM9~GBt&id?c};YeH-9^M+M%5Jx^7Xw zm3;NppEs7DJ6>06w=PuMX2FZnE;*LJTrcC*6#2SmA3Z*I{uQ+qvz>NZ_*5S`Tf$)b z`^egowL6;E370>7mhqp9XQpD!i49Cqb%6^W$v27g4>aZ!Bb6U5TzDM^|hg*v@*SgB4ZMNlQ|2FAnp2(k9Kk^IM z(p6GZ+8zqa|MBg6TwQkEG&A_egzt0aeBO8d^PcIp^?yG<*Jd#Ov9MwBjI)XB8bqFj z>YVsG%OqaJpzC$zuDB^_D;pf|OnBy1&e%oBO@7K?^`Kl|Mo;P~Sds+Nbea#9M{v&#aL(YDh)Ae|# zZ~pGUO!h;3nc}ytt?%rATxnLQz3yd;0egq!r@o&RcXywy?EbT;q-P)3@1?4t>5uk& zo_79h!}?G2Q~I99efQwIxKxU_?K}TYn;?Fl*B85Pas@BBGI)r%oo)3E8fj` zZ}3Fs-4*Az?K|%&U3<6XniT&|(H4P~$Hl9%h3^My|My<}-Qw;O#;4KZzSntf*=@{| z$#IIc(4Bpn?abHEEe5xRFBk93iE4aquei$TZuW1nc(F~7-K(Xm;|^t6G%AVK)E^eR zeQ4RX6R)jJg7!|lEVb{LxzwwO>3r&@GKUL!lO?Vfh)YYIOA0=`{l=vN{`;9f*1H(Sx#5=Pp&*YYpq!McFASGd9r^V2#n!d zwL+@m;>Ca8)Z&jcWZwR=m-SEEhm{YDmaS^<-5mJpccjdtwcGZ@3UZvEddGG~XM5^4 zA8(exc_#lQqb-yUh}haMULd(_d$vbe_r2|kHw~gft(L1zn!BLBd}59gy^u)e2)GWEq`Imo%e!z;0v+9}8PRM3|pDT6#h1uPuNo`#P6YqWZ z4mo^!VOO%C(;6q${YEdB@VSfrlTNn0bo$AG<7>1HUvHTB&f&Jn3I=y8i5nsF)HL~9 zCOw~clxbq@Yb7baOR{dNDnSK|^N(BzPkyn+=f(B=LVI!|rY+T*lhZW0x1ep^4E=FqH+-XnF|WK^a>q z;G9{MT$+C4$FA?)Tx03rm1Ea5`N|q*J`-QXgj+MF9Xm2% z*|JWiRS6qqcdgvGHZ@kWHdpR9yVBEzr?~ZNGgO?Gg!TTK^WEmF`4@hd&|Ai@dktqO zoc@09&d%>=W)`P^yL$V6JkyLL=88W)L^51wev#=ck(v2y>Cc#1`b-fVk4_6T?GSuq zBYb4hoI6t{uaVJZ-Kg_-EyF&c3)g&ao5^#{i92m)P;W3-njFp0ak4a-h-T<7&GnWyO@PzOrl0 z6PJn2eyY!JgjISkP`?)w+kfiS*;}=Z|E4W1Ijbewwaw;f?df}k75*%bHfvvx(mW%3 zTx-heD{pEF4^A>FF<))2x4G0sQ2d2e)XK*uRV7~@uj%VBN&nDzVCMG?i(9gVUT*8_ zFAP0Uo*8lc`iYk_4lI#bYw$Q)c7B3a!h<9833y@xChkM(8$ zuKrxur+@Ca`RYa9T?|H#&a~T|TiIm2OmAKP4!Z+$G}toOEq`|ww$`1fU`%xR*YaLp zLe7d>al9r{w7DscEuW4(Ca5jTc%k>uV2_vfA` z+PP(3$32nJyTo17vBUjE`nA){M_BDaxd;NCCrezrgTAwm+%xmIL=!uymaXi)MBiFvi zr+cN8{EXA*r0B^+?YXvmb1> zPkiK_b>nRK#e>t8zlPljzB04@MA59ff-XC|W-71OyL+YCZ$3xrgN1=X2Wy#=pOcfCT#}ie=bBfVn_83zVnPa^-eBMS z%MJpy!pjXk?<{LEnb5)(wZKAi?av((HKtGU@>poQ&iq(ye13QR|G)p3AE?GXU65?u?_M#-mCgUtjf25kXIe>F z&9W-vyu~gl;I-HL_vGAO=9dxq%nxrjKHtu9Q`oZPZNeLFC)I^ZYH#J1?$EnDZ5@wQ zOv=3#Rv%>Cd6-`ATzgDXvG&1SW50#!v4tjbUt8<5zRUKBRNp&Lb}lD=Rk4f@yZEQB zgl}y3PDoY0yI}qP{Nb{@A3aPLNpP4bOqu*LG^y?J>EoQ|?@eNv9GKn7Gdah$@}I_9 z7mb)3;qPtYOJog&@(u`Rr9HM)eBX86QRd10L^CCs<7MsF3ja?^l&C$LV<7O*clYlq z!~2mucQe!yr`+i@|Hl3(KudO2XYhM%2Ikcj%aYF@u+w3Vd{Sa#{(;G~Isc|wV!9`qV$y!?eDVt9Zg@KL&fUy+_onPS6gM?cL&ZMDJE!=p{DpNB)oSK`N;~9Z`^0$Bsu}BT zgadV2e&6U}pLIA!v1az+J8@jbueP7l{v`JxF=P8bqzeT>X^Z6>+tgxC1_oat9IO7E z^YhX&(;FS{q!wWg)>LSEP258r#f>b6#H?f;v~vp0NL@Y}}t zv;6&!b@#vjyT9Mxru?5$gKNb)fwensAHHtOb#KvwIK!INP1`jqb~hd7dMC{N{zHQ5 zy_FB@KH4fhUcr9ULM`sS(E9S~4-EGnAFSGQy_x;vgbhFKB#$5c{#VZDIQx;;E{aR- zRy;^t_^G3bzp_ARdCO0J?zR0I7P@NbDLoYdt(%R`arX9Wd1y$8>K!}s?|90b@B+t! z$B(`V{J3ky1H;BQ!d!MM9|UvRt$kq3Ww-jlq$XJ|x$qB`8~<1G&pROAvQ+=nk4a7X z)f;5uCw>fNjSv1%%6dQGgD>m-pbxpM_a}agP5d*X=e_5QOVXU#iniBsw?2x zsEVzoOC*=IWSUH6?i0wpX&$(xBYU-J^zDquZ5@ZWG9UUzT@g4IEEf})p6@k%ZEM-~ zY{B%Iol^ofoH5|7wp3oR@~(=b)P#UJB{>m}6UD903dfx?TD>++B~N(bI^M#|Z&haL zZOQneR(ELE$^I)^SB~7dmwCj3uT^zQy6Y90Ye^f;ykB2m?7L=8&->FE>g<^t%+I8@ zMHvgWH%zxr5PEQjQ(AV~-eX;}|LXpBsybq(Gx^&&&l!P}g*PN0-SCBzu{7=Vyy*`T z-NGZoBCfkUFbx-5RK~sb&9!z_pYt1cAHDhRI%nu3kEB0Fy4xm-?i9UtbzSl@pWKcO zDtz6VcV%Vs48N~4Tx2Mgm&vzOW<^nv&9d9li^5#`Zyo;Mzwq3?*s2p^t@l>9K4zJ5 zKIK!44tHztnU5urA2U4sCHRPlwe;e7gET;9{NXM_DsEVbuE8Yu0PQTJKAe-bLpd{FG4>i z|8Y6$zcKRI`4F4V`Q1VoEyy0wqYf2{4g|M0s|8du(> z9r`ydYM7^d;dNQ7ct7mnV}6z`vB%^?|8V-R>`3VEvVW|vaxrD^6fc&KCSRu9*V)AN zzFOtXKDFDSe?l2%3tc*sHM`ANoPTAG2@CiwY3K) zoHsgr*zQ~BhI{Xg*=pL}Uj8m=XnpO0F!OAW&_BHO;UD=KH<%pvoEWg!eR0?o_a!@x zg^HUBF07E;%*)HG)mFHC#V`Ary3t4XyZl^|XQ#5_%HecHd8-LlKh`|l>~QpQh1;?H zp?}z?huUa|r1y!}B;VQ6t7yx8`%Q|~iQ4!xQkQPFbX+hBR&Y(4KPkXyrqP>VUdK(o z9uq$}-sLOQ+P>yp?CqQPl)@%i>uq%YtKzJD@^b16o99o%Gymtj=rc~wbe`rEd2ZT_ zoL7&JUvsUnVe88KcHB(*o1Yx3uFyjtCx!6pT}hgy5=UCoqF*L#ek|X2)5_LIvi$Xd z*%SA*sWC2J*fr~p^`gUmi)Su5$>|vCv*XI9^$eU>uV0^;u}8r(^!X{F-fKdCGxp5R zU-00^R})3sm2qWjzf5^%;LPQ6M5ku!?S=(jk{{h{pOqY%x^YX~+pFEhM_p%~e|*HN zyZDg5@9GV&yy9BT7$cp!$R?lB_s6(vx<;lWx8!CiF z4Rr3_>8|{fzIEPzhtCT;;!aL<|KeVk-lcXv-;m37d3#IVIjx_f_SZRj%#VR)bQ z+$$ZgyhG2Xq=@Er#b1>8wC87BIMch6T*WItOuECx8fV$=Bq~~E#8tgQA&l9{@uQg9 z1J4B+d+)DSGkB_TN`JwQbdlh{oKrfMPGZT6cyIrfMcb$9;iKKN7_Tjm*}9@xK6=NZ zOBse6b4xF6=3$9>+8l1cBDHeU(fQGL#y?Y)NAaf7wFEU9n5icf#8UpRGV znte<1*VJ{cz3;eZ+zWmv=lD}2%|t9jL?xh*rBr#wOs5xfT}zU7Ub43CG;Xx~*VPnw z#1)(JhG8qxlE$!X;!r!-H^OKo#GW@g0ic&AnN zLd1%{5j}P-8HI9u3+Ef<{j%Vj`{h*fHTfe9Y%llr{QqBGq_V1jug!Uzl1)$Sjk7%Y z#i!m@%}dIYOq6ss^67k9C$@G?3(srGE%v^bD<7Hp89tKewibt>&`J+BMdkIuZLv=odY3oIEnCGP^+C9+Ug%I2(`s=J=A8n&X1>|Q z$+5k7ZU5@MHnP?p8N6S8>ZKAD1>YS#Ez{D-bEqMB5znEmM&CjUty zu0JeNenm5;mkP1V{JuO{NpiJO+_@s}zJ=DoZS$7&XcR`YNWI~(;VXZ7vZ36OiMxN1 z)q~h4JkMD6bkB8+JW$E zpW>cwz1D@Nb{XEeC%B_!rAm}wp)EuCgDv~l*^Q$tTR>m4LPWdz)85s)s$%XvTPL@@yfob3@z;-S2CE~( z{lfcgD${+d+-L6jeCW!#$SIZA=ZS_#Xn(&xx3xsASX4~in*H}np-bhO;rHLLl)pe5 zeNb>-_;fh~1H%Ib%zJ^sdo-L&i%arzJravEd=m>)3?a?7+8$r7Lk0q^_cKhRxW)Jt zVt1Im5bavj{pgVJlH3>knM%H|AI4NL@T)G{QS{j6nXTNJ8t@Gp{SA$VKUn@}{W6<; z+{^Qj*1O#FS(7)UD&^gdy2F}Sd10o}wo9%`yDvTA;dYubv(4O1T+P4oerVVKJ$Yp; z0!^E*ZR(x6AuP(tf?=o7t_Rb%OpA1n`2W0R;^LkUb2kddd^RY2nfR*a-L-OalPv|` z7*PjWtdlNSi?A{;A>LgIKDu4vuJO#1DlZEJxlCCFd9SHBY!J!L z70lJ#GR1qVgGiO^B*9B6!n3%y@&9_T|HAiI-ttk?1N5_Zep$Nisr{#euk6y7T~-M= zsM>A$-1`2_`*!!=&iV84%kp@Jo<%Z_=F<+paEjuQ?|vw3xW;8e*J`$P?mKoAa2C(~wYgFM`J^jdR*61axrflTOTs=oP z+ka)Kc@a;D;L8)AZ$Emj@gncYz1uZy_M-C(n}6gpavyJcT~-=)Eqa+3_62X|;@Ow2e=3yq)wM#y z9wSxNx-IXD8jbG!`n0;T@r>}zO%Yp-D&L)~*?2v5eVfbSou!;dgpG3&U#(htG|Te& z8gum{S0`Q7xji$;vf6C&M(q+~vHR-JjZS+7I{vS7VEtWqb?d7KjT;~R5xf3UyKLhT z>*WclHQ&Cx`?Bo&1>Zd{%$R_JB|C$jXYF*lrZ-z7aq`c4 ze~xmWGY=*;H8$T7Vtspd;%U1?v)}*j&eL3B>AHGS{0h+-ucx(n+(_a+U0iIQzC7&4 zn`_UOy-gA2d0$*Fm1K3f<$KiUqZMC1>%MP0bUem+_X+c-8uel!GEZ*=Z-4jH&YSV$ z@kc*?NgSHP{(YW22-_K)%y^0|1Lmdt2b zHqSj`uG4I*-ovk0U9NU_6xW|gb!vL<=;c|pz$0_QzLh~zi$o?|GANV^nlgD#?CBZl zmM7jz?z?{cct`PL2}S+cC%PZmgg=@S@Toe(Ug5`u@0J>0Uak3ZzQk}|{Yti8i|eU! zOW(Deuep|d?c^G>%W>-#UoF4*ig!!$mA$=_<=)1gQ_={&a88|l=J$oq->gmYk8N3} zr?^P(bnvg(J@aFP-=8RYozoU1TVtSb3Gb zmla%HweaDHOU)&keq!;@xB zEsS51p4^i?$M98AO@Dkq#p~xvy__?eng;{5amj1bWeZ`fU zpEh~hqs?CJQr);ZTBy{n)G2#zn4V@mw|BGS%B~Ns`SYHiUiIAj{`rjP%AT^om9l%T zT-?~~7btql+TzZgbw{n(f0bEYcy4}H=h+^!zaD1X)=vV3uTER?s?7YamBx(YOvghG z$DO&q`;EP`yw|7N{-1y9<%K^i(TujYT2r%Ecela ziGkq+D+7ZO)&V7yY6M)idX|93mGX-qW$e_D+j+Mf1Z=Z=c#mYx@pjJl%5VxY&}`ds zmRlpJ<&qg!u6$EPe21${qpW1GYW-EaEmMD8;D2H7@^|v8&3%~-i)PqWl%;<^Gjp@? z?tedj|K?}deZ$-FVA-TIn?*u$xXsml;#?h%@-;u2fAeonr($saZrjbztz^G%N#(2A zoqdh1_Ws+wPycQ%|Fg*H#;UhB{@EQ))8m?xZ*;=+`<0}K6}S7o)?LVsjBDP$Ys;pP z^4oiEKbfcdryx+wN#Ys5?ET$VpLF|wuRFd#*0S&E)m?k;Z_n5*G10E|V#7-KE1BoOYvwZ^19_=i6j^BUhVA zh3)-(=h2gu!sQRPuDxDXV0%oWTPe($t5{0NBTFMO{BW&Jz{jS<=k@EDofVnvRz)54 zZhNYE>g8G&(LO8vJWq!3k6nuHYv;OZT}^tMCu2L&(3j_CWXHsX;p;E?H@@7pLiucp z$D%bQ+f6>*o1lKtB3)#kgAvz#f!{uPJfBlUnH+Z=vz?WlzC)HI&;H;vS zW0k|a8{N|JiuJP={5EwG|KF}Bcgc2%{~_hS4H@$7QSO%cid99@?HZ zit<%WQYi_}(*l+m_8vjHPZ%^9W&U8MR~s_}gE|KTgD#QjGB_1F&C(kh9eg=J;Gf@R zwM?I-6$ho2l(O_44(=BF*rYI(N$W=7eLrWm#kozHuinmoA^)M3eQuykZNZ15?EfeC zRZj|7QIeBxmHz$ByPw~zcUNDEuisb8UclxpRT9&8xyaR-sgn2cj#UqC=^ZJE&B@EK z=$!2|yXSI|cSbPRGSNF}6ZWcyqb_=Y zhZgwVocFux;unc8O}Vq*rL(neEWfP`Jx#+4!%vzo>{%DNwO_i_G;5P+1%Fcm7bsaOIWtNbx6AS_?Yph zAFN9aKmRTZt8fAGiJT za)N#iwmrYiZtb`r{r0<0JhlJ%6FqJ{^Oj$CLE?+c z<+&>lYA-X-4%$~cTYo`iTj;0uo^@Mh{r7twYBv9RWoulZ(hQAHYooq#*-m2m^-_5H z0)IJgHP^)+!2*J{i#OhK-ko{N)gx=>n{*eWc!k;}b6fUqIVHlJDfQdqdMh9A@4^XB z7OI_2Z0uKl!E2a5QN+&lGv~xo7yCcW7Mpnk?>4S56X;*0?{Y_>FL09bP5F+!&OTA6 z^Aya~KeX?2N{eVWvi~C-d)WDPzs zl_^Y5CbVDZ3%n{3x?28tVUy8!p?1ePi>x`O{Z(nMIB3*ib+^N7qWRm~OMm3^Xq?bE z5hwmtBJ0jFnQMEZKb&8u{I8h(;evqgwN18;1|6Af;^-N!sJa?t>5{tD>bsI9S#y?{J%joyf zcK2<8QyLRz+CG0%ZTY-*{&P#|c{a5>*b_M3PhH3-$p5NvCr_YH=k?5uyOi1_KmOV! zk(PSIM&od*WU<_o?ia?}(&LVW@~_G{EiHGdD)?Bmkyy$RNtM{UMyY$wKInUu_Dig} z-0k|+5|x!HMpVTVA^q$^u69hk>dR*4Y?}FN)vluo>YH9}(ORSW zY}d4xaw#uto^ssUlHzmOw0O?K)8$bG_mvz44Z~J`TQy_Z>d!Z?bj|A1*7n?V5VAfqBP+_V*TngMX0Lc#aA!}{tG#hLM|>8$r)Sv2U08cI-L=*K z=1a*(%&n&#J5Ri|mD~waq=OMa&Jwc;|2FpKo$g?Ddo9 zfgf}vZk9OBy`=N3|Ej6Nracvc>3d%sVr@F!ot^Q0kuT4Cg%?LBMVKzS+0D1b_>1gZ zVZ##lBPxY&nROS=n6=P-yU?p;5fc{lCq3_N%}KJI6%s5mkN@K$;j=ul?sw0qOnxD_(7MtG($t z?^LrD8#A|Wn{9My^C7Wsb5k~Z{Pdjr#dHn3GxMD$ zJe>PhrtZbdt$Cm3EWRrLM7Y}b7qg|of4v>{8<@lSgnZxad~nZ#yF2xydq&Rg=35VP zuP5HV5ENnMaPr&3_^JXEbAD-l?Vha(--YYae}t!e^bb62@2vb^#`lk2)K9Zr zKg2E0??1xvpDX!~oZ64;FP6&e552BZvqfkwtKfq6#hkS-me<8xN#uWf$EQ$HyUF@v zv&rp!VW0N8_(UTllGN-wQ!4&KmZqHtq}T9k}nivi}#``$w_qk6_!+a*ogM1s_(=c>cTNv;2l5 z^;>4iY|Ad4m9tR(<_6XI3Y9Ex=A_LQ5wEP$3Chv3I+>Kt_slr@^USqVG#OU4U-@Ca zsYA0dKvSAYNKN`A_hl~m^z&@tfv^Od;I z)(4k7R*wC4p%hG)JoT^X6XO)%VC;BEUEv{f(T2j6E#pEAojcf-g|0+2q28Q1( z3=9T@8#CUim8eBuZ^+%EOAaFc%$BIMWNZw(5~$6T)!>zJT>E7~bEviJUX8&8bxN&q{tB#hX)haQb zkSRYe98$J13os5yKXFPpKP=a9O4Z_oSANX(GBW&kJ*tGaOP@_Ks6CplzW!(A>^hpnHdS(Qng zddX;FlNxjG)6G@B`fZx&?K{>iR^W1f)GGcyUvu5cw8XkFSOnd@(uZ6eQ0R{r~u47ySzh zwx8r;HPyXjbm7W}7uFk3R(VcyGm6izX$i}(aeC&=v&$)cn!|;C54B!yyQG;TE3L9# zztSv}>5jw16(TQ-H(i+WCLF>C;(7Og3$)k(4 zQva{p@`Zci2d%eyrstC0%5Cd-XcTUCa;oR1sUH-krN$^nw)t_evwpgx*4gBFxTGNd z`V0HB2Zd+YqYaixvN#mIXJTOZ%!YYUI+l9YJGBzgY@X^Hd^td*?f&g8zS2xvG&Gum z7G~H_X}TZevf;pmg{Kzzh`+lup)p~$L1xz@`J%^8=>lmnJ4zn*7ulHaog!wntou&? zGErvG=b?{m$Qd*yg9+%xN$6jL$6jGv~5sTf)J6 zrV?%5%To7bUt8U_d2wiVilpYvU16&;`c8g7B=Mv*pilSlj+`AlSr<3)EDyLW#oPSm zd##aLbYaNT2=l)`KG-;)W8b)C^VIt*pG<##YemOPslI2o_yU7pUTQ2`vh`8dAwRo| zn|7vW=3QRMBWyd@qI{-JGw)|(OV5=h6EEz_-8n1s;zhUMwF_pYy?wfEHGA8;XP4hg z&N#bt*QYL%qMlu~E-MahTK!UfMM>eI330|I$Grn5Zal%zR(e0~r{?YlrN$pJ=kas% zT>i(%Gg;PYO_=n$#V_?btJbv!ZJXVfmowvD?F+8?j~lhv43{J^XvLpBbz*hIp&ebG zdxAFhXo{}?=;kW4nP+otEU(b6bkCBnf6pB*c>Z6H$9dYviJwGni?;<%Wx z+HGs2*A?$cv`(2ExL{c&TiemN>j(U^^rwCC`S!S-rB+&wOMsc)IQRoaBq=%1Lr2+N846x>#k|KaNYZfM|{dF-DNC=(R1uib>0ka z(N|`-c@lBjQ{kspqwd6Wed<);w7>mCN0`@Wdq#d!fJ+3PDX#3nMzG&pJ7;@#{Xh&S~zu zzZhI=jH=QQYS>b{|(N@-|Y)e_K z!oMGyCQgoN$+`oW_1|MztA#Y+|}!q{yKS z3B~$_Wl8E!3I&WZtoOZdsqJ^4=zM+coFiLj7Obi)HM{=u;`|!_;u%$k@4mb6E^n)z z(W!mKLdI)md_AaW|7_avznx#pN?!CN@6vs{Q+WPyPY=y!XRHi0GK?A$t;;hi_m*DT z=%t=pSR$eIlhMQ>an9M#H$!jR$zKzed!+TA)zhLZZpTZp^hZ%iVp6AOTwkzgNg}f@ z>$EmAD=srhvw!J@JZEKox(Cp0Zz9P(p>COSIK+a3gQ#!4;e&qbberE6P13wmp5gV1RTDmXEKCh;Z88;Aogx~gG= zz!_{& z3T;8b>AUKtJbh#E_jRGZlP1%~jo;Vpy1piF-PgcPFQxUq%T8ahv*vL}{iE3ZRTX|_ zr`A;_6z_i=)beGin>3Txw8Ha$+}win;?=jjyJ2UZtCg#Ey>!!#+JIY`vXZ;v&(^0T z^krOa)o$awYqUdp!YoglWQN1HPfT<%-5|uH`)#StG%jbeTa9st9QLk{p7*}!?t05< zuAQ^`?yioxTWYl~FK6b#FYOxHhvJ*tJbAU&aca&!Qp~Gwuw1csx>Q`E<6-6$$!W){ zn0Y>jtGfEzt}{@~ttNOH;iC7v_5bTT(wG73`3c2YaUduLH?+KZI14~5djE<$I_mvmb1 zENHr+`N-a_Lz~&%IwgClTUegO)U)accP$AgXg$yCjjp9rQxq20Rgq+%BPmV^GHXRm@$TT4(MnUI}mJO~> z4nmCyx;!Tt8dKC#9FK^)=sxJu?kHXR^3ePBp-p10yFFcZheyA@boJV{|M&N=UK?`q z|J>jA?o>`@nY69!-QM^2exI{_ZvA}T)7IeheMLbLKJMnVRQ} zkCy1~bnSGXQf%Kmd*+=v?^UPISbF~O?YP3m8E*x}Kb5fVw`ia36@2FDzEj=LlpZU+ zd2(@2N|fTNy-E94JUq_2CsnautZ?%T`RN~4Oq<=kGjf(ovWu+w=^q>Cxu4z{`OvkP zbN|Lk;!-;@Q$9^s>kdsS-4vlbYe!^u*Xc6`uaPRov) z2UKS7%zSvE)=Z|-!CO?ys53E zbjp`qc-Iv7+j|xTmlR$;>)Wrn?Q@jr<{DOWYoEfUnq{9BhR=MIrN1`q!TN{)qWX9A z{eEqmG~NBpw+`taFKh1YIxb>9>ycXUot&=oGm_RT2t8Td>vCwWY3{;x>k6hToIm7I z{(LI$!#u}#p$oUk%`4XDjW*US+PKa7j^wMpGA^%UPJc9A-}T$hPLl7?=Pb?bdtY$! zJ8N(JhJwJaOG|rSXT8pr&R+fc+SQQtE7q;d%@I<`a$KP%_3{;;>n>GC*|y1Q8o7~Q zXWdGju2=j{+ix41`V zEwU9{@L=WsE$i~`UTS@yus6>;qk6>}U6Gq1+iDI^D=0Sis651VDDc`Y8*$+XpRA0# zBAlh)OCD{=>|8yy&;4jr>f=k6y{n&vJhV@^Ao?zcck5cN^0KXN%G0muHEa>z9rMh8 z|F5rSzTR(NwCz@xly!qq$A{nV-fnXkN+eME;FSz<{Q9biutJ|Tkwr`~m z&F!6Lb@}z8vjX-k0v~exrS8s-E{wZpFpKT?;vX^(!i8UPm~JmSEMR*!YsO5E->3Q{ z{w_-7(B?f@Aic}^Y_y?z{Lx(Ia@Vaolj4r#Rs}BVdj4TahW{4f?(q6YKB)rBS>7gZ z>OQwi<6*Ml%_Qg8=-1V^Zn22+EM2$IC%m0;VQ$VGW_v}A?VC0xeb}~2X^r^fcI`{T zo%54&rfpL!d(a-ooqxE&F|T(^OS#S@z6C3`O?!Lfu2^5rt9v?y2N&PGwROYZ=B*9s z5iR>Vdn0m=t{1h}SeUTnd&R8|Gp)IbUpS=9MQkG4nzQ@db~&$|xNd3B=?P){Wwr^| zzvYNJE7>~Td;b5pzI9H(`xlI5o88NPx0S>f)Lr`M6nlGZ-1LMO7AzA)BGV%oeilfX zL|>NVD{XhLd6~Gx)6htwpK0Q&ZD#Cqdltq#oa3@zj9YugJc}jIOX6lmI`4^)lzC=q z*8kTa%!Nf#W|HzlZJB+{7B}^jB%O~lZHwe`rAylv}gk?lMp#|3X3SJzQ-Dap0I zw^vlk_VlzF98%9&pYvKJMAS`Q|03rtU-Yj-zFTA+vaf_a{4_7`My|8@l`DCz)-sc8 z*ZDT3{c%4~DgG{luY7}tzz;K<<|yx;^>-R;uDS``JY{v+38^%x3-@)Xw|ta zyRBHZ+<(dP?)9soBSuF5o!L=ayTbK5_!ITM zDTPZ_N~f+&+*`cAf89b^yIr#q;(jV~O4;q2RQBryr`UUjyH6LdUU6Q8z4noS?d!$w zFDl#Z>Rb2yVs6Rq{&x$kE1jqJSH1jfS2gMRyoa^^pYDiP+`qi%X{g*@cl}>Sm>+HE zU-$H?{l)pUU(EB$E*>xNw)?11+u`t1c=8L&H)6qoGkFUmYaeY+TIFxk(zeg{{>O{f zU)J^CThdAlD-5VZ$J9_H%p@}m5UCS!YsLQq29evI)tDsxm=i+PO`OjzS2h8_hV(>+i z^TO{Jm0=&kUuJ*U_573XhuG)eeC#Ir)^a#H?-uycyZT1n{toSkBdn2feEQF3>L+qq zZVQ{#e$doz;(4EE^P*E&t~B0LObhO;WB8Y;;m%-h&9m$>D{K4BNk3jH)fRYo9k`{n zyPa!;;kkp!Z;ROPRWe@*ly_CTE1X%Fb5dTxXq(BGk`fo|-G|TR=A{%orfXj^?KOw&4q);;ktZ@IIxE~WDM ziOXMF4;NX=tbIA@T+8Nk7lVD%J{%J`^foJf)zgWc;kxw`r8XI`2L6vMmU=SN?CjJ& zos&ykw()px;yoAs;>B$+)rjz}&SF|3Q;`Dgs)jdQ~sD8t1mzMP+jTyX}^H!O2>n zhhd?Hz{>^Ij+zN4y}n=kEA%t^#eyrM{SvjjB3v&8o|RNFY__X@YiHH-&+(7Z$-DiF zODEfDn<(|?A3Cn$vgybdMeg9J&g~oB<~f8_Ju{R#{^>=K-1<59J=IF;*Dq1~u32Ye zX8&=s?YEmg{}X5bi`#QFd#UpaoeA?!ZdmqH;_{X)E&;k~TpFBj*D)@5r)KYyro^*` zgDs3ncz3vAV3zR@heJL+YuyjY#Z1KHwc;-^wYfEQ5HI09uqFOt1Qx)T<;8RYztK4NmQrTuXOikaHal7AhR{1>7 z_)R>Qup(LjPB;nfhku z&6}B?)?4nruAETyHLv6u-_Hk6+m*SFaz1F9FmdP0*Ct*27?;*e-ZYWPf8pdw>utJM z1U(4(m0!^Df$ee?*S58m6?3x|&pq~X*V(Z4v)67UoP5quxnW6v5#OXt2F|}H7*zH> zwkTXUN@b;cqEl^!MyOP&6khOtLRfZYg92MaZ31(KkFtx z5%T{Td;ZdsIqjOp0f!E2)=sIPFsZ^Kbe(9(j;i1HLwKU(p3k@Vq3pHna>IvsgLZ$7 z`R5YW&euBlutsqSL#UX%*WA)eM`UB5TS zRA>lQIwS}Q%-~^J#?V;fVLw%@gQ@*V_f!!2JoU*`uTL+%J}q*5wjpAs^F@v`iB6Mp z`R*S{T=C&;b&+V?=Y)OT8&~j8Vd{=_Yg>4sz|$n=sc7E*-=eEN>~3^x`)DA_;#HXw z*)qR9Sleg+?k5^O$9g}+yfB~t=w=gFdH(;C4wpBFq^z;`a&6>UyhY{kRrjMxeYbV) zqzP?qxXt=Rc(Y)(_6mnH3wJIO+HrPix2xz{0r5cQXZqr%TRe3ZmfNdkSf<#Yw52rSqFU#+#tpSIU2Y$m@ipb5?a~+X0!sL` zcdgglwOr)xb%*bcnfw=ysu)exd-Q5X-K-?8O4-IzV@d+4yg(PsFq+EB}zkk9lcd!<_p+l%V~dn4Slk5qAf72zrSY`hI-Gv8?4svv+ zof6R9aXnE>SbAklPSDIBE-wGXU;GYw!PN1KxzayfV@8_Ar2Rks$*=lrAM~4l_1`%H zn=YJOQtM+k`JP3uiSj(feJdxGxE(*bV^gD!wq@Yd$@4xLR5HIbo?vM|xAn-*LmWSP z?Q%Xy&v8z_+cI}?>PDjrYGnu1)~WR0@Lc&pAo=K3fuB~Vgsxv!+1Sl>G;fw--h`y{ zTh4_jom(P*`pH4p)Gxv!Y*OpeIrpmGjTD=6+21hT;?8%U_TPR=A30NJd@)7^3 zxBdCI{hP$1?f+YM+z~x-&+|>|o!<)I>%7FbKd`&wW%`xNcyKUU;c9Zqe8CYquU$ipLGj67<%cc!4=E?N&1Hk%FY;7{r;b}d(m-CPQ9i5 z=gRLa{}uGx?& zADuP{wQ+WR6nSU!;*xzY7HbvuOzU|5U`k)`=88t8N3OS2{VvFToKzGboLI4c%7>|m zf08*XSYAD-&b$yMVR7I4+=l!RuN@cnO;?Nc-XCOH>#+By^VetnS7x_goxM?dmaAHx zhRB50`O!=2To&7mBE4fp{-LVj0=&F$3_K7d&X>63ny~R%- zrC(90^Lu?%e}%8Z>POd0mR8JPC$@j->!a)&X5PPe_7VT9Ptz9aJv)7RWBGii^7*IE z<%Qh5S*m6II_&1nuwT7+qhXuuk6H;?CZO#+)zC)wEvw>3eN) zyYN?g6m48gt z|Fu;+_bZ>O;h6u0U*psK4{GuUFV9F(Ok9{c*N@GD<4#;_v8os)lM zN>wIB{X5LysxPx7!}0%OI~LoddVh_Q3>K~xm!GGx3kn4{-CUH|-}d0!^#(rKqq1vt z{I(cAxq9r9hHmq*%$ZYK>n54?ac%i{YG;pIP*IGPqfF9cGcJw4>wAJfo``+XVPBv* z|3XHe{ql|B7vw{C{@i!wUdJ<5|4HfvJz9MyG}eVbEnwiE_GC)9MBQW2Q(V7zf9$oJ zl`J}gO$|%FB8H}^qKIWVW&2*f) zFeR|>%3Q{q%RFC79I8B}_3Y%DscRR-oO=1^h|zh)=N2#C39nmwudT3Z;qsCvvt=?& z|1q!B{dBtGk%Il%mD5iieDmqorSOa#%_TM`m68Gi?%)3JzH-fX879B9=1ZqeEc2M2E~(?qv#?zs5O-fnX1Sqnr0UYT>xQdxCfFtFN+;{7i}VL%IpkSy zl$1Qw@F(&&&y{WBLT{T_eY@OxOSf;=4yTn%oZ?&+-Qy?Bo9@2;RQIXH`%iSwYT>es z6OWERtQ}IaZbGZeo3p`}T>Z+goRVvLApU9V=Db_+7ytQs{+py*`EbJ|?}Lx!(=N~C zeQVcIX@A6qW2tOWN5l#joe(84EkW+79j#tR?l>aYG0{hM1k^9*&t3TAymHN=?-pls zxfJHFs_GKj_bl_hwcYMY_S&+~x74Gz{CE5#n!|BR-1F9FwoCsW++Xll@YZGLi|eLs zdCtG&Z+m_7xBUj&#n)Y1v^P2~LCLS}>#hgdDQwl5B@ZmFo|r7Q#@6dsLyOOAb@3@8 z|7&KgU3bUgm&?DOuNqsn9?r_0KUeRRiO$g_#-~4Q{`usu$ScYSbL z;=pt}&Kh62S^A1k=3i`k!kxWc?UU-3)E|*GoU+-w+m3h_f7%-HX)8-jCiBl({QI)b z9hzQPwr9h(=Wi-FKPcYem@5{)f3xiSqaMq%n=k$U^00Bg;bM2UO(q-PobR9h*Kzfm z_ltKWtc+cLMRkhir^n0g`L*41)T|OueQ|rG$Nr{MUu8p9#(Q>unH#b?eyL2cW$#vd zR-Y~2eAC_}m44S3lbe|0eKzp=t^dDo)IALSoqR5;j$uZ|RAHq^BQ+KWK~1HrA1}`S zd`6351JC|nI~(8pkUvv#Xw}@n3r`;GM{Yk;uHKpRVE&Rd zLi=A=Myo)o8bNpAyV_VDY0m8XQ4p@%E?R!_=r)fcU#sQpy4U}4 z{(Mk>e+ENavCF!@N8fQ=yE*N>wcqO5eHUl#N~j8!UmI&X;rFUJ&0Cf}nbY?AP_75( zviM``7w_Zw6v#S<``38S47p?vOFX5M!+`)%y`;RXRy&x!= zd?I;)nvv1T{GP=&$u>`=>$Hs3F61b8ujGFOvKHf|zq2>#URd;P)}k`6z+_cVDKAgqlQzzk%Vsc{E}UZLe{+uYW!}}! zC!W-^WV8odlX+cj=C$?0=`9QOPW%^WmOjk2BFy3;r*6luO&zoED7cGjlsg&Bn{v|V ztcCoAbBjbCGkKY(DF^PGuuMW!Bl>y3%0SP{y*o`#uP9o=x>;1=c_&lPoXmqcU-Km^ z-fs94t`#PtqtdStB>G8Yr*z;$3)92Dju=lls_1L+Z_6K+8C#4xk_0Ez3S70S=lFEV z?T4<{XNK#%SGa<>FXlVOH`i(Z%KDP~;`yR{_jZlowGS-W6YXk(~XPM zp3QzgyZG7h^Xu<3<|Mnfw)t>e5B)KLQ@Kf6FlA!!$=#ZJbt`jDAKrV9>tPv3xdhXC z={wJOHh!|Re_(ms>`ctf7q=_h3XW!!?Rfiz)#Kb%zM+NXQ=6Gy3uMid^%j z3t0hQYi_>iQ1{!dRuvj&thp&*+p9Zw9@{$K+q)oXzu_+)?Weo0p4+bsP~tw738 zUHSEtbppC=JLb&_wF%!?x%caga@$x&+oy-7u1lSj^6QxOL%R!lPhTy2V9T~Q;O@+K zp>wXrt&Q+oujkeFMpo8$#?+-!=aL#*=Kh)E=WX&tJadM#Ny~1jNjnxK%1TSUd$_NS z{nL#pJD$v!pJ0|0#J#a!pON>f$hMk$cW3eozvx zDU-?SeBcwwKTjApei4lLC0(Q6_uxOzQ{|(7IxcH&m$u+%jgC<9m%gU#Xqb?xv+0e| zr8g}T@5WD@`oiOv@RTzQjPiCpQtYu2mvU!GOsn)=y1l7;O1#u*-TtEKZp^W2@40%d zRi31zUa$DY-Sl2Cp?%U#dxsP4&RyDi#ZyEYs#-W?)xNyn_$WB}sO`Pg>+;0DWvmY@ zdi#D$`m)UH9c6Pf%>PZFw(ZpKJwlO@YrM8G9?E%DdRg7$il$KMm(XZs5~ir8Kj zyOkI2uz*7(FrYAc3Rf3@)M^*!pvylzqLw5F0UiKNhdf9YQOtLNG;tJE9FCwg*@08EgooZy+C3#lL z*ZGM=Q&iD(#V<$J1bwMEnDOeob?>IUsTDi@=ACSceE2msPx8|nE9a#18OAyyT4~C6 z4Q88ejw;hAtB4k1T`wbW)aU=@#n(=LURuA$`l5JN>8)y&_~I|uD>qN83%qw-TS@t= zk>XO`m_Vy9^EO@1*!Vf?W-`AC1vcrUKJ(#IZD=fl13zd&6@Qp ztDh{se|+lyD^uksn%rOT!_us(#htCiJ?2S6_ujTGd++^1J4VOs{|={Ub_RxNd<+cI z*a~OR)&@v2?+uSG5Du02XMXeSB$L){CBjadm#o$GRi4l!#d<41NS+2}YX zl=AbI|9}2}|NGy6`)IozKb}RqY-!E=d{JxHIrr z-}PV)-O`XD=qkE%*K?bUR;`gxk9J6AHH@Z#ZA$F z`P|Lko~?H-eoJh<5>m&rc{SUcn6&Rt9$xfGJRvprfX`hAyIfzMXx7=iN0&sMy5-v1 z#QgHl!yk!9PWSg7Q}_PnGKclvx(W8(>HSmpyb>kMxC^_JmJ)%5X>3=hv?p6WLO^ z1WwI8$(U<;+h~IQEKQ5w*K~HSpPw6Jd%ooPMCCh;VsHI7hN||)do7%r%9G0Ma$wq& z&@&c-B7g1(&%CoqV&TOuo%5QfCq-sXITh7<@XX!GGh?ijeXi?l=XqN6^O2zT+?5N& zCnT`lJQZ-z?v2iivWe#z?lUeaIixl1TjbM~4kals=d21_c!4Q(TEsCWkEDyKkC%!6 z%n4ksH}{*?6X`SlVwYyV&YhO1-@Ku-^26n z#nGj=-Y;i1X)=n~q;&AN&AIF-7T%I!EEvB@P+#)TCG|bW%Jsg zXyUp12j$C|jSFo=ZMNQcy=2c3U#1<^KbAN;-uc_dDAW3Z=VDZr!0h+x=6Z|V%G2M7 z?7XsZ-G|_i`vJlyj~!ZmqIN^^DN}Rf@9u{`ZzwF@&zSVwPa@D~)w0qLnUCZi7D^>P zZoO~tET-m6n8c#e3Uk5DoXYY$^(KS|o@;dKnDx@A@hM|ap`dB?Zdo1A&zf8=uROOV zs~wQpyleR#htJhdT3Iu02`F-zyiE{uT@t}MOTqoHg_*ZW?~bhJ3j-U~7)*49&Q85? zIOOxuJ3MD~D&ry+yuB)V>sL$uvxT7*6#_Xs!tTv$`{2oSW%9k0<5Cur=V`jmocVig zrs8Bd7Z1gw*PUjI+=w}zd}N1SqG0phwa>FQZ8uxDm3v#y55wi$0(+({+rtaGJp2StYARXI?6zF{ zwBr`*qH0#9&;K8;d~CS+MpAOMSZu)xrf$uRGlaS|H(apM(YkKkQahbn;qHuN(`WJQ z0%bFf$7|$IJkC{+U-z!}$8EM-9XkbbC*9lCV!r-y?#9)>wPGrlYOgO5ozDADL&mU3 z*RQ#J=VY}dT-RKrHtkv2AmaP3Ent6`$juXr^M~Y5foH@qhtKjRG>F{gqPJx%n9iJ`ME)XvG&k|I|WMy-5qT0qd))1bR$NWzhO?qr} zvM{nh+Oo>rW^3V>SE^q^Wom^l#5aZ&UD&U3p`78b^o9jof7Fi4i~P8+u)mw-&wH_h z^->GxJD#@f{#dN>K0T1zSg6i)(X@x<4F5u9>e^fGD?ZE@`cNAY&9Hyg;e3`qEh7K9 z|Cu^YaD9~j^(mKeUQIN-51_ zT6jJ1*5-~sTBVm}&xz1iGEWj;9Wia;*-1%3X&RcEYN|*5W-fGLbv4;GdEsXfM&J9E z6h)x zZPT9YRSt{%ykf$`$z9Jp6_Q=@ncrkis9|@w$GY%4!6dB^(luJBHFcaK%wX(Ly+V)|+|Z4i3q7ir4wdUeaA&%1iNbyTAlYAobl zVt6u2AyRg7j?~?Kv0F~xciJQ;a&aARzU9)Sc}uj-BwkI+jq*sgs=DJNbh!Dw?dr)B z(q5dqA83{GqxJf!FyOhWbxdgsjTDI%f|J3arSo?)k%DG3woZg?B$l=MEetE6M5!V zi9C(x`pdnat0igoy1)FWixRK+onJPck%3_~69a=H);hT)H^;R&Ik5oRW9kix1vfyq z&%Yd{%cGGMZO5gT%WC%UHBlRpRJ{4d9{~DO~6HfR4)Ze?1qZ zssbOd1zL0-Q!bzP9S0hlBCz zA0CUUWX>l0*MC}DQ@gMzAv=3Ta_4MWr;C9Hx5OX2E%j}K|B1OSZ+~s$9Qm!WNx(|$5k&Iy<=hU+5Z}@gWMq&Q5JM+$* z{KLx?U$sfYTT;V&Vq@2uva1q|@p*MrOO+eYh=gN^p$;3&iW!aKJk7oa1N}BppaP<_CsHgGX@kg|3 zo2RJGoA>hN+?%l)br;HW}ozHM?;Uq`?XQg*eE42MI>3g&|?8~D% zZM$Pl5n{%BelKD5KJ>6L!cO$G^F|w?)9Fb+_lU-KEI7VH|Igm1oqhVHGpweWs?1w6 zTa@?s^Lew*pZ&8ed-|u%+S4B2dUq|iIQi|mNX-ln{Tr+MUgm}A@;?9eeNI%2&W~%8 zUaom2erMI&HDb$VDww8PZ?j&jI8QoW>4i^a>&jctbB@ot9}~ZARrj-^PV?B}r;8$^ zj8<>^p{pv*CVoq_4vM+j^Ast zLtP6TFI-SA9rk<(LkQ+w4?WjR(Y+}~-q;PSQy zvyP^(S@oS`ee!9mE-AKIAHOVSxw&KKrbP?Yub(LYBPcy_@nVZDBB%SZZ}D-@UKREF z>GNxLj^2&}{F(PJ>rCDAy;C<*Co*lSz4@Dbo%Q=S`{bRr+Mv1fZHNZly&T*Xg)0-q!WlOI^HMI5L-e$_#~PjbdF(O0Jq zaOp6|CtiJU{JBl{X_o8_yf#NGncqK}*~rAk4J_K7p|Y_t$dw*U08hT?1DY=?#zE(+>PRHF8LTFtZII-Y%|N+g9&#wZrdX! zuc!0%%%}UeBrk6LpPJPjGojk}t>S6_Vt$Rxf2AGw3f@2e-z0Ib;h^#DlV4f##RQ*o zzL-(Ln)@jHh}=G>Kj|uUPhw@7WBLo&7YomDw|?CIjLHprzi&^N@Im5>(#cW>Ba24Ed(Tcf z8_az0RwAfka`v2ge=E2xm4y8_2`?}Fl__^VvFhi)$@g}j^E$Tgx@OhfXFJ(9+NyQG zwpgsZ{&L%Ookj77w!d_VJ^kF$NBO}n^}0v1cU`hR@rTcLW3S7f)+)zStIv7%7p{N5 z?nY_#o!TuMrCR5qk@`}aRW(fL}UkHoe^m$2%BMq_uC}D z=+$n%^MBdwHOznhp7!Y8;vMSFciKh1D{eZ~w&Q!t4t~vdhq6`9*h)UsQ!!tymJwYf zzi#$|bppTNz1>^?>SX8Tuo+>(2%y`!h3Md{Ghondll%LaU1V5Lo+o$qG#%aO?E)P|+AW;t& ztLSL%3TFKPM(aYW31zk_>>X;BhL#bFFI#Rc+k9=?wX&smU30C=UZ<5a>PBDP`SM!n z^>w%J#Q#qJpZ7m^|GVdJ=Dk;mX}Y0jf3E!8@4EMu`scsz$vZ9uyRxcOX#IU+YKH zl>I9n%qW>TZQZ<}f|#S1S!Xm0vsSR3KlRj7R6W#Y{evk@;vst?80`0jG)ymWIyyll zF6?7hlfL)@uUD%-h_c3qelQhX9?S8lr)e`+TI)2u%M2m3{OI4q=$En8uAHbv#$ z`ROf+hwmnx7O7_c&2lQga(SkK5btZxD2w1}P6?i0bJynaYI2J!#+}`xv?r=Eb5GFD zPM?&B8<|-P=e~_n>OMS4(rb5ajdoPb0kKF01MB3p#A{ivJkOe>$X3=)OgXhA*4(i# z+wj8OzS_;P{cIcKqx|N7Oz zVicdJJ8|Bfi1x2buH^=lEatV%n{%AiZDq-0-JYEvlm8s)-Cj8H#Xc$0&;Z`;lPsO5JbrLZdU&+w4zYOb;qZHnw6-^F4G+Y+`%r?RVvm zpYQOxb7x0e{Em;_dk!~$)?Zfsk%PZlOGt7;)Zxol9=m&$|9UogI@VPq1-qw9c>J!Bl+d&y{W4ueTizjb0TM^(uMeuaH%%c6%xPk8a#K z`JS1|*Sh9fnfz;us%+K>p0S*~Tk?9elHuOl9o~!bGVUwY{_)e>U;dcC;(Ra1KaBvJ z&XmcCE~UNh!IPr@r0rerIay|NZhq3tUf+p3ruqDyxno<=9);5fpB>zBa>DCxEniwB z4PUHGazEAa+c|2_sW1LLvioQHy$~yV|JXn8Pvj@oyg#hhBOkg8T<&eL**!_px5&b< zF6Lgebfkl6@3}WFvtn%@Zz#^{WHA(7@ps0uU8z?-YWzCOm|ajDXX(rwRmA(bAY}Ws zg1*oY^ZF~dj|OvRd(GY@Q|hBSD^8qWGV#_niDT!k9QS|Q8MprL{$syW*s@ZXmR>5% zSk~{D>fl{EVPDw9YZ_ZxVl>o^3f^70JlE=bck!RVs}n98PV3zpzfRS-abIZK6|2u~ zkzYm5Kc2I_j4NoD#eiIcfSu^iwW5Q96PvO68Y?lX0eAxBmnL${hh=O^c%+-y{|^!(zeqCmHAzij?(F5pwPe<0nM zep_(1#J>*-X5yWb@2<+z)@FX@@D^uJ5zMyyLcFUX0h`*_fk0Xu6#~p6GTvO|hJ7zFORd zdAlz79@!SXVppC*{GA4Wk(2$uj45^s@6_o znqGKZAm-o!jswDEA}?*WO9x;(9YFZ z<$hEkR4cfqDy<*yUF(NT`&%%et3)NkH_xaz^gl6G!&Re9@EYk2Tc|o7xjv`#Zvz?bH%G z)3CEX8=0IlQaT)dOEksaJGywq+ZD2hC#^HQQhIam_nt?>izBR>s+;F|OlOt z)zcF8?thcIqhh!H^8`7GNz1q0=`w6%-@WPV^R>&{+<3Pnv-d6f_=v^#e1w&RPEh)+jPwzm#MH?#O{4E#Q+ z>bJ)!=Os@KgFa~neNf@7=u)X>?SEt{v`JEbMEjPE!*LsBf4l1QbqMfv%3A2~$OvZIDEd8EVbQIA zbhX8?#?qLcN126k=exQq{9=xJ7V_#xy!|ZHHKSVdcCN7W%BgR^XxKU1Oe+?$JN75% z%%(QWGU2J_7gF9@MYwA0uAX&PEa_ia+V&Y`vnQyZI{tP>?X|w2`N^%dTZ{|jrK=lu znJjjVSRK19s_e|kV9fN(R{=QX$9wr}|eb(UVq!>Xq{tv$MH@19rv$$ z?;baLRn33TWN+M?c1Groy5z}jg9{Sb7ckFwC8ILkwyPQbHcd`G{P5hf%f6XX( zq&TPf?DxuTb{p4jTvNv?JICRQOtiJztC_(+dsezg-ntbw&-P{cjMAJ~%X?f^^}h~p z>{WRwF_ZsKSDWR&>k}AXh_E$3XUX^H(Bb4wop?y?bhJ{h?!w1R&&75uJ8{dVI5=kY zjtx3Q%#NO;mj2+yoy{x7g!89gM^X}xOFnh-^t0F)Vg8!JLZKy z4qW@bSS)JojZ@AmH%f^{aXO}DSub9DweQx9Ev=&pV$2K zb-&2nsxA4Ct&R4C?z)}w?wi2719LCk6+Lu!hx@MT*7tTV_pN^TPvD&Ed6gRe-6n6Y zeW+zx%Hg_p_L;S5zWXI#ug&yVU%c_2Rg<~kbJZ+0mRE~6W>iToT=FU8*v{7+`<7K~ zch$)0J+@}snQ403l{;@<&F_3rapX;Wy4qr+GPT;5`!u}g-IMCfUwKog|Ld{cyR(d5 zX4Lz7|DLsNYnoB2YUF-<#rPIu?dQ9;tb2JY#r4vrJy+kHk9d53UhEa6nJJgLmj3+X z+w$kz7Rj46D`y6<2ZZ?t9m=gcloIyP?o8LQH7f7ZvaP>=T<65h+7-2pdM-OaN- zQztV#>iqIiF(qs2*52*mrXm01ix$rfuU@<5QKppbbl$fvmp9M* z7(2c5GoNm5uICz2^{1{9|F?czVKn1w=E@e)&RKtTwrXEK{B5q%Qp3xalNZnNntjrw zUE=uR6;-!eg|FV;yhl~ScWp=d6z$HpC&H`4)XsWXN%adlW!;(JGm9tY;tGzZ_pfDm z8GQX}tSTWKZenxb_U*?rQ;tMQivFw=68zli>&_eYa>cP4+0Yrw7mH4R718KzVzc6L zdxeL)^tBfe{k&G|j=IU7-Y_Si@R!8yl;|T~Cnmankvk+}p1pWxmz$gIn#E$>H&0v1 z9qTVKS?qeaztpB_uhqB2{cX%va<1KdS0j!FPLj@+?SHtSZ~lWq+4~2yc$ux{9q>D@zb(Tfgt?CGZZ9}?D1SEA3iF$a`Mnh$2&Tl4}DW2 zUQLoYz5H3pIjIDnJ0~Kq<{z!PT&p#INr~&PGbzqdlh#FkT3wOjF1)_r43}D!$<>SE zzR@dNBqy%$PTdvMx98HSXV2z%N*D-pY9G_I*AEZ0sXesQA*XNY+PI7IA)1$UUe1=* z*|wx-^|6;r*)D$!WQkeOvux$uYl|1p39V^8v%VmE!_C)jj~&i#J?82>Pbj_qxyZFc z4&mE&v~m{T&D=3t^i*CRyM*TcwDRvQxr-S$%5DB}iu-f!n}^3t89zN{I=Gkb(Gt7< z-=8bDv{|++H>eR2`6kz>9#hJ4?{L;@rgz;B9{-d0eqNFP{9=aV8z-cDz0KXh&^_gY z)6%xn^F&ypE#^Lmt?|8Fl*P+`aC^zE;I66X9@F;+9*kE$o)vb!4HqRSENDp=Gvr>>h|cE}IZN>o)hDvJbz$Y!H-gvd>8g zxj+9c`v%*bC07kzCT-a9omcsSRl~Ur7Z*SCxqdBV+Ue|K-4qRzWuZRJKH4*$8R{lW zB}LW9Otw0F{^04e#Uj7BL)(93#69gPo$z@7kqiH&q~eY##2xMaAzRmc{pJGm0;c`P zkN;q9{;Agb!QJeatk$93IbYaKMC%v5{J}l-F^lzsWUj~gA-(L?%2XF@ji#2&*;^+n6mH52g!p;N+y%q^<{ZiYj&KL=x^0Z`E$mc zUA%Zh)y&O4k(!G4-bKhgS-py}Hz&ZbxHnR+>AAN^c7_sX{=Qh*$-gVNFL83+k;9R0 zQ?u&-p}Bt^-afIi)FQj-l$Mt3gmZ^dW;GR+osS3$P1(GPN&6?m621qlzR&#kDaf8( zzgZxuYJG-Kud_y#NN3<(XAQG+)(uJDe;jJgDC(D1TeIHgMA?pG<}X^;gR^8>ad9 zCCtr8vP>$`E4vVL$2s(r%U!$8$%`bG9kj21<`b*bd7rrAKIW0F%s#V$X{yH8 z87DQ3`i0ZZtjL-kC?pbUb2{J9{jJ+P!F4xt0#908ZPmNl?7FmB*dT^g-gI$CltFXY z?ki`@Rwj3+eNfr|IVX3Xa89LM{yxQ=GY@y%X|_rB`^#|Zu-i^!o%QD*+H)rTFPwAq zr1ef;wd~q=i-RV-!Q_|E>C3oz1LTr}@2KQ=TFA&NoZb?|FHi zdAsM_`Yo`%=St#l%813Cvs`(oX>OLoZ+3}e?3Vt*F|<_#sUtrAoHpdPEA!Cr!KnTH`~yo z@XsWniq>_9rKddlH1F8$DF>^!O!fX{R^xU1BkNlQ{<{u!yE;pD&Fsol_gxyD!FJb6 zv_x8W+3l5$?-qoXsBgU(TOxVa{rZK!A`4?nY~O}CPJLkiz-oT^+Ea5ky}2$elQR9| zWyizIWB%l>SIe>Bs3zMf&-qoVBT-hEc;CeMRsD=+PnDqxLIh}*WA zPgdvXa;EKaRfz}1c}{uumGOpO;xKc(e8E#iS?_Vo&GkGiO!v-jNNC}IG2Qg2ra$M; z;KzH+@=|XGov@$6u|_;y=c^vK^wm{bpG$+5KC-K?u}Ll7a9s3;|0=Db);ag9YxcZ1Tk)zw zFZ{UWxyjddRLQ@3q8nbpGj-k^{Tbh9X4*6DT(!3F>yPDUne0Sf=(4=X6}e!ov8>#% z_1@u|U+l78FzYPj-`Ml-jO7~H=Wpj0K<|{D8VtG8&F_%~r{86L zr^}c4y)x%)xpG0-Wnw_+60JtLD5a`Zb5cZOWNsJD>6-JyTOlx%iSykbjU#WYNuIM z(goea?_L}~%YE%ryqCxP8M3!O{Fa+6V82#ylFfdTHTx{ger!y-wJd&Wz?EgMmro38 z{v~UXyXyQ^-`RWLmd`$8Z8}TrG1r`FiKaZ~pFCHb@xgwEE$8d6(=K1#-FLU}mhay8 zv#0$#R=}ToUs|R#wtLEvqavRIV(aE)Ke+cn^u5}u3lmHtrk-ENYIuFl8-xAFeu{4m zn&Q7HOz7PbjrD>W4+P3Ju5vGY%h9j&GDzyZ_Ni1w-=?aR+h?pd^u+Z~luw^}tNZ0C zH0Rw3`-Mc*wJuCvP}+Ho zNl;(-AeR`&O^#C=I(|2Fd|JfYFBc%Pc-F-=PBWIaMH){LJrSjr!^+>jDDGnC^Ak_= zJ8C(Xs<7@*yTz{ZX~W-35{IH$x2$ei>w4*!dZzjR=CZjPc#Uiq)cRNVe7nN0a&DdC z|5*w5#LoOwQ2(N>8Z*hI|8{xnhr2!%sk4uWx%hW0~fDOQ28pz{L(zTSr&MCSBnUcQ!*oxA$l_)Gl!S`{}^pY5$Q?*IPr=Qq9t@z<;~ zRy;FopVb=5oy~JB^hm(FdppY4J>FgP(&J;?%X__DDpAD_{Q>}Pa7WZKC*K2-LD}J zSiJhK6g)T*_2XQKbgr-9+oM9_Ymapsgh-vezfJ#3h)mU=2$h@N#*62=WF2-o=f)Pv zUD|fG{)y3*{myzxD_sxtzq74d-8$*YpW95*C3%z2oe%I*;*|W7!My4T=Uf4Qtx-;+YmOZ-$j7yV2ToiGJhVIZ--G z&Avq#Y&6_3=bva7OQt02`hbLgNQWweqDJk@8q>M#3=C01IM&s|BBU4+BWuHdmP=oi z-22#7O7pR=VPwu@jTtvKi9E6p34WBovB~+Vu88%*!bxo#ZMLahY%@_~@rvZq715Y- zNoRsn`K}9Mw~A%v7y12;F82GsV%v9H+uq~JC!e&>OFsMiUiIg@zt_I+{r`9V{{PGe z1Z(8nn5H+Kcy*%nVndBUtHG>7Pxru{^BwM4)ukQ?x6YqcDeVo5!kK!@&qu=PRT>uQO90Kiw2sWFoP$=AM@7X0_+3yw-X#=Wg_w zhMQcT*0%Su_}TQc3qy~eORLedi@OKZA>n^S9Z+A`qUDR z*+Fyk*K$q0(e&V=*w5$-7mS|IcZ8>Xf{0kJ6eO zn>^FCf2g0ynaSanYWDGr)^n*@$t$O*nEdqa{P|?b9Dgp$nNx~_P81gh%}e%4di?lt zk&$2X^fymad6_q^y)tj=jO-(<6lb}r;jwGKaX>vXuum+Kd#)=c$X`zGwnn=G@{ z57$WvPA=0Gf8pL;wROS0uvM4CB3108cjQc+aiM4LBtfU*HIr`eiQbC2xHBm6+sBGO z*ZY@lUgdtMxb?Z|%|P3SBXwV*C7W8$+#k ztDL#|H2dP>K<4X(hYz&>@GzO1qtdZ;_8hnG_B!9|)#T*aKXx|Ge=MH#$(y;jBFH)Y zT2$Gh%45$HwjA*Y(6eBxYmGO)lYVse{=}Yh+zU2KNu6_#T*D&9#pd@=^WzNj0=6?N z%kCYBoMZeUx+d#E`HvF^6nR)bRx{ThkZ=BR=D_@dzJ*GyOGGBT4cslW_KCu)lruF` zZd!-?N&GPWw`k$&x)Up2o&URRY1TWYw2c{0r<>dg^$g3x zKDADoYT~;2dQKN>WJ}q)s9n+eV)Mi;FMFPzxBEW##4|INT3(9yxg~V#(ZzPbfl_N5 zZGw+-PhXQX?fb35i|-t-`2}u!yijV|vTa5o`F3xf^Ui+o)ZZcS;FNCxY5bonTQ>i; z+;sYa%zoCl++4gdOh>LW3b+V6{g84IKQ;XWgPTR$2Zep>7}PFme808J&gJy<3=84R zJ*~^?xmLJwUOgpv!*_-4l@U*Q+HKse!Uh>_-JKOha z_dnWkNLM5LQS9CM2?t)E=KFPVE1U8qr-iefWS9Sv{Kd$l^sG>;@A!l%en&m$-6_Zl znAETRNhx%;g<92O`8zjG-P_$3c2aI>K)Y=t1K*^lcKp>%Z-gh=I)39^r}=G1ihbeo zb=yN@^H)39&G^QD`Kz+sb@}qx`aAD`ng7c#tZ#UttWtl$eO}SY;JQzquK$cenPu94 zCu_gXxPQ6i?c=p(U)C>lz9q0Y;CS0&osEHQ4`*yq)Vki5d3ef}#2IEjp1a!&eOIo` zI-8hzwr7*t;qW8gvLBD+vTXGiOyPFDwz0T*?WIrs3+84?-z%Gt>0?wnAv3IUw>a-g z1;2mOSMfU92p%y%S}|!+N^Q`_KFw1NJ85B%EJ&Sv{^VJ`1ywV2OpHWM@4k~NliuYW#u>3U%wl}wizS3{5M?9G~{ch)N6 z@D{IM&oi%SKC*x6`M+cK6v0_WYW@oZD>v=Tl~{C2)BNu?FBg|3@%<&cf4=|t{J+lU znsbj!k1Xwau*LlUGuekAi#c|<@vafgCj%O5?__N$LWtaCd?fooKy*t(| zzAhdvctC37-Ei}D-cL4k%>Q|6N8M@p@H$1U$;(1xZa;qA;dgP(i!C0%{+*9;*G`GN z=Go`>-1gkI-6?Oobad=2ML%)wQ+{Fn^1N+uy{r83>Z3CY6SV&AvyN!OZ2wX#bubA|5nuB+<12S%>H-0a(elj-rW0? zvPeF&bo$rLIyU8z0YcGrkN({#mEUM{oZW2xW4lM?o`2*z?|&Ec-+3f>cIWhsi#pOn zRmzXKGJdE&A#mkm)byjFT5-vmG2dN^mus=M$|gQczw>^-T_(o{Wuff;waFjyUkJ~b zb%e*`@9CPO(^ShR&SzLu{`0=D{{ChT^d*a(U3Z-87#SGmFyW}${R=>|8@`DJkgB~j z(AWQvgFr2}$I_-BoLwsxbTazpJUZ*JW5x`D)iV~{6OVW$bYs${AFKCN1U^1k@y%Uw zxvt@{V{*^lp4n6R`QrKY+shf$Z1axpU*1%E6z`%tL(aLq;j}r-uh(Utuj$- zH%?o(>&auOtpzQ4T4yJ$zQO$Oz*@!dzN^>fh4`(F%$?NtXz>Df72o2oF7q1&wXaU= zdsOvG@TczC=FGFSqt4=>>36k9(`s%dz1cszc9+hn zFX@v%?3b9apYf(hrI@1f9P1j!YOYIaH&X=8Bsb<*sR*QTyp%g}u1mi|R{e~OoUQV= z#)^-koyYB!S{;^%2&F6i%jP`oXxA*dCdid1+wrMY5#zJ{X#4XDe?=EYp9Fj*OzYWZLG1vbWdeMlTat7kuiiamMYuW{XLp4u& zW5O71?<`lB{daVAhxM)?=1l91v<)}R)`+-o-uJYZtyk|xPVw^%JHqW3?Ol2&n@#O1 zgPvnaPlkls>PfTT$9x*j-KE603Z z?K_EmT1Ld_klfZC;m%c;WA|oCy-n)BR}#Md&@_(dZ>Aek6lz+7O5~XyT0aRrz3bIu zro%kxu_p`VPqr_4HGRpe*p(%FnO4@$u{!+R?%bjJ!fn6LUcMf;_F>=q_y5oiFutnY z^dW?qfnggPj>TdDiJ7o@vJmfl;c$_E>(b|JoO_aavc#)PZOdogU<wOKhv7)R&%P`v9dY4 zu4i@ZR?0h?yR&ZUI@A9Fj{BdP&am40Y}=gObJxzgT$gZtR$s~YS7o0U-Yq-Y-?VH0 z%XbHw@{if z_3Zj%k!v?ZC3X5%ryI{{ZN3{cBjWqpUz@GJl`%Bv6qh{z-FH{z-%UaHv-WAh{co!N zExR0MFt23ue|3Xv$M@*FOyNBK{o3Dcw{Hc^*!YZn(_xL{YeS~3=P8er6kOeRt2pcK z>n*R(t2`h}PWpTfJh~ty z;?&_rbLZ@`1LqTZ%q$oFX_+W}rORsG{pKoPXXj}~M?(xe(=RRGa>ju3_y@_a&*fd8 ztyucB@S4Zz`72FdX=cvU-{YziU&FojzRlTf2{X@4Qkm%gD5c=U#|=7GE^CAti#GaQ z>SAU8zWG^Ir19Q0Jev=B`Wqfgbua!WV!-_5Q@+6M_Jw;Lyw1eF2#K;^WccZ=ciJn) zYa17wl2TAKcX84?H0g1<#IGN#cCEeVy|i(2ho<6;axJD$b3UXt6g`xEv|n-EUY$R! zKj!Xf(EN1!@Qw8+I#yr2%5?ogyuO&w;(4qAU_{Ede|GmT@#W%^?&{6U6W7pHYzeYaY$<9PWD{3QRnC+7oC7x%UUN) zVraTnVZ2i%Sk1Vwi23NM=-si~Gji9Ktrm$6U$JOgl#{2Ei?r^#uC#9kol zyvqk?8|~xuBFFllp7B5QW95a4C^h@Z7tg1D;TC*4-O-}nF7nrYj=I+P>>s`?*@lwG ziZA`Im)Jk`U-_jP_lQ6HMCuQGUiw4%pUTon=TYuDDP^KQ_*oy|S()Qq=>nQhb7dH?91y~$H~@8uIqQ{L&Zt@$TndF9MDkMyhr zgWR%|&6yilJ$^ZfX@1-1cQGM8KOa0W`8u_}`^}cMtDl9Wo|g+$3+kA>fP3PkCAkO6 zJ~ueI#?~Hun`>)6+tbl&!@7A_L~Cx=ws_rrqx|*AoK0ODU*G+9yWF|-&6Ah~=Ccj; z9omdmO>v4`?rO=&9$l!OG{az7=Z7i#&u?it_ON^ zy|=y1H9s3?`TBfH=ca;eqql5vvDx9DbE?S90^FjRzC8&8Em2%#7Y~!I|f1(99WE^N+Euv}128eHn1Z zQzbT`bV>}E`%!k34Pn;wc>Qi z)t2o-VVx}edwpWhRdn4<2{WGP((%vb(7j*mTit@gUu3O4@!fD@zRTV@Q&%szvE*`^ z{NtNSE4c4$a1+{_D{T?*+2831OFMmE14g}ruoe(+domxZ2Q}(JMvf0U%bQU zrkH3#TGt%Q33ty+>`qzdV-cQmPP@)J;OfFF(r-lWn?3(&(7h>jiII*|-QsYq@ApEi z?oK=T+W(!Znp({9UFfLphVgcll?(Gl%Xdz- zn3}sOTZMn-F^AJ7W?FH}wlo`g2e)QSy!7sHsbi7F^u;DY2e%7ZetNPfs>b>EuSt!f ze-w6f>c2H=QROZSQT%!9-ONpI_g#NGbI03#=ie<3Qdv;2xh6b8{<#jtP{3!HL%dT&zQo-`5eM^pDm z_J*^$Z#2;V9Tg?DV)2pt?v`~8ODovKA4k6WpltH+ctms6n#Vb|QX4pXGn|=j?@+E< zSDy0u%bO2iRPc4mMf;2XjMXLV?gyFfTFcyJX4G_<*Z;3oIV`^Kh}dmQ;jVoL7SH>l z_`7Vi?pdYu>ywYQZ-4mq&i=I-?{)9pin=FRh$g;>@3yG9hQVqjkm(S(68T`|RRe6U%SA^s7Q9g_Eqh3}mMoE9xd` ztxDC}HKQ!<_!Z;123aqse}A+=RzY`OX!Hk$sfn@+rytq(kLmZe9a$FD<%RF#qAg41 zULRT4SLOcW@$PG(`R&p!2iq>Mm@Vnf&h<#+MW?`=r#BWnzmX6qV|(QO@8!BLvlT)E z>sO^LmK8aBP~G;8eG9MAw`Yy_IIsM^Ak!7zDv{JabNeEnO5V_gs~+4G{+OYBT!?Se z?v(2vS91D^*&La3Y^$M4N|}iEjr1N;?V~yNvH^MU~Z&m$n+pxgu;6KGF>sIW2-*Ltx_1>R*?Sip|Les+& zO1ow+yd0sN@|^Q(<)*}(lwzrHnfa482_6g;2+2{nv1I?`^${=q6GSSvJlW9mcCE?% z*>65==updFvT%KZWk%wsI|rUr=sG`e3wpWeVQ|T5fwT1!INy}1ZLog%pZ`JZ4~5$Q zfox|ocRk`vdUg58h3Os5>jhZPU;1KyaQ{Qgc{TF_b@}3*&CNEkbj)^M685g|g%v+b zupVD+MdS9}u`*s}1$pwQdrZ8m?a%qXi^pIXg#vFoX}*=@mfnW^2} z8&19FU;bm|>J0IPr7w7{y_XFsctTT8#=Q_^IONpwP@x{!TcTex8Uo#JEzgQ{1Df!KW>|fmxn*Ecz zwNAvhbM-{`9^j5x`%qcR?w3+nR)x#q#jj+-{&b$7*ifUp)4x;hTT$go;gZ}k-=q&Q z?`OPYYyGoWAuD}hV30)eT?u#5jZ^$rc&DpgS$gmC)5jHOo|bPtt^elOi!&+3&s3LY zsLChn9W9e``?l!kitw+o2zTLf;`}oC-DXeL$rE_Iv3eIlUe*JvmLrt9o z$5X~@=N;X$i-9X;V?+01x$C^^f+nSZooV)~i1F?Non4nT@2US!e=uox^LN%+Nk3ZK z1COtm(Rb=CYv9e3%MNy)F)Zml6Y%ZGlEK%~mn)#;U>8HszD)0XmkcfG4VDfS zsmq&`nz-9xVQz)#GFH>bs0~-MxTj1AT5)B|RkpyInY&c3mz+*B-+c4REBnCoIloTo z*By{#bWeNJBVTgt{u7INn|HUUq*&G6_+9jF=X0C$#eRAJ{(awmpE2fOx|G|-JMDr` zDtDYb+|?B=C8G0r!>Pkk{M$qKT<$LAm3sH#U#uvrXt^m*(oXU375mN~uD02;K2f2h zdcmRdAP47ur#x$G=F+Ssphx zJ8|iAfZbQyUHC7d%`S+0FDlgm0p6^afxH4J_$j`PkRW@%wxU!kx}o}jU%bD`44j&KR(Xk zm+H$8efsM1q%}XMy$-N^ofjJPb&l7qRm=B(S-~{twX^JX1J#0uKi=)iJ>8Z0e6QDH zE!q95$4+bvzW80^%GtKm>8hTlFUao=`R<-z$ zYN5r!x{OzKrgI-$@BBICYOT^?-{|C)fTmmDXKbBSa*ApCF3ULvt{+xvOn&S7&gR|M zyBDt93=hnhvwV5d6uF5ONio(@M|ac+RA@#lf3euh?ECYDmu7kSJ~oMbH^KM98cB8m zw;KM9^P4l)Z|FVe@KN~5SFN>QE(otzbS~a@HtB+nL34LW`{RFt3QT#D`xUtfE@<#EX*sn*w1FYw2`YAc21n3FaPnCFeM8orsTSsu0 zL~7^d*;9U7Rjw0=bDP6s=+aSHs(C@}c3GOq`JfUr>6GqX9@nn36W^A`^i@2~JU&OX zZP)E7tJDqBqEmwWPAqX*d1yoUiEnPkZ`MzYspO01SUJ7ZYV~*CHXgBb`MoNq`#nBB z^Y3Zdw(tGLdXC)eA6FQ^JU8C$yEbTvP{(Aa9=1-`NfAE5w^mOvbN7;cJ-L5@R)k9R zZo8ixB^6~${NQ{ZWj|k_h5D*bj-GI=gne zm+S_&Q+M+;-Phe*XQ^|+KWaJk-PbIWP8{tC5|Q(k`S*rvx3acw+ZL4_ z{d)1fr5gW=%k#}9x$eGip8nsu_}Lue=YP`Q)jqnf?$0=*eY0Oo>+QJ_-FNwTED{e- z-~8i)XzMqP!gitRsW+Y<2%lS^_4e=UeqcEUzx9Yx?+v>b`?h22zdU7O0rtCq-ul=!)Rva;8eLuOwTV}e2V&VQHo}G%F zb)EU%HVTDakF16Gy=+uI#&))=%1x{Yd1TmmS?K=cikL^7ow`E)UN)*9Yde>#)+v1K zIl`|xZ|aYUM~a2cd;f`eq%NfI@h9X_x{$utpO{Cgozqq86hC$ySuM1G%8#i>vW50f ztB8GME)=bLui$|%`#qr(U9Ni;W*m?GWyT47$P{VVC8!_h8}9oIXK{BhgjrJ(+b z{~KG6RhBNNd(*uc4uMYQX)(g9GwkxGTEDsaZ-RZ8@`UhN0X!AXv7%=;cGzDD4c!*y zu$uSxi=vpx_9;5AxwlDA6w9w}Fs=&TaacOyZSRk(#YI8grN0+5wff3FOmH=jdByen zmT=*vl=L(5CNC~a_Wjts=Es+dc`w&0%iKB=ENSPRn>Oo%Tgt(nqXx{|*nMnrDxX+| zTTfW8-;1H8$NJ5eJ1&Hm6`#4i@#5pR zrk)QEG&B5rYpB-c(4yR1GjcCV94=OEidtDVIqF-7VDwww4JwCu4P_#aW?VkG zz-@MZO!P5lE2}koXa1XTen(ra7~c=6$(bi!eQ{r-liJ#I_S&8`?>JO$9}8R6^*o2~ zyQ@`?YTeP@Io+>{rv!_eJqQywYu=_Fze9AYRH=Q}SFW!+1YAzEt`;m* zQ*Tf2{hc4G{~TdETK7Me*ZUL9I(PQFbqjY*Z(qNDefdM4dru!L8MXC)ZFw8>vBJis+w!GhqTTea z&aT>{yu4EnCZw7~-8nBmb;cha`PLQ5X}0sY=C40AC)_6H&>gLW+nBbF1l0xoo6a1TM#Qpl>`b1^cY}~xtT2hK% zJ#3;#+L|M0?}&yjPt$Y}bLURp%6G`UNFn)iT9c`a&#ZvLt%Wh#0R;zlPf+m_O{=W# zzbN>7{Ysa$SEi=5>`J<;cKgQeZ+u2Yf}vY49W(m2ZWsC=qsdE(Els^2r3PrFxn zKG~4<#pmV=O`pft4~G8nI@xftQpxwL{Qu1gA=W|LK4&sN&;2w1g&kjDU6V}_|G{f! zuPwIxo=|yX%LT`k!TdMeeriVDILALx_Cw(^i;dE3R*b@>3ukZJJb~9fu#CoDHQW3^<{ z=C>BdLbA58&a9mI&LZZwVA*rS3vXDz*;JqFsVxxYb;#mo-?%Bm{F&cP-sNkL9Xo!M zRZ5iGKOx6dbo%?&$@O1>UQiaZkW`k?Uaf#R9thj;MwFW~CmxM=xCiT=f${*zw$PrT)CoPK^&!g)jM z^NZ#6A56YeZyTpnA9qY{Pt)!XT6_;pjkm9!@l*dlPK@%72( z%^G6KpG|eY^T?!6h~)a5I^~J8eeX)SS~(cMk<6&RO6KYLuH;Fak2F4<@p`It zQ8vHe@$8<*x^=Jj+b)t^{;)Xh3fJ8Px4DkJ(r44|Bu)yNb2Q`_`{%i{o=j9fxw!F@ z(oxY|uI^>35eqcMLPRsAPx)H)mQNS0U#s@=&N{z6-Khgbf#1n;bGr>;B>(-5YH(qv90s+x2onWTB@P$Dz;!^`B$SjgVPtgMAtm= z+7}S^@lmc?Y}5^l@K0+uO0n;#(!cgV<<w=NzqyW0r2| z<1=Kn3*>S>(w#~(b5c@^5L0ih!MXmzjskVt)|Wp$<(=!e zWQ9Uje1p=Drl0@=Lr3jdQzm32o!J_D`ruxZr>l;<|0ispw5W5Mi}2(0`YDBF)n-du zXPrKK?%X+>^Jm_?d2fHeo+;vpo5W^8gEN{l#IyZ6S~(W&Sm<;a{#`rIxODd{?OmmZ*R9LRTUIW?#6Op- zl3$c(cE0Hvq4oK%RVV9gYzn@1R(5Y*$KG_F9lMV)9`;%ICc^Uc#?^jHr)2MFd)b(0 z!n66%>+`b5V-)kFx2pv4n>TxP=2`n&tT$}A?Ya7?)%DnYNADZ@EV*RcC}(%{_ng|c zl>Es5Hkb4z|13Qw-S*K=uhQp-9U;mXI%Wo}r z*tLGjj1v>$Ru}Ge;(st@;ahW|uGd?9?w-x#k3I3E?CRaAK3{CEFuxPC@m6p>&lvn= z#-cA=lA_*ICy7n^#c@*NtqjWxX1&z9hP@VT`p@!}CM@0GnQ*DRCm`*U^r83@N85{4 z*dMCTJhJ13NNwS*)F=Uu1d$21B+dypUO3iyMSUyxlAkBN&VD^1{?esFQ||k7GjESu z=_$%Fi z4DD@mOXn2r@i`G}G|5#nM=IQA)gJey9IGC@Yxj>`saNWtmFuyT)pC!Y=lKec)pC<& zo&3j?tyFY{b?S?TpxXgj>mJQ&nRTF)U(0=U2S?g0i5GcsixyWp@*iuTG9`1D(Z;m@ zXag53#WjQvFflN&;5y(rxTGjEFCD&Gtv3XEA~|&D)-n+Xth>G?86aLFw`|+r_p`AqSS9i(uvhY)DdsVEBtDnt&KYJ$gpMRhK zvN!0yVKL}anO$nO{btSz57q+q*^ECnEPb@DtD5Ow&%Fz4V;NQVl_@+pJ1f*TVbKEf zEzjRpMP^S+xw&BS%cjVQ#~O29{dp%>wN`nr>V|+7Gror0&ADv#J(v z)Azr`bn)M%@9O_giR-U8J;m!~tk$<?7p&e;#74eCH)88&x^|r8Kj!3Yfrnm z#HCNFSG@0O^ver{%soP-^H%dm;oYD0O%87!*=6o_W=Manc(`V{>E=yKdv~ywtL$s_JR6t0 z@0!7Esl(?R<&p%GzeGRkmv2&6m0q&l_EXay{fmu1oEn=1ZZg=UJb!qU>5vGktbm$< zXWgpzDYI;X-C|Bn4>^7H-;o;jd5-5)S4D2KT+Das>5~^mX&sMy?%qEvS9&vEaJEyN z@0s-_3wSQ6uh7W6e7_(ew(9EA=P$U{3H|c%cq=$-DG#@7*>R7u2eMagKCxe1d~C+z zqn62Yo-W(Hll4^W;v3BpiR*&rpGye+)YGR@fAG8D!YBSe_8qL}TK{Qg-`;II?&p>7 zcDJ}B+IK-!|La@*M_l^1&7aP!I&)I=PKl_!0ONa&XBuqRPS!T9nxk~)(d#cYtyUWU zmZb0AxUPa{dro0rnC7dyd25#Q+E3Z=sYkuEOyKyex5D*k>;3HKt38>>$-uxQ$iSe6 zyA}ulol6l~k_laY(HdS|5E3r=|L)!2H*)e$YOE7ooi<>FOX!g2K4m8NSGwnfdkm?=B=qoLg~N%!Sjt*)KB zv8X;H_0psFb9T>Wzw5_r`F+m&n&;L3_Pw9;=S}nUIK~3*xKBkL)rpIpdFCd)`1B}E z<;&mqj{hn)GF$KUSQMSJY>&rccb?rmDJ+(+UHK{xZjGMsz2j-z!CmK@cOUtl$Nx_7 ze)ZSvaG8m}{%O13G<)|sVgHYN`fcns6#+H-GafWFw(ptIw1Yif=zeq3k4@sdKf3CE zer;NiniUwp7k_oSukJdzW6Es%(jH7;sx4HSdO|n!0iStZ-~zMdkGD0Q+U9a9Zua}U z?Z&g$d{fcl#T2*kHFMGSGb>>nl?mOMvO!I;lq_l40e_N=0F8-jv zmt+lqUy1{)kx7Ig{UdFjyN-asqK?ba2uHg_p~XVac{V|7B+N#(^EekLul zS43sDZY;__^X{bTCCzu4lJ2v%D^EQ6EJ|oDXVhYq4pvsvr6zX-@2b5qniOUx-urpU zYre!eQ+<|wU$fPEZA_B+)ymJ2yVsrwRIA`#bb6_HUnZB>lnWmc`Ms>3>brhX*`)h& z56`;1qeYe4nGY^53R1Lp6J9noAS$R;%Del)?%w4^NbcZs+1wH!Tx{5%Hlu>4fA$Y6zS$N{>OLmPa~l_{^*!`t-mBL4xTSOQkG95O zHNVCFZ)}z(ICUPGY0;c7Wue_N$M~bkxo+Y6LhADbjpn5~w!EKH=pX!e?ZuGx71L|g z_Vw27x|s6F^2_WWeDl)Z&3ZOtM?<&TzV72Y=WGtonG+mfy{N?5ZmM_5?Zdl7efHSZ zXn*QViFvYl-%T&y^H<9wS5{nFxBXSH(Uh-?Uc9<3JeT{mZwPbA{Ep^{ zF*58Bul)0PRZwHT%lBR1WVfAI{=TZ%WoEk2nMj2@5v%mRE}8r4OzBBJr#G)Q>S=GD z({!a^%f`x{JxVir?uHrVuUD36dN}Q(k!+i5@}?_3g)H+s+QrHP*0;`1HJzUN`R&c7 z-q42`Tb5KlcFV}kJQ%6Q`238wc~_W}K%T6wZ$a?1gG~iK0f)~nitLq7RIGdJmzcUC z#L=ZYHMqyobKSK51>3#;yGe&!*ybUl@pk*g+^0#gW#5!tE>+~4rKc9%ye+I$>82#Q z{d?D(jy;_=w{}N-xGrBFpwvJ8`K8>Kwq?t1o;t;L@pAI=8;fS!EtBs#xFf@8XNh3C zD(_t*wbpE%&Mou4$T2ogn|4g>-ZAsf)5PrMG!|JG{9y^-{4?~&Ri)_*VxAmn{rM

!XnM#a{rFs!>ObLaTeQ??AHo+qYT_a>a! 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 <{sc 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 literal 0 HcmV?d00001