From 9832de088151e43cd163383de6c282591591b7c3 Mon Sep 17 00:00:00 2001 From: Dominik Aumayr Date: Mon, 23 Jul 2018 10:34:23 +0200 Subject: [PATCH 01/16] Implement handling of TwoDArrayWrapper --- src/tools/concurrency/TracingBackend.java | 77 ++++++++++++++++++++--- 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/src/tools/concurrency/TracingBackend.java b/src/tools/concurrency/TracingBackend.java index 2b32a176c..d776bfffc 100644 --- a/src/tools/concurrency/TracingBackend.java +++ b/src/tools/concurrency/TracingBackend.java @@ -169,7 +169,7 @@ static void returnBuffer(final ByteBuffer b) { } @TruffleBoundary - private static void returnBufferGlobally(final ByteBuffer buffer) { + private static void returnBufferGlobally(final BufferAndLimit buffer) { assert fullBuffers.offer(buffer); } @@ -298,8 +298,8 @@ private void writeExternalData(final FileOutputStream edfos) throws IOException ActorExecutionTrace.getExtDataHeader(sw.actorId, sw.dataId, bytes.length); if (edfos != null) { - edfos.getChannel().write(java.nio.ByteBuffer.wrap(header)); - edfos.getChannel().write(java.nio.ByteBuffer.wrap(bytes)); + edfos.getChannel().write(ByteBuffer.wrap(header)); + edfos.getChannel().write(ByteBuffer.wrap(bytes)); edfos.flush(); } externalBytes += bytes.length + 12; @@ -310,7 +310,7 @@ private void writeExternalData(final FileOutputStream edfos) throws IOException byte[] data = (byte[]) oo; externalBytes += data.length; if (edfos != null) { - edfos.getChannel().write(java.nio.ByteBuffer.wrap(data)); + edfos.getChannel().write(ByteBuffer.wrap(data)); edfos.flush(); } } @@ -320,9 +320,70 @@ private void writeExternalData(final FileOutputStream edfos) throws IOException private void writeArray(final TwoDArrayWrapper aw, final FileOutputStream edfos) throws IOException { - // TODO - // this is to work around codacy - edfos.write(aw.actorId); + SImmutableArray sia = aw.ia; + + Object[] outer = sia.getObjectStorage(SArray.ObjectStorageType); + byte[][][] bouter = new byte[outer.length][][]; + byte[] endRow = {ENDROW}; + int numBytes = 0; + for (int i = 0; i < outer.length; i++) { + Object o = outer[i]; + SImmutableArray ia = (SImmutableArray) o; + Object[] inner = ia.getObjectStorage(SArray.ObjectStorageType); + byte[][] binner = new byte[inner.length + 1][]; + for (int j = 0; j < inner.length; j++) { + Object oo = inner[j]; + byte[] bytes = null; + if (oo instanceof String) { + byte[] sbytes = ((String) oo).getBytes(); + bytes = new byte[5 + sbytes.length]; + TraceBuffer.UNSAFE.putByte(bytes, TraceBuffer.BYTE_ARR_BASE_OFFSET, STRING); + TraceBuffer.UNSAFE.putInt(bytes, TraceBuffer.BYTE_ARR_BASE_OFFSET + 1, + sbytes.length); + System.arraycopy(sbytes, 0, bytes, 5, sbytes.length); + } else if (oo instanceof Long) { + bytes = new byte[9]; + TraceBuffer.UNSAFE.putByte(bytes, TraceBuffer.BYTE_ARR_BASE_OFFSET, LONG); + TraceBuffer.UNSAFE.putLong(bytes, TraceBuffer.BYTE_ARR_BASE_OFFSET + 1, (Long) oo); + } else if (oo instanceof Double) { + bytes = new byte[9]; + TraceBuffer.UNSAFE.putByte(bytes, TraceBuffer.BYTE_ARR_BASE_OFFSET, DOUBLE); + TraceBuffer.UNSAFE.putDouble(bytes, TraceBuffer.BYTE_ARR_BASE_OFFSET + 1, + (Double) oo); + } else if (oo instanceof Boolean) { + bytes = new byte[1]; + TraceBuffer.UNSAFE.putByte(bytes, TraceBuffer.BYTE_ARR_BASE_OFFSET + 1, + ((Boolean) oo ? TRUE : FALSE)); + } else if (oo == Nil.nilObject) { + bytes = new byte[1]; + TraceBuffer.UNSAFE.putByte(bytes, TraceBuffer.BYTE_ARR_BASE_OFFSET, NULL); + } else { + throw new UnsupportedOperationException("Unexpected DataType"); + } + + numBytes += bytes.length; + binner[j] = bytes; + } + binner[binner.length - 1] = endRow; + numBytes++; + bouter[i] = binner; + } + } + + byte[] header = + ActorExecutionTrace.getExtDataHeader(aw.actorId, aw.dataId, numBytes); + + if (edfos != null) { + edfos.getChannel().write(ByteBuffer.wrap(header)); + for (byte[][] baa : bouter) { + for (byte[] ba : baa) { + edfos.getChannel().write(ByteBuffer.wrap(ba)); + } + } + + edfos.flush(); + } + externalBytes += numBytes + 12; } private void writeSymbols(final BufferedWriter bw) throws IOException { @@ -409,7 +470,7 @@ public void run() { static final byte NULL = 5; static final byte ENDROW = 6; - public static SArray parseArray(final java.nio.ByteBuffer bb) { + public static SArray parseArray(final ByteBuffer bb) { List rows = new ArrayList<>(); List currentRow = new ArrayList<>(); From 078dc1f5f59c52d7d252d81764a06789048894e0 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Wed, 25 Apr 2018 23:16:42 +0100 Subject: [PATCH 02/16] Prototype for TraceActorCreation node MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don’t write currentActor in every actorContext recording This seems just in the wrong place, and just writes itself, even if not necessary. Signed-off-by: Stefan Marr --- .../primitives/actors/CreateActorPrim.java | 5 +- src/tools/concurrency/TraceBuffer.java | 3 +- .../concurrency/nodes/TraceActorCreation.java | 78 +++++++++++++++++++ .../replay/actors/ActorExecutionTrace.java | 2 +- 4 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/tools/concurrency/nodes/TraceActorCreation.java diff --git a/src/som/primitives/actors/CreateActorPrim.java b/src/som/primitives/actors/CreateActorPrim.java index 7abdfa2a1..5dd159066 100644 --- a/src/som/primitives/actors/CreateActorPrim.java +++ b/src/som/primitives/actors/CreateActorPrim.java @@ -18,6 +18,8 @@ import tools.concurrency.KomposTrace; import tools.concurrency.Tags.ExpressionBreakpoint; import tools.concurrency.TracingActors.TracingActor; +import tools.concurrency.nodes.TraceActorCreation; +import tools.concurrency.nodes.TraceActorCreationNodeGen; import tools.debugger.entities.ActivityType; import tools.replay.actors.ActorExecutionTrace; @@ -28,6 +30,7 @@ public abstract class CreateActorPrim extends BinarySystemOperation { @Child protected IsValue isValue = IsValueNodeGen.createSubNode(); @Child protected ExceptionSignalingNode notAValue; + @Child protected TraceActorCreation trace = TraceActorCreationNodeGen.create(); @Override public final CreateActorPrim initialize(final VM vm) { @@ -42,7 +45,7 @@ public final SFarReference createActor(final Object receiver, final Object argum SFarReference ref = new SFarReference(actor, argument); if (VmSettings.ACTOR_TRACING) { - ActorExecutionTrace.recordActorCreation(((TracingActor) actor).getActorId()); + trace.execute((TracingActor) actor); } else if (VmSettings.KOMPOS_TRACING) { assert argument instanceof SClass; final SClass actorClass = (SClass) argument; diff --git a/src/tools/concurrency/TraceBuffer.java b/src/tools/concurrency/TraceBuffer.java index 7386b6773..09fadc58e 100644 --- a/src/tools/concurrency/TraceBuffer.java +++ b/src/tools/concurrency/TraceBuffer.java @@ -44,10 +44,11 @@ public boolean swapStorage() { return true; } - protected final void ensureSufficientSpace(final int requiredSpace) { + public final ByteBuffer ensureSufficientSpace(final int requiredSpace) { if (storage.remaining() < requiredSpace) { swapBufferWhenNotEnoughSpace(); } + return storage; } protected void swapBufferWhenNotEnoughSpace() { diff --git a/src/tools/concurrency/nodes/TraceActorCreation.java b/src/tools/concurrency/nodes/TraceActorCreation.java new file mode 100644 index 000000000..763c94629 --- /dev/null +++ b/src/tools/concurrency/nodes/TraceActorCreation.java @@ -0,0 +1,78 @@ +package tools.concurrency.nodes; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; + +import som.vm.VmSettings; +import tools.concurrency.ActorExecutionTrace; +import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; +import tools.concurrency.ByteBuffer; +import tools.concurrency.TracingActivityThread; +import tools.concurrency.TracingActors.TracingActor; + + +public abstract class TraceActorCreation extends Node { + public abstract void execute(TracingActor actor); + + protected static boolean smallIds() { + return VmSettings.TRACE_SMALL_IDS; + } + + protected static boolean byteId(final TracingActor actor) { + return (actor.getActorId() & 0xFFFFFF00) == 0; + } + + protected static boolean shortId(final TracingActor actor) { + return (actor.getActorId() & 0xFFFF0000) == 0; + } + + protected static boolean threeByteId(final TracingActor actor) { + return (actor.getActorId() & 0xFF000000) == 0; + } + + @Specialization(guards = {"smallIds()", "byteId(actor)"}) + public static void traceByteId(final TracingActor actor) { + ByteBuffer storage = getStorage(); + storage.put((byte) (ActorExecutionTrace.ACTOR_CREATION | (0 << 4))); + storage.put((byte) actor.getActorId()); + } + + @Specialization(guards = {"smallIds()", "shortId(actor)"}, replaces = "traceByteId") + public static void traceShortId(final TracingActor actor) { + ByteBuffer storage = getStorage(); + storage.putByteShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (1 << 4)), + (short) actor.getActorId()); + } + + @Specialization(guards = {"smallIds()", "threeByteId(actor)"}, + replaces = {"traceShortId", "traceByteId"}) + public static void traceThreeByteId(final TracingActor actor) { + ByteBuffer storage = getStorage(); + int id = actor.getActorId(); + storage.putByteByteShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (2 << 4)), + (byte) (id >> 16), (short) id); + } + + @Specialization(replaces = {"traceShortId", "traceByteId", "traceThreeByteId"}) + public static void traceStandardId(final TracingActor actor) { + ByteBuffer storage = getStorage(); + int id = actor.getActorId(); + storage.putByteInt((byte) (ActorExecutionTrace.ACTOR_CREATION | (3 << 4)), id); + } + + private static ByteBuffer getStorage() { + ActorTraceBuffer buffer = getCurrentBuffer(); + return buffer.ensureSufficientSpace(5); + } + + private static TracingActivityThread getThread() { + Thread current = Thread.currentThread(); + assert current instanceof TracingActivityThread; + return (TracingActivityThread) current; + } + + private static ActorTraceBuffer getCurrentBuffer() { + TracingActivityThread t = getThread(); + return (ActorTraceBuffer) t.getBuffer(); + } +} diff --git a/src/tools/replay/actors/ActorExecutionTrace.java b/src/tools/replay/actors/ActorExecutionTrace.java index 68f3f620e..f14e95b69 100644 --- a/src/tools/replay/actors/ActorExecutionTrace.java +++ b/src/tools/replay/actors/ActorExecutionTrace.java @@ -146,11 +146,11 @@ static int getUsedBytes(final int id) { public void recordActorContext(final TracingActor actor) { ensureSufficientSpace(7); + currentActor = actor; recordActorContextWithoutBufferCheck(actor); } private void recordActorContextWithoutBufferCheck(final TracingActor actor) { - currentActor = actor; int id = actor.getActorId(); if (VmSettings.TRACE_SMALL_IDS) { From fff1cf3c48344e36579df4d57bb34ec3ca1b1f6b Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Wed, 25 Apr 2018 23:56:13 +0100 Subject: [PATCH 03/16] Add second node for TraceActorContext This one is needed for all buffer changes Remove recordActorCreation, was replaced by node Signed-off-by: Stefan Marr --- src/som/interpreter/actors/Actor.java | 6 +- src/som/primitives/SystemPrims.java | 13 +- src/tools/concurrency/TraceBuffer.java | 12 +- .../concurrency/nodes/TraceActorContext.java | 79 +++++++++++ .../concurrency/nodes/TraceActorCreation.java | 14 +- .../replay/actors/ActorExecutionTrace.java | 127 +++++++----------- 6 files changed, 162 insertions(+), 89 deletions(-) create mode 100644 src/tools/concurrency/nodes/TraceActorContext.java diff --git a/src/som/interpreter/actors/Actor.java b/src/som/interpreter/actors/Actor.java index 015adc3ca..787c9bd94 100644 --- a/src/som/interpreter/actors/Actor.java +++ b/src/som/interpreter/actors/Actor.java @@ -28,6 +28,8 @@ import tools.concurrency.TracingActivityThread; import tools.concurrency.TracingActors.ReplayActor; import tools.concurrency.TracingActors.TracingActor; +import tools.concurrency.nodes.TraceActorContext; +import tools.concurrency.nodes.TraceActorContextNodeGen; import tools.debugger.WebDebugger; import tools.debugger.entities.ActivityType; import tools.debugger.entities.DynamicScopeType; @@ -230,6 +232,8 @@ protected ExecAllMessages(final Actor actor, final VM vm) { this.vm = vm; } + private static final TraceActorContext tracer = TraceActorContextNodeGen.create(); + @Override public void run() { assert executorRoot != null : "Actor system not initalized, call to initializeActorSystem(.) missing?"; @@ -249,7 +253,7 @@ void doRun() { t.currentlyExecutingActor = actor; if (VmSettings.ACTOR_TRACING) { - ActorExecutionTrace.recordActorContext((TracingActor) actor); + ActorExecutionTrace.recordActorContext((TracingActor) actor, tracer); } else if (VmSettings.KOMPOS_TRACING) { KomposTrace.currentActivity(actor); } diff --git a/src/som/primitives/SystemPrims.java b/src/som/primitives/SystemPrims.java index 11a73e1f9..cd6985726 100644 --- a/src/som/primitives/SystemPrims.java +++ b/src/som/primitives/SystemPrims.java @@ -53,8 +53,11 @@ import som.vmobjects.SObjectWithClass; import som.vmobjects.SSymbol; import tools.SourceCoordinate; +import tools.concurrency.ActorExecutionTrace; import tools.concurrency.TraceParser; -import tools.replay.actors.ActorExecutionTrace; +import tools.concurrency.TracingBackend; +import tools.concurrency.nodes.TraceActorContext; +import tools.concurrency.nodes.TraceActorContextNodeGen; public final class SystemPrims { @@ -285,6 +288,8 @@ public final Object doSObject(final Object receiver) { @GenerateNodeFactory @Primitive(primitive = "systemTime:") public abstract static class TimePrim extends UnaryBasicOperation { + @Child TraceActorContext tracer = TraceActorContextNodeGen.create(); + @Specialization public final long doSObject(final Object receiver) { if (VmSettings.REPLAY) { @@ -293,7 +298,7 @@ public final long doSObject(final Object receiver) { long res = System.currentTimeMillis() - startTime; if (VmSettings.ACTOR_TRACING) { - ActorExecutionTrace.longSystemCall(res); + ActorExecutionTrace.longSystemCall(res, tracer); } return res; } @@ -319,6 +324,8 @@ public boolean matches(final Object[] args, final ExpressionNode[] argNodes) { @Primitive(primitive = "systemTicks:", selector = "ticks", specializer = IsSystemModule.class, noWrapper = true) public abstract static class TicksPrim extends UnaryBasicOperation implements Operation { + @Child TraceActorContext tracer = TraceActorContextNodeGen.create(); + @Specialization public final long doSObject(final Object receiver) { if (VmSettings.REPLAY) { @@ -328,7 +335,7 @@ public final long doSObject(final Object receiver) { long res = System.nanoTime() / 1000L - startMicroTime; if (VmSettings.ACTOR_TRACING) { - ActorExecutionTrace.longSystemCall(res); + ActorExecutionTrace.longSystemCall(res, tracer); } return res; } diff --git a/src/tools/concurrency/TraceBuffer.java b/src/tools/concurrency/TraceBuffer.java index 09fadc58e..612d9e318 100644 --- a/src/tools/concurrency/TraceBuffer.java +++ b/src/tools/concurrency/TraceBuffer.java @@ -2,6 +2,7 @@ import som.vm.VmSettings; import tools.replay.actors.ActorExecutionTrace.ActorTraceBuffer; +import tools.concurrency.nodes.TraceActorContext; public abstract class TraceBuffer { @@ -44,14 +45,19 @@ public boolean swapStorage() { return true; } - public final ByteBuffer ensureSufficientSpace(final int requiredSpace) { + public final ByteBuffer ensureSufficientSpace(final int requiredSpace, + final TraceActorContext tracer) { if (storage.remaining() < requiredSpace) { - swapBufferWhenNotEnoughSpace(); + swapBufferWhenNotEnoughSpace(tracer); } return storage; } - protected void swapBufferWhenNotEnoughSpace() { + public final ByteBuffer getStorage() { + return storage; + } + + protected void swapBufferWhenNotEnoughSpace(final TraceActorContext tracer) { swapStorage(); } } diff --git a/src/tools/concurrency/nodes/TraceActorContext.java b/src/tools/concurrency/nodes/TraceActorContext.java new file mode 100644 index 000000000..448f51b63 --- /dev/null +++ b/src/tools/concurrency/nodes/TraceActorContext.java @@ -0,0 +1,79 @@ +package tools.concurrency.nodes; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; + +import som.vm.VmSettings; +import tools.concurrency.ActorExecutionTrace; +import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; +import tools.concurrency.ByteBuffer; +import tools.concurrency.TracingActivityThread; +import tools.concurrency.TracingActors.TracingActor; + + +public abstract class TraceActorContext extends Node { + public abstract void execute(TracingActor actor); + + protected static boolean smallIds() { + return VmSettings.TRACE_SMALL_IDS; + } + + protected static boolean byteId(final TracingActor actor) { + return (actor.getActorId() & 0xFFFFFF00) == 0; + } + + protected static boolean shortId(final TracingActor actor) { + return (actor.getActorId() & 0xFFFF0000) == 0; + } + + protected static boolean threeByteId(final TracingActor actor) { + return (actor.getActorId() & 0xFF000000) == 0; + } + + @Specialization(guards = {"smallIds()", "byteId(actor)"}) + public static void traceByteId(final TracingActor actor) { + ByteBuffer storage = getStorage(); + storage.putByteShortByte((byte) (ActorExecutionTrace.ACTOR_CREATION | (0 << 4)), + actor.getOrdering(), (byte) actor.getActorId()); + } + + @Specialization(guards = {"smallIds()", "shortId(actor)"}, replaces = "traceByteId") + public static void traceShortId(final TracingActor actor) { + ByteBuffer storage = getStorage(); + storage.putByteShortShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (1 << 4)), + actor.getOrdering(), (short) actor.getActorId()); + } + + @Specialization(guards = {"smallIds()", "threeByteId(actor)"}, + replaces = {"traceShortId", "traceByteId"}) + public static void traceThreeByteId(final TracingActor actor) { + ByteBuffer storage = getStorage(); + int id = actor.getActorId(); + storage.putByteShortByteShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (2 << 4)), + actor.getOrdering(), (byte) (id >> 16), (short) id); + } + + @Specialization(replaces = {"traceShortId", "traceByteId", "traceThreeByteId"}) + public static void traceStandardId(final TracingActor actor) { + ByteBuffer storage = getStorage(); + int id = actor.getActorId(); + storage.putByteShortInt((byte) (ActorExecutionTrace.ACTOR_CREATION | (3 << 4)), + actor.getOrdering(), id); + } + + private static ByteBuffer getStorage() { + ActorTraceBuffer buffer = getCurrentBuffer(); + return buffer.getStorage(); + } + + private static TracingActivityThread getThread() { + Thread current = Thread.currentThread(); + assert current instanceof TracingActivityThread; + return (TracingActivityThread) current; + } + + private static ActorTraceBuffer getCurrentBuffer() { + TracingActivityThread t = getThread(); + return (ActorTraceBuffer) t.getBuffer(); + } +} diff --git a/src/tools/concurrency/nodes/TraceActorCreation.java b/src/tools/concurrency/nodes/TraceActorCreation.java index 763c94629..e8e2005f8 100644 --- a/src/tools/concurrency/nodes/TraceActorCreation.java +++ b/src/tools/concurrency/nodes/TraceActorCreation.java @@ -31,14 +31,14 @@ protected static boolean threeByteId(final TracingActor actor) { } @Specialization(guards = {"smallIds()", "byteId(actor)"}) - public static void traceByteId(final TracingActor actor) { + public void traceByteId(final TracingActor actor) { ByteBuffer storage = getStorage(); storage.put((byte) (ActorExecutionTrace.ACTOR_CREATION | (0 << 4))); storage.put((byte) actor.getActorId()); } @Specialization(guards = {"smallIds()", "shortId(actor)"}, replaces = "traceByteId") - public static void traceShortId(final TracingActor actor) { + public void traceShortId(final TracingActor actor) { ByteBuffer storage = getStorage(); storage.putByteShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (1 << 4)), (short) actor.getActorId()); @@ -46,7 +46,7 @@ public static void traceShortId(final TracingActor actor) { @Specialization(guards = {"smallIds()", "threeByteId(actor)"}, replaces = {"traceShortId", "traceByteId"}) - public static void traceThreeByteId(final TracingActor actor) { + public void traceThreeByteId(final TracingActor actor) { ByteBuffer storage = getStorage(); int id = actor.getActorId(); storage.putByteByteShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (2 << 4)), @@ -54,15 +54,17 @@ public static void traceThreeByteId(final TracingActor actor) { } @Specialization(replaces = {"traceShortId", "traceByteId", "traceThreeByteId"}) - public static void traceStandardId(final TracingActor actor) { + public void traceStandardId(final TracingActor actor) { ByteBuffer storage = getStorage(); int id = actor.getActorId(); storage.putByteInt((byte) (ActorExecutionTrace.ACTOR_CREATION | (3 << 4)), id); } - private static ByteBuffer getStorage() { + @Child TraceActorContext tracer = TraceActorContextNodeGen.create(); + + private ByteBuffer getStorage() { ActorTraceBuffer buffer = getCurrentBuffer(); - return buffer.ensureSufficientSpace(5); + return buffer.ensureSufficientSpace(5, tracer); } private static TracingActivityThread getThread() { diff --git a/src/tools/replay/actors/ActorExecutionTrace.java b/src/tools/replay/actors/ActorExecutionTrace.java index f14e95b69..9f0744995 100644 --- a/src/tools/replay/actors/ActorExecutionTrace.java +++ b/src/tools/replay/actors/ActorExecutionTrace.java @@ -29,17 +29,13 @@ private static TracingActivityThread getThread() { return (TracingActivityThread) current; } - public static void recordActorContext(final TracingActor actor) { + public static void recordActorContext(final TracingActor actor, + final TraceActorContext tracer) { TracingActivityThread t = getThread(); - ((ActorTraceBuffer) t.getBuffer()).recordActorContext(actor); + ((ActorTraceBuffer) t.getBuffer()).recordActorContext(actor, tracer); } - public static void recordActorCreation(final int childId) { - TracingActivityThread t = getThread(); - ((ActorTraceBuffer) t.getBuffer()).recordActorCreation(childId); - } - - public static void recordMessage(final EventualMessage msg) { + public static void recordMessage(final EventualMessage msg, final TraceActorContext tracer) { TracingActivityThread t = getThread(); ActorTraceBuffer atb = ((ActorTraceBuffer) t.getBuffer()); if (msg instanceof ExternalMessage) { @@ -47,61 +43,63 @@ public static void recordMessage(final EventualMessage msg) { if (msg instanceof PromiseMessage) { atb.recordExternalPromiseMessage(((TracingActor) msg.getSender()).getActorId(), ((STracingPromise) ((PromiseMessage) msg).getPromise()).getResolvingActor(), - em.getMethod(), em.getDataId()); + em.getMethod(), em.getDataId(), tracer); } else { atb.recordExternalMessage(((TracingActor) msg.getSender()).getActorId(), em.getMethod(), - em.getDataId()); + em.getDataId(), tracer); } } else { if (msg instanceof PromiseMessage) { atb.recordPromiseMessage(((TracingActor) msg.getSender()).getActorId(), - ((STracingPromise) ((PromiseMessage) msg).getPromise()).getResolvingActor()); + ((STracingPromise) ((PromiseMessage) msg).getPromise()).getResolvingActor(), + tracer); } else { - atb.recordMessage(((TracingActor) msg.getSender()).getActorId()); + atb.recordMessage(((TracingActor) msg.getSender()).getActorId(), tracer); } } } - public static void recordSystemCall(final int dataId) { + public static void recordSystemCall(final int dataId, final TraceActorContext tracer) { TracingActivityThread t = getThread(); - ((ActorTraceBuffer) t.getBuffer()).recordSystemCall(dataId); + ((ActorTraceBuffer) t.getBuffer()).recordSystemCall(dataId, tracer); } - public static void intSystemCall(final int i) { - ActorProcessingThread t = (ActorProcessingThread) getThread(); - TracingActor ta = (TracingActor) t.getCurrentActor(); - int dataId = ta.getDataId(); - byte[] b = getExtDataByteBuffer(ta.getActorId(), dataId, Integer.BYTES); - recordSystemCall(dataId); + public static void intSystemCall(final int i, final TraceActorContext tracer) { + TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); + int dataId = ta.getActorId(); + ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, Integer.BYTES); + b.putInt(i); + recordSystemCall(dataId, tracer); t.addExternalData(b); } - public static void longSystemCall(final long l) { - ActorProcessingThread t = (ActorProcessingThread) getThread(); - TracingActor ta = (TracingActor) t.getCurrentActor(); - int dataId = ta.getDataId(); - byte[] b = getExtDataByteBuffer(ta.getActorId(), dataId, Long.BYTES); - recordSystemCall(dataId); + public static void longSystemCall(final long l, final TraceActorContext tracer) { + TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); + int dataId = ta.getActorId(); + ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, Long.BYTES); + b.putLong(l); + recordSystemCall(dataId, tracer); t.addExternalData(b); } - public static void doubleSystemCall(final double d) { - ActorProcessingThread t = (ActorProcessingThread) getThread(); - TracingActor ta = (TracingActor) t.getCurrentActor(); - int dataId = ta.getDataId(); - byte[] b = getExtDataByteBuffer(ta.getActorId(), dataId, Double.BYTES); - recordSystemCall(dataId); + public static void doubleSystemCall(final double d, final TraceActorContext tracer) { + TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); + int dataId = ta.getActorId(); + ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, Double.BYTES); + b.putDouble(d); + recordSystemCall(dataId, tracer); t.addExternalData(b); } private static final int EXT_DATA_HEADER_SIZE = 3 * 4; - public static void stringSystemCall(final String s) { - ActorProcessingThread t = (ActorProcessingThread) getThread(); - TracingActor ta = (TracingActor) t.getCurrentActor(); - int dataId = ta.getDataId(); - recordSystemCall(dataId); + public static void stringSystemCall(final String s, final TraceActorContext tracer) { + TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); + int dataId = ta.getActorId(); + ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, s.getBytes().length); + b.put(s.getBytes()); + recordSystemCall(dataId, tracer); StringWrapper sw = new StringWrapper(s, ta.getActorId(), dataId); @@ -125,10 +123,10 @@ public static class ActorTraceBuffer extends TraceBuffer { TracingActor currentActor; @Override - protected void swapBufferWhenNotEnoughSpace() { + protected void swapBufferWhenNotEnoughSpace(final TraceActorContext tracer) { boolean didSwap = swapStorage(); assert didSwap; - recordActorContextWithoutBufferCheck(currentActor); + tracer.execute(currentActor); } static int getUsedBytes(final int id) { @@ -144,38 +142,14 @@ static int getUsedBytes(final int id) { return 3; } - public void recordActorContext(final TracingActor actor) { - ensureSufficientSpace(7); + public void recordActorContext(final TracingActor actor, final TraceActorContext tracer) { + ensureSufficientSpace(7, tracer); currentActor = actor; - recordActorContextWithoutBufferCheck(actor); - } - - private void recordActorContextWithoutBufferCheck(final TracingActor actor) { - int id = actor.getActorId(); - - if (VmSettings.TRACE_SMALL_IDS) { - int usedBytes = getUsedBytes(id); - storage.putByteShort((byte) (ACTOR_CONTEXT | (usedBytes << 4)), actor.getOrdering()); - writeId(usedBytes, id); - } else { - storage.putByteShortInt( - (byte) (ACTOR_CONTEXT | (3 << 4)), actor.getOrdering(), id); - } - } - - public void recordActorCreation(final int childId) { - ensureSufficientSpace(5); - if (VmSettings.TRACE_SMALL_IDS) { - int usedBytes = getUsedBytes(childId); - storage.put((byte) (ACTOR_CREATION | (usedBytes << 4))); - writeId(usedBytes, childId); - } else { - storage.putByteInt((byte) (ACTOR_CREATION | (3 << 4)), (short) childId); - } + tracer.execute(actor); } - public void recordMessage(final int senderId) { - ensureSufficientSpace(5); + public void recordMessage(final int senderId, final TraceActorContext tracer) { + ensureSufficientSpace(5, tracer); if (VmSettings.TRACE_SMALL_IDS) { int usedBytes = getUsedBytes(senderId); storage.put((byte) (MESSAGE | (usedBytes << 4))); @@ -185,8 +159,9 @@ public void recordMessage(final int senderId) { } } - public void recordPromiseMessage(final int senderId, final int resolverId) { - ensureSufficientSpace(9); + public void recordPromiseMessage(final int senderId, final int resolverId, + final TraceActorContext tracer) { + ensureSufficientSpace(9, tracer); int usedBytes = Math.max(getUsedBytes(resolverId), getUsedBytes(senderId)); if (VmSettings.TRACE_SMALL_IDS) { @@ -199,8 +174,8 @@ public void recordPromiseMessage(final int senderId, final int resolverId) { } public void recordExternalMessage(final int senderId, final short method, - final int dataId) { - ensureSufficientSpace(11); + final int dataId, final TraceActorContext tracer) { + ensureSufficientSpace(11, tracer); if (VmSettings.TRACE_SMALL_IDS) { int usedBytes = getUsedBytes(senderId); @@ -213,8 +188,8 @@ public void recordExternalMessage(final int senderId, final short method, } public void recordExternalPromiseMessage(final int senderId, final int resolverId, - final short method, final int dataId) { - ensureSufficientSpace(15); + final short method, final int dataId, final TraceActorContext tracer) { + ensureSufficientSpace(15, tracer); if (VmSettings.TRACE_SMALL_IDS) { int usedBytes = Math.max(getUsedBytes(resolverId), getUsedBytes(senderId)); @@ -230,8 +205,8 @@ public void recordExternalPromiseMessage(final int senderId, final int resolverI storage.putShortInt(method, senderId); } - public void recordSystemCall(final int dataId) { - ensureSufficientSpace(5); + public void recordSystemCall(final int dataId, final TraceActorContext tracer) { + ensureSufficientSpace(5, tracer); storage.putByteInt(SYSTEM_CALL, dataId); } From c013a0ffb218f286372e85beb680728ec5419635 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Fri, 27 Apr 2018 11:19:28 +0100 Subject: [PATCH 04/16] Remove message tracing intro truffle method to enable specialization Reduce code duplication in received message handling Move more of the old tracing also intro the received call targets Factor our redundant code Signed-off-by: Stefan Marr --- .../interpreter/actors/ReceivedMessage.java | 33 +++--------- .../interpreter/actors/ReceivedRootNode.java | 51 +++++++++++++++++++ .../concurrency/nodes/TraceActorContext.java | 33 +----------- .../concurrency/nodes/TraceActorCreation.java | 33 +----------- src/tools/concurrency/nodes/TraceNode.java | 35 +++++++++++++ 5 files changed, 94 insertions(+), 91 deletions(-) create mode 100644 src/tools/concurrency/nodes/TraceNode.java diff --git a/src/som/interpreter/actors/ReceivedMessage.java b/src/som/interpreter/actors/ReceivedMessage.java index db6760b5e..e57307e30 100644 --- a/src/som/interpreter/actors/ReceivedMessage.java +++ b/src/som/interpreter/actors/ReceivedMessage.java @@ -7,11 +7,9 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.DirectCallNode; -import som.interpreter.SArguments; import som.interpreter.SomException; import som.interpreter.SomLanguage; import som.interpreter.nodes.MessageSendNode.AbstractMessageSendNode; -import som.vm.VmSettings; import som.vmobjects.SSymbol; @@ -30,15 +28,8 @@ public ReceivedMessage(final AbstractMessageSendNode onReceive, } @Override - public Object execute(final VirtualFrame frame) { - EventualMessage msg = (EventualMessage) SArguments.rcvr(frame); - boolean haltOnResolver = msg.getHaltOnResolver(); - boolean haltOnResolution = msg.getHaltOnResolution(); - - if (VmSettings.TRUFFLE_DEBUGGER_ENABLED && haltOnResolver) { - dbg.prepareSteppingAfterNextRootNode(); - } - + protected Object executeBody(final VirtualFrame frame, final EventualMessage msg, + final boolean haltOnResolver, final boolean haltOnResolution) { try { Object result = onReceive.doPreEvaluated(frame, msg.args); resolvePromise(frame, msg.resolver, result, haltOnResolver, haltOnResolution); @@ -65,13 +56,8 @@ public ReceivedMessageForVMMain(final AbstractMessageSendNode onReceive, } @Override - public Object execute(final VirtualFrame frame) { - EventualMessage msg = (EventualMessage) SArguments.rcvr(frame); - - if (VmSettings.TRUFFLE_DEBUGGER_ENABLED && msg.getHaltOnResolver()) { - dbg.prepareSteppingAfterNextRootNode(); - } - + protected Object executeBody(final VirtualFrame frame, final EventualMessage msg, + final boolean haltOnResolver, final boolean haltOnResolution) { Object result = onReceive.doPreEvaluated(frame, msg.args); future.complete(result); return result; @@ -88,15 +74,8 @@ public ReceivedCallback(final RootCallTarget onReceive) { } @Override - public Object execute(final VirtualFrame frame) { - EventualMessage msg = (EventualMessage) SArguments.rcvr(frame); - boolean haltOnResolver = msg.getHaltOnResolver(); - boolean haltOnResolution = msg.getHaltOnResolution(); - - if (VmSettings.TRUFFLE_DEBUGGER_ENABLED && haltOnResolver) { - dbg.prepareSteppingAfterNextRootNode(); - } - + protected Object executeBody(final VirtualFrame frame, final EventualMessage msg, + final boolean haltOnResolver, final boolean haltOnResolution) { try { Object result = onReceive.call(msg.args); resolvePromise(frame, msg.resolver, result, haltOnResolver, diff --git a/src/som/interpreter/actors/ReceivedRootNode.java b/src/som/interpreter/actors/ReceivedRootNode.java index b470fa69b..c3f914b08 100644 --- a/src/som/interpreter/actors/ReceivedRootNode.java +++ b/src/som/interpreter/actors/ReceivedRootNode.java @@ -4,13 +4,20 @@ import com.oracle.truffle.api.frame.FrameDescriptor; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.RootNode; +import com.oracle.truffle.api.profiles.ValueProfile; import com.oracle.truffle.api.source.SourceSection; import som.VM; +import som.interpreter.SArguments; import som.interpreter.SomLanguage; import som.interpreter.actors.SPromise.SResolver; import som.vm.VmSettings; +import tools.concurrency.ActorExecutionTrace; +import tools.concurrency.MedeorTrace; +import tools.concurrency.nodes.TraceActorContext; +import tools.concurrency.nodes.TraceActorContextNodeGen; import tools.debugger.WebDebugger; +import tools.debugger.entities.DynamicScopeType; public abstract class ReceivedRootNode extends RootNode { @@ -18,6 +25,10 @@ public abstract class ReceivedRootNode extends RootNode { @Child protected AbstractPromiseResolutionNode resolve; @Child protected AbstractPromiseResolutionNode error; + @Child protected TraceActorContext tracer = TraceActorContextNodeGen.create(); + + private final ValueProfile msgProfile = ValueProfile.createClassProfile(); + private final VM vm; protected final WebDebugger dbg; private final SourceSection sourceSection; @@ -35,6 +46,46 @@ protected ReceivedRootNode(final SomLanguage language, this.sourceSection = sourceSection; } + protected abstract Object executeBody(VirtualFrame frame, EventualMessage msg, + boolean haltOnResolver, boolean haltOnResolution); + + @Override + public final Object execute(final VirtualFrame frame) { + EventualMessage msg = (EventualMessage) SArguments.rcvr(frame); + + boolean haltOnResolver; + boolean haltOnResolution; + + if (VmSettings.TRUFFLE_DEBUGGER_ENABLED) { + haltOnResolver = msg.getHaltOnResolver(); + haltOnResolution = msg.getHaltOnResolution(); + + if (haltOnResolver) { + dbg.prepareSteppingAfterNextRootNode(); + } + } else { + haltOnResolver = false; + haltOnResolution = false; + } + + if (VmSettings.MEDEOR_TRACING) { + MedeorTrace.scopeStart(DynamicScopeType.TURN, msg.getMessageId(), + msg.getTargetSourceSection()); + } + + try { + return executeBody(frame, msg, haltOnResolver, haltOnResolution); + } finally { + if (VmSettings.ACTOR_TRACING) { + ActorExecutionTrace.recordMessage(msgProfile.profile(msg), tracer); + } + + if (VmSettings.MEDEOR_TRACING) { + MedeorTrace.scopeEnd(DynamicScopeType.TURN); + } + } + } + @Override public SourceSection getSourceSection() { return sourceSection; diff --git a/src/tools/concurrency/nodes/TraceActorContext.java b/src/tools/concurrency/nodes/TraceActorContext.java index 448f51b63..b16553c60 100644 --- a/src/tools/concurrency/nodes/TraceActorContext.java +++ b/src/tools/concurrency/nodes/TraceActorContext.java @@ -1,34 +1,14 @@ package tools.concurrency.nodes; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.nodes.Node; -import som.vm.VmSettings; import tools.concurrency.ActorExecutionTrace; import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.ByteBuffer; -import tools.concurrency.TracingActivityThread; import tools.concurrency.TracingActors.TracingActor; -public abstract class TraceActorContext extends Node { - public abstract void execute(TracingActor actor); - - protected static boolean smallIds() { - return VmSettings.TRACE_SMALL_IDS; - } - - protected static boolean byteId(final TracingActor actor) { - return (actor.getActorId() & 0xFFFFFF00) == 0; - } - - protected static boolean shortId(final TracingActor actor) { - return (actor.getActorId() & 0xFFFF0000) == 0; - } - - protected static boolean threeByteId(final TracingActor actor) { - return (actor.getActorId() & 0xFF000000) == 0; - } +public abstract class TraceActorContext extends TraceNode { @Specialization(guards = {"smallIds()", "byteId(actor)"}) public static void traceByteId(final TracingActor actor) { @@ -65,15 +45,4 @@ private static ByteBuffer getStorage() { ActorTraceBuffer buffer = getCurrentBuffer(); return buffer.getStorage(); } - - private static TracingActivityThread getThread() { - Thread current = Thread.currentThread(); - assert current instanceof TracingActivityThread; - return (TracingActivityThread) current; - } - - private static ActorTraceBuffer getCurrentBuffer() { - TracingActivityThread t = getThread(); - return (ActorTraceBuffer) t.getBuffer(); - } } diff --git a/src/tools/concurrency/nodes/TraceActorCreation.java b/src/tools/concurrency/nodes/TraceActorCreation.java index e8e2005f8..a811ea39e 100644 --- a/src/tools/concurrency/nodes/TraceActorCreation.java +++ b/src/tools/concurrency/nodes/TraceActorCreation.java @@ -1,34 +1,14 @@ package tools.concurrency.nodes; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.nodes.Node; -import som.vm.VmSettings; import tools.concurrency.ActorExecutionTrace; import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.ByteBuffer; -import tools.concurrency.TracingActivityThread; import tools.concurrency.TracingActors.TracingActor; -public abstract class TraceActorCreation extends Node { - public abstract void execute(TracingActor actor); - - protected static boolean smallIds() { - return VmSettings.TRACE_SMALL_IDS; - } - - protected static boolean byteId(final TracingActor actor) { - return (actor.getActorId() & 0xFFFFFF00) == 0; - } - - protected static boolean shortId(final TracingActor actor) { - return (actor.getActorId() & 0xFFFF0000) == 0; - } - - protected static boolean threeByteId(final TracingActor actor) { - return (actor.getActorId() & 0xFF000000) == 0; - } +public abstract class TraceActorCreation extends TraceNode { @Specialization(guards = {"smallIds()", "byteId(actor)"}) public void traceByteId(final TracingActor actor) { @@ -66,15 +46,4 @@ private ByteBuffer getStorage() { ActorTraceBuffer buffer = getCurrentBuffer(); return buffer.ensureSufficientSpace(5, tracer); } - - private static TracingActivityThread getThread() { - Thread current = Thread.currentThread(); - assert current instanceof TracingActivityThread; - return (TracingActivityThread) current; - } - - private static ActorTraceBuffer getCurrentBuffer() { - TracingActivityThread t = getThread(); - return (ActorTraceBuffer) t.getBuffer(); - } } diff --git a/src/tools/concurrency/nodes/TraceNode.java b/src/tools/concurrency/nodes/TraceNode.java new file mode 100644 index 000000000..5832c8439 --- /dev/null +++ b/src/tools/concurrency/nodes/TraceNode.java @@ -0,0 +1,35 @@ +package tools.concurrency.nodes; + +import com.oracle.truffle.api.nodes.Node; + +import som.vm.VmSettings; +import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; +import tools.concurrency.TracingActivityThread; +import tools.concurrency.TracingActors.TracingActor; + + +public abstract class TraceNode extends Node { + + public abstract void execute(TracingActor actor); + + protected static boolean smallIds() { + return VmSettings.TRACE_SMALL_IDS; + } + + protected static boolean byteId(final TracingActor actor) { + return (actor.getActorId() & 0xFFFFFF00) == 0; + } + + protected static boolean shortId(final TracingActor actor) { + return (actor.getActorId() & 0xFFFF0000) == 0; + } + + protected static boolean threeByteId(final TracingActor actor) { + return (actor.getActorId() & 0xFF000000) == 0; + } + + protected static ActorTraceBuffer getCurrentBuffer() { + TracingActivityThread t = TracingActivityThread.currentThread(); + return (ActorTraceBuffer) t.getBuffer(); + } +} From 49ec8ce0772bdf7af8e97ad38c9fb69163d7e786 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Fri, 27 Apr 2018 15:47:59 +0100 Subject: [PATCH 05/16] Add node suffix to node classes for consistency Signed-off-by: Stefan Marr --- src/som/interpreter/actors/Actor.java | 4 +-- .../interpreter/actors/ReceivedRootNode.java | 4 +-- src/som/primitives/SystemPrims.java | 6 ++-- .../primitives/actors/CreateActorPrim.java | 4 +-- src/tools/concurrency/TraceBuffer.java | 4 +-- ...ontext.java => TraceActorContextNode.java} | 2 +- ...ation.java => TraceActorCreationNode.java} | 4 +-- .../replay/actors/ActorExecutionTrace.java | 29 ++++++++++--------- 8 files changed, 29 insertions(+), 28 deletions(-) rename src/tools/concurrency/nodes/{TraceActorContext.java => TraceActorContextNode.java} (96%) rename src/tools/concurrency/nodes/{TraceActorCreation.java => TraceActorCreationNode.java} (92%) diff --git a/src/som/interpreter/actors/Actor.java b/src/som/interpreter/actors/Actor.java index 787c9bd94..56115edc2 100644 --- a/src/som/interpreter/actors/Actor.java +++ b/src/som/interpreter/actors/Actor.java @@ -28,7 +28,7 @@ import tools.concurrency.TracingActivityThread; import tools.concurrency.TracingActors.ReplayActor; import tools.concurrency.TracingActors.TracingActor; -import tools.concurrency.nodes.TraceActorContext; +import tools.concurrency.nodes.TraceActorContextNode; import tools.concurrency.nodes.TraceActorContextNodeGen; import tools.debugger.WebDebugger; import tools.debugger.entities.ActivityType; @@ -232,7 +232,7 @@ protected ExecAllMessages(final Actor actor, final VM vm) { this.vm = vm; } - private static final TraceActorContext tracer = TraceActorContextNodeGen.create(); + private static final TraceActorContextNode tracer = TraceActorContextNodeGen.create(); @Override public void run() { diff --git a/src/som/interpreter/actors/ReceivedRootNode.java b/src/som/interpreter/actors/ReceivedRootNode.java index c3f914b08..fe0aa99b0 100644 --- a/src/som/interpreter/actors/ReceivedRootNode.java +++ b/src/som/interpreter/actors/ReceivedRootNode.java @@ -14,7 +14,7 @@ import som.vm.VmSettings; import tools.concurrency.ActorExecutionTrace; import tools.concurrency.MedeorTrace; -import tools.concurrency.nodes.TraceActorContext; +import tools.concurrency.nodes.TraceActorContextNode; import tools.concurrency.nodes.TraceActorContextNodeGen; import tools.debugger.WebDebugger; import tools.debugger.entities.DynamicScopeType; @@ -25,7 +25,7 @@ public abstract class ReceivedRootNode extends RootNode { @Child protected AbstractPromiseResolutionNode resolve; @Child protected AbstractPromiseResolutionNode error; - @Child protected TraceActorContext tracer = TraceActorContextNodeGen.create(); + @Child protected TraceActorContextNode tracer = TraceActorContextNodeGen.create(); private final ValueProfile msgProfile = ValueProfile.createClassProfile(); diff --git a/src/som/primitives/SystemPrims.java b/src/som/primitives/SystemPrims.java index cd6985726..9f82288a4 100644 --- a/src/som/primitives/SystemPrims.java +++ b/src/som/primitives/SystemPrims.java @@ -56,7 +56,7 @@ import tools.concurrency.ActorExecutionTrace; import tools.concurrency.TraceParser; import tools.concurrency.TracingBackend; -import tools.concurrency.nodes.TraceActorContext; +import tools.concurrency.nodes.TraceActorContextNode; import tools.concurrency.nodes.TraceActorContextNodeGen; @@ -288,7 +288,7 @@ public final Object doSObject(final Object receiver) { @GenerateNodeFactory @Primitive(primitive = "systemTime:") public abstract static class TimePrim extends UnaryBasicOperation { - @Child TraceActorContext tracer = TraceActorContextNodeGen.create(); + @Child TraceActorContextNode tracer = TraceActorContextNodeGen.create(); @Specialization public final long doSObject(final Object receiver) { @@ -324,7 +324,7 @@ public boolean matches(final Object[] args, final ExpressionNode[] argNodes) { @Primitive(primitive = "systemTicks:", selector = "ticks", specializer = IsSystemModule.class, noWrapper = true) public abstract static class TicksPrim extends UnaryBasicOperation implements Operation { - @Child TraceActorContext tracer = TraceActorContextNodeGen.create(); + @Child TraceActorContextNode tracer = TraceActorContextNodeGen.create(); @Specialization public final long doSObject(final Object receiver) { diff --git a/src/som/primitives/actors/CreateActorPrim.java b/src/som/primitives/actors/CreateActorPrim.java index 5dd159066..40716877d 100644 --- a/src/som/primitives/actors/CreateActorPrim.java +++ b/src/som/primitives/actors/CreateActorPrim.java @@ -18,7 +18,7 @@ import tools.concurrency.KomposTrace; import tools.concurrency.Tags.ExpressionBreakpoint; import tools.concurrency.TracingActors.TracingActor; -import tools.concurrency.nodes.TraceActorCreation; +import tools.concurrency.nodes.TraceActorCreationNode; import tools.concurrency.nodes.TraceActorCreationNodeGen; import tools.debugger.entities.ActivityType; import tools.replay.actors.ActorExecutionTrace; @@ -30,7 +30,7 @@ public abstract class CreateActorPrim extends BinarySystemOperation { @Child protected IsValue isValue = IsValueNodeGen.createSubNode(); @Child protected ExceptionSignalingNode notAValue; - @Child protected TraceActorCreation trace = TraceActorCreationNodeGen.create(); + @Child protected TraceActorCreationNode trace = TraceActorCreationNodeGen.create(); @Override public final CreateActorPrim initialize(final VM vm) { diff --git a/src/tools/concurrency/TraceBuffer.java b/src/tools/concurrency/TraceBuffer.java index 612d9e318..056457957 100644 --- a/src/tools/concurrency/TraceBuffer.java +++ b/src/tools/concurrency/TraceBuffer.java @@ -46,7 +46,7 @@ public boolean swapStorage() { } public final ByteBuffer ensureSufficientSpace(final int requiredSpace, - final TraceActorContext tracer) { + final TraceActorContextNode tracer) { if (storage.remaining() < requiredSpace) { swapBufferWhenNotEnoughSpace(tracer); } @@ -57,7 +57,7 @@ public final ByteBuffer getStorage() { return storage; } - protected void swapBufferWhenNotEnoughSpace(final TraceActorContext tracer) { + protected void swapBufferWhenNotEnoughSpace(final TraceActorContextNode tracer) { swapStorage(); } } diff --git a/src/tools/concurrency/nodes/TraceActorContext.java b/src/tools/concurrency/nodes/TraceActorContextNode.java similarity index 96% rename from src/tools/concurrency/nodes/TraceActorContext.java rename to src/tools/concurrency/nodes/TraceActorContextNode.java index b16553c60..232c2a176 100644 --- a/src/tools/concurrency/nodes/TraceActorContext.java +++ b/src/tools/concurrency/nodes/TraceActorContextNode.java @@ -8,7 +8,7 @@ import tools.concurrency.TracingActors.TracingActor; -public abstract class TraceActorContext extends TraceNode { +public abstract class TraceActorContextNode extends TraceNode { @Specialization(guards = {"smallIds()", "byteId(actor)"}) public static void traceByteId(final TracingActor actor) { diff --git a/src/tools/concurrency/nodes/TraceActorCreation.java b/src/tools/concurrency/nodes/TraceActorCreationNode.java similarity index 92% rename from src/tools/concurrency/nodes/TraceActorCreation.java rename to src/tools/concurrency/nodes/TraceActorCreationNode.java index a811ea39e..54214fad0 100644 --- a/src/tools/concurrency/nodes/TraceActorCreation.java +++ b/src/tools/concurrency/nodes/TraceActorCreationNode.java @@ -8,7 +8,7 @@ import tools.concurrency.TracingActors.TracingActor; -public abstract class TraceActorCreation extends TraceNode { +public abstract class TraceActorCreationNode extends TraceNode { @Specialization(guards = {"smallIds()", "byteId(actor)"}) public void traceByteId(final TracingActor actor) { @@ -40,7 +40,7 @@ public void traceStandardId(final TracingActor actor) { storage.putByteInt((byte) (ActorExecutionTrace.ACTOR_CREATION | (3 << 4)), id); } - @Child TraceActorContext tracer = TraceActorContextNodeGen.create(); + @Child TraceActorContextNode tracer = TraceActorContextNodeGen.create(); private ByteBuffer getStorage() { ActorTraceBuffer buffer = getCurrentBuffer(); diff --git a/src/tools/replay/actors/ActorExecutionTrace.java b/src/tools/replay/actors/ActorExecutionTrace.java index 9f0744995..785c0988e 100644 --- a/src/tools/replay/actors/ActorExecutionTrace.java +++ b/src/tools/replay/actors/ActorExecutionTrace.java @@ -11,6 +11,7 @@ import tools.concurrency.TracingActivityThread; import tools.concurrency.TracingActors.TracingActor; import tools.replay.StringWrapper; +import tools.concurrency.nodes.TraceActorContextNode; public class ActorExecutionTrace { @@ -30,12 +31,12 @@ private static TracingActivityThread getThread() { } public static void recordActorContext(final TracingActor actor, - final TraceActorContext tracer) { + final TraceActorContextNode tracer) { TracingActivityThread t = getThread(); ((ActorTraceBuffer) t.getBuffer()).recordActorContext(actor, tracer); } - public static void recordMessage(final EventualMessage msg, final TraceActorContext tracer) { + public static void recordMessage(final EventualMessage msg, final TraceActorContextNode tracer) { TracingActivityThread t = getThread(); ActorTraceBuffer atb = ((ActorTraceBuffer) t.getBuffer()); if (msg instanceof ExternalMessage) { @@ -60,12 +61,12 @@ public static void recordMessage(final EventualMessage msg, final TraceActorCont } } - public static void recordSystemCall(final int dataId, final TraceActorContext tracer) { + public static void recordSystemCall(final int dataId, final TraceActorContextNode tracer) { TracingActivityThread t = getThread(); ((ActorTraceBuffer) t.getBuffer()).recordSystemCall(dataId, tracer); } - public static void intSystemCall(final int i, final TraceActorContext tracer) { + public static void intSystemCall(final int i, final TraceActorContextNode tracer) { TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); int dataId = ta.getActorId(); ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, Integer.BYTES); @@ -74,7 +75,7 @@ public static void intSystemCall(final int i, final TraceActorContext tracer) { t.addExternalData(b); } - public static void longSystemCall(final long l, final TraceActorContext tracer) { + public static void longSystemCall(final long l, final TraceActorContextNode tracer) { TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); int dataId = ta.getActorId(); ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, Long.BYTES); @@ -83,7 +84,7 @@ public static void longSystemCall(final long l, final TraceActorContext tracer) t.addExternalData(b); } - public static void doubleSystemCall(final double d, final TraceActorContext tracer) { + public static void doubleSystemCall(final double d, final TraceActorContextNode tracer) { TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); int dataId = ta.getActorId(); ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, Double.BYTES); @@ -94,7 +95,7 @@ public static void doubleSystemCall(final double d, final TraceActorContext trac private static final int EXT_DATA_HEADER_SIZE = 3 * 4; - public static void stringSystemCall(final String s, final TraceActorContext tracer) { + public static void stringSystemCall(final String s, final TraceActorContextNode tracer) { TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); int dataId = ta.getActorId(); ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, s.getBytes().length); @@ -123,7 +124,7 @@ public static class ActorTraceBuffer extends TraceBuffer { TracingActor currentActor; @Override - protected void swapBufferWhenNotEnoughSpace(final TraceActorContext tracer) { + protected void swapBufferWhenNotEnoughSpace(final TraceActorContextNode tracer) { boolean didSwap = swapStorage(); assert didSwap; tracer.execute(currentActor); @@ -142,13 +143,13 @@ static int getUsedBytes(final int id) { return 3; } - public void recordActorContext(final TracingActor actor, final TraceActorContext tracer) { + public void recordActorContext(final TracingActor actor, final TraceActorContextNode tracer) { ensureSufficientSpace(7, tracer); currentActor = actor; tracer.execute(actor); } - public void recordMessage(final int senderId, final TraceActorContext tracer) { + public void recordMessage(final int senderId, final TraceActorContextNode tracer) { ensureSufficientSpace(5, tracer); if (VmSettings.TRACE_SMALL_IDS) { int usedBytes = getUsedBytes(senderId); @@ -160,7 +161,7 @@ public void recordMessage(final int senderId, final TraceActorContext tracer) { } public void recordPromiseMessage(final int senderId, final int resolverId, - final TraceActorContext tracer) { + final TraceActorContextNode tracer) { ensureSufficientSpace(9, tracer); int usedBytes = Math.max(getUsedBytes(resolverId), getUsedBytes(senderId)); @@ -174,7 +175,7 @@ public void recordPromiseMessage(final int senderId, final int resolverId, } public void recordExternalMessage(final int senderId, final short method, - final int dataId, final TraceActorContext tracer) { + final int dataId, final TraceActorContextNode tracer) { ensureSufficientSpace(11, tracer); if (VmSettings.TRACE_SMALL_IDS) { @@ -188,7 +189,7 @@ public void recordExternalMessage(final int senderId, final short method, } public void recordExternalPromiseMessage(final int senderId, final int resolverId, - final short method, final int dataId, final TraceActorContext tracer) { + final short method, final int dataId, final TraceActorContextNode tracer) { ensureSufficientSpace(15, tracer); if (VmSettings.TRACE_SMALL_IDS) { @@ -205,7 +206,7 @@ public void recordExternalPromiseMessage(final int senderId, final int resolverI storage.putShortInt(method, senderId); } - public void recordSystemCall(final int dataId, final TraceActorContext tracer) { + public void recordSystemCall(final int dataId, final TraceActorContextNode tracer) { ensureSufficientSpace(5, tracer); storage.putByteInt(SYSTEM_CALL, dataId); } From 8bfba642d2d1d4f4702dfa645872fb41f553d075 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Fri, 27 Apr 2018 19:21:49 +0100 Subject: [PATCH 06/16] Added separate nodes to record ids This avoids many recurring specializations in the tracing nodes we need. Signed-off-by: Stefan Marr --- .../concurrency/nodes/RecordIdIdNode.java | 67 +++++++++++++++++++ src/tools/concurrency/nodes/RecordIdNode.java | 59 ++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 src/tools/concurrency/nodes/RecordIdIdNode.java create mode 100644 src/tools/concurrency/nodes/RecordIdNode.java diff --git a/src/tools/concurrency/nodes/RecordIdIdNode.java b/src/tools/concurrency/nodes/RecordIdIdNode.java new file mode 100644 index 000000000..10877b518 --- /dev/null +++ b/src/tools/concurrency/nodes/RecordIdIdNode.java @@ -0,0 +1,67 @@ +package tools.concurrency.nodes; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; + +import som.vm.VmSettings; +import tools.concurrency.ByteBuffer; + + +public abstract class RecordIdIdNode extends Node { + private static final int BYTE_LEN = 1; + private static final int SHORT_LEN = 2; + private static final int THREE_BYTE_LEN = 3; + private static final int INT_LEN = 4; + + public abstract int execute(ByteBuffer storage, int idx, int id1, int id2); + + protected static boolean smallIds() { + return VmSettings.TRACE_SMALL_IDS; + } + + protected static boolean byteId(final int id1, final int id2) { + return (id1 & id2 & 0xFFFFFF00) == 0; + } + + protected static boolean shortId(final int id1, final int id2) { + return (id1 & id2 & 0xFFFF0000) == 0; + } + + protected static boolean threeByteId(final int id1, final int id2) { + return (id1 & id2 & 0xFF000000) == 0; + } + + @Specialization(guards = {"smallIds()", "byteId(id1, id2)"}) + public int traceByteId(final ByteBuffer storage, final int idx, final int id1, + final int id2) { + storage.putByteAt(idx, (byte) id1); + storage.putByteAt(idx + 1, (byte) id2); + return BYTE_LEN; + } + + @Specialization(guards = {"smallIds()", "shortId(id1, id2)"}, + replaces = "traceByteId") + public int traceShortId(final ByteBuffer storage, final int idx, final int id1, + final int id2) { + storage.putShortAt(idx, (short) id1); + storage.putShortAt(idx + 2, (short) id2); + return SHORT_LEN; + } + + @Specialization(guards = {"smallIds()", "threeByteId(id1, id2)"}, + replaces = {"traceShortId", "traceByteId"}) + public int traceThreeByteId(final ByteBuffer storage, final int idx, final int id1, + final int id2) { + storage.putByteShortAt(idx, (byte) (id1 >> 16), (short) id1); + storage.putByteShortAt(idx + 3, (byte) (id2 >> 16), (short) id2); + return THREE_BYTE_LEN; + } + + @Specialization(replaces = {"traceShortId", "traceByteId", "traceThreeByteId"}) + public int traceStandardId(final ByteBuffer storage, final int idx, final int id1, + final int id2) { + storage.putIntAt(idx, id1); + storage.putIntAt(idx + 4, id2); + return INT_LEN; + } +} diff --git a/src/tools/concurrency/nodes/RecordIdNode.java b/src/tools/concurrency/nodes/RecordIdNode.java new file mode 100644 index 000000000..91e1ca8e6 --- /dev/null +++ b/src/tools/concurrency/nodes/RecordIdNode.java @@ -0,0 +1,59 @@ +package tools.concurrency.nodes; + +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; + +import som.vm.VmSettings; +import tools.concurrency.ByteBuffer; + + +public abstract class RecordIdNode extends Node { + private static final int BYTE_LEN = 1; + private static final int SHORT_LEN = 2; + private static final int THREE_BYTE_LEN = 3; + private static final int INT_LEN = 4; + + public abstract int execute(ByteBuffer storage, int idx, int id); + + protected static boolean smallIds() { + return VmSettings.TRACE_SMALL_IDS; + } + + protected static boolean byteId(final int id) { + return (id & 0xFFFFFF00) == 0; + } + + protected static boolean shortId(final int id) { + return (id & 0xFFFF0000) == 0; + } + + protected static boolean threeByteId(final int id) { + return (id & 0xFF000000) == 0; + } + + @Specialization(guards = {"smallIds()", "byteId(id)"}) + public int traceByteId(final ByteBuffer storage, final int idx, final int id) { + storage.putByteAt(idx, (byte) id); + return BYTE_LEN; + } + + @Specialization(guards = {"smallIds()", "shortId(id)"}, + replaces = "traceByteId") + public int traceShortId(final ByteBuffer storage, final int idx, final int id) { + storage.putShortAt(idx, (short) id); + return SHORT_LEN; + } + + @Specialization(guards = {"smallIds()", "threeByteId(id)"}, + replaces = {"traceShortId", "traceByteId"}) + public int traceThreeByteId(final ByteBuffer storage, final int idx, final int id) { + storage.putByteShortAt(idx, (byte) (id >> 16), (short) id); + return THREE_BYTE_LEN; + } + + @Specialization(replaces = {"traceShortId", "traceByteId", "traceThreeByteId"}) + public int traceStandardId(final ByteBuffer storage, final int idx, final int id) { + storage.putIntAt(idx, id); + return INT_LEN; + } +} From 22699cf33eac22fad60eed39dc4afada827f6da6 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Fri, 27 Apr 2018 19:24:04 +0100 Subject: [PATCH 07/16] Refactor tracing nodes to use id nodes [Fix] id tracing, remove unneeded code Signed-off-by: Stefan Marr --- src/som/interpreter/actors/Actor.java | 3 +- .../interpreter/actors/ReceivedRootNode.java | 12 ++--- src/som/primitives/SystemPrims.java | 5 +-- .../primitives/actors/CreateActorPrim.java | 5 +-- .../nodes/TraceActorContextNode.java | 38 +++++----------- .../nodes/TraceActorCreationNode.java | 44 ++++++------------- src/tools/concurrency/nodes/TraceNode.java | 20 --------- 7 files changed, 32 insertions(+), 95 deletions(-) diff --git a/src/som/interpreter/actors/Actor.java b/src/som/interpreter/actors/Actor.java index 56115edc2..d49a9ca85 100644 --- a/src/som/interpreter/actors/Actor.java +++ b/src/som/interpreter/actors/Actor.java @@ -29,7 +29,6 @@ import tools.concurrency.TracingActors.ReplayActor; import tools.concurrency.TracingActors.TracingActor; import tools.concurrency.nodes.TraceActorContextNode; -import tools.concurrency.nodes.TraceActorContextNodeGen; import tools.debugger.WebDebugger; import tools.debugger.entities.ActivityType; import tools.debugger.entities.DynamicScopeType; @@ -232,7 +231,7 @@ protected ExecAllMessages(final Actor actor, final VM vm) { this.vm = vm; } - private static final TraceActorContextNode tracer = TraceActorContextNodeGen.create(); + private static final TraceActorContextNode tracer = new TraceActorContextNode(); @Override public void run() { diff --git a/src/som/interpreter/actors/ReceivedRootNode.java b/src/som/interpreter/actors/ReceivedRootNode.java index fe0aa99b0..2c73c14f3 100644 --- a/src/som/interpreter/actors/ReceivedRootNode.java +++ b/src/som/interpreter/actors/ReceivedRootNode.java @@ -4,7 +4,6 @@ import com.oracle.truffle.api.frame.FrameDescriptor; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.profiles.ValueProfile; import com.oracle.truffle.api.source.SourceSection; import som.VM; @@ -12,10 +11,9 @@ import som.interpreter.SomLanguage; import som.interpreter.actors.SPromise.SResolver; import som.vm.VmSettings; -import tools.concurrency.ActorExecutionTrace; import tools.concurrency.MedeorTrace; -import tools.concurrency.nodes.TraceActorContextNode; -import tools.concurrency.nodes.TraceActorContextNodeGen; +import tools.concurrency.nodes.TraceMessageNode; +import tools.concurrency.nodes.TraceMessageNodeGen; import tools.debugger.WebDebugger; import tools.debugger.entities.DynamicScopeType; @@ -25,9 +23,7 @@ public abstract class ReceivedRootNode extends RootNode { @Child protected AbstractPromiseResolutionNode resolve; @Child protected AbstractPromiseResolutionNode error; - @Child protected TraceActorContextNode tracer = TraceActorContextNodeGen.create(); - - private final ValueProfile msgProfile = ValueProfile.createClassProfile(); + @Child protected TraceMessageNode msgTracer = TraceMessageNodeGen.create(); private final VM vm; protected final WebDebugger dbg; @@ -77,7 +73,7 @@ public final Object execute(final VirtualFrame frame) { return executeBody(frame, msg, haltOnResolver, haltOnResolution); } finally { if (VmSettings.ACTOR_TRACING) { - ActorExecutionTrace.recordMessage(msgProfile.profile(msg), tracer); + msgTracer.execute(msg); } if (VmSettings.MEDEOR_TRACING) { diff --git a/src/som/primitives/SystemPrims.java b/src/som/primitives/SystemPrims.java index 9f82288a4..47bb0d914 100644 --- a/src/som/primitives/SystemPrims.java +++ b/src/som/primitives/SystemPrims.java @@ -57,7 +57,6 @@ import tools.concurrency.TraceParser; import tools.concurrency.TracingBackend; import tools.concurrency.nodes.TraceActorContextNode; -import tools.concurrency.nodes.TraceActorContextNodeGen; public final class SystemPrims { @@ -288,7 +287,7 @@ public final Object doSObject(final Object receiver) { @GenerateNodeFactory @Primitive(primitive = "systemTime:") public abstract static class TimePrim extends UnaryBasicOperation { - @Child TraceActorContextNode tracer = TraceActorContextNodeGen.create(); + @Child TraceActorContextNode tracer = new TraceActorContextNode(); @Specialization public final long doSObject(final Object receiver) { @@ -324,7 +323,7 @@ public boolean matches(final Object[] args, final ExpressionNode[] argNodes) { @Primitive(primitive = "systemTicks:", selector = "ticks", specializer = IsSystemModule.class, noWrapper = true) public abstract static class TicksPrim extends UnaryBasicOperation implements Operation { - @Child TraceActorContextNode tracer = TraceActorContextNodeGen.create(); + @Child TraceActorContextNode tracer = new TraceActorContextNode(); @Specialization public final long doSObject(final Object receiver) { diff --git a/src/som/primitives/actors/CreateActorPrim.java b/src/som/primitives/actors/CreateActorPrim.java index 40716877d..333f983fd 100644 --- a/src/som/primitives/actors/CreateActorPrim.java +++ b/src/som/primitives/actors/CreateActorPrim.java @@ -19,7 +19,6 @@ import tools.concurrency.Tags.ExpressionBreakpoint; import tools.concurrency.TracingActors.TracingActor; import tools.concurrency.nodes.TraceActorCreationNode; -import tools.concurrency.nodes.TraceActorCreationNodeGen; import tools.debugger.entities.ActivityType; import tools.replay.actors.ActorExecutionTrace; @@ -30,7 +29,7 @@ public abstract class CreateActorPrim extends BinarySystemOperation { @Child protected IsValue isValue = IsValueNodeGen.createSubNode(); @Child protected ExceptionSignalingNode notAValue; - @Child protected TraceActorCreationNode trace = TraceActorCreationNodeGen.create(); + @Child protected TraceActorCreationNode trace = new TraceActorCreationNode(); @Override public final CreateActorPrim initialize(final VM vm) { @@ -45,7 +44,7 @@ public final SFarReference createActor(final Object receiver, final Object argum SFarReference ref = new SFarReference(actor, argument); if (VmSettings.ACTOR_TRACING) { - trace.execute((TracingActor) actor); + trace.trace((TracingActor) actor); } else if (VmSettings.KOMPOS_TRACING) { assert argument instanceof SClass; final SClass actorClass = (SClass) argument; diff --git a/src/tools/concurrency/nodes/TraceActorContextNode.java b/src/tools/concurrency/nodes/TraceActorContextNode.java index 232c2a176..6e56add69 100644 --- a/src/tools/concurrency/nodes/TraceActorContextNode.java +++ b/src/tools/concurrency/nodes/TraceActorContextNode.java @@ -1,44 +1,26 @@ package tools.concurrency.nodes; -import com.oracle.truffle.api.dsl.Specialization; - import tools.concurrency.ActorExecutionTrace; import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.ByteBuffer; import tools.concurrency.TracingActors.TracingActor; -public abstract class TraceActorContextNode extends TraceNode { +public final class TraceActorContextNode extends TraceNode { - @Specialization(guards = {"smallIds()", "byteId(actor)"}) - public static void traceByteId(final TracingActor actor) { - ByteBuffer storage = getStorage(); - storage.putByteShortByte((byte) (ActorExecutionTrace.ACTOR_CREATION | (0 << 4)), - actor.getOrdering(), (byte) actor.getActorId()); - } + @Child protected RecordIdNode id = RecordIdNodeGen.create(); - @Specialization(guards = {"smallIds()", "shortId(actor)"}, replaces = "traceByteId") - public static void traceShortId(final TracingActor actor) { + public void trace(final TracingActor actor) { ByteBuffer storage = getStorage(); - storage.putByteShortShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (1 << 4)), - actor.getOrdering(), (short) actor.getActorId()); - } + int pos = storage.position(); - @Specialization(guards = {"smallIds()", "threeByteId(actor)"}, - replaces = {"traceShortId", "traceByteId"}) - public static void traceThreeByteId(final TracingActor actor) { - ByteBuffer storage = getStorage(); - int id = actor.getActorId(); - storage.putByteShortByteShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (2 << 4)), - actor.getOrdering(), (byte) (id >> 16), (short) id); - } + int idLen = id.execute(storage, pos + 3, actor.getActorId()); + int idBit = (idLen - 1) << 4; - @Specialization(replaces = {"traceShortId", "traceByteId", "traceThreeByteId"}) - public static void traceStandardId(final TracingActor actor) { - ByteBuffer storage = getStorage(); - int id = actor.getActorId(); - storage.putByteShortInt((byte) (ActorExecutionTrace.ACTOR_CREATION | (3 << 4)), - actor.getOrdering(), id); + storage.putByteAt(pos, (byte) (ActorExecutionTrace.ACTOR_CONTEXT | idBit)); + storage.putShortAt(pos + 1, actor.getOrdering()); + + storage.position(pos + idLen + 1 + 2); } private static ByteBuffer getStorage() { diff --git a/src/tools/concurrency/nodes/TraceActorCreationNode.java b/src/tools/concurrency/nodes/TraceActorCreationNode.java index 54214fad0..0944dcbae 100644 --- a/src/tools/concurrency/nodes/TraceActorCreationNode.java +++ b/src/tools/concurrency/nodes/TraceActorCreationNode.java @@ -1,49 +1,31 @@ package tools.concurrency.nodes; -import com.oracle.truffle.api.dsl.Specialization; - import tools.concurrency.ActorExecutionTrace; import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.ByteBuffer; import tools.concurrency.TracingActors.TracingActor; -public abstract class TraceActorCreationNode extends TraceNode { +public final class TraceActorCreationNode extends TraceNode { - @Specialization(guards = {"smallIds()", "byteId(actor)"}) - public void traceByteId(final TracingActor actor) { - ByteBuffer storage = getStorage(); - storage.put((byte) (ActorExecutionTrace.ACTOR_CREATION | (0 << 4))); - storage.put((byte) actor.getActorId()); - } + private static final int TRACE_ENTRY_SIZE = 5; - @Specialization(guards = {"smallIds()", "shortId(actor)"}, replaces = "traceByteId") - public void traceShortId(final TracingActor actor) { - ByteBuffer storage = getStorage(); - storage.putByteShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (1 << 4)), - (short) actor.getActorId()); - } + @Child protected TraceActorContextNode tracer = new TraceActorContextNode(); + @Child protected RecordIdNode id = RecordIdNodeGen.create(); - @Specialization(guards = {"smallIds()", "threeByteId(actor)"}, - replaces = {"traceShortId", "traceByteId"}) - public void traceThreeByteId(final TracingActor actor) { - ByteBuffer storage = getStorage(); - int id = actor.getActorId(); - storage.putByteByteShort((byte) (ActorExecutionTrace.ACTOR_CREATION | (2 << 4)), - (byte) (id >> 16), (short) id); + private ByteBuffer getStorage() { + ActorTraceBuffer buffer = getCurrentBuffer(); + return buffer.ensureSufficientSpace(TRACE_ENTRY_SIZE, tracer); } - @Specialization(replaces = {"traceShortId", "traceByteId", "traceThreeByteId"}) - public void traceStandardId(final TracingActor actor) { + public void trace(final TracingActor actor) { ByteBuffer storage = getStorage(); - int id = actor.getActorId(); - storage.putByteInt((byte) (ActorExecutionTrace.ACTOR_CREATION | (3 << 4)), id); - } + int pos = storage.position(); - @Child TraceActorContextNode tracer = TraceActorContextNodeGen.create(); + int idLen = id.execute(storage, pos + 1, actor.getActorId()); + int idBit = (idLen - 1) << 4; - private ByteBuffer getStorage() { - ActorTraceBuffer buffer = getCurrentBuffer(); - return buffer.ensureSufficientSpace(5, tracer); + storage.putByteAt(pos, (byte) (ActorExecutionTrace.ACTOR_CREATION | idBit)); + storage.position(pos + idLen + 1); } } diff --git a/src/tools/concurrency/nodes/TraceNode.java b/src/tools/concurrency/nodes/TraceNode.java index 5832c8439..f8d2e234c 100644 --- a/src/tools/concurrency/nodes/TraceNode.java +++ b/src/tools/concurrency/nodes/TraceNode.java @@ -2,32 +2,12 @@ import com.oracle.truffle.api.nodes.Node; -import som.vm.VmSettings; import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.TracingActivityThread; -import tools.concurrency.TracingActors.TracingActor; public abstract class TraceNode extends Node { - public abstract void execute(TracingActor actor); - - protected static boolean smallIds() { - return VmSettings.TRACE_SMALL_IDS; - } - - protected static boolean byteId(final TracingActor actor) { - return (actor.getActorId() & 0xFFFFFF00) == 0; - } - - protected static boolean shortId(final TracingActor actor) { - return (actor.getActorId() & 0xFFFF0000) == 0; - } - - protected static boolean threeByteId(final TracingActor actor) { - return (actor.getActorId() & 0xFF000000) == 0; - } - protected static ActorTraceBuffer getCurrentBuffer() { TracingActivityThread t = TracingActivityThread.currentThread(); return (ActorTraceBuffer) t.getBuffer(); From 81d9e7851e22da67cb6247e453538c3a72e476d4 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Fri, 27 Apr 2018 19:24:50 +0100 Subject: [PATCH 08/16] Turn message tracing into node Signed-off-by: Stefan Marr --- .../concurrency/nodes/TraceMessageNode.java | 132 ++++++++++++++++++ .../replay/actors/ActorExecutionTrace.java | 119 +--------------- 2 files changed, 136 insertions(+), 115 deletions(-) create mode 100644 src/tools/concurrency/nodes/TraceMessageNode.java diff --git a/src/tools/concurrency/nodes/TraceMessageNode.java b/src/tools/concurrency/nodes/TraceMessageNode.java new file mode 100644 index 000000000..8e95c9559 --- /dev/null +++ b/src/tools/concurrency/nodes/TraceMessageNode.java @@ -0,0 +1,132 @@ +package tools.concurrency.nodes; + +import com.oracle.truffle.api.dsl.Specialization; + +import som.interpreter.actors.EventualMessage; +import som.interpreter.actors.EventualMessage.DirectMessage; +import som.interpreter.actors.EventualMessage.ExternalDirectMessage; +import som.interpreter.actors.EventualMessage.ExternalPromiseCallbackMessage; +import som.interpreter.actors.EventualMessage.ExternalPromiseSendMessage; +import som.interpreter.actors.EventualMessage.PromiseCallbackMessage; +import som.interpreter.actors.EventualMessage.PromiseMessage; +import som.interpreter.actors.EventualMessage.PromiseSendMessage; +import som.interpreter.actors.SPromise.STracingPromise; +import tools.concurrency.ActorExecutionTrace; +import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; +import tools.concurrency.ByteBuffer; +import tools.concurrency.TracingActors.TracingActor; + + +public abstract class TraceMessageNode extends TraceNode { + + private static final int DIRECT_MSG_SIZE = 5; + private static final int PROMISE_MSG_SIZE = 9; + private static final int EXT_DIRECT_MSG_SIZE = 11; + private static final int EXT_PROMISE_MSG_SIZE = 15; + + @Child TraceActorContextNode tracer = new TraceActorContextNode(); + @Child protected RecordIdNode id = RecordIdNodeGen.create(); + @Child protected RecordIdIdNode idid = RecordIdIdNodeGen.create(); + + public abstract void execute(EventualMessage msg); + + private ByteBuffer getStorage(final int entrySize) { + ActorTraceBuffer buffer = getCurrentBuffer(); + return buffer.ensureSufficientSpace(entrySize, tracer); + } + + @Specialization + public void trace(final DirectMessage msg) { + ByteBuffer storage = getStorage(DIRECT_MSG_SIZE); + + int pos = storage.position(); + + int idLen = id.execute(storage, pos + 1, ((TracingActor) msg.getSender()).getActorId()); + int idBit = (idLen - 1) << 4; + + storage.putByteAt(pos, (byte) (ActorExecutionTrace.MESSAGE | idBit)); + storage.position(pos + idLen + 1); + } + + @Specialization + public void trace(final ExternalDirectMessage msg) { + ByteBuffer storage = getStorage(EXT_DIRECT_MSG_SIZE); + + int pos = storage.position(); + + int idLen = id.execute(storage, pos + 1, + ((TracingActor) msg.getSender()).getActorId()); + int idBit = (idLen - 1) << 4; + + storage.putByteAt(pos, + (byte) (ActorExecutionTrace.EXTERNAL_BIT | ActorExecutionTrace.MESSAGE | idBit)); + + pos += idLen + 1; + + storage.putShortAt(pos, msg.getMethod()); + pos += 2; + storage.putIntAt(pos, msg.getDataId()); + pos += 4; + + storage.position(pos); + } + + @Specialization + public void trace(final PromiseCallbackMessage msg) { + tracePromiseMsg(msg); + } + + @Specialization + public void trace(final PromiseSendMessage msg) { + tracePromiseMsg(msg); + } + + private void tracePromiseMsg(final PromiseMessage msg) { + ByteBuffer storage = getStorage(PROMISE_MSG_SIZE); + + int pos = storage.position(); + + int idLen = idid.execute(storage, pos + 1, + ((TracingActor) msg.getSender()).getActorId(), + ((STracingPromise) msg.getPromise()).getResolvingActor()); + int idBit = (idLen - 1) << 4; + + storage.putByteAt(pos, (byte) (ActorExecutionTrace.PROMISE_MESSAGE | idBit)); + storage.position(pos + idLen + idLen + 1); + } + + @Specialization + public void trace(final ExternalPromiseCallbackMessage msg) { + traceExternalPromiseMsg(msg, msg.getMethod(), msg.getDataId()); + } + + @Specialization + public void trace(final ExternalPromiseSendMessage msg) { + traceExternalPromiseMsg(msg, msg.getMethod(), msg.getDataId()); + } + + private void traceExternalPromiseMsg(final PromiseMessage msg, final short method, + final int dataId) { + ByteBuffer storage = getStorage(EXT_PROMISE_MSG_SIZE); + + int pos = storage.position(); + + int idLen = idid.execute(storage, pos + 1, + ((TracingActor) msg.getSender()).getActorId(), + ((STracingPromise) msg.getPromise()).getResolvingActor()); + int idBit = (idLen - 1) << 4; + + storage.putByteAt(pos, + (byte) (ActorExecutionTrace.EXTERNAL_BIT | ActorExecutionTrace.PROMISE_MESSAGE + | idBit)); + + pos += idLen + idLen + 1; + + storage.putShortAt(pos, method); + pos += 2; + storage.putIntAt(pos, dataId); + pos += 4; + + storage.position(pos); + } +} diff --git a/src/tools/replay/actors/ActorExecutionTrace.java b/src/tools/replay/actors/ActorExecutionTrace.java index 785c0988e..2f15e6778 100644 --- a/src/tools/replay/actors/ActorExecutionTrace.java +++ b/src/tools/replay/actors/ActorExecutionTrace.java @@ -36,31 +36,6 @@ public static void recordActorContext(final TracingActor actor, ((ActorTraceBuffer) t.getBuffer()).recordActorContext(actor, tracer); } - public static void recordMessage(final EventualMessage msg, final TraceActorContextNode tracer) { - TracingActivityThread t = getThread(); - ActorTraceBuffer atb = ((ActorTraceBuffer) t.getBuffer()); - if (msg instanceof ExternalMessage) { - ExternalMessage em = (ExternalMessage) msg; - if (msg instanceof PromiseMessage) { - atb.recordExternalPromiseMessage(((TracingActor) msg.getSender()).getActorId(), - ((STracingPromise) ((PromiseMessage) msg).getPromise()).getResolvingActor(), - em.getMethod(), em.getDataId(), tracer); - } else { - atb.recordExternalMessage(((TracingActor) msg.getSender()).getActorId(), - em.getMethod(), - em.getDataId(), tracer); - } - } else { - if (msg instanceof PromiseMessage) { - atb.recordPromiseMessage(((TracingActor) msg.getSender()).getActorId(), - ((STracingPromise) ((PromiseMessage) msg).getPromise()).getResolvingActor(), - tracer); - } else { - atb.recordMessage(((TracingActor) msg.getSender()).getActorId(), tracer); - } - } - } - public static void recordSystemCall(final int dataId, final TraceActorContextNode tracer) { TracingActivityThread t = getThread(); ((ActorTraceBuffer) t.getBuffer()).recordSystemCall(dataId, tracer); @@ -127,105 +102,19 @@ public static class ActorTraceBuffer extends TraceBuffer { protected void swapBufferWhenNotEnoughSpace(final TraceActorContextNode tracer) { boolean didSwap = swapStorage(); assert didSwap; - tracer.execute(currentActor); - } - - static int getUsedBytes(final int id) { - if (id >= 0) { - if (id <= 0xFF) { - return 0; - } else if (id <= 0xFFFF) { - return 1; - } else if (id <= 0xFFFFFF) { - return 2; - } - } - return 3; + tracer.trace(currentActor); } - public void recordActorContext(final TracingActor actor, final TraceActorContextNode tracer) { + public void recordActorContext(final TracingActor actor, + final TraceActorContextNode tracer) { ensureSufficientSpace(7, tracer); currentActor = actor; - tracer.execute(actor); - } - - public void recordMessage(final int senderId, final TraceActorContextNode tracer) { - ensureSufficientSpace(5, tracer); - if (VmSettings.TRACE_SMALL_IDS) { - int usedBytes = getUsedBytes(senderId); - storage.put((byte) (MESSAGE | (usedBytes << 4))); - writeId(usedBytes, senderId); - } else { - storage.putByteInt((byte) (MESSAGE | (3 << 4)), senderId); - } - } - - public void recordPromiseMessage(final int senderId, final int resolverId, - final TraceActorContextNode tracer) { - ensureSufficientSpace(9, tracer); - int usedBytes = Math.max(getUsedBytes(resolverId), getUsedBytes(senderId)); - - if (VmSettings.TRACE_SMALL_IDS) { - storage.put((byte) (PROMISE_MESSAGE | (usedBytes << 4))); - writeId(usedBytes, senderId); - writeId(usedBytes, resolverId); - } else { - storage.putByteIntInt((byte) (PROMISE_MESSAGE | (3 << 4)), senderId, resolverId); - } - } - - public void recordExternalMessage(final int senderId, final short method, - final int dataId, final TraceActorContextNode tracer) { - ensureSufficientSpace(11, tracer); - - if (VmSettings.TRACE_SMALL_IDS) { - int usedBytes = getUsedBytes(senderId); - storage.put((byte) (EXTERNAL_BIT | MESSAGE | (usedBytes << 4))); - writeId(usedBytes, senderId); - } else { - storage.putByteInt((byte) (EXTERNAL_BIT | MESSAGE | (3 << 4)), senderId); - } - storage.putShortInt(method, senderId); - } - - public void recordExternalPromiseMessage(final int senderId, final int resolverId, - final short method, final int dataId, final TraceActorContextNode tracer) { - ensureSufficientSpace(15, tracer); - - if (VmSettings.TRACE_SMALL_IDS) { - int usedBytes = Math.max(getUsedBytes(resolverId), getUsedBytes(senderId)); - storage.put((byte) (EXTERNAL_BIT | PROMISE_MESSAGE | (usedBytes << 4))); - - writeId(usedBytes, senderId); - writeId(usedBytes, resolverId); - } else { - storage.putByteIntInt((byte) (EXTERNAL_BIT | PROMISE_MESSAGE | (3 << 4)), senderId, - resolverId); - } - - storage.putShortInt(method, senderId); + tracer.trace(actor); } public void recordSystemCall(final int dataId, final TraceActorContextNode tracer) { ensureSufficientSpace(5, tracer); storage.putByteInt(SYSTEM_CALL, dataId); } - - private void writeId(final int usedBytes, final int id) { - switch (usedBytes) { - case 0: - storage.put((byte) id); - break; - case 1: - storage.putShort((short) id); - break; - case 2: - storage.putByteShort((byte) (id >> 16), (short) id); - break; - case 3: - storage.putInt(id); - break; - } - } } } From 26e5660f185f29bedf15d4a2a3ff39659ca1504b Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Sat, 28 Apr 2018 18:52:55 +0100 Subject: [PATCH 09/16] Add support for statistics on tracing Signed-off-by: Stefan Marr --- core-lib/Benchmarks/AsyncHarness.ns | 3 +++ core-lib/System.ns | 3 +++ src/som/interpreter/actors/Actor.java | 4 ++++ src/som/primitives/SystemPrims.java | 11 +++++++++++ src/tools/concurrency/TracingBackend.java | 17 +++++++++++++++-- 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/core-lib/Benchmarks/AsyncHarness.ns b/core-lib/Benchmarks/AsyncHarness.ns index 9185eb446..f7f62706f 100644 --- a/core-lib/Benchmarks/AsyncHarness.ns +++ b/core-lib/Benchmarks/AsyncHarness.ns @@ -120,6 +120,9 @@ class AsyncHarness usingPlatform: platform = Value ( ) printRun: runTime = ( + | stats = system traceStatistics. | + (name + ': trace size: ' + (stats at: 1) + 'byte') println. + (name + ': external data: ' + (stats at: 2) + 'byte') println. (name + ': iterations=1' + ' runtime: ' + runTime + 'us') println ) diff --git a/core-lib/System.ns b/core-lib/System.ns index 14a1161a7..c15077975 100644 --- a/core-lib/System.ns +++ b/core-lib/System.ns @@ -42,6 +42,9 @@ class System usingVmMirror: vmMirror = Value ( public time = ( ^ vmMirror systemTime: nil ) public ticks = ( ^ vmMirror systemTicks: nil ) (* returns the microseconds since start *) + (* Actor Tracing Statistics *) + public traceStatistics = ( ^ vmMirror traceStatistics: nil ) + (* Force Garbage Collection *) public fullGC = ( ^ vmMirror systemGC: nil ) diff --git a/src/som/interpreter/actors/Actor.java b/src/som/interpreter/actors/Actor.java index d49a9ca85..598c4bde3 100644 --- a/src/som/interpreter/actors/Actor.java +++ b/src/som/interpreter/actors/Actor.java @@ -265,6 +265,10 @@ void doRun() { ObjectTransitionSafepoint.INSTANCE.unregister(); } + if (VmSettings.ACTOR_TRACING && t.swapTracingBuffer) { + t.getBuffer().swapStorage(); + t.swapTracingBuffer = false; + } t.currentlyExecutingActor = null; } diff --git a/src/som/primitives/SystemPrims.java b/src/som/primitives/SystemPrims.java index 47bb0d914..7dbb97f0c 100644 --- a/src/som/primitives/SystemPrims.java +++ b/src/som/primitives/SystemPrims.java @@ -76,6 +76,17 @@ public final Object set(final SObjectWithClass system) { } } + @GenerateNodeFactory + @Primitive(primitive = "traceStatistics:") + public abstract static class TraceStatisticsPrim extends UnarySystemOperation { + @Specialization + @TruffleBoundary + public final Object doSObject(final Object module) { + long[] stats = TracingBackend.getStatistics(); + return new SImmutableArray(stats, Classes.valueArrayClass); + } + } + public static Object loadModule(final VM vm, final String path, final ExceptionSignalingNode ioException) { // TODO: a single node for the different exceptions? diff --git a/src/tools/concurrency/TracingBackend.java b/src/tools/concurrency/TracingBackend.java index d776bfffc..1c6436810 100644 --- a/src/tools/concurrency/TracingBackend.java +++ b/src/tools/concurrency/TracingBackend.java @@ -186,16 +186,22 @@ public static void unregisterThread(final TracingActivityThread t) { synchronized (tracingThreads) { boolean removed = tracingThreads.remove(t); assert removed; + t.swapTracingBuffer = false; } } public static final void forceSwapBuffers() { - assert VmSettings.TRUFFLE_DEBUGGER_ENABLED && VmSettings.KOMPOS_TRACING; + assert VmSettings.ACTOR_TRACING + || (VmSettings.TRUFFLE_DEBUGGER_ENABLED && VmSettings.KOMPOS_TRACING); TracingActivityThread[] result; synchronized (tracingThreads) { result = tracingThreads.toArray(new TracingActivityThread[0]); } + // XXX: This is only safe because we assume that threads do not disappear + // XXX: correction, I think this is all inherently racy, but hopefully good enough + + // signal threads to swap buffers for (TracingActivityThread t : result) { t.swapTracingBuffer = true; } @@ -231,6 +237,14 @@ public static final void forceSwapBuffers() { } } + public static final long[] getStatistics() { + long[] stats = new long[] {workerThread.traceBytes, workerThread.externalBytes}; + + workerThread.traceBytes = 0; + workerThread.externalBytes = 0; + return stats; + } + @TruffleBoundary public static final void addExternalData(final Object[] b) { assert b != null; @@ -368,7 +382,6 @@ private void writeArray(final TwoDArrayWrapper aw, final FileOutputStream edfos) numBytes++; bouter[i] = binner; } - } byte[] header = ActorExecutionTrace.getExtDataHeader(aw.actorId, aw.dataId, numBytes); From e26d079545fc6d7f3bd71affa5803eb831457468 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Mon, 30 Apr 2018 11:18:32 +0100 Subject: [PATCH 10/16] =?UTF-8?q?Don=E2=80=99t=20trace=20actor=20context?= =?UTF-8?q?=20twice=20on=20buffer=20swap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Marr --- src/tools/replay/actors/ActorExecutionTrace.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/tools/replay/actors/ActorExecutionTrace.java b/src/tools/replay/actors/ActorExecutionTrace.java index 2f15e6778..acf31baf6 100644 --- a/src/tools/replay/actors/ActorExecutionTrace.java +++ b/src/tools/replay/actors/ActorExecutionTrace.java @@ -102,12 +102,15 @@ public static class ActorTraceBuffer extends TraceBuffer { protected void swapBufferWhenNotEnoughSpace(final TraceActorContextNode tracer) { boolean didSwap = swapStorage(); assert didSwap; - tracer.trace(currentActor); + if (tracer != null) { + tracer.trace(currentActor); + } } public void recordActorContext(final TracingActor actor, final TraceActorContextNode tracer) { - ensureSufficientSpace(7, tracer); + ensureSufficientSpace(7, null); // null, because we don't need to write actor context, + // and going to do it ourselves currentActor = actor; tracer.trace(actor); } From 9df067fa28fed99495abb363dddf8d7c99ea4d63 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Tue, 1 May 2018 08:02:18 +0100 Subject: [PATCH 11/16] Remove extra indirection of byte buffer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ByteBuffer didn’t do much useful things, and cost another indirection for tracing. Let’s see whether this makes any difference. Signed-off-by: Stefan Marr --- src/tools/concurrency/ByteBuffer.java | 263 ------------------ src/tools/concurrency/KomposTrace.java | 86 +++--- src/tools/concurrency/TraceBuffer.java | 165 +++++++++-- .../concurrency/TracingActivityThread.java | 2 +- src/tools/concurrency/TracingBackend.java | 50 ++-- .../concurrency/nodes/RecordIdIdNode.java | 12 +- src/tools/concurrency/nodes/RecordIdNode.java | 20 +- .../nodes/TraceActorContextNode.java | 18 +- .../nodes/TraceActorCreationNode.java | 17 +- .../concurrency/nodes/TraceMessageNode.java | 14 +- src/tools/debugger/FrontendConnector.java | 6 +- .../replay/actors/ActorExecutionTrace.java | 22 +- 12 files changed, 271 insertions(+), 404 deletions(-) delete mode 100644 src/tools/concurrency/ByteBuffer.java diff --git a/src/tools/concurrency/ByteBuffer.java b/src/tools/concurrency/ByteBuffer.java deleted file mode 100644 index 0c3da8c38..000000000 --- a/src/tools/concurrency/ByteBuffer.java +++ /dev/null @@ -1,263 +0,0 @@ -package tools.concurrency; - -import java.lang.reflect.Field; - -import com.oracle.truffle.api.CompilerDirectives; - -import sun.misc.Unsafe; - - -public final class ByteBuffer { - private static final Unsafe unsafe; - private static final long byteArrBaseOffset; - - static { - unsafe = loadUnsafe(); - byteArrBaseOffset = unsafe.arrayBaseOffset(byte[].class); - assert unsafe.arrayIndexScale( - byte[].class) == 1 : "Expect byte elements to be exactly one byte in size."; - } - - public static ByteBuffer allocate(final int capacity) { - return new ByteBuffer(capacity); - } - - private int position; - - private final byte[] buffer; - - private ByteBuffer(final int capacity) { - buffer = new byte[capacity]; - this.position = 0; - } - - public java.nio.ByteBuffer getReadingFromStartBuffer() { - return java.nio.ByteBuffer.wrap(buffer, 0, position); - } - - public int position() { - return position; - } - - public ByteBuffer position(final int newPosition) { - if (newPosition < 0) { - CompilerDirectives.transferToInterpreter(); - throw new IllegalArgumentException(); - } - position = newPosition; - return this; - } - - public int remaining() { - return buffer.length - position; - } - - public ByteBuffer clear() { - position = 0; - return this; - } - - private int nextPutIndex() { - return position++; - } - - private int nextPutIndex(final int nb) { - int p = position; - position += nb; - return p; - } - - public ByteBuffer putShort(final short x) { - int bi = nextPutIndex(2); - unsafe.putShort(buffer, byteArrBaseOffset + bi, x); - - return this; - } - - public ByteBuffer putShortAt(final int idx, final short x) { - unsafe.putShort(buffer, byteArrBaseOffset + idx, x); - return this; - } - - public ByteBuffer putLong(final long x) { - int bi = nextPutIndex(8); - unsafe.putLong(buffer, byteArrBaseOffset + bi, x); - - return this; - } - - public ByteBuffer putDouble(final double x) { - putLong(Double.doubleToRawLongBits(x)); - return this; - } - - public ByteBuffer putInt(final int x) { - int bi = nextPutIndex(4); - unsafe.putInt(buffer, byteArrBaseOffset + bi, x); - - return this; - } - - public ByteBuffer putIntAt(final int idx, final int x) { - unsafe.putInt(buffer, byteArrBaseOffset + idx, x); - return this; - } - - public ByteBuffer put(final byte x) { - unsafe.putByte(buffer, byteArrBaseOffset + nextPutIndex(), x); - return this; - } - - public ByteBuffer putByteAt(final int idx, final byte x) { - unsafe.putByte(buffer, byteArrBaseOffset + idx, x); - return this; - } - - public ByteBuffer put(final byte[] src) { - return put(src, 0, src.length); - } - - public ByteBuffer put(final byte[] src, final int offset, final int length) { - System.arraycopy(src, offset, buffer, position, length); - position += length; - return this; - } - - public void putByteByteShort(final byte a, final byte b, final short c) { - int bi = nextPutIndex(1 + 2); - putByteAt(bi, a); - putByteAt(bi + 1, b); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 2, b); - } - - public void putByteByteShortShortInt(final byte a, final byte b, final short c, - final short d, final int e) { - int bi = nextPutIndex(1 + 1 + 2 + 2 + 4); - putByteAt(bi, a); - putByteAt(bi + 1, b); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 2, b); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 4, b); - unsafe.putInt(buffer, byteArrBaseOffset + bi + 6, e); - } - - public void putByteByteShortInt(final byte a, final byte b, final short c, final int d) { - int bi = nextPutIndex(1 + 1 + 2 + 4); - putByteAt(bi, a); - putByteAt(bi + 1, b); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 2, b); - unsafe.putInt(buffer, byteArrBaseOffset + bi + 4, b); - } - - public void putByteShort(final byte a, final short b) { - int bi = nextPutIndex(1 + 2); - putByteAt(bi, a); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 1, b); - // putByteAt(bi + 1, short1(b)); - // putByteAt(bi + 2, short0(b)); - } - - public void putByteShortAt(final int idx, final byte a, final short b) { - unsafe.putByte(buffer, byteArrBaseOffset + idx, a); - unsafe.putShort(buffer, byteArrBaseOffset + idx + 1, b); - } - - public void putByteShortByte(final byte a, final short b, final byte c) { - int bi = nextPutIndex(1 + 2 + 1); - putByteAt(bi, a); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 1, b); - putByteAt(bi + 3, c); - } - - public void putByteShortByteShort(final byte a, final short b, final byte c, final short d) { - int bi = nextPutIndex(1 + 2 + 1 + 2); - putByteAt(bi, a); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 1, b); - putByteAt(bi + 3, c); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 4, d); - } - - public void putByteShortShortInt(final byte a, final short b, final short c, final int d) { - int bi = nextPutIndex(1 + 2 + 2 + 4); - putByteAt(bi, a); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 1, b); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 3, c); - unsafe.putInt(buffer, byteArrBaseOffset + bi + 5, d); - } - - public void putByteShortShort(final byte a, final short b, final short c) { - int bi = nextPutIndex(1 + 2 + 2); - putByteAt(bi, a); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 1, b); - // putByteAt(bi + 1, short1(b)); - // putByteAt(bi + 2, short0(b)); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 3, c); - // putByteAt(bi + 3, short1(c)); - // putByteAt(bi + 4, short0(c)); - } - - public void putByteShortInt(final byte a, final short b, final int c) { - int bi = nextPutIndex(1 + 2 + 4); - putByteAt(bi, a); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 1, b); - - // putByteAt(bi + 1, short1(b)); - // putByteAt(bi + 2, short0(b)); - unsafe.putInt(buffer, byteArrBaseOffset + bi + 3, c); - // putByteAt(bi + 3, int3(c)); - // putByteAt(bi + 4, int2(c)); - // putByteAt(bi + 5, int1(c)); - // putByteAt(bi + 6, int0(c)); - } - - public void putByteInt(final byte a, final int b) { - int bi = nextPutIndex(1 + 4); - putByteAt(bi, a); - unsafe.putInt(buffer, byteArrBaseOffset + bi + 1, b); - } - - public void putByteIntShortInt(final byte a, final int b, final short c, final int d) { - int bi = nextPutIndex(1 + 4 + 2 + 4); - putByteAt(bi, a); - - unsafe.putInt(buffer, byteArrBaseOffset + bi + 1, b); - unsafe.putShort(buffer, byteArrBaseOffset + bi + 5, c); - unsafe.putInt(buffer, byteArrBaseOffset + bi + 7, d); - } - - public void putByteIntInt(final byte a, final int b, final int c) { - int bi = nextPutIndex(1 + 4 + 4); - putByteAt(bi, a); - unsafe.putInt(buffer, byteArrBaseOffset + bi + 1, b); - // putByteAt(bi + 1, int3(b)); - // putByteAt(bi + 2, int2(b)); - // putByteAt(bi + 3, int1(b)); - // putByteAt(bi + 4, int0(b)); - unsafe.putInt(buffer, byteArrBaseOffset + bi + 5, c); - // putByteAt(bi + 5, int3(c)); - // putByteAt(bi + 6, int2(c)); - // putByteAt(bi + 7, int1(c)); - // putByteAt(bi + 8, int0(c)); - } - - public void putShortInt(final short a, final int b) { - int bi = nextPutIndex(2 + 4); - unsafe.putShort(buffer, byteArrBaseOffset + bi, a); - unsafe.putInt(buffer, byteArrBaseOffset + bi + 2, b); - } - - private static Unsafe loadUnsafe() { - try { - return Unsafe.getUnsafe(); - } catch (SecurityException e) { - // can fail, is ok, just to the fallback below - } - try { - Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe"); - theUnsafeInstance.setAccessible(true); - return (Unsafe) theUnsafeInstance.get(Unsafe.class); - } catch (Exception e) { - throw new RuntimeException( - "exception while trying to get Unsafe.theUnsafe via reflection:", e); - } - } -} diff --git a/src/tools/concurrency/KomposTrace.java b/src/tools/concurrency/KomposTrace.java index cb7bd4b51..eacc0d355 100644 --- a/src/tools/concurrency/KomposTrace.java +++ b/src/tools/concurrency/KomposTrace.java @@ -30,7 +30,7 @@ public static void recordMainActor(final Actor mainActor, buffer.recordCurrentActivity(mainActor); buffer.recordMainActor(mainActor, objectSystem); buffer.recordSendOperation(SendOp.ACTOR_MSG, 0, mainActor.getId(), mainActor); - buffer.returnBuffer(); + buffer.returnBuffer(null); } public static void currentActivity(final Activity current) { @@ -167,13 +167,13 @@ public static KomposTraceBuffer create(final long implThreadId) { protected KomposTraceBuffer(final long implThreadId) { this.implThreadId = implThreadId; this.lastActivity = null; - retrieveBuffer(); + recordThreadId(); } boolean swapStorage(final Activity current) { - if (storage == null || - storage.position() <= (Implementation.IMPL_THREAD.getSize() + + if (buffer == null || + position <= (Implementation.IMPL_THREAD.getSize() + Implementation.IMPL_CURRENT_ACTIVITY.getSize())) { return false; } @@ -185,7 +185,7 @@ boolean swapStorage(final Activity current) { @TruffleBoundary protected boolean ensureSufficientSpace(final int requiredSpace, final Activity current) { - if (storage.remaining() < requiredSpace) { + if (position + requiredSpace < TracingBackend.BUFFER_SIZE) { boolean didSwap = swapStorage(current); return didSwap; } @@ -215,13 +215,13 @@ public final void recordMainActor(final Actor mainActor, } private void recordThreadId() { - final int start = storage.position(); + final int start = position; assert start == 0; - storage.put(Implementation.IMPL_THREAD.getId()); - storage.putLong(implThreadId); + put(Implementation.IMPL_THREAD.getId()); + putLong(implThreadId); - assert storage.position() == start + Implementation.IMPL_THREAD.getSize(); + assert position == start + Implementation.IMPL_THREAD.getSize(); } public void recordCurrentActivity(final Activity current) { @@ -234,13 +234,13 @@ public void recordCurrentActivity(final Activity current) { lastActivity = current; - final int start = storage.position(); + final int start = position; - storage.put(Implementation.IMPL_CURRENT_ACTIVITY.getId()); - storage.putLong(current.getId()); - storage.putInt(current.getNextTraceBufferId()); + put(Implementation.IMPL_CURRENT_ACTIVITY.getId()); + putLong(current.getId()); + putInt(current.getNextTraceBufferId()); - assert storage.position() == start + Implementation.IMPL_CURRENT_ACTIVITY.getSize(); + assert position == start + Implementation.IMPL_CURRENT_ACTIVITY.getSize(); } /** REM: Ensure it is in sync with {@link TraceSemantics#SOURCE_SECTION_SIZE}. */ @@ -252,16 +252,16 @@ private void writeSourceSection(final SourceSection origin) { * The following if is a workaround. */ if (origin == null) { - storage.putLong(0); + putLong(0); return; } assert !origin.getSource() .isInternal() : "Need special handling to ensure we see user code reported to trace/debugger"; - storage.putShort(SourceCoordinate.getURI(origin.getSource()).getSymbolId()); - storage.putShort((short) origin.getStartLine()); - storage.putShort((short) origin.getStartColumn()); - storage.putShort((short) origin.getCharLength()); + putShort(SourceCoordinate.getURI(origin.getSource()).getSymbolId()); + putShort((short) origin.getStartLine()); + putShort((short) origin.getStartColumn()); + putShort((short) origin.getCharLength()); } public void recordActivityCreation(final ActivityType entity, final long activityId, @@ -269,42 +269,42 @@ public void recordActivityCreation(final ActivityType entity, final long activit int requiredSpace = entity.getCreationSize(); ensureSufficientSpace(requiredSpace, current); - final int start = storage.position(); + final int start = position; assert entity.getCreationMarker() != 0; - storage.put(entity.getCreationMarker()); - storage.putLong(activityId); - storage.putShort(symbolId); + put(entity.getCreationMarker()); + putLong(activityId); + putShort(symbolId); if (VmSettings.TRUFFLE_DEBUGGER_ENABLED) { writeSourceSection(sourceSection); } - assert storage.position() == start + requiredSpace; + assert position == start + requiredSpace; } public void recordActivityCompletion(final ActivityType entity, final Activity current) { int requireSize = entity.getCompletionSize(); ensureSufficientSpace(requireSize, current); - final int start = storage.position(); - storage.put(entity.getCompletionMarker()); - assert storage.position() == start + requireSize; + final int start = position; + put(entity.getCompletionMarker()); + assert position == start + requireSize; } private void recordEventWithIdAndSource(final byte eventMarker, final int eventSize, final long id, final SourceSection section, final Activity current) { ensureSufficientSpace(eventSize, current); - final int start = storage.position(); + final int start = position; - storage.put(eventMarker); - storage.putLong(id); + put(eventMarker); + putLong(id); if (VmSettings.TRUFFLE_DEBUGGER_ENABLED) { writeSourceSection(section); } - assert storage.position() == start + eventSize; + assert position == start + eventSize; } public void recordScopeStart(final DynamicScopeType entity, final long scopeId, @@ -317,10 +317,10 @@ public void recordScopeEnd(final DynamicScopeType entity, final Activity current int requiredSpace = entity.getEndSize(); ensureSufficientSpace(requiredSpace, current); - final int start = storage.position(); - storage.put(entity.getEndMarker()); + final int start = position; + put(entity.getEndMarker()); - assert storage.position() == start + requiredSpace; + assert position() == start + requiredSpace; } public void recordPassiveEntityCreation(final PassiveEntityType entity, @@ -334,11 +334,11 @@ public void recordReceiveOperation(final ReceiveOp op, final long sourceId, int requiredSpace = op.getSize(); ensureSufficientSpace(requiredSpace, current); - final int start = storage.position(); - storage.put(op.getId()); - storage.putLong(sourceId); + final int start = position; + put(op.getId()); + putLong(sourceId); - assert storage.position() == start + requiredSpace; + assert position == start + requiredSpace; } public void recordSendOperation(final SendOp op, final long entityId, @@ -346,12 +346,12 @@ public void recordSendOperation(final SendOp op, final long entityId, int requiredSpace = op.getSize(); ensureSufficientSpace(requiredSpace, current); - final int start = storage.position(); - storage.put(op.getId()); - storage.putLong(entityId); - storage.putLong(targetId); + final int start = position; + put(op.getId()); + putLong(entityId); + putLong(targetId); - assert storage.position() == start + requiredSpace; + assert position == start + requiredSpace; } public static class SyncedMedeorTraceBuffer extends KomposTraceBuffer { diff --git a/src/tools/concurrency/TraceBuffer.java b/src/tools/concurrency/TraceBuffer.java index 056457957..f6154a366 100644 --- a/src/tools/concurrency/TraceBuffer.java +++ b/src/tools/concurrency/TraceBuffer.java @@ -1,6 +1,11 @@ package tools.concurrency; +import java.lang.reflect.Field; + +import com.oracle.truffle.api.CompilerDirectives; + import som.vm.VmSettings; +import sun.misc.Unsafe; import tools.replay.actors.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.nodes.TraceActorContext; @@ -16,48 +21,164 @@ public static TraceBuffer create(final long threadId) { } } - protected ByteBuffer storage; + static final Unsafe UNSAFE; + static final long BYTE_ARR_BASE_OFFSET; + + private static Unsafe loadUnsafe() { + try { + return Unsafe.getUnsafe(); + } catch (SecurityException e) { + // can fail, is ok, just to the fallback below + } + try { + Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe"); + theUnsafeInstance.setAccessible(true); + return (Unsafe) theUnsafeInstance.get(Unsafe.class); + } catch (Exception e) { + throw new RuntimeException( + "exception while trying to get Unsafe.theUnsafe via reflection:", e); + } + } + + static { + UNSAFE = loadUnsafe(); + BYTE_ARR_BASE_OFFSET = UNSAFE.arrayBaseOffset(byte[].class); + assert UNSAFE.arrayIndexScale( + byte[].class) == 1 : "Expect byte elements to be exactly one byte in size."; + } + + protected byte[] buffer; + protected int position; protected TraceBuffer() { - retrieveBuffer(); + buffer = TracingBackend.getEmptyBuffer(); } - public void retrieveBuffer() { - this.storage = TracingBackend.getEmptyBuffer(); + public int position() { + assert position <= TracingBackend.BUFFER_SIZE; + assert position <= buffer.length; + return position; } - public void returnBuffer() { - TracingBackend.returnBuffer(storage); - storage = null; + public void position(final int newPosition) { + assert newPosition >= 0; + assert newPosition <= TracingBackend.BUFFER_SIZE; + assert newPosition <= buffer.length; + if (newPosition < 0) { + CompilerDirectives.transferToInterpreter(); + throw new IllegalArgumentException(); + } + position = newPosition; } - public boolean isEmpty() { - return storage.position() == 0; + private int nextPutIndex() { + assert position + 1 <= TracingBackend.BUFFER_SIZE; + assert position + 1 <= buffer.length; + return position++; + } - public boolean isFull() { - return storage.remaining() == 0; + private int nextPutIndex(final int nb) { + assert position + nb <= TracingBackend.BUFFER_SIZE; + assert position + nb <= buffer.length; + int p = position; + position += nb; + return p; + } + + public final void returnBuffer(final byte[] nextBuffer) { + TracingBackend.returnBuffer(buffer, position); + buffer = nextBuffer; + position = 0; } - public boolean swapStorage() { - TracingBackend.returnBuffer(storage); - retrieveBuffer(); - return true; + public final void swapStorage() { + returnBuffer(TracingBackend.getEmptyBuffer()); } - public final ByteBuffer ensureSufficientSpace(final int requiredSpace, + public boolean isEmpty() { + return position == 0; + } + + public boolean isFull() { + assert (position == TracingBackend.BUFFER_SIZE) == ((buffer.length - position) == 0); + return position == TracingBackend.BUFFER_SIZE; + } + + public final boolean ensureSufficientSpace(final int requiredSpace, final TraceActorContextNode tracer) { - if (storage.remaining() < requiredSpace) { + if (position + requiredSpace >= TracingBackend.BUFFER_SIZE) { swapBufferWhenNotEnoughSpace(tracer); + return true; } - return storage; - } - - public final ByteBuffer getStorage() { - return storage; + return false; } protected void swapBufferWhenNotEnoughSpace(final TraceActorContextNode tracer) { swapStorage(); } + + public void putByteAt(final int idx, final byte x) { + assert buffer.length >= TracingBackend.BUFFER_SIZE; + assert 0 <= idx && idx < TracingBackend.BUFFER_SIZE; + UNSAFE.putByte(buffer, BYTE_ARR_BASE_OFFSET + idx, x); + } + + public void putShortAt(final int idx, final short x) { + assert buffer.length >= TracingBackend.BUFFER_SIZE; + assert 0 <= idx && (idx + 2) < TracingBackend.BUFFER_SIZE; + UNSAFE.putShort(buffer, BYTE_ARR_BASE_OFFSET + idx, x); + } + + public void putIntAt(final int idx, final int x) { + assert buffer.length >= TracingBackend.BUFFER_SIZE; + assert 0 <= idx && (idx + 4) < TracingBackend.BUFFER_SIZE; + UNSAFE.putInt(buffer, BYTE_ARR_BASE_OFFSET + idx, x); + } + + public void putByteShortAt(final int idx, final byte a, final short b) { + assert buffer.length >= TracingBackend.BUFFER_SIZE; + assert 0 <= idx && (idx + 1 + 2) < TracingBackend.BUFFER_SIZE; + UNSAFE.putByte(buffer, BYTE_ARR_BASE_OFFSET + idx, a); + UNSAFE.putShort(buffer, BYTE_ARR_BASE_OFFSET + idx + 1, b); + } + + protected final void put(final byte x) { + assert buffer.length >= TracingBackend.BUFFER_SIZE; + assert 0 <= position && (position + 1) < TracingBackend.BUFFER_SIZE; + UNSAFE.putByte(buffer, BYTE_ARR_BASE_OFFSET + nextPutIndex(), x); + } + + public void putByteInt(final byte a, final int b) { + int bi = nextPutIndex(1 + 4); + putByteAt(bi, a); + assert buffer.length >= TracingBackend.BUFFER_SIZE; + assert (0 <= bi + 1) && (bi + 1 + 4) < TracingBackend.BUFFER_SIZE; + UNSAFE.putInt(buffer, BYTE_ARR_BASE_OFFSET + bi + 1, b); + } + + protected final void putShort(final short x) { + int bi = nextPutIndex(2); + assert buffer.length >= TracingBackend.BUFFER_SIZE; + assert 0 <= bi && (bi + 2) < TracingBackend.BUFFER_SIZE; + UNSAFE.putShort(buffer, BYTE_ARR_BASE_OFFSET + bi, x); + } + + protected final void putInt(final int x) { + int bi = nextPutIndex(4); + assert buffer.length >= TracingBackend.BUFFER_SIZE; + assert 0 <= bi && (bi + 4) < TracingBackend.BUFFER_SIZE; + UNSAFE.putInt(buffer, BYTE_ARR_BASE_OFFSET + bi, x); + } + + protected final void putLong(final long x) { + int bi = nextPutIndex(8); + assert buffer.length >= TracingBackend.BUFFER_SIZE; + assert 0 <= bi && (bi + 8) < TracingBackend.BUFFER_SIZE; + UNSAFE.putLong(buffer, BYTE_ARR_BASE_OFFSET + bi, x); + } + + protected final void putDouble(final double x) { + putLong(Double.doubleToRawLongBits(x)); + } } diff --git a/src/tools/concurrency/TracingActivityThread.java b/src/tools/concurrency/TracingActivityThread.java index d365c677e..110879ab5 100644 --- a/src/tools/concurrency/TracingActivityThread.java +++ b/src/tools/concurrency/TracingActivityThread.java @@ -135,7 +135,7 @@ protected void onStart() { @Override protected void onTermination(final Throwable exception) { if (VmSettings.ACTOR_TRACING) { - traceBuffer.returnBuffer(); + traceBuffer.returnBuffer(null); TracingBackend.addExternalData(externalData); TracingBackend.unregisterThread(this); } diff --git a/src/tools/concurrency/TracingBackend.java b/src/tools/concurrency/TracingBackend.java index 1c6436810..fc3f85462 100644 --- a/src/tools/concurrency/TracingBackend.java +++ b/src/tools/concurrency/TracingBackend.java @@ -11,6 +11,7 @@ import java.lang.management.MemoryPoolMXBean; import java.lang.management.MemoryType; import java.lang.management.MemoryUsage; +import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -23,6 +24,7 @@ import javax.management.NotificationListener; import javax.management.openmbean.CompositeData; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.sun.management.GarbageCollectionNotificationInfo; @@ -75,11 +77,11 @@ public class TracingBackend { private static final List gcbeans = ManagementFactory.getGarbageCollectorMXBeans(); - private static final ArrayBlockingQueue emptyBuffers = - new ArrayBlockingQueue(BUFFER_POOL_SIZE); + private static final ArrayBlockingQueue emptyBuffers = + new ArrayBlockingQueue<>(BUFFER_POOL_SIZE); - private static final ArrayBlockingQueue fullBuffers = - new ArrayBlockingQueue(BUFFER_POOL_SIZE); + private static final ArrayBlockingQueue fullBuffers = + new ArrayBlockingQueue<>(BUFFER_POOL_SIZE); private static final java.util.concurrent.ConcurrentLinkedQueue externalData = new java.util.concurrent.ConcurrentLinkedQueue(); @@ -101,7 +103,7 @@ public class TracingBackend { if (VmSettings.ACTOR_TRACING || VmSettings.KOMPOS_TRACING) { for (int i = 0; i < BUFFER_POOL_SIZE; i++) { - emptyBuffers.add(ByteBuffer.allocate(BUFFER_SIZE)); + emptyBuffers.add(new byte[BUFFER_SIZE]); } } } @@ -152,20 +154,35 @@ public static void reportPeakMemoryUsage() { } @TruffleBoundary - public static ByteBuffer getEmptyBuffer() { + public static byte[] getEmptyBuffer() { try { return emptyBuffers.take(); } catch (InterruptedException e) { + CompilerDirectives.transferToInterpreter(); throw new IllegalStateException("Failed to acquire a new Buffer!"); } } - static void returnBuffer(final ByteBuffer b) { - if (b == null) { + static void returnBuffer(final byte[] buffer, final int pos) { + if (buffer == null) { return; } - returnBufferGlobally(b); + returnBufferGlobally(new BufferAndLimit(buffer, pos)); + } + + private static final class BufferAndLimit { + final byte[] buffer; + final int limit; + + BufferAndLimit(final byte[] buffer, final int limit) { + this.buffer = buffer; + this.limit = limit; + } + + public ByteBuffer getReadingFromStartBuffer() { + return ByteBuffer.wrap(buffer, 0, limit); + } } @TruffleBoundary @@ -284,8 +301,8 @@ private static class TraceWorkerThread extends Thread { protected long traceBytes; protected long externalBytes; - private ByteBuffer tryToObtainBuffer() { - ByteBuffer buffer; + private BufferAndLimit tryToObtainBuffer() { + BufferAndLimit buffer; try { buffer = TracingBackend.fullBuffers.poll(POLL_TIMEOUT, TimeUnit.MILLISECONDS); if (buffer == null) { @@ -416,15 +433,14 @@ private void writeSymbols(final BufferedWriter bw) throws IOException { } } - private void writeAndRecycleBuffer(final FileOutputStream fos, final ByteBuffer buffer) + private void writeAndRecycleBuffer(final FileOutputStream fos, final BufferAndLimit buffer) throws IOException { if (fos != null) { fos.getChannel().write(buffer.getReadingFromStartBuffer()); fos.flush(); } - traceBytes += buffer.position(); - buffer.clear(); - TracingBackend.emptyBuffers.add(buffer); + traceBytes += buffer.limit; + TracingBackend.emptyBuffers.add(buffer.buffer); } private void processTraceData(final FileOutputStream traceDataStream, @@ -434,14 +450,14 @@ private void processTraceData(final FileOutputStream traceDataStream, || !TracingBackend.externalData.isEmpty()) { writeExternalData(externalDataStream); - ByteBuffer b = tryToObtainBuffer(); + BufferAndLimit b = tryToObtainBuffer(); if (b == null) { continue; } writeSymbols(symbolStream); if (front != null) { - front.sendTracingData(b); + front.sendTracingData(b.getReadingFromStartBuffer()); } writeAndRecycleBuffer(traceDataStream, b); diff --git a/src/tools/concurrency/nodes/RecordIdIdNode.java b/src/tools/concurrency/nodes/RecordIdIdNode.java index 10877b518..61d05e032 100644 --- a/src/tools/concurrency/nodes/RecordIdIdNode.java +++ b/src/tools/concurrency/nodes/RecordIdIdNode.java @@ -4,7 +4,7 @@ import com.oracle.truffle.api.nodes.Node; import som.vm.VmSettings; -import tools.concurrency.ByteBuffer; +import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; public abstract class RecordIdIdNode extends Node { @@ -13,7 +13,7 @@ public abstract class RecordIdIdNode extends Node { private static final int THREE_BYTE_LEN = 3; private static final int INT_LEN = 4; - public abstract int execute(ByteBuffer storage, int idx, int id1, int id2); + public abstract int execute(ActorTraceBuffer storage, int idx, int id1, int id2); protected static boolean smallIds() { return VmSettings.TRACE_SMALL_IDS; @@ -32,7 +32,7 @@ protected static boolean threeByteId(final int id1, final int id2) { } @Specialization(guards = {"smallIds()", "byteId(id1, id2)"}) - public int traceByteId(final ByteBuffer storage, final int idx, final int id1, + public int traceByteId(final ActorTraceBuffer storage, final int idx, final int id1, final int id2) { storage.putByteAt(idx, (byte) id1); storage.putByteAt(idx + 1, (byte) id2); @@ -41,7 +41,7 @@ public int traceByteId(final ByteBuffer storage, final int idx, final int id1, @Specialization(guards = {"smallIds()", "shortId(id1, id2)"}, replaces = "traceByteId") - public int traceShortId(final ByteBuffer storage, final int idx, final int id1, + public int traceShortId(final ActorTraceBuffer storage, final int idx, final int id1, final int id2) { storage.putShortAt(idx, (short) id1); storage.putShortAt(idx + 2, (short) id2); @@ -50,7 +50,7 @@ public int traceShortId(final ByteBuffer storage, final int idx, final int id1, @Specialization(guards = {"smallIds()", "threeByteId(id1, id2)"}, replaces = {"traceShortId", "traceByteId"}) - public int traceThreeByteId(final ByteBuffer storage, final int idx, final int id1, + public int traceThreeByteId(final ActorTraceBuffer storage, final int idx, final int id1, final int id2) { storage.putByteShortAt(idx, (byte) (id1 >> 16), (short) id1); storage.putByteShortAt(idx + 3, (byte) (id2 >> 16), (short) id2); @@ -58,7 +58,7 @@ public int traceThreeByteId(final ByteBuffer storage, final int idx, final int i } @Specialization(replaces = {"traceShortId", "traceByteId", "traceThreeByteId"}) - public int traceStandardId(final ByteBuffer storage, final int idx, final int id1, + public int traceStandardId(final ActorTraceBuffer storage, final int idx, final int id1, final int id2) { storage.putIntAt(idx, id1); storage.putIntAt(idx + 4, id2); diff --git a/src/tools/concurrency/nodes/RecordIdNode.java b/src/tools/concurrency/nodes/RecordIdNode.java index 91e1ca8e6..fc44c641c 100644 --- a/src/tools/concurrency/nodes/RecordIdNode.java +++ b/src/tools/concurrency/nodes/RecordIdNode.java @@ -4,7 +4,7 @@ import com.oracle.truffle.api.nodes.Node; import som.vm.VmSettings; -import tools.concurrency.ByteBuffer; +import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; public abstract class RecordIdNode extends Node { @@ -13,7 +13,7 @@ public abstract class RecordIdNode extends Node { private static final int THREE_BYTE_LEN = 3; private static final int INT_LEN = 4; - public abstract int execute(ByteBuffer storage, int idx, int id); + public abstract int execute(ActorTraceBuffer buffer, int idx, int id); protected static boolean smallIds() { return VmSettings.TRACE_SMALL_IDS; @@ -32,28 +32,28 @@ protected static boolean threeByteId(final int id) { } @Specialization(guards = {"smallIds()", "byteId(id)"}) - public int traceByteId(final ByteBuffer storage, final int idx, final int id) { - storage.putByteAt(idx, (byte) id); + public int traceByteId(final ActorTraceBuffer buffer, final int idx, final int id) { + buffer.putByteAt(idx, (byte) id); return BYTE_LEN; } @Specialization(guards = {"smallIds()", "shortId(id)"}, replaces = "traceByteId") - public int traceShortId(final ByteBuffer storage, final int idx, final int id) { - storage.putShortAt(idx, (short) id); + public int traceShortId(final ActorTraceBuffer buffer, final int idx, final int id) { + buffer.putShortAt(idx, (short) id); return SHORT_LEN; } @Specialization(guards = {"smallIds()", "threeByteId(id)"}, replaces = {"traceShortId", "traceByteId"}) - public int traceThreeByteId(final ByteBuffer storage, final int idx, final int id) { - storage.putByteShortAt(idx, (byte) (id >> 16), (short) id); + public int traceThreeByteId(final ActorTraceBuffer buffer, final int idx, final int id) { + buffer.putByteShortAt(idx, (byte) (id >> 16), (short) id); return THREE_BYTE_LEN; } @Specialization(replaces = {"traceShortId", "traceByteId", "traceThreeByteId"}) - public int traceStandardId(final ByteBuffer storage, final int idx, final int id) { - storage.putIntAt(idx, id); + public int traceStandardId(final ActorTraceBuffer buffer, final int idx, final int id) { + buffer.putIntAt(idx, id); return INT_LEN; } } diff --git a/src/tools/concurrency/nodes/TraceActorContextNode.java b/src/tools/concurrency/nodes/TraceActorContextNode.java index 6e56add69..98d9ec8e3 100644 --- a/src/tools/concurrency/nodes/TraceActorContextNode.java +++ b/src/tools/concurrency/nodes/TraceActorContextNode.java @@ -2,7 +2,6 @@ import tools.concurrency.ActorExecutionTrace; import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; -import tools.concurrency.ByteBuffer; import tools.concurrency.TracingActors.TracingActor; @@ -11,20 +10,15 @@ public final class TraceActorContextNode extends TraceNode { @Child protected RecordIdNode id = RecordIdNodeGen.create(); public void trace(final TracingActor actor) { - ByteBuffer storage = getStorage(); - int pos = storage.position(); + ActorTraceBuffer buffer = getCurrentBuffer(); + int pos = buffer.position(); - int idLen = id.execute(storage, pos + 3, actor.getActorId()); + int idLen = id.execute(buffer, pos + 3, actor.getActorId()); int idBit = (idLen - 1) << 4; - storage.putByteAt(pos, (byte) (ActorExecutionTrace.ACTOR_CONTEXT | idBit)); - storage.putShortAt(pos + 1, actor.getOrdering()); - - storage.position(pos + idLen + 1 + 2); - } + buffer.putByteAt(pos, (byte) (ActorExecutionTrace.ACTOR_CONTEXT | idBit)); + buffer.putShortAt(pos + 1, actor.getOrdering()); - private static ByteBuffer getStorage() { - ActorTraceBuffer buffer = getCurrentBuffer(); - return buffer.getStorage(); + buffer.position(pos + idLen + 1 + 2); } } diff --git a/src/tools/concurrency/nodes/TraceActorCreationNode.java b/src/tools/concurrency/nodes/TraceActorCreationNode.java index 0944dcbae..af705758e 100644 --- a/src/tools/concurrency/nodes/TraceActorCreationNode.java +++ b/src/tools/concurrency/nodes/TraceActorCreationNode.java @@ -2,7 +2,6 @@ import tools.concurrency.ActorExecutionTrace; import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; -import tools.concurrency.ByteBuffer; import tools.concurrency.TracingActors.TracingActor; @@ -13,19 +12,15 @@ public final class TraceActorCreationNode extends TraceNode { @Child protected TraceActorContextNode tracer = new TraceActorContextNode(); @Child protected RecordIdNode id = RecordIdNodeGen.create(); - private ByteBuffer getStorage() { - ActorTraceBuffer buffer = getCurrentBuffer(); - return buffer.ensureSufficientSpace(TRACE_ENTRY_SIZE, tracer); - } - public void trace(final TracingActor actor) { - ByteBuffer storage = getStorage(); - int pos = storage.position(); + ActorTraceBuffer buffer = getCurrentBuffer(); + buffer.ensureSufficientSpace(TRACE_ENTRY_SIZE, tracer); + int pos = buffer.position(); - int idLen = id.execute(storage, pos + 1, actor.getActorId()); + int idLen = id.execute(buffer, pos + 1, actor.getActorId()); int idBit = (idLen - 1) << 4; - storage.putByteAt(pos, (byte) (ActorExecutionTrace.ACTOR_CREATION | idBit)); - storage.position(pos + idLen + 1); + buffer.putByteAt(pos, (byte) (ActorExecutionTrace.ACTOR_CREATION | idBit)); + buffer.position(pos + idLen + 1); } } diff --git a/src/tools/concurrency/nodes/TraceMessageNode.java b/src/tools/concurrency/nodes/TraceMessageNode.java index 8e95c9559..d21a0d33c 100644 --- a/src/tools/concurrency/nodes/TraceMessageNode.java +++ b/src/tools/concurrency/nodes/TraceMessageNode.java @@ -13,7 +13,6 @@ import som.interpreter.actors.SPromise.STracingPromise; import tools.concurrency.ActorExecutionTrace; import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; -import tools.concurrency.ByteBuffer; import tools.concurrency.TracingActors.TracingActor; @@ -30,14 +29,15 @@ public abstract class TraceMessageNode extends TraceNode { public abstract void execute(EventualMessage msg); - private ByteBuffer getStorage(final int entrySize) { + private ActorTraceBuffer getStorage(final int entrySize) { ActorTraceBuffer buffer = getCurrentBuffer(); - return buffer.ensureSufficientSpace(entrySize, tracer); + buffer.ensureSufficientSpace(entrySize, tracer); + return buffer; } @Specialization public void trace(final DirectMessage msg) { - ByteBuffer storage = getStorage(DIRECT_MSG_SIZE); + ActorTraceBuffer storage = getStorage(DIRECT_MSG_SIZE); int pos = storage.position(); @@ -50,7 +50,7 @@ public void trace(final DirectMessage msg) { @Specialization public void trace(final ExternalDirectMessage msg) { - ByteBuffer storage = getStorage(EXT_DIRECT_MSG_SIZE); + ActorTraceBuffer storage = getStorage(EXT_DIRECT_MSG_SIZE); int pos = storage.position(); @@ -82,7 +82,7 @@ public void trace(final PromiseSendMessage msg) { } private void tracePromiseMsg(final PromiseMessage msg) { - ByteBuffer storage = getStorage(PROMISE_MSG_SIZE); + ActorTraceBuffer storage = getStorage(PROMISE_MSG_SIZE); int pos = storage.position(); @@ -107,7 +107,7 @@ public void trace(final ExternalPromiseSendMessage msg) { private void traceExternalPromiseMsg(final PromiseMessage msg, final short method, final int dataId) { - ByteBuffer storage = getStorage(EXT_PROMISE_MSG_SIZE); + ActorTraceBuffer storage = getStorage(EXT_PROMISE_MSG_SIZE); int pos = storage.position(); diff --git a/src/tools/debugger/FrontendConnector.java b/src/tools/debugger/FrontendConnector.java index 4042023ac..b9ab0a984 100644 --- a/src/tools/debugger/FrontendConnector.java +++ b/src/tools/debugger/FrontendConnector.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.net.BindException; import java.net.InetSocketAddress; +import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashSet; import java.util.Map; @@ -26,7 +27,6 @@ import tools.SourceCoordinate.TaggedSourceCoordinate; import tools.Tagging; import tools.TraceData; -import tools.concurrency.ByteBuffer; import tools.concurrency.TracingBackend; import tools.debugger.WebSocketHandler.MessageHandler; import tools.debugger.WebSocketHandler.TraceHandler; @@ -253,8 +253,8 @@ public void sendSymbols(final ArrayList symbolsToWrite) { send(new SymbolMessage(symbolsToWrite)); } - public void sendTracingData(final ByteBuffer b) { - traceSocket.send(b.getReadingFromStartBuffer()); + public void sendTracingData(final ByteBuffer buffer) { + traceSocket.send(buffer); } public void awaitClient() { diff --git a/src/tools/replay/actors/ActorExecutionTrace.java b/src/tools/replay/actors/ActorExecutionTrace.java index acf31baf6..820beace7 100644 --- a/src/tools/replay/actors/ActorExecutionTrace.java +++ b/src/tools/replay/actors/ActorExecutionTrace.java @@ -44,8 +44,9 @@ public static void recordSystemCall(final int dataId, final TraceActorContextNod public static void intSystemCall(final int i, final TraceActorContextNode tracer) { TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); int dataId = ta.getActorId(); - ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, Integer.BYTES); - b.putInt(i); + byte[] b = getExtDataByteBuffer(ta.getActorId(), dataId, Integer.BYTES); + TraceBuffer.UNSAFE.putInt( + b, TraceBuffer.BYTE_ARR_BASE_OFFSET + EXT_DATA_HEADER_SIZE, i); recordSystemCall(dataId, tracer); t.addExternalData(b); } @@ -53,8 +54,9 @@ public static void intSystemCall(final int i, final TraceActorContextNode tracer public static void longSystemCall(final long l, final TraceActorContextNode tracer) { TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); int dataId = ta.getActorId(); - ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, Long.BYTES); - b.putLong(l); + byte[] b = getExtDataByteBuffer(ta.getActorId(), dataId, Long.BYTES); + TraceBuffer.UNSAFE.putLong( + b, TraceBuffer.BYTE_ARR_BASE_OFFSET + EXT_DATA_HEADER_SIZE, l); recordSystemCall(dataId, tracer); t.addExternalData(b); } @@ -62,8 +64,9 @@ public static void longSystemCall(final long l, final TraceActorContextNode trac public static void doubleSystemCall(final double d, final TraceActorContextNode tracer) { TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); int dataId = ta.getActorId(); - ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, Double.BYTES); - b.putDouble(d); + byte[] b = getExtDataByteBuffer(ta.getActorId(), dataId, Double.BYTES); + TraceBuffer.UNSAFE.putDouble( + b, TraceBuffer.BYTE_ARR_BASE_OFFSET + EXT_DATA_HEADER_SIZE, d); recordSystemCall(dataId, tracer); t.addExternalData(b); } @@ -73,8 +76,6 @@ public static void doubleSystemCall(final double d, final TraceActorContextNode public static void stringSystemCall(final String s, final TraceActorContextNode tracer) { TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); int dataId = ta.getActorId(); - ByteBuffer b = getExtDataByteBuffer(ta.getActorId(), dataId, s.getBytes().length); - b.put(s.getBytes()); recordSystemCall(dataId, tracer); StringWrapper sw = new StringWrapper(s, ta.getActorId(), dataId); @@ -92,6 +93,9 @@ public static byte[] getExtDataHeader(final int actor, final int dataId, final int size) { byte[] buffer = new byte[EXT_DATA_HEADER_SIZE]; Arrays.fill(buffer, (byte) -1); + TraceBuffer.UNSAFE.putInt(buffer, TraceBuffer.BYTE_ARR_BASE_OFFSET, actor); + TraceBuffer.UNSAFE.putInt(buffer, TraceBuffer.BYTE_ARR_BASE_OFFSET + 4, dataId); + TraceBuffer.UNSAFE.putInt(buffer, TraceBuffer.BYTE_ARR_BASE_OFFSET + 8, size); return buffer; } @@ -117,7 +121,7 @@ public void recordActorContext(final TracingActor actor, public void recordSystemCall(final int dataId, final TraceActorContextNode tracer) { ensureSufficientSpace(5, tracer); - storage.putByteInt(SYSTEM_CALL, dataId); + putByteInt(SYSTEM_CALL, dataId); } } } From f829a12b4fccf146341fe9cd689e4e8645dc667d Mon Sep 17 00:00:00 2001 From: Dominik Aumayr Date: Tue, 26 Jun 2018 14:57:56 +0200 Subject: [PATCH 12/16] Fixes for tracing external data, naming, and Kompos --- .../interpreter/actors/ReceivedRootNode.java | 10 +++--- src/tools/concurrency/KomposTrace.java | 6 ++-- .../replay/actors/ActorExecutionTrace.java | 32 +++++++++++++------ tools/kompos/src/system-view.ts | 4 +-- tools/kompos/src/trace-parser.ts | 16 +++++----- 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/som/interpreter/actors/ReceivedRootNode.java b/src/som/interpreter/actors/ReceivedRootNode.java index 2c73c14f3..f0239588a 100644 --- a/src/som/interpreter/actors/ReceivedRootNode.java +++ b/src/som/interpreter/actors/ReceivedRootNode.java @@ -11,7 +11,7 @@ import som.interpreter.SomLanguage; import som.interpreter.actors.SPromise.SResolver; import som.vm.VmSettings; -import tools.concurrency.MedeorTrace; +import tools.concurrency.KomposTrace; import tools.concurrency.nodes.TraceMessageNode; import tools.concurrency.nodes.TraceMessageNodeGen; import tools.debugger.WebDebugger; @@ -64,8 +64,8 @@ public final Object execute(final VirtualFrame frame) { haltOnResolution = false; } - if (VmSettings.MEDEOR_TRACING) { - MedeorTrace.scopeStart(DynamicScopeType.TURN, msg.getMessageId(), + if (VmSettings.KOMPOS_TRACING) { + KomposTrace.scopeStart(DynamicScopeType.TURN, msg.getMessageId(), msg.getTargetSourceSection()); } @@ -76,8 +76,8 @@ public final Object execute(final VirtualFrame frame) { msgTracer.execute(msg); } - if (VmSettings.MEDEOR_TRACING) { - MedeorTrace.scopeEnd(DynamicScopeType.TURN); + if (VmSettings.KOMPOS_TRACING) { + KomposTrace.scopeEnd(DynamicScopeType.TURN); } } } diff --git a/src/tools/concurrency/KomposTrace.java b/src/tools/concurrency/KomposTrace.java index eacc0d355..926175fc5 100644 --- a/src/tools/concurrency/KomposTrace.java +++ b/src/tools/concurrency/KomposTrace.java @@ -158,7 +158,7 @@ public static class KomposTraceBuffer extends TraceBuffer { public static KomposTraceBuffer create(final long implThreadId) { assert VmSettings.KOMPOS_TRACING; if (VmSettings.TRUFFLE_DEBUGGER_ENABLED) { - return new SyncedMedeorTraceBuffer(implThreadId); + return new SyncedKomposTraceBuffer(implThreadId); } else { return new KomposTraceBuffer(implThreadId); } @@ -354,9 +354,9 @@ public void recordSendOperation(final SendOp op, final long entityId, assert position == start + requiredSpace; } - public static class SyncedMedeorTraceBuffer extends KomposTraceBuffer { + public static class SyncedKomposTraceBuffer extends KomposTraceBuffer { - protected SyncedMedeorTraceBuffer(final long implThreadId) { + protected SyncedKomposTraceBuffer(final long implThreadId) { super(implThreadId); } diff --git a/src/tools/replay/actors/ActorExecutionTrace.java b/src/tools/replay/actors/ActorExecutionTrace.java index 820beace7..bd41608b9 100644 --- a/src/tools/replay/actors/ActorExecutionTrace.java +++ b/src/tools/replay/actors/ActorExecutionTrace.java @@ -41,9 +41,15 @@ public static void recordSystemCall(final int dataId, final TraceActorContextNod ((ActorTraceBuffer) t.getBuffer()).recordSystemCall(dataId, tracer); } + public static void recordSystemCall(final int dataId, final TraceActorContextNode tracer, + final TracingActivityThread t) { + ((ActorTraceBuffer) t.getBuffer()).recordSystemCall(dataId, tracer); + } + public static void intSystemCall(final int i, final TraceActorContextNode tracer) { - TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); - int dataId = ta.getActorId(); + ActorProcessingThread t = (ActorProcessingThread) getThread(); + TracingActor ta = (TracingActor) t.getCurrentActor(); + int dataId = ta.getDataId(); byte[] b = getExtDataByteBuffer(ta.getActorId(), dataId, Integer.BYTES); TraceBuffer.UNSAFE.putInt( b, TraceBuffer.BYTE_ARR_BASE_OFFSET + EXT_DATA_HEADER_SIZE, i); @@ -52,8 +58,9 @@ public static void intSystemCall(final int i, final TraceActorContextNode tracer } public static void longSystemCall(final long l, final TraceActorContextNode tracer) { - TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); - int dataId = ta.getActorId(); + ActorProcessingThread t = (ActorProcessingThread) getThread(); + TracingActor ta = (TracingActor) t.getCurrentActor(); + int dataId = ta.getDataId(); byte[] b = getExtDataByteBuffer(ta.getActorId(), dataId, Long.BYTES); TraceBuffer.UNSAFE.putLong( b, TraceBuffer.BYTE_ARR_BASE_OFFSET + EXT_DATA_HEADER_SIZE, l); @@ -62,8 +69,9 @@ public static void longSystemCall(final long l, final TraceActorContextNode trac } public static void doubleSystemCall(final double d, final TraceActorContextNode tracer) { - TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); - int dataId = ta.getActorId(); + ActorProcessingThread t = (ActorProcessingThread) getThread(); + TracingActor ta = (TracingActor) t.getCurrentActor(); + int dataId = ta.getDataId(); byte[] b = getExtDataByteBuffer(ta.getActorId(), dataId, Double.BYTES); TraceBuffer.UNSAFE.putDouble( b, TraceBuffer.BYTE_ARR_BASE_OFFSET + EXT_DATA_HEADER_SIZE, d); @@ -74,8 +82,9 @@ public static void doubleSystemCall(final double d, final TraceActorContextNode private static final int EXT_DATA_HEADER_SIZE = 3 * 4; public static void stringSystemCall(final String s, final TraceActorContextNode tracer) { - TracingActor ta = (TracingActor) EventualMessage.getActorCurrentMessageIsExecutionOn(); - int dataId = ta.getActorId(); + ActorProcessingThread t = (ActorProcessingThread) getThread(); + TracingActor ta = (TracingActor) t.getCurrentActor(); + int dataId = ta.getDataId(); recordSystemCall(dataId, tracer); StringWrapper sw = new StringWrapper(s, ta.getActorId(), dataId); @@ -86,6 +95,10 @@ public static void stringSystemCall(final String s, final TraceActorContextNode public static byte[] getExtDataByteBuffer(final int actor, final int dataId, final int size) { byte[] buffer = new byte[size + EXT_DATA_HEADER_SIZE]; + Arrays.fill(buffer, (byte) -1); + TraceBuffer.UNSAFE.putInt(buffer, TraceBuffer.BYTE_ARR_BASE_OFFSET, actor); + TraceBuffer.UNSAFE.putInt(buffer, TraceBuffer.BYTE_ARR_BASE_OFFSET + 4, dataId); + TraceBuffer.UNSAFE.putInt(buffer, TraceBuffer.BYTE_ARR_BASE_OFFSET + 8, size); return buffer; } @@ -104,8 +117,7 @@ public static class ActorTraceBuffer extends TraceBuffer { @Override protected void swapBufferWhenNotEnoughSpace(final TraceActorContextNode tracer) { - boolean didSwap = swapStorage(); - assert didSwap; + swapStorage(); if (tracer != null) { tracer.trace(currentActor); } diff --git a/tools/kompos/src/system-view.ts b/tools/kompos/src/system-view.ts index 02f5b0eeb..d364d77e0 100644 --- a/tools/kompos/src/system-view.ts +++ b/tools/kompos/src/system-view.ts @@ -137,8 +137,8 @@ export class SystemView { const deltaX = target.x - source.x, deltaY = target.y - source.y, dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY), - normX = deltaX / dist, - normY = deltaY / dist, + normX = dist === 0 ? 0 : deltaX / dist, + normY = dist === 0 ? 0 : deltaY / dist, sourcePadding = d.left ? 17 : 12, targetPadding = d.right ? 17 : 12, sourceX = source.x + (sourcePadding * normX), diff --git a/tools/kompos/src/trace-parser.ts b/tools/kompos/src/trace-parser.ts index 585a50874..91a335588 100644 --- a/tools/kompos/src/trace-parser.ts +++ b/tools/kompos/src/trace-parser.ts @@ -114,16 +114,16 @@ export class TraceParser { /** Read a long within JS int range */ private readLong(d: DataView, offset: number) { - const high = d.getUint32(offset); + const high = d.getUint32(offset + 4, true); console.assert(high <= MAX_SAFE_HIGH_VAL, "expected 53bit, but read high int as: " + high); - return high * SHIFT_HIGH_INT + d.getUint32(offset + 4); + return high * SHIFT_HIGH_INT + d.getUint32(offset, true); } private readSourceSection(data: DataView, i: number): RawSourceCoordinate { - const fileId: number = data.getUint16(i); - const startLine: number = data.getUint16(i + 2); - const startCol: number = data.getUint16(i + 4); - const charLen: number = data.getUint16(i + 6); + const fileId: number = data.getUint16(i, true); + const startLine: number = data.getUint16(i + 2, true); + const startCol: number = data.getUint16(i + 4, true); + const charLen: number = data.getUint16(i + 6, true); return new RawSourceCoordinate(fileId, charLen, startLine, startCol); } @@ -131,7 +131,7 @@ export class TraceParser { currentActivityId: number, currentScopeId: number) { const marker = data.getUint8(i); const activityId = this.readLong(data, i + 1); - const symbolId = data.getUint16(i + 9); + const symbolId = data.getUint16(i + 9, true); const sourceSection = this.readSourceSection(data, i + 11); this.execData.addRawActivity(new RawActivity( @@ -238,7 +238,7 @@ export class TraceParser { } case TraceRecords.ImplThreadCurrentActivity: { currentActivityId = this.readLong(data, i + 1); - /* currentActivityBufferId = */ data.getUint32(i + 9); + /* currentActivityBufferId = */ data.getUint32(i + 9, true); i += RECORD_SIZE.ImplThreadCurrentActivity; break; } From f112fdb681c8913ead371dfa1408c38a32462f3f Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 17 Jul 2018 11:55:41 +0200 Subject: [PATCH 13/16] Make buffers configureable - add options for constants - make buffer recycling optional --- som | 16 ++++++++ src/som/vm/VmSettings.java | 14 +++++++ src/tools/concurrency/KomposTrace.java | 2 +- src/tools/concurrency/TraceBuffer.java | 50 +++++++++++------------ src/tools/concurrency/TraceParser.java | 2 +- src/tools/concurrency/TracingBackend.java | 31 ++++++++------ 6 files changed, 76 insertions(+), 39 deletions(-) diff --git a/som b/som index b9c64130d..51f86d2fe 100755 --- a/som +++ b/som @@ -86,6 +86,14 @@ tools.add_argument('-TF', '--disable-trace-file', help='trace file wont be writt dest='disable_trace_file', action='store_true', default=False) tools.add_argument('-r', '--replay', help='execution of the program is guided by an existing trace file', dest='replay', action='store_true', default=False) +tools.add_argument('-BR', '--no-buffer-recycling', help='create singe-use buffers only', + dest='buffer_recycling', action='store_true', default=False) +tools.add_argument('-bpt', '--buffers-per-thread', help='used to calculate the number of buffers to use for tracing', + dest='buffers_per_thread', default=4) +tools.add_argument('-bs', '--buffer-size', help='set the size of buffer used for tracing', + dest='buffer_size', default=1048576) +tools.add_argument('-bd', '--buffer-delay', help='set the delay for checking if there are buffers to write', + dest='buffer_delay', default=50) tools.add_argument('--coverage', help='determine SOMns code coverage and store in given file', dest='coverage', default=None) tools.add_argument('--java-coverage', help='determine Java code coverage and store in given file', @@ -315,6 +323,14 @@ if args.disable_trace_file: flags += ['-Dsom.disableTraceFile=true'] if args.replay: flags += ['-Dsom.replay=true'] +if args.buffer_recycling: + flags += ['-Dsom.bufferRecycling=false'] +if args.buffer_size: + flags += ['-Dsom.buffSize=%s' % args.buffer_size ] +if args.buffer_size: + flags += ['-Dsom.buffDelay=%s' % args.buffer_delay ] +if args.buffers_per_thread: + flags += ['-Dsom.buffPerThread=%s' % args.buffers_per_thread ] if (args.truffle_profile or args.web_debugger or args.dynamic_metrics or args.coverage or args.si_candidates): diff --git a/src/som/vm/VmSettings.java b/src/som/vm/VmSettings.java index 256d9a609..4a27b1b40 100644 --- a/src/som/vm/VmSettings.java +++ b/src/som/vm/VmSettings.java @@ -31,6 +31,11 @@ public class VmSettings implements Settings { public static final String INSTRUMENTATION_PROP = "som.instrumentation"; + public static final int BUFFERS_PER_THREAD; + public static final int BUFFER_SIZE; + public static final boolean RECYCLE_BUFFERS; + public static final int BUFFER_TIMEOUT; + static { String prop = System.getProperty("som.threads"); if (prop == null) { @@ -67,12 +72,21 @@ public class VmSettings implements Settings { IGV_DUMP_AFTER_PARSING = getBool("som.igvDumpAfterParsing", false); ANSI_COLOR_IN_OUTPUT = getBool("som.useAnsiColoring", false); + + BUFFER_SIZE = getInteger("som.buffSize", 1024 * 1024); + BUFFERS_PER_THREAD = getInteger("som.buffPerThread", 4); + BUFFER_TIMEOUT = getInteger("som.buffDelay", 50); + RECYCLE_BUFFERS = getBool("som.bufferRecycling", true); } private static boolean getBool(final String prop, final boolean defaultVal) { return Boolean.parseBoolean(System.getProperty(prop, defaultVal ? "true" : "false")); } + private static int getInteger(final String prop, final int defaultVal) { + return Integer.parseInt(System.getProperty(prop, "" + defaultVal)); + } + @Override public boolean dynamicMetricsEnabled() { return DYNAMIC_METRICS; diff --git a/src/tools/concurrency/KomposTrace.java b/src/tools/concurrency/KomposTrace.java index 926175fc5..f3907375c 100644 --- a/src/tools/concurrency/KomposTrace.java +++ b/src/tools/concurrency/KomposTrace.java @@ -185,7 +185,7 @@ boolean swapStorage(final Activity current) { @TruffleBoundary protected boolean ensureSufficientSpace(final int requiredSpace, final Activity current) { - if (position + requiredSpace < TracingBackend.BUFFER_SIZE) { + if (position + requiredSpace < VmSettings.BUFFER_SIZE) { boolean didSwap = swapStorage(current); return didSwap; } diff --git a/src/tools/concurrency/TraceBuffer.java b/src/tools/concurrency/TraceBuffer.java index f6154a366..8932c7968 100644 --- a/src/tools/concurrency/TraceBuffer.java +++ b/src/tools/concurrency/TraceBuffer.java @@ -55,14 +55,14 @@ protected TraceBuffer() { } public int position() { - assert position <= TracingBackend.BUFFER_SIZE; + assert position <= VmSettings.BUFFER_SIZE; assert position <= buffer.length; return position; } public void position(final int newPosition) { assert newPosition >= 0; - assert newPosition <= TracingBackend.BUFFER_SIZE; + assert newPosition <= VmSettings.BUFFER_SIZE; assert newPosition <= buffer.length; if (newPosition < 0) { CompilerDirectives.transferToInterpreter(); @@ -72,14 +72,14 @@ public void position(final int newPosition) { } private int nextPutIndex() { - assert position + 1 <= TracingBackend.BUFFER_SIZE; + assert position + 1 <= VmSettings.BUFFER_SIZE; assert position + 1 <= buffer.length; return position++; } private int nextPutIndex(final int nb) { - assert position + nb <= TracingBackend.BUFFER_SIZE; + assert position + nb <= VmSettings.BUFFER_SIZE; assert position + nb <= buffer.length; int p = position; position += nb; @@ -101,13 +101,13 @@ public boolean isEmpty() { } public boolean isFull() { - assert (position == TracingBackend.BUFFER_SIZE) == ((buffer.length - position) == 0); - return position == TracingBackend.BUFFER_SIZE; + assert (position == VmSettings.BUFFER_SIZE) == ((buffer.length - position) == 0); + return position == VmSettings.BUFFER_SIZE; } public final boolean ensureSufficientSpace(final int requiredSpace, final TraceActorContextNode tracer) { - if (position + requiredSpace >= TracingBackend.BUFFER_SIZE) { + if (position + requiredSpace >= VmSettings.BUFFER_SIZE) { swapBufferWhenNotEnoughSpace(tracer); return true; } @@ -119,62 +119,62 @@ protected void swapBufferWhenNotEnoughSpace(final TraceActorContextNode tracer) } public void putByteAt(final int idx, final byte x) { - assert buffer.length >= TracingBackend.BUFFER_SIZE; - assert 0 <= idx && idx < TracingBackend.BUFFER_SIZE; + assert buffer.length >= VmSettings.BUFFER_SIZE; + assert 0 <= idx && idx < VmSettings.BUFFER_SIZE; UNSAFE.putByte(buffer, BYTE_ARR_BASE_OFFSET + idx, x); } public void putShortAt(final int idx, final short x) { - assert buffer.length >= TracingBackend.BUFFER_SIZE; - assert 0 <= idx && (idx + 2) < TracingBackend.BUFFER_SIZE; + assert buffer.length >= VmSettings.BUFFER_SIZE; + assert 0 <= idx && (idx + 2) < VmSettings.BUFFER_SIZE; UNSAFE.putShort(buffer, BYTE_ARR_BASE_OFFSET + idx, x); } public void putIntAt(final int idx, final int x) { - assert buffer.length >= TracingBackend.BUFFER_SIZE; - assert 0 <= idx && (idx + 4) < TracingBackend.BUFFER_SIZE; + assert buffer.length >= VmSettings.BUFFER_SIZE; + assert 0 <= idx && (idx + 4) < VmSettings.BUFFER_SIZE; UNSAFE.putInt(buffer, BYTE_ARR_BASE_OFFSET + idx, x); } public void putByteShortAt(final int idx, final byte a, final short b) { - assert buffer.length >= TracingBackend.BUFFER_SIZE; - assert 0 <= idx && (idx + 1 + 2) < TracingBackend.BUFFER_SIZE; + assert buffer.length >= VmSettings.BUFFER_SIZE; + assert 0 <= idx && (idx + 1 + 2) < VmSettings.BUFFER_SIZE; UNSAFE.putByte(buffer, BYTE_ARR_BASE_OFFSET + idx, a); UNSAFE.putShort(buffer, BYTE_ARR_BASE_OFFSET + idx + 1, b); } protected final void put(final byte x) { - assert buffer.length >= TracingBackend.BUFFER_SIZE; - assert 0 <= position && (position + 1) < TracingBackend.BUFFER_SIZE; + assert buffer.length >= VmSettings.BUFFER_SIZE; + assert 0 <= position && (position + 1) < VmSettings.BUFFER_SIZE; UNSAFE.putByte(buffer, BYTE_ARR_BASE_OFFSET + nextPutIndex(), x); } public void putByteInt(final byte a, final int b) { int bi = nextPutIndex(1 + 4); putByteAt(bi, a); - assert buffer.length >= TracingBackend.BUFFER_SIZE; - assert (0 <= bi + 1) && (bi + 1 + 4) < TracingBackend.BUFFER_SIZE; + assert buffer.length >= VmSettings.BUFFER_SIZE; + assert (0 <= bi + 1) && (bi + 1 + 4) < VmSettings.BUFFER_SIZE; UNSAFE.putInt(buffer, BYTE_ARR_BASE_OFFSET + bi + 1, b); } protected final void putShort(final short x) { int bi = nextPutIndex(2); - assert buffer.length >= TracingBackend.BUFFER_SIZE; - assert 0 <= bi && (bi + 2) < TracingBackend.BUFFER_SIZE; + assert buffer.length >= VmSettings.BUFFER_SIZE; + assert 0 <= bi && (bi + 2) < VmSettings.BUFFER_SIZE; UNSAFE.putShort(buffer, BYTE_ARR_BASE_OFFSET + bi, x); } protected final void putInt(final int x) { int bi = nextPutIndex(4); - assert buffer.length >= TracingBackend.BUFFER_SIZE; - assert 0 <= bi && (bi + 4) < TracingBackend.BUFFER_SIZE; + assert buffer.length >= VmSettings.BUFFER_SIZE; + assert 0 <= bi && (bi + 4) < VmSettings.BUFFER_SIZE; UNSAFE.putInt(buffer, BYTE_ARR_BASE_OFFSET + bi, x); } protected final void putLong(final long x) { int bi = nextPutIndex(8); - assert buffer.length >= TracingBackend.BUFFER_SIZE; - assert 0 <= bi && (bi + 8) < TracingBackend.BUFFER_SIZE; + assert buffer.length >= VmSettings.BUFFER_SIZE; + assert 0 <= bi && (bi + 8) < VmSettings.BUFFER_SIZE; UNSAFE.putLong(buffer, BYTE_ARR_BASE_OFFSET + bi, x); } diff --git a/src/tools/concurrency/TraceParser.java b/src/tools/concurrency/TraceParser.java index 5b7d49e84..7c36988ce 100644 --- a/src/tools/concurrency/TraceParser.java +++ b/src/tools/concurrency/TraceParser.java @@ -33,7 +33,7 @@ private enum TraceRecord { } private ByteBuffer b = - ByteBuffer.allocate(TracingBackend.BUFFER_SIZE); + ByteBuffer.allocate(VmSettings.BUFFER_SIZE); private final HashMap actors = new HashMap<>(); private final HashMap externalDataDict = new HashMap<>(); diff --git a/src/tools/concurrency/TracingBackend.java b/src/tools/concurrency/TracingBackend.java index fc3f85462..a6bad57b1 100644 --- a/src/tools/concurrency/TracingBackend.java +++ b/src/tools/concurrency/TracingBackend.java @@ -68,11 +68,10 @@ * done on the buffer for all access. */ public class TracingBackend { - private static final int BUFFER_POOL_SIZE = VmSettings.NUM_THREADS * 16; - public static final int BUFFER_SIZE = 4096 * 256; + private static final int BUFFER_POOL_SIZE = + VmSettings.NUM_THREADS * VmSettings.BUFFERS_PER_THREAD; private static final int TRACE_TIMEOUT = 500; - private static final int POLL_TIMEOUT = 50; private static final List gcbeans = ManagementFactory.getGarbageCollectorMXBeans(); @@ -101,9 +100,10 @@ public class TracingBackend { setUpGCMonitoring(); } - if (VmSettings.ACTOR_TRACING || VmSettings.KOMPOS_TRACING) { + if (VmSettings.RECYCLE_BUFFERS + && (VmSettings.ACTOR_TRACING || VmSettings.KOMPOS_TRACING)) { for (int i = 0; i < BUFFER_POOL_SIZE; i++) { - emptyBuffers.add(new byte[BUFFER_SIZE]); + emptyBuffers.add(new byte[VmSettings.BUFFER_SIZE]); } } } @@ -155,11 +155,15 @@ public static void reportPeakMemoryUsage() { @TruffleBoundary public static byte[] getEmptyBuffer() { - try { - return emptyBuffers.take(); - } catch (InterruptedException e) { - CompilerDirectives.transferToInterpreter(); - throw new IllegalStateException("Failed to acquire a new Buffer!"); + if (VmSettings.RECYCLE_BUFFERS) { + try { + return emptyBuffers.take(); + } catch (InterruptedException e) { + CompilerDirectives.transferToInterpreter(); + throw new IllegalStateException("Failed to acquire a new Buffer!"); + } + } else { + return new byte[VmSettings.BUFFER_SIZE]; } } @@ -304,7 +308,8 @@ private static class TraceWorkerThread extends Thread { private BufferAndLimit tryToObtainBuffer() { BufferAndLimit buffer; try { - buffer = TracingBackend.fullBuffers.poll(POLL_TIMEOUT, TimeUnit.MILLISECONDS); + buffer = + TracingBackend.fullBuffers.poll(VmSettings.BUFFER_TIMEOUT, TimeUnit.MILLISECONDS); if (buffer == null) { return null; } else { @@ -440,7 +445,9 @@ private void writeAndRecycleBuffer(final FileOutputStream fos, final BufferAndLi fos.flush(); } traceBytes += buffer.limit; - TracingBackend.emptyBuffers.add(buffer.buffer); + if (VmSettings.RECYCLE_BUFFERS) { + TracingBackend.emptyBuffers.add(buffer.buffer); + } } private void processTraceData(final FileOutputStream traceDataStream, From 3e5a618df7f1bd60816556e2bb07b213415553be Mon Sep 17 00:00:00 2001 From: Dominik Aumayr Date: Tue, 17 Jul 2018 14:26:28 +0200 Subject: [PATCH 14/16] Fix buffer handling when assertions are disabled --- src/tools/concurrency/TracingBackend.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tools/concurrency/TracingBackend.java b/src/tools/concurrency/TracingBackend.java index a6bad57b1..e7ea27bf4 100644 --- a/src/tools/concurrency/TracingBackend.java +++ b/src/tools/concurrency/TracingBackend.java @@ -191,7 +191,8 @@ public ByteBuffer getReadingFromStartBuffer() { @TruffleBoundary private static void returnBufferGlobally(final BufferAndLimit buffer) { - assert fullBuffers.offer(buffer); + boolean inserted = fullBuffers.offer(buffer); + assert inserted; } private static HashSet tracingThreads = new HashSet<>(); From 854c09b36babd140d9acc36b984aa07fe7f98ea0 Mon Sep 17 00:00:00 2001 From: Dominik Aumayr Date: Mon, 23 Jul 2018 11:31:24 +0200 Subject: [PATCH 15/16] Fix packages and imports --- src/som/interpreter/actors/Actor.java | 5 +---- src/som/interpreter/actors/ReceivedRootNode.java | 4 ++-- src/som/primitives/SystemPrims.java | 4 ++-- src/som/primitives/actors/CreateActorPrim.java | 2 +- src/tools/concurrency/TraceBuffer.java | 6 +++--- src/tools/concurrency/TracingBackend.java | 2 +- src/tools/replay/TwoDArrayWrapper.java | 8 ++++---- src/tools/replay/actors/ActorExecutionTrace.java | 2 +- .../nodes/RecordIdIdNode.java | 4 ++-- .../{concurrency => replay}/nodes/RecordIdNode.java | 4 ++-- .../nodes/TraceActorContextNode.java | 6 +++--- .../nodes/TraceActorCreationNode.java | 6 +++--- .../nodes/TraceMessageNode.java | 12 ++++++------ .../{concurrency => replay}/nodes/TraceNode.java | 4 ++-- 14 files changed, 33 insertions(+), 36 deletions(-) rename src/tools/{concurrency => replay}/nodes/RecordIdIdNode.java (95%) rename src/tools/{concurrency => replay}/nodes/RecordIdNode.java (94%) rename src/tools/{concurrency => replay}/nodes/TraceActorContextNode.java (80%) rename src/tools/{concurrency => replay}/nodes/TraceActorCreationNode.java (83%) rename src/tools/{concurrency => replay}/nodes/TraceMessageNode.java (91%) rename src/tools/{concurrency => replay}/nodes/TraceNode.java (76%) diff --git a/src/som/interpreter/actors/Actor.java b/src/som/interpreter/actors/Actor.java index 598c4bde3..c8800040d 100644 --- a/src/som/interpreter/actors/Actor.java +++ b/src/som/interpreter/actors/Actor.java @@ -28,11 +28,11 @@ import tools.concurrency.TracingActivityThread; import tools.concurrency.TracingActors.ReplayActor; import tools.concurrency.TracingActors.TracingActor; -import tools.concurrency.nodes.TraceActorContextNode; import tools.debugger.WebDebugger; import tools.debugger.entities.ActivityType; import tools.debugger.entities.DynamicScopeType; import tools.replay.actors.ActorExecutionTrace; +import tools.replay.nodes.TraceActorContextNode; /** @@ -302,9 +302,6 @@ private void execute(final EventualMessage msg, if (VmSettings.KOMPOS_TRACING) { KomposTrace.scopeEnd(DynamicScopeType.TURN); } - if (VmSettings.ACTOR_TRACING) { - ActorExecutionTrace.recordMessage(msg); - } } } diff --git a/src/som/interpreter/actors/ReceivedRootNode.java b/src/som/interpreter/actors/ReceivedRootNode.java index f0239588a..9f0aaa7a4 100644 --- a/src/som/interpreter/actors/ReceivedRootNode.java +++ b/src/som/interpreter/actors/ReceivedRootNode.java @@ -12,10 +12,10 @@ import som.interpreter.actors.SPromise.SResolver; import som.vm.VmSettings; import tools.concurrency.KomposTrace; -import tools.concurrency.nodes.TraceMessageNode; -import tools.concurrency.nodes.TraceMessageNodeGen; import tools.debugger.WebDebugger; import tools.debugger.entities.DynamicScopeType; +import tools.replay.nodes.TraceMessageNode; +import tools.replay.nodes.TraceMessageNodeGen; public abstract class ReceivedRootNode extends RootNode { diff --git a/src/som/primitives/SystemPrims.java b/src/som/primitives/SystemPrims.java index 7dbb97f0c..1a40e6402 100644 --- a/src/som/primitives/SystemPrims.java +++ b/src/som/primitives/SystemPrims.java @@ -53,10 +53,10 @@ import som.vmobjects.SObjectWithClass; import som.vmobjects.SSymbol; import tools.SourceCoordinate; -import tools.concurrency.ActorExecutionTrace; import tools.concurrency.TraceParser; import tools.concurrency.TracingBackend; -import tools.concurrency.nodes.TraceActorContextNode; +import tools.replay.actors.ActorExecutionTrace; +import tools.replay.nodes.TraceActorContextNode; public final class SystemPrims { diff --git a/src/som/primitives/actors/CreateActorPrim.java b/src/som/primitives/actors/CreateActorPrim.java index 333f983fd..f70a50398 100644 --- a/src/som/primitives/actors/CreateActorPrim.java +++ b/src/som/primitives/actors/CreateActorPrim.java @@ -18,9 +18,9 @@ import tools.concurrency.KomposTrace; import tools.concurrency.Tags.ExpressionBreakpoint; import tools.concurrency.TracingActors.TracingActor; -import tools.concurrency.nodes.TraceActorCreationNode; import tools.debugger.entities.ActivityType; import tools.replay.actors.ActorExecutionTrace; +import tools.replay.nodes.TraceActorCreationNode; @GenerateNodeFactory diff --git a/src/tools/concurrency/TraceBuffer.java b/src/tools/concurrency/TraceBuffer.java index 8932c7968..b8b0b1fa6 100644 --- a/src/tools/concurrency/TraceBuffer.java +++ b/src/tools/concurrency/TraceBuffer.java @@ -7,7 +7,7 @@ import som.vm.VmSettings; import sun.misc.Unsafe; import tools.replay.actors.ActorExecutionTrace.ActorTraceBuffer; -import tools.concurrency.nodes.TraceActorContext; +import tools.replay.nodes.TraceActorContextNode; public abstract class TraceBuffer { @@ -21,8 +21,8 @@ public static TraceBuffer create(final long threadId) { } } - static final Unsafe UNSAFE; - static final long BYTE_ARR_BASE_OFFSET; + public static final Unsafe UNSAFE; + public static final long BYTE_ARR_BASE_OFFSET; private static Unsafe loadUnsafe() { try { diff --git a/src/tools/concurrency/TracingBackend.java b/src/tools/concurrency/TracingBackend.java index e7ea27bf4..e57515fd2 100644 --- a/src/tools/concurrency/TracingBackend.java +++ b/src/tools/concurrency/TracingBackend.java @@ -357,7 +357,7 @@ private void writeExternalData(final FileOutputStream edfos) throws IOException private void writeArray(final TwoDArrayWrapper aw, final FileOutputStream edfos) throws IOException { - SImmutableArray sia = aw.ia; + SImmutableArray sia = aw.immArray; Object[] outer = sia.getObjectStorage(SArray.ObjectStorageType); byte[][][] bouter = new byte[outer.length][][]; diff --git a/src/tools/replay/TwoDArrayWrapper.java b/src/tools/replay/TwoDArrayWrapper.java index 035d77fb0..27b1d0901 100644 --- a/src/tools/replay/TwoDArrayWrapper.java +++ b/src/tools/replay/TwoDArrayWrapper.java @@ -4,13 +4,13 @@ public class TwoDArrayWrapper { - final SImmutableArray ia; - public final int actorId; - final int dataId; + public final SImmutableArray immArray; + public final int actorId; + public final int dataId; public TwoDArrayWrapper(final SImmutableArray ia, final int actorId, final int dataId) { super(); - this.ia = ia; + this.immArray = ia; this.actorId = actorId; this.dataId = dataId; } diff --git a/src/tools/replay/actors/ActorExecutionTrace.java b/src/tools/replay/actors/ActorExecutionTrace.java index bd41608b9..9b517b4b0 100644 --- a/src/tools/replay/actors/ActorExecutionTrace.java +++ b/src/tools/replay/actors/ActorExecutionTrace.java @@ -11,7 +11,7 @@ import tools.concurrency.TracingActivityThread; import tools.concurrency.TracingActors.TracingActor; import tools.replay.StringWrapper; -import tools.concurrency.nodes.TraceActorContextNode; +import tools.replay.nodes.TraceActorContextNode; public class ActorExecutionTrace { diff --git a/src/tools/concurrency/nodes/RecordIdIdNode.java b/src/tools/replay/nodes/RecordIdIdNode.java similarity index 95% rename from src/tools/concurrency/nodes/RecordIdIdNode.java rename to src/tools/replay/nodes/RecordIdIdNode.java index 61d05e032..9791443d9 100644 --- a/src/tools/concurrency/nodes/RecordIdIdNode.java +++ b/src/tools/replay/nodes/RecordIdIdNode.java @@ -1,10 +1,10 @@ -package tools.concurrency.nodes; +package tools.replay.nodes; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; import som.vm.VmSettings; -import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; +import tools.replay.actors.ActorExecutionTrace.ActorTraceBuffer; public abstract class RecordIdIdNode extends Node { diff --git a/src/tools/concurrency/nodes/RecordIdNode.java b/src/tools/replay/nodes/RecordIdNode.java similarity index 94% rename from src/tools/concurrency/nodes/RecordIdNode.java rename to src/tools/replay/nodes/RecordIdNode.java index fc44c641c..e497edb37 100644 --- a/src/tools/concurrency/nodes/RecordIdNode.java +++ b/src/tools/replay/nodes/RecordIdNode.java @@ -1,10 +1,10 @@ -package tools.concurrency.nodes; +package tools.replay.nodes; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; import som.vm.VmSettings; -import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; +import tools.replay.actors.ActorExecutionTrace.ActorTraceBuffer; public abstract class RecordIdNode extends Node { diff --git a/src/tools/concurrency/nodes/TraceActorContextNode.java b/src/tools/replay/nodes/TraceActorContextNode.java similarity index 80% rename from src/tools/concurrency/nodes/TraceActorContextNode.java rename to src/tools/replay/nodes/TraceActorContextNode.java index 98d9ec8e3..bcbaadd0b 100644 --- a/src/tools/concurrency/nodes/TraceActorContextNode.java +++ b/src/tools/replay/nodes/TraceActorContextNode.java @@ -1,8 +1,8 @@ -package tools.concurrency.nodes; +package tools.replay.nodes; -import tools.concurrency.ActorExecutionTrace; -import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.TracingActors.TracingActor; +import tools.replay.actors.ActorExecutionTrace; +import tools.replay.actors.ActorExecutionTrace.ActorTraceBuffer; public final class TraceActorContextNode extends TraceNode { diff --git a/src/tools/concurrency/nodes/TraceActorCreationNode.java b/src/tools/replay/nodes/TraceActorCreationNode.java similarity index 83% rename from src/tools/concurrency/nodes/TraceActorCreationNode.java rename to src/tools/replay/nodes/TraceActorCreationNode.java index af705758e..6772b83d7 100644 --- a/src/tools/concurrency/nodes/TraceActorCreationNode.java +++ b/src/tools/replay/nodes/TraceActorCreationNode.java @@ -1,8 +1,8 @@ -package tools.concurrency.nodes; +package tools.replay.nodes; -import tools.concurrency.ActorExecutionTrace; -import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.TracingActors.TracingActor; +import tools.replay.actors.ActorExecutionTrace; +import tools.replay.actors.ActorExecutionTrace.ActorTraceBuffer; public final class TraceActorCreationNode extends TraceNode { diff --git a/src/tools/concurrency/nodes/TraceMessageNode.java b/src/tools/replay/nodes/TraceMessageNode.java similarity index 91% rename from src/tools/concurrency/nodes/TraceMessageNode.java rename to src/tools/replay/nodes/TraceMessageNode.java index d21a0d33c..2d53d3c33 100644 --- a/src/tools/concurrency/nodes/TraceMessageNode.java +++ b/src/tools/replay/nodes/TraceMessageNode.java @@ -1,19 +1,19 @@ -package tools.concurrency.nodes; +package tools.replay.nodes; import com.oracle.truffle.api.dsl.Specialization; import som.interpreter.actors.EventualMessage; import som.interpreter.actors.EventualMessage.DirectMessage; -import som.interpreter.actors.EventualMessage.ExternalDirectMessage; -import som.interpreter.actors.EventualMessage.ExternalPromiseCallbackMessage; -import som.interpreter.actors.EventualMessage.ExternalPromiseSendMessage; import som.interpreter.actors.EventualMessage.PromiseCallbackMessage; import som.interpreter.actors.EventualMessage.PromiseMessage; import som.interpreter.actors.EventualMessage.PromiseSendMessage; import som.interpreter.actors.SPromise.STracingPromise; -import tools.concurrency.ActorExecutionTrace; -import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.TracingActors.TracingActor; +import tools.replay.actors.ActorExecutionTrace; +import tools.replay.actors.ActorExecutionTrace.ActorTraceBuffer; +import tools.replay.actors.ExternalEventualMessage.ExternalDirectMessage; +import tools.replay.actors.ExternalEventualMessage.ExternalPromiseCallbackMessage; +import tools.replay.actors.ExternalEventualMessage.ExternalPromiseSendMessage; public abstract class TraceMessageNode extends TraceNode { diff --git a/src/tools/concurrency/nodes/TraceNode.java b/src/tools/replay/nodes/TraceNode.java similarity index 76% rename from src/tools/concurrency/nodes/TraceNode.java rename to src/tools/replay/nodes/TraceNode.java index f8d2e234c..efa2f4d74 100644 --- a/src/tools/concurrency/nodes/TraceNode.java +++ b/src/tools/replay/nodes/TraceNode.java @@ -1,9 +1,9 @@ -package tools.concurrency.nodes; +package tools.replay.nodes; import com.oracle.truffle.api.nodes.Node; -import tools.concurrency.ActorExecutionTrace.ActorTraceBuffer; import tools.concurrency.TracingActivityThread; +import tools.replay.actors.ActorExecutionTrace.ActorTraceBuffer; public abstract class TraceNode extends Node { From a1479ab79ce0aa693337c07545880ac03f16c619 Mon Sep 17 00:00:00 2001 From: Dominik Aumayr Date: Mon, 23 Jul 2018 11:32:20 +0200 Subject: [PATCH 16/16] Update test data --- tests/dym/expected-results.tar.bz2 | Bin 126486 -> 125742 bytes .../expected-results.tar.bz2 | Bin 10227 -> 10228 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/dym/expected-results.tar.bz2 b/tests/dym/expected-results.tar.bz2 index faf6916fdce1a017f88037657ccc78a7a5a37698..12a1aa28158878b1353faaaf8e56cd0e7882c778 100644 GIT binary patch literal 125742 zcmYhi1z23W6F0oL6u07~u(*`s+TukPXIb3cU0aG2cX#()mg2TRfrV1ExVt;FSSh9V z+k5}-`#xXJld~r?$t35OnVjq-ku!1-e=TdsrfaC?;{E}XivHt2|1?!3{)75KgTXFZ*_9NDPGmR~m;kf@w7QxGyP7G*Dml1S1j8D! z_qxQ0N&6f6L)j2s3470~*9R6_yNa^ayAl>i|$8Gw_zn`DO;1yjNn zyy*qzSY}ui5(oIpEBbIwr+PIY zn%%0E0l09d@^)uLn={O5mA>5#k*_KyX%&^b2tr7`0)Q^kBMpXZI&EF&7`8rRa8`40ssgJVaQhf zk0*p`2r3A33Zb2Ap%_BMTC@P6S#?4H+P^s*2r+Jz@`$x;ZbpT^YN=FwB76C=j4MbO zLtP+9W&o|^-?pNa^o7pKpo9Q6P<#bBijfm(5PJ<{x;ibL7Jr`5ln?+r52uDe1~6q~ zgH{eoKu=4>e2IxU1&T^dS5i_GntfLlm10*ig`qCA6aoC^D)X;2wCdrfr+;)Zz4QN3 z%Jj}#F1|I!x!bo>kKth|u?AGORm5kSU)Z33bigYV6j@nrwrdqB9?i7QaduhGH>P~A zgY{S5UAS$*S-%e-l&12w<7xQfWA;PjA7tvHu)o_sUS_Ngw(BPZrgNpS@m^b95-oO% z_ix^tQZ#%EcrPj1W&A$5^eljw@}hMDWM6M0`kAHTRF`Ixk8bKlj1k60&p0gq?d)TU zM=(RO=kBYdf~2O?(y2S?r0CM6J2B~`ufajiltsAomZf?64mLBmG^`l0a2(&MOUa&S zqOV9F{-0vf$?~OV9v*?z0oO$m*NcIEl0+VL>nl2MjVBI!LQV?kF6e?vg+i$?O0UGk zBD-a?7h0hd9}^i;8hLY})J_Q+Xf$ zFk`SwzJnQYaNVje1vZo_Pv|n_k(j9D`&HNsm;@+QG%|9Pnm%zgovK;BjkL#qFHESQ z+pUl#nOr_w;pgMy7vSUP=jX8>l%e@xO~8*NsNyn5{P_IP%Xr)$TSm_w#njwB_I8dt7LN`6Ddd0V?z%MK`%*Tbj5 z7`X0p*a!Ji+d^JLb5palyJ&M?LakLD_y=F35jw3Bc!ett4Eg{pg|eKs;Q-3{xqoO=V-qI2r<+{BkIK`}B@>q04hn%RF{#t!n`^pSF1~ zF8$?nwtOa|3MK8|!vD(A$x>NR)ehVIv*IpfyZB_SR`FD@K7T}<@HQj=??9Dz-SKP^ z^WQHgx{>!!l9;05Ds%KE%r@PdgGLfxgURj_Uh3Hhzo|y-fXDb@9+I-zy60HuU1SaqgwHQFJHa& zf1vme6-A-{rG#`ZbQQ%ctU@3l}6| z+r4kPu+fRCO>vzrK@)6{?isDv7G#)*ne5vbeY2NK^vry$LcT~R>A zCP!B>l5=kTxV)B~fKz?aOvuM+9`@}@Olkpc)atZ_?3$lQb%9scP`CL3aQdiGtw2=38p)! z$zuu`e^G`cD37*F!uvzK_7G;HF=B%(%h9z>b7x^bEDU^j^7{L+Bl}u+`OSRFrpC>O zs(YI(dI2FP6_CQWRMO&V&)VTU$co9MsWnMA$2vu7*^73sEs(b!t z1e}^voc9s}bev5{RPQUkl~XAvinCNjf$)Egq#6a|G^)V=v6%l9A7upp8qxpDQ^`5K zZS%W%CZAIy&QBKwrcTE6zcNr=ADQ-TWQ6DC@AM0`&$OTQI_AOhXRIN|EB?;#s*h7% zak&ZZ^DQ(1VaEB>P(}Qy^_y^ximocxI6=ScRr1!Ad)i<5szzxf+RgcQadg0Zt zj;00UV3XE=jl~poH*4DAf-)~ad7Ypzqc~`{>Moe76>Kz*;)B8ZC%Z9rH&#$o$fBq| z|LhB&Z)n%+OfsInlY9ezDh_FH!>(A%&h==RR@c-Sk@~;N`>zJ0tl-~q;(zLFsTnDx zld&Dfp0)hoE$mAj8}&U>f^+%*y=nDn94hZXAq~D>-Zz_Eb{_+dhT{1<{wKSfS6)Dh zoId1umUwh^^gu>63YV%lOBAXo{X`8T|HXf6`Q;^l{r%W?7krUT3#|#Ez+W7*BR=?* zGL2HRfAga1uViD2@yIGOOU2|?;D{Ve~c)7 z5{5fhn6jE5&4Y`RPsfSia9hVl;-uE!PaZdO2LG5s>r8sYpIq%HbPpTeMxVYgIetVI ze{bFI4I`K|NmBua0n;#z6K<;;S!))m>~Tx#Hqotqe9eF5qbEe&vkd|959v!;6~*AH z#7_;pW~|y-U0nzq5fMVatFON?pkj&D1O~y`9N!<#>D^bVZf*LHGO|GTXEb zF`p8fy$>MxJd$$_lEKu*B`**C)Ie6J%B-h`LMfYP5O^b@J+y&}U0gF}cPF@%lO%C@{a&T}i92SuDFg7IMwZv>eXK zRA6RzIjW`qQKe^repXk77ECS{8!V!R1$X0nkXSjjTk1k6B-Lm$snqtu^-L`C^kFJN zV%qJsaT!?@+(E5ysrpR{O8a8Nxz)fe*(qiv!)S|owqHnXA3kW2-bY9jhwBcfNw$O>K}gu7fZ{T%K&LnWb~ZMyMyPW6}X zVu<*w&fYjX#h?Hn3vaPA<{ttq%R){z+m4>!85``TU;|_Ck%aD_?Mfefw>F^V9P(7} zR6iHxaA_LwJg6nnotm^Ph^m65cKTtT$iD_auF?ovkhyH(!UIi|tBi3|}5R zl(k-FKX6wF%(R+#){E^xJ93=_e>AB@nD=W|PZ|=IL81OZ6SngmbIR}4870iCD>k6V zvz1QnzF@y&QD~RXv8gcJ^WWj1hRdcqqawkYIWfFN?0a@ktz!kJw!{QoNkL-%BUL+1h{Ti@78Xm;Jx{{C z2y!^Uf9mP+&kLR8?Rw!_6V>mBZOHTZ_O^}%kJr4VJuv(@eL0v52y~@*R;fC5s5IX0 zY07Q1Nbgx3z1>uJR!vX)$NuoGz1ZCJPjR<-0|i+3WrHP^%DZp0huv zh55hc)r>;aZf|=Qs^Ar_Dw&$%$Exjljwfuqq)Q90+@yqaq^l(@d;$Q>4y_Au@F9rU zLMs4LHPilehHPc1!J5q^?D;9*r2wtjt-I^5g@^5Ji)Ww$H$F93Lc4$AY0TO;eXHy|$f1^>Ug}TZ}<TJ!I~uRjM{$zdiGl%%p|I(AN~r4>{Xqu$ots?OKWt@M@!x0@y$sAg@?*_Y4S)-y<&35J z@@WxGvf<`b4Ax2Ql8O(KKHtB^fBw8Elg#27`VA)0RL0dSa_F_m9deX~_U5FP*rek~ zvS&BnqE-ommh8YJoO(zxVdWY}8gIX;8!v znE$Iy?mH1h1oJ0fp-LLwrsv_|#qS(j9Y$PJDj<2B*h=vIC_~4zrh(m^Kd+uciSl(; z3|`Ua4{^D@4)YXJ&QekxfqSWTd76+^*B5iSzt=IYfD8Aif*}F@%QJDP|5u~_8VLJt zr3+CKg(~+qw$q*TE%@q{H49JXy1Y6wgZ_`R_lt;m#X(oYaq;l%z2f%k<8{5Z`g6D^ zncv?Q2bmSMH;VFMKr}q3fbIPZ;0+>C!qt;BO3Z9y;7ict%9lX0P#Y;K%1s{lS2gPP zB0ZSh?s~eEwM1|!Shb_8u$tc7;ahIMs%(H@Rz?nFohh6XUO{PR8=LK_oXgw9*SvC= z>|fE@`!~m1u_^*`IuzWRS*wfD|0$1MsoOH|cnE9$q4~QY?Qs31Ra2}w3~GQtw^+N-8+aIv>lqZZo6k(@r4RnK7(!Z`e{yc{>#vcH$)>{ zD@ua=uB%_yO_(y+r(PHu$5HJj|FF_LmVZjs%5A7{fA2dq-QIhRK|CH5qVoH?kSD|) zc{_7Y<$hql;*Y3KspO&#&v4}PzGx(+000`=Z}$flXWA8XmZ4e{wUUJ~P1CL<9KE++ zmmhXv5T!rk(JviNO}zIm@6Qxb(-`}mKf67H{!VbGFXQ8?evS_ngTFkB!~=FZ@F&D> z7U$L0KiN-@?;ou!wANldI2$dr{^=;r+&7a+T3>{u#kD0c9SGf`Igs^MSlznY#(YVu^s_U3J=o&?> zN8P8}o?rA2xe_t$LTl!9zH0M5}|UEIw={$*fG6>NQ1YF2oi4e#2^0I!W~m4>)M;YBSar!FHe6EWr zS0IczP}fsCtf7=1uak}(sy?jU1RJsuu%rlSXvLnDS&wg2TpKkOTylKKJkj|>YYuz8 zSU!Clgf21lI38TGa1G~ZkTOpA5a?;h-?h~4z0nH46n58+mkOE*YO{R+su96>Rz=V* zP3KCQp1&V_HPh%c_w=ImvAC^T{E=qjYv&962?N!)ZBJh+4L*QRU7o4tmnvM~iYi9N zRVe9eOQ>7P0y7-hf<0_~;h*(n%w#UHL1lH~7=EHk?XgCVSv6!lXf|Y`MmiT^DJdSM zs)LhNEt*8hyTm&xx<<>-?50~*UE5q>wv7!d>b0#6wN67$qb&L=Fnu`3e1@>2nxj#} zlB;YhIFYRmZa}u=tkTp*m~L(Du;Sv%*59Pp=Bnyy%$u9fu_UtW5;bevw5&gCMNwc5#v&EVBDrle!0>O4 za`+AL6jbO#S`cGy$5xcw#JqVCm`&T#a>I&1vMW9b0Yk?cblW&;t zb=GCtnQc|qW@Tk5pJ3LtO(fqK?BXJ_YB%QW)Qn--Hg89#H0R=C%-SR(Vr=YctTZSB zZ!23?huIj*TN^MBQIRp1g?}sI;3|{xacN78`s?(?)mNuG(Y!JM;`9&9JO^U&kK;#z zw<~Y=>1{Q*Ge>6(kODOe3(Oy(o+)2>6=r5A8D1)+Q7ezwGzlq?QpO1ctdj0c5REsy#wU0i(t;qbdQt{V(dSw6l zap-r_%$E|U{Sc?W13fGb={Fw+7f=6ToX{+Y_F=!JB;}3y!;yvT`xZz8_7na9>AL$I ztKR=xpOpPrg-7D8MM!~!h|0V&uvkZp?A`ub(BGOWh8MZyv*&~_6yK81+9M-HY{Z-x z>G@AsA40l|&gCzAV8FkPu!CL>KL#*6c+WD5o`Im|Y3T*y!y6;M7RdRK%8hVHX04_? zq@R7Q7*9Y(@~=J}wI;R9cOIeZ%}Ix8F!AX?`h6nUyz2L_n>XB@L_b*W2~8JIKIe`8 znUf^H8Lj<&RAES6Jd##2*upv9Fqo#fgsmyOjbs1Vv6|$afQ$&+v+R$S@vubI&H2NW zJJUvmCzmake>`Zwx?FXQ-`Y)^C$&c9Z@=cBR0p>NB7MKxy&!fGKGvFil6|-vaqIwfd*g+&^1fj zwpM2=ivy|^ovbluL5{sjhxt)sH>)I*cVv~{>( z&apyMuL(ojY|5j~trTN2qBVI=IrQEjX&5^$i|ZPtT9CRysL$R>ONXeQdb&cBM=|+w zQ@)6wPR3RBGnC6EO5Xk*A+4mC%L*%J&6=yQV2@LKH*z+WtO)7F$d2zzz<+agvy7Z= zCQ2qIn#h-oR+`Azj+!XopVpw`)aJBQ!#A)5@o=$6E0xv+Sauk=Tn+x~<3V{nE!8Bm zG&I@m5*Z34XS~JSUh-tmbg$c?)ymP%coeab5B8~5BLf9P0s=f5kOZ6{k%Dd^-R3A- z5hpqcl$THqKftmnj}sY1%UN!Rib}LxtdSzRQQM$M&gE?p5L|E-UT~|4-(#{RER%I@I9&BvLbv{-LOoN`Zv+AXZni(2Y$akrBjR23< za_iDumbatdDN2ZWTum=)Oj0{cqt+xQ3WQ>(RoLkHkB*LzQQrxv9k!#A#yRKMgDwKo zMfa}lCaSZW?P8l8GBn7cJfn`f&tvv|v1Tc*;#`RdXf&zyg+Cjs&OjV^+;Rwi&aQPJt0?Gt>RFJ{_Al@UP4A z(vS(3fOIR9Y2r$+F&Qmok<7Ru-k&R_C-zgeh|J)L*2`~6a5*VV+9VTG`VPnc>M4^sy%ws?P%Uvn1>dK7JBS$y5sG) zgMPATlIpmG_X%XTWp&v?4bWJxL};)(iDX)jft}Vrxmd`v$pgc~155Q+-20#DC-b>- z9xQRZ6rt_MCxlw_KxkIj)&^jw;th{T03xFRxRNO=@@e5Ae>Faf1R*h)Bs}-K1x9kN*P9QC0q7~*&(6)?!&c-uDMAf4qED_9@6g_#X1>&8Xq@g+ zC8FrQpG;c&=`5#Kb%m%rWK~Tn)XO-5YI>aFb<;8By&B&K-q{CEFOIwnft82c;Ms|+ zTLd%R;u}ja63wJWrBJ827qzz382BnUifEEo9KWHq+}2>EIGfh^uC7wM8RW!f$qj&V zvZ}N#ytALrj0@G|Q%FnjSI`k(NThvd+_pwO32%*J7)c9c!yplN`XsMca7w*H8Ek% zrr|$n-08AEY5%Hgq&HnDnTTR)8pOY?o<*M)WSL%GV{$zv_OqhrT6p*wPvc&*ZnUD9 zfv#31C$MRUH9a9Uz@7FbGrznGrxp;yan@2oSVpHLvNSNo+Sw?qLJl3rC9=t_i{PNL zK$Uh8Vo&&EfQP?|4L<^x&Ej=`STtXb3VR!q=+yjjQ|MxnTLOO47#PRsSlvaXWu|gD z08bTtOpRt%Caw=lSWf|@T)SDml>Ph4&8IrkT<89E|LgF&j z8bMn=PX~*B?<3g4!cy-iqX?BnPnWKh zhQ7;hBN-{vK~Je63yNB}05&=WYvimvXKxFGy1hi`D>9Sx1ZKC;S@WBFWPQR_brDVh z3Q@};D&|?S4N0b|Mt;2EMaiAxpFW^kWIjlMlx*_l$ABJ0&(rhC4J_|v!Md_naxixE2QIMm3Za7mVasX zi?;HkNRFQRrL{*w>1vrujeqVf@R!j* zE@qcp};E##Tkwye#dfKHf%j8Rp0>R}kJ{5!#kz_~n&-||QLZ$UNT zZPT$vgA`g?WHWI(qj6mE`iU^3rs)>jHhd=lHO>;h0cw&6yMy?`ASEGS<>cWLP2|Vu z%^#2coxgrQ{Q7lRM9;ac!BFIpxrb&!SfBrW0}or^wZPmI@LP9%x3t6po~|=OuVXPg zbP+OgRVQ-aK6)(;TR+@iJxhH2=9DjK{L&ir4j-FML);>^a1`Z0pkXcjPl= zt5Vwg?7*e{c-{LFZ(pr(Id|xf&EhXg%(48h=}u!QE81((HprS~g^{3qMA9MT{$JB?;a`ZQq6I3#5hH-SElfvsg`ls+xGAq~&z zDZ%aI=zjW|vDyLcL9@F+!vcWk?N_u+ZCjnBJb5fv1wck`XbXXyd6yn@qvewy#3gT_ ztfmBtuZSiqzj1t%Nui*vpm_hBAS-LItwLw`mAb=0qEn<*X0}j3ty8Bweann-ZnpIN zgl;$ud~2r!R{10RL+^thM4p>KYwfab$(-zq=E{rSFVxXf;~-C_1gZJp#hl=U>#FaG zuIfMuXKlGtL3*L^Ol~Z$-1$6t&E3nq+wqaF&t984=Y-IIyV&h0p^o~bWQ@ml{E3t% zX{pPRm9TWHK*O*i>8Q$vCD^!Y*!$vQlC#G$YR2`9?6s*b;*#AMv2i6b^t{4f!&$NQ zGE!Sx526k_J`}Dhi}{w%XPGCta4@Z^%(P0#*5}$C;dIjJk2SILoJ6CXYlUhft3Ao- z*vBZbW2a+2Xn$sC;I3pWxWTN;pIs(mjBes(v9D_a#lXZh%o7v3=85J0ozk0xDdqY` z0JO0B=XwHICX$x5xtb@_Pba5$3EOxwH@yy;3V%%lTl{d07cM;&sVMGH#vBvJOerzH zFbtl}RT6g?)Xo+p=ua|wO(E;d*J9@%H5;hNTkc#jSjG`^aXR{EVOX={dFE~mtHEvz zcVLQ^Yz7(C1<2RemtheKHw8O6E8*yw5+-%LR&N{YE~OOtk(8OMS?SO-%WXGrDuQ(J z9UE0mORyyhPtm_k4$`O#43nL5o!6~)c1r2$s_Sf?X;WWq*WhFT>-f^8e#$7a3$CAw zN!H8vHaq1&$PacZmkBi4y4TaI(cE+iH7$`S=pBQM&?*QMTC}Yq)|)aNGh8WrRpaoP z@Hr`x*`jvA5U#H;ISKmNOl2q~YJtK4y_0xC*UU$12eoehV{8iUOr^A+Qqb_{8ft?q zBOoCP^pps48cBa{QHi1U53kzWL_G-%1s%L;1O*Fm%f8Ct@>tFuU?w(+({+$kacR{l z@fPRY+MT=BK04`xouSi2T&+SHb|jF!sluyUhH#6oy!1^0EXF3FHHDd}4A;wK5l zHY_}zSSIXi)Y_;rwJJ)KJ|SeG$1RF8I>hgIfrTJ7Dl&?NAcCMypkauAuwgXE79>!I zx~gbUq_%T2?BirM(E$V^cmo zYb^8~5!7hydGXGq^_wA2@p$f(S-ccZG(ic3Tnw$tuc>AptPO>hgTYErXd>8^v+-Dx zXknR&*kb$|Q7-ZG65{xh9Y5A4i=vVPbDwdt$pbCNTj2j!s3E`E-}k?=U|MJc)-s~& z|H=x;lrtR%Sg`UgQOnZSV8;G*G^o}nldZx>ZF}1Jpi!lL!0FueD8)0$@T}xro?0*l@kH zyQ*Z_$$$k7yN;F!Hkk!MI=E0gH{Yo$)z|n!jjw6LKfO6-47hD6EOwYLO71#GGJ+`} zOAxJbK_Hr^jxUf@u;y=eK}~X2g4ODu6Ggf#=FwphaDBSLJA&ztA)=6A`2V@^F@$=-=@ch#7I-3t%ZHT~ncPW}d<|s8; zZq_eSf+s>oSWy#8p&;}aC19ogVEu1&A9vbv?^XRankR-yK&{c9kD-YsADh|m!^3Z%Wx_Dgfb5QV zt!6^Pvj-cJfc^J>?CYek`Xje2jvVfx^_9Z5GGT=q2^%CBG%pQ-t3WFG3{8%8GJnO& zsygOCKn7y^iLU}f7Wp@t;TP^d7Ug@PC&rSUXgb~k(Wa1McInQI=4R`YH|@&N z@<1d-^}JU-H}SYfJwe@T14{#eC~Pzu8hYPPHC9-o`qIMMtnymhQez~8eUuEsm_%#3hDby7@g#S-qhw*&&~@C#C}Zo zm9L3h+z5OxPbsM`A#)_(J`87x)6s2oY&`-*&C|zwwPkUUt5}syEEJXHsi`uvjJecQ z6^X0H*@<%-!dIYOI$ckJFcDT-r;;(Sbocy-wXq@16Z~@_6SFdQoxl$v9E9{@3^it) zqb}o^B1M2sRo6j_w7HpCz{$hPHAd}94`?dc#G0h_c|oS=9AWPF+}%csAM@f5%h#vxeOS)btC+(D_}0xuPKEQQgIlKZVymVXnhjPND2yI+ z>?!Jy!5)LRrgiH3dGn)|;|EDB;&P1|%wAPZdh9d#R`n<7aq(1K*FxcpNiQ>I2A96> zki4YS+wuJ%PxO0ygOU)c{XDWPPK9G67Cl7&+#R><*|>T@T^rLhw{Uq+{`@+F&gJ;1 zvD3>eXgEGIZ&~$6PD2VEzi*USK(iE9OEejEtr~oE!B_+L$!2;kgcEHrADbaq%o6d}2d>6)L< z#{N9y%3Wz~V9VhijLDEl;K;l6kFXE^k-8Mbs0zE)YBPNkC|&A^aN3pF#=r>+wQUwmjD zf2dl?YqEQ#mynej18ThfROS%sNz)<>)%5ySqQ|F$qf9Lj5cXB2(s6~@OLK}gz5c#v zS55(!wA zlhi)ueiP+YF6x|AN{SaShf;m&oB?QB1w|Z|PTW(aBB?=jdqC#%7%)9=+s_m<93qXS}Uh&fSS z2DRE{v0t{=_7H$-N9+x>JsU6&_Ed%RoGT*LsaKN7qo%PVbO9Xv<}uc)`oRK zRp0&D0$k;KCZsv5Z`yS7nQG~YZ;T@JfJ@_inHdf8 zsHhBcdPZrb4^GjuL5&5DZL32c#myp~R(fsU3x9;%5<}c1A;iGx)f!fJrHW3NQbNXB z2F7h-fz4de2*~Cs@G`xRSFBl~s++IyMUfqPv!|BIp`w$a(R{UOMNithVtbOH#|xHy zG6ltjBR>g7?uWob?$SSh8Kb#N_ku3rjvq-OCBy(BKqvv44Mz7!@ZrX{voJ`+y3rGP z70mF{Et9tJenp=e+sJ_7ax*cJ2IH{)SH@s#kC~4-k)XI`a3t>s~N9eb@+M>_ufDc1to)~(0_*s4{r1RG@DC(m#>OilCp_G+cD0K z?~Ienvi+rc7x=4)eQ=E=@brep^*RU8WGJCYZquO7Rp+ymCfnAGhnh|77z%pbLhL+6 z&?H_tR|>d7+&eEL5xw021GZR;0=ALw;%3kfosfJV5yW@N*IE$?RCo8C{b!8~1o|EB z^)11Ij{DVXPaDpw7iW+-N4Za5JN(?+-B(HS5%U*G2eUm9Ii-t`a?|}Hj;ZSyMNU)R zn-K{wJY!AF*2Q!DMnI@Tv06q+d=mF@u@-mdV>m;WfjW$HA{!^y!Q>7ACuCH!hvKIziV(FJ);rUS>n)+FE%#>SxCVjJ-r1qF2(tdG6VqGuI9fE}zb&AE#(zo{xb-K*nYuIC9^&|=KW z1jv_g&>YkcEwhn%`AgkQPdDd%%WYPgxYk9&M+%>DhFaj_(!bndxQ7}#6jI;!_B9#U z9P?=P7;d+$8H26D%_j2QQ-wns_4!6VZHtOQ^4+St_OX~o+8gu-f@AMPG5W$RZ~-?R zfHBJRYP0&fy#``tl9x=M2;3qD@5mJh4m(>_cY`{c5g@k+I8VG!VLdy5Ryd(UGtH#g z8zFOVCb-j84@r804DE?eMwjj`Asf8`RKggLLNh46DqHN;0?I=R56%#*6Z7+)xb=yh zuBYSF)Ywbc(FisP94h2ryQ)6%h4_1^K`y$M5BE>Mf)tJb78vt=IA=W>J;zaT#C2%X z>F0>gAPoT5`e+xc1qNoiN}IZYGMX})FESBNuIq_pQjytGR7+Mxz!AR$hsRgoG|$w>m^HR%P1H2fJc(j<#ztY4uC z06?5oLr&lJ%BLUCGpJvP;VXV-y+}=@@YI>w+CR^ZaxksH&^3y03z807p(2h5wg}$KU__aJ^@x*1SwKGPplJ7BxY5}Nt?3HZR?)!7gCC;;)*3r8l#jZy|02J4zCQi- zH#X&~;Pvo@g`FbSbnsEtejSW0)~3m!fUUgaJa~ECbjK${X26NpdA+x>-9*$WBJPKo zInOyl|Am`MMnuRLAm?4(ckO|z{zFz)GKS|pa(`avo-uw2s^h`C1L5YGg0mUzq1WPE z)Ya^go;Zx)xVXzv;y|bI-1v7N+`mg)xVib}7I~LPQF|cE%aQM_6^? zosS#P)`fe~l66_E)=S7cJrFDT;I@m}?G}8GCKjEIDJPBJ^;Zt4uJZOHex5$BoF6+FYCa=PWn7wKpwapNO`55`lSG-!VSp4v#P+oL3!ByMRYLBPU*VPWe0_7P)G57q9 zJ9pjol}uL^O5Vnx6yFp@wj?Mlk~Zlo*mNXNpK{qmG#a7{t#}_9$Uoa~pn?^6Pi}*t zv36%WtaPSyMhaU)n5af;Xzra|4}*ipny!6EwQy@%qzVurpN-6(VUF^sRhIppZC1^M z>8ukNUW%Be{}5AUf5SFX=0aYv{Hp$86LEU}+2OYCc5PFa4Zvp_yqwdSj;HX0-{|wR z_EU1ZUiM;K(e`!dzJ5>UvR!{e-jJn9V?AuTMXL;3W%97l zj&liz$Zmu($Dxm(h#G~N#0y4ihr1w1>85q#83o`9t!E72fIhU&n^tkCzEbj7<;SFY zt{%BNFtj3LNlhcBNv_RmF)cw%{9&xTIchS{dlgH2$~D;InZcBYv7Ni4p4vAXZdl(z0QS2veX z^j%8O{+$ZyEvNVSszZ*BDg~p%qySr?w16p0KmeKyUO+Kn2?Bd*Lf(7fRgT}2PvC|) zeV-DQFQ!<55x3uJ{^|j3lS>{e`KMi2ULU0fY<1me$iKn9JWPR~aU)n7yIpczBKJ@& zn6+uGv?X@OUnXC1rO4OsRfcqJ(pPEhS+=appp~Crf)E>*0UjNK@C~1zwO#iTmBAt- z1C|_N%PZ2{tJy-q8|&^H6pMBozd!Rq-l^XHytdN9;Jcnry7!JuxB2mgz5Xc$Z2BsA z+3y#B);N$yJu3&Vg)LfiR~oAo>V<&si^CAb`Ec#hv`TuI|PK zpALZ+(XGBNd9`@D%pi3S>#}>)xqWMs-sNujN{4Q=@WS`vh&3%%p(%iDWWdW*?`K&6 zxhQu^SF*QvYm;M}TRU0T^B8H&%~+Wk)^O7+$cahQTWn2SAK=3Ajacg1;0s-XBIIe8^{TNBxxR*@up~QT zu#``S9ieNA$m6%r_I1%Hu14 z&-Sg5CG&6Ck({r3o_uPbeJuDmLVWINYq7P3{1un__KP_(bC_RUa!EBuxG!qiNjF4$r`sjeE9wN|H=~|(bMBt|Hi=}W{KGI5o1WU4nO)3kx>-o z-!&@6UmRBcmtHEl6oiBQ0xe=`;1BWrFh<`U|4#;t#)!KFX(FOw`3TfG z;>M%*M8jbbM?R=?#oq!Lqdm7AUZmWb!Js$NI2et8bN-?J?*e_SdOJ&eNc~~B@6Yi0 z3(G0wANkV9=sijL7Y!l(^X4^v64U`NF#7!7#%$e45w9_zS~qniN#5tfK#bAoC&qup z?;}QSj)Bt{y=M87o)IT?2}v9leL-zX!1(pWdGa1T&H;aabXdeS6%i`O(l3T+Y@C$- zzO9?L7H15}ED;gJ*7#d@{J$BJhWGfp2#Mj4u>QVB0_u-wf1-c982m{3i+JZn!`m1n z@wX4iGhKogEgl{oAwNdD6Z;=<4kQ?r7~fsJD0zB^)A#=|bl%}?zHb{3v3IT7qYW`z zds9UbBb3^sM(n+JzfmK!W@5$OY7?a>ida##OJnc7YSZ@jzW#jvd!FmKkNbYE>paiT zeXaEImQ+242GM&<(}!P?Q_)QI9PRrvM8Y-98#(`B<3%tBOH@1uw|$>IA|3G%uSP_l z$tiGY5yW$8(muW9RxkcT^<15HMFqPRs6yJi6||e*_)F#CgKRxWm%=${)7JtOsKox8 zU0fHOwFw9;keHbAc~;gA&>C-P-}&KgrP}>pkWzcNJld% z9(F%?yLP<#S!%s|Yj%>+%?{(Y@wn6XjH=f>XiC-a6Y2IX$w#W6%p_uq#CxQB)H4S& zN&7;M@?5P!om|TSFaK@)2SZ$|(gPlmjn-2BDN2p-s`FIQ+LAY>Pjg+J=(KVJIsLEv z6qHSUXf46*KC58M^gYXY$T?X$*Evtx&thx{;~|5tbH>0%C1u3(O-o0&Hy<3%mOiHV z5E6*QYd2Ghtg-kfdLJpfv(VB)BVV7fI5TGrjn1%)dT=~V;rZc1k4siFXBCm)$jwFY zIXefCJ!OJoFTaZk|1&EQ%?#_X z40tN#%;sU4(o*x&I?(q3D%X-ZWCrGV>J*SPPhx87tFZ1PK2EHgE}>ne?{@He_N;s&o$8 zB~oY<%%H!5yn}2w<*Jm-m;wVwkJsPy!9mH$=ngR;EJeufjc8fP)Zn1s0@{W(ak+fS z*^CdiiIuDLT_3EO{B7M}S^Hr#E~!BnD$6v);-@#*D%bE#51%w{>SP}j+y6liG)B~0 zy8Z;_#wQ?{tzK!S#p)6?5>kP#w0Aa@j7gRsrVp-D2%Hgd)Rz%2*dFHabk28vX3a9L zZmKup+dv~F3Biozw#doNrwg1*+6P>_7A3wdN`DBTvyPklSuGA(6mY-8FWfnb+ z!!1?`mi!!ZVST8cHOr{Rs5wsxqaZ7Nat4G4r|v>2wa}93yBUoe%JEC83-m)L`L9oR zQppW#9%Nv7V-v+R1U=gbU=B}79%5kmt-~T4o&$%D;x)crx>9o36b^-|xS+n^qxGb| z-kDaXz!sTKQ{V6M!YTN<05dZviKH2oe!Qs}%Ul(SMf|vPRtoEl}5Xfwd@V>wHtJ+{4m(CS6x0G8B+DFxQ%7;h*0ifp+h!b^l@MZ(%9r z-#$#0UYeekCF5;O59^@HLqJUe>z;{=W;y42m^QOhjcqiK4mrPCb`&fSeiP)#?(D+! zJvkoZ1r(EMk>s40)9d&DTp-LK7#lcwfcaTdTj83LTfEUyGbL9km|1QkVKV4mTQiHQ zj1ecFZnZJ}P#~>d;SOaRYBRNWG^rD9@l3)?5`W4^UlBWHkBl*F_MaR|&yq29 zb2c5a)a(E8m??jj1!pQXCz{*T-oWA7LhUFq%v9}H{g8W5_fj1b#g07W*KyR zGL`FqhB<#>%6G-dnCZZr0@9sjOzi{f@||1Eo9jKK>&6zwHrhAbH=4154Ps*ry76)i zdJS5_B3t<#{=#gTb(Kq$eM zCf{i|{HzedP?LH`FBhF9>4%EOI}ACSF8qKk zQqr4mU;ffwzL@&`W3iF*{}BBZwy*pCz4? z=$SfhzpKdYm>5j}N#CXH5UJ-eg|1!TT?JwW2+>MqR1O<<(WX1}2dV>KW#aOXuDjJX ziBpvppFArP%`v)4r#{bre#}vdy|J0+T2TztGO0Bs&-`sos}SC4$NH3qm`ki#JVP2y zmGrrU&+f{}k12`OQ%F2B{Z(mJ4o;Z2O%FDSl;COBPACrIhxkpqS?lw>p%#<Iu`?J(DAhY*prRncMaU>(EnpNPDo~^aItg3{jrlzWRzQ17BYw>0iGFVd9D|($l zw0j+o9l2;zW=tgsXt^{=&j-QM^gH5ENZs=Hp%Fc^go0XcK?IsuU%DQaCQ44eHsX-x zpd#7n%#06YCJl;?*asGz?2wV%v%TPpH8B(h7{jY68QM+`{deOEg`c%LXItnVgzQK{)qKJQot@hn7;V=uYRA zdpP zr4e%=#3)UL@&y@`-ev$LPTX{d=7RmWnj6c%*tX5~B`Bea^& zNl|PIC3pCrikI*G+8^-Sj_+Jtzwhs}%re6p_Xm1EYNX5s=Kz8%l#8rgqby}}HA>uM z;))yfxia}{m4Ezcl*fTv!A5#wcU|B&5qCd#9wyh{9M?kLK9`=a!ImH_ib(*D2^i19 zvq=)vl~Luh6iO}81WVmad-+%m;lR)0pEc|HeY2pg(Zv5T^yc7J;6!jPKvb9VqZpAQ zhTn1x3_YBR%W0vf@ylJOv`)80US0z_4HIE=`!WV1Lzf3b0$EDHzT`g*AaUiwM?oKp z?_2^4P@zStfScI05fvC-h0k6|hhKTx)yAL4i=U#QwzA$rNyoUseoH~hwE`JbVBiyR z8<~?6L=pUqA`yixF!Vklextt!(5WB*(VH*axqL0_xv1YCb7v7F_{jK>VzREX>_zi^ zltz15d9hp8CQB?5dp5IK(4bLPeK!qFx!bjjtXU_}kt;V7-j!;aDPD#;GR}bBDX>E* zTQ1y=3f(A(lqE;%yJDnE3#PMHdKC%iq`TEI5KuusLzVD$2>m;4(vuN^c;(Xqu;_rpy;EPk#NnQ^mz;1j4{NMC5{K$pjlL6Ys?>oI62M|4EjZAUSe8 z5*w{oyr#0nW|e7N+bpwp{qK|?5+w#8+=zjJ?5q<1QL`!@UyRjAY)DRxlhIF8(4?UF z>zhxMN(Kckusw>_(oe$v^+J{L6YTRsV-=H9J-8#%V+%&s!am%|&J5!wk17PWE{Bmp zjp=iu=bVI*yfUHy$@MQI&sZP|a;o|X$KVZW4ipTx?28 z)C6N2T#PINZpYa@Df(~8Lj!|K7CJ^QFOG*kTr2YN&@(r&OP@4)xNAz05CX!7EzTHq zNG1a;#4=5U$cP3$<>=Eg8*rLgb_*|s=N>;hETd&8Tl+oyAB};^Vbc2gwk`1t=S&}Z zZM0bNi_i#R^w(Y~eIBP0d-x)C4;PiUu1PQS7cs0h97npltrUs@uX_ zPE$_k`MIAyJ^^>gKS)6puU)DI%+BCtk-JT%`0kI>4k#c=NtCd0Wyg+hS%?CO`f~gq zcYQPt=+4T8LTpDp0_t^T`S9a0H6|&64Z>dxXrHMlnW32-td$Ii3=pww-ox)f{ecCR z?T#e12(W^J+|p53cG|_t)(KS{!su=>QhDY}rr)Y|gwyCG-lq0Pznqh;-!fa^wf_O8 zYfI4>V9q06OiggywoL(?v=^{taEjHE!fMFrYOLn)|6%Zw{<=cINc~=qI1!l_SD;pf z@e#q~XY?aqJGjAeUh7zh=K3h2*Ga#2>#Y2}yP8iWRw^TPo7@XlNdGF0V&8zmEW zs3tY?@R9PS1chl+morFoBE2LjJlUZE-{s3b?3&DwSHR@e5>l?5l#4#_E z%{Q5x8zpiYwIrMrA0VJls(n@+94J<7`sV_#YU`iQAvHUAvmsSEi~u=}K$*h_ptdS3t^Xt>Fsl%a-Hw$mHq^3U&g7URBUMjYNidYgTD8W(!7iq>rwx7+q)aMd-Fa+z2 ztW0Y3Z07~MAlZvX$)K!%^R<$J1OO@m=C%^iDN!Pwz!o2u#0~FW4%uvzfUmIM&v2iA zt@Kd1Q|{`BB+?w5M2!19se$&Di45ei z9q_`CHC=EkkJN(z&>#9TM<>sE$8MERDC^$$oJRTJhwX77Nvc_GRo8?5S;AiYZ{%cM z-ejFLLOz@x{pp~+h+mq z2^IX?^J3%3F_s%1?Fz%FnpnP%ECip}xS&YoPh@eV5dH#@F);B9MpmNP>Cgw0!qI0y zsPde$m*Z${=7#^F_iGhpF&uTrzI{PqR{o9Ed_e&J1wvY598#%&k-bj-PSr3Y!maj= zCR04k&jd`f8DoQc!Tu6SEZwz%RA?$q1h~L6tyl13D-R`Ijm{PPM)Q~RU`cG(Q&I`( zA2tPrS~(}PZi!tRH>Ox!g?)q>eVdL!!Zdy{0{{OyI@uoBf z+`0TZQY;&)YWX6#sU+c*6xH;9dBeEf_RBH5^NH6bEkXF{hO7Sr(@5x-=M}-Hc+*yT zv;Q?33O)^qzj=S8Y|Cd{CK$r`O)ui?#0*}j^gkuWBW1Iok&A*8uezZhH9Lu)$ps+K zuKsXdr<+Fsq9Eg_GTz?nk(;S0@N*A0gv7Jn{q+BQis;fWk9YzfuL3{h9?qG4fjsYF z+7+_>^3z4|7^?QW?0jAyvZ%Zr@e$f#&(lQ4plSTik>$Th4!tdN>WXqZwA&POrA-_ z9O(6H^us0SDWY!lR1a`BeA4w!$*n)8iQ*x=p9D(D3KSKjNc9Rr(uMZMeRBEZQZ(Vds3^L~X4dASNw=W65^Tu$a z=+*3ya7M8w=pL$kun~klKLg+Y%7Rg~pa?_=ZJJi$(4Ovmr&N3F6mfj*qE+zpcqc7plzJ77#eHAPcUl2KkoX|MIo@whXh5mi+o< zcod=0;yO*oHwd`0_ZI1IEn6_<>VuaWnN*fsX;VDA*h(*)fGElGwvW6^X53JH*Hi3m zAFNixrhw}HcOD@PHeTe{$&0VbT|c`ka_q0l?c(tHa9|LFQ8axaD?C&b8EybxyRsdt zzcp^e&UuHv`JK6l_$XO6WTu&UL;29F=l9L%vdxq!EE{gpHhwA0v}yj#uu87VIyB_XuJPy?O-7}BqkZMW|pg|JPJ?YMuO8ky&HWvlX|{+xF3hRNCn2hJD2dt!bDPpSj2WY`GlB`V#VH`&3jY$rtBREIg#`q9 zD9?mOfE?uKP(?PVyf7hLKkiX{l9JYXi$;NA{se4q3Xb4R$^@^Y0@hoiODY(_IrejP zs$~MmClKi}{NC|8@}eZF2<%;$Yh^szd9bv9Iq%$V8HJ~*EkiFNhJq^CNXm<%n0331 z5mWsCiw5j|m0(i{2hI1*yZqb)(res-&(<>9p)R+NUTD#=FI|v&_i~fkMWkD5wJY*v+d#*I{n$gwBh7v z8`wVnDyiv@`9Q``1XfEhFofL5ed^+^`@z?vaJR!}Esk|NAMOwM>lT8pd@vIvg?$JJ8WxZZO*8BSx3czV~$oh~7pQH?EBy$n0o7-Ap~1>3s~-JU$4 zwar}B?^0TE!|!S}B#=z#u=I071Zly~uDQ4Vd z25`gAYETvrpaXrQe8H*f_$1k6>M;sI)ln{xprMIe;M#uPtF-<3f#$O>pcsBD zW|dxI)bklWN*$+{^h6+`v=2zy`SLp(?=5GZ_pz=7@!FWtfW0k=>{k;F!QPPRz&4ZW z9UsC9wI-PMpr(XK3=7YD@$?z1xLzu!@20QFl34T(bb0kHo?DKyq3en=7*4IoASSn zchrV9$`VtTF9fEYOSlobb55dX;t9lILjqOiTtr$<<2Hs8MPL%MYK`#1rzby= z;s_i$_}yn3+40N5i%{pkzz0OJIbcLkhP>2X5!NB=eApM>pd7+^>_)&445&upERsFJ zKt_F+8g(HGbrHM{^K@W_sa_&Q+A^D<>Vlp%eUDeNy?8Vzf00q6jXs1kgt!=%m-I3G z5Y7>IV5Ltt>GK0#`=l=UTrce+ccwI7k$x_-%m&>o8^jMFji2`g4q%nbMw)r}(|{|V zb1us*W;Tz8RsdfTqaQNwU9{<|UsG zGY4*D>lL<3cMi*E4SchFBG1+f#+i1;yXI_LW=}^UvOO^MH zF^2C9V9BD_2KdUMk5Vl-QkOEe_exY%3oPJ|KY%jSInK7oWsrB7i>AVM1NG19qlp{H z4Y+JEwx;i$=>jZN_%F?aiYe!yA1&LQ-&O=r zpH>o;WW*|Qk3hw=Z%Dp{ft%A6ipfscF`35NM^ezZsjA@ z#V5Ecek^uppTD(Yf7BLRNB{rrHj35T}p~VBZ)VuP;ffRjjXI10v`8Z z)(0{;fo^%&bfpS~hiU5-hY!<#aJ5FHf@fCczRJqIPt(ZN>5nS>M;cIOKST*65|AwK z!q_WPpQ`o2K0y|*wrHwSCKR%;u0OyN*@!F`k5pUhual1r1$j6nh~Cr_N0#$&NjQMe z`ZWKuif2-8p+LK=&hSHiU)zHb3i3U37e*qvG`Fgk{IT$L9k4Sy=xEXt#wasu=p~Au zy0o|D!*8O*zRb9p4znoyeD?VxZ)~iPVVXK+G1le?*KO`#%A(0|fOG~DCxTh^y8qq@ z;`tLd*3+)Cu&|vS-6O6OXwK27wF5pU`z>iqwc-%AOs)7KhR^G)s-TjD2#>9x;QULy zzf14Bhb_hXgk`M5DiTKWb;x>B57Zzxs|827q+2TG<3KP@dLB~XsQ=iau06M5Yb9yf z3bW@>4OZn0I}e25=W*2ZF6z4KFQ@p6+4NXUMDKJp}}Pzs&zmK0}cH1Suf^>XmXQzCf55PeUc5Tv1zTCmU|UQBzBz4Hov` z@DKk8W%;uwD5F>Z)9NzwsJS;YSwR>ZU0>6_i%IEGq_!10PC38t8>_qW@4A2Y?s>#u zU5MJ$t~1yh!8BMPbv!H_Z}!cm=;`|Q)K0rQ@gp*hBuWVj;hUWhh5*x>F7EfQUOZ&-n+XmMXn0OS<0wdtm34~Dr`G6;}QszL;7x#Wx0J4qLYC zO|i%Bpo~ZQB)6J=jG<}Y%|!55Jh{wJBVYyn`db<)TEPuG;HIT^=i~^Y?#|oQUH%gC zEGo76(kLe|A178hVE~~XL5e(}W-Qy(XU`hYdZY7;YX|xaPV&Nr znXh-YrudKru=A9-g9~U8bl+gy5v7pJlzTX?-vD%O0K?ohrbj$3w{N;Z00$#&Z;Dh@ zw5JvC#RcPY$z|BDcUGRJjxmW+`52Blq_yS1e~~E#ic`o)9Dg8;t0}wsy6mFo)X^Oh zd72KYFdAm2w}AV6$yy{vSg!2Y8%Y_CFSe@50;I>f@}!^YQo>yX8mk|lH;3FY<-i ze|g$pr1Xh{)E5P^qNri6vtWMTZ2pSQoWbxlKcHVInw2-&^NmxRFcXmo3|>p1iU~-t zP9t3uI2C82`XEkd)gq*jK{8z~Gylj%9hi48wYcIb6geZZHxd}wB&`UOq4m1!`7oIJ z*-CRt{fp-$DL@HOO!||&O&>*$v5Am)lPDYe-Ard)AP-DlLB^c#823jZ0;>{rq zrLC{NvS^vEPEGz5ZXAsIZ75p>+R+`-oz==f< zOo^!Z_*vx^0(j0IG0?wJ*9G2?Mb)=0KoslwBJd`qUOu*dw&?P;R2rhlH~`QJu!DZT2i=mnePlQJp2MJtZmf6bK+JRRXDqgXdITY zr#@~sQ7(iVYef&irBCm#ebz`D_N!&s-mvo_t(8_ZmpSCV-l`$|eX)e_C!CP*Pq^ay zVm6|)D)nB-*$bJda1Oe?1Fu9pEDDb`HiE(RbN|`osjyC6ddfbfL-_RG{ten3ctO*l za+UEDRek!+Ai3pRNn<=9l1gQh8R`kG&L6UL(?FH+Nn=L6I`p=)#$b1%=0Qq%FASKj zADfNKXKZwJ3uC`ZuX*TNG0$?~=Cu-Sbo}FxZ(or1hJ}Z25}zXQGlOp_ex^zU9+2Ls z(f~N5*SNmDYuPyrjwC-zTa$O*+FM%3>FB$0;>sdhjjE<3V9dt z(|dw?pN-np;m&blE8ieZtMAD9oA&-l0+teK-`Q%Xr}MX*{6lhFzT$YU=Bdxz`sEaK zQMR3%KCYdu>DoPB-|m4})>XdUomED4fVL(h{`}=|+iJ!auq=7Y{h4PxoXn64wS3A) z!NpD<=nlER#63a<`0KS}V@^|e)&o)V59q``F%FfzHT<7@I7`rVc&&86+Rt#mU52`_ z2s8Ym+xVbZ890|e6GbtSSX~ywTd#V58a?ZG8${lUnAt*03l3BogosyP2UJV*rKd+% zxkkrpJFEVMTqq9PvB3kYr%r$U`}}!=^wbF%B>^t>hLlZIz1#7yM&#yC31!cemRG&* z*jhROg+7aXOEW>58GNtO8g%@a1GAi;)fgA3RB7g@(is(8Xlotj@)L)hT8%&L+h`;> z|D(VS+#mhS72cjyc9eF1E2FjhcoKI>YCoQZn+0lYsZ@bc)nJIq5G!LP$EFc<>oWh0 z+c>f{QtB#%Wp5Z-ak6%^=sj}uTOmjo3&i2p&G*C4B>3sdz&Jf+W$GUwYHVmQs34Da zW<4>ibjIy}694HlH=c)|%bZ`A^lG!V9}hK8pHak5l-# z$rsUfVo}=#aRg4saWx6$2wjp+geexu1^g%fW6|sQjzSf?1tn6W-|d_F8xpM2C1h#! zRq=a0XE$q)l6)537NZ%^-I3Jao#?w)jxjZ}M0o~=?p_ddZ6=&qtJAs2Z2CG^2H({7 z=@cx5Z*w?N2 zeY(TC-r{K;yO(H%`>1V~Z+CFRD;e=5ypywja-4@yl}`BK+^#O{oeQFRu?^|3Iwk-j zvL{R`(p)%n-QUd!lvrwI*OHPnncC>dmkn`jXsK~AZbhi)zc&Bg$@&O1mEpi;jT0_8 zM0XRUU9_Zw`xs1nLmL>}RT$Ea9dO-&8Wd?nWV))Ld=S9&51|gK@{o9g+o}ua@k+lA z@EQ=w!UrdnzZlYe^#o~p{Grq}(=!)91kYl#{YDGxGiR%08~r{ufGTmAv^UIQdmQs* z*q+iG@8v-C&|gp9w(HUeKVH*5A~SPvTY-y1rV0I_DUg|6#Zlt(u!u({#>OSPHW1ZG zLc$ST!>tXZTDp({Hc8k9$}+MDC2vyq%(|lHnl=J2WhapSJbDiyCG_ciP9OhT?BV>) zp|fOFrqj*`N2_2wvvjJ{Y>b@b@)pX&!cTd^Uif^oiL&YX>sLHOKI+G!#S{GMjmIgKtru#H%j*f4e1vF*kug%~dAZqiqNXvlcMkn4C}`JZt42b6OY%JP$kGch1xxTD4MG)>X&yB zFN=t&2C8L^ll6-CTW}BV(zg^5Pj3q3PZhgaUTCeJ9rq^a!oFq;W(SoKP}3W)^TrmA z*k6)Hu2LhT&^QTT4d#-Yp(hBS@*=6g6V3VpE(T2oM41AnJzmNYURwxo;pF>Ama+TB zr3NyzQ3QL{#`jwm&|+9RK}^)+vz61;wXPsF&)x$2JuQX`{|r)Lz# z-Fk)5_;|^NANJKMUv~&7pU^4705S%}k-#B?OkIAK)TxWEoh*VwIGIRMO6%OFvoD8l zs6Br_AD5V>#?r{%cV!|aoM7DZDpfAh*a9%<59k2f4uvk>=W)vAUc2jKcbkDkz?^Ti z1a$cI$w);hvf{|-O>9EoSBo5#sECW-QD)7DnYE^*483$T465ntee;O^qc!k($pnrv z3wlkGaw%BQDB9M~iKI$k)`R(=wpuQSnF={qcFksXx@yhh{P34StCO3pDxM+X%ED!D zhC>j2`?e%|e9>3+km^s^CY40NH6Zl~#BB+}I6_+4D~2ySrA<1~7#@2dj`_0Ezoku* zQxy!m@HFMbtAL{~C1X|ET;6%eh0`8sNQ%7+Y0n02^ zAn_7l`)^cJ7wbo2OH^R{b8bb@R(5ZBoP60XaIx1n$kz7f@rA9)*7cvre~~JwhVs4A zU~eBQo?kv1yg?vM1Iedex7u%Mjc3#vze&=tp-Pc9NH#^}2DSaJ;+%7o{^<;U>3RPh zn0M*dR#7%yrC`jsb$cC%<>LX&X+Jw&n>*7O|>t2RlQQa8fZB>Nu`MN!L>9gfDEkg5Ebnr z`sk&MJERT?>;5zaH@ONkq*sNj5UOt>3wDwL(boTSfFHvn>AC8za-&n-pLh>ko;(!C zpb;Jl=Y3Ji7a>s?@vB8re3F`w3H6d55no;w&$?TOTDrWv)rRGlqgrB%#DKWn66DK* zIMDsdlfr5B;!qfrsOYUGy*)_w>|HsPNG@eGi9t~D>U>pb#0BCf>W)C=-}#?;$1lTs zQ~|U@$-9tc8cdSTpW$=`xzGq&`}UC8)5DX9i^#F*!F(s9zo@G> zO^Y+%&|&?K^{kl@Qf51YZxohR`B2GDQD07F5Po6^C&W7#irOq`=#SYCKO0fD&$LX4 zc$B<7gf1G%;|d!R^oN%)ioZ1Curo)|$s#{8sq%yFGL~g?kXh>0Azm@zII-CgWTRHi zN@VbFRtuD*RLR`4um(y7DIDZU9fZm8=Ss4M2cT{l*~hE&ho384o)6 z#f7IJrK1_47=tk8FNtj7w{B-MwOy%+rU^!bQRNJE@cu*<>jeOZ%D3_`{~Iv^2lVsf z?{~zpP5VE$|MkaTu@%?EK33B*+LjNh*F}5Loh#oNEp)rCzIr4KI-^M7060-{0fB3P z#Aw*$RF^G=sgZt9!s>CnxfczEKyJpMad9y&*6E?s;qPUJQvs$#GIYT6QfQ1v47@-; z%s|IDs$lv&0xhYqgeo+#!-GjtMCG>x1oEebXY~Fep@nCJiE4=zx|%k`&!ro6Ge}Z> z5^ZZLzLTh)mh*Tr)(J|+Gz@+Am#xF*?|Pwh+Vkl0>bA>I&aR7zZzYVtkWunsdPjRZ zTGw6+E9@`5vs&|}(5L+rR}Nn}=ax891AeP;4N3gCrS4Ou(%~5(CUoxyhVv|G%drIN zYwA{Q*b(q%`~$Im{HQL!Ao7|RBo>!`QLThB68rreg0T?D(dD8U_Ha{Vt7%&T2c4p) z3_yjCl`gEaZCFA>LtUrVUEt+X$0)9!Yu*KY_O|o|yYLCKHQ>emmD7jENL_*_42kq? zqRG*{W)nv%9@5N^MQh33xRmBJ+e^08Ti>r&Il{ z;J%2Q{61~OoYY7i*SyYqZ*)2#C|_iN>E~sMv6ra`1HU48LYS4a}Q4P{j)&@Ol%@>AtG8KDDT$aq5&{QUlwo>%sv2< zV7b)65hPsKpT1HA7`pJss#CFw^;VYS)*e47KAW`RR5=<9s>p)=ApBHIWE=@sq?8M6 zN2r*(w$8G$05dh{u3`Qf zu!a+|e>NFP@*Q_{hL<5|veRfPj}G=7iJ*?&k1fs=w^<#TTr+8#|O~w_J!8 zOQ5P9r!UP!!VW<~@4D*vD*;a5d6RR_rY`CHTN?jWQrGpV!A~~fioswgt&h-=Qco0@ znfC>nk0@;tt{m4lDFs&Nr_oRWW0xaoh0gyxS4vfXYuPdA6nY$$UM{)3j+cks(Z&~B zwCvy%inRO>{e60HZ46K{{pAn048y(VU{bQdqJ&qHCt*>1hhKm*+vAEehzcc6@xdTX z@$mvKD@lyv`eM~%Ij*_DkkiY(^H75?HeB8~>^DU5G5)$pdbRC1V19A(!e+kr9`i+_ z@JqVCZJ{!@$Z8^R$CU;dN@gu$<@SpMiJL2a3Tu_n<-3?6Py1Xf2D>Bg?B;RBAB5UB z^{XCmtZx;GbM})FJ_q-1^aM1g*KTz92H(pm==Z}=Wi)v$>q*{kGDW_=t&KW%o9`jx z{gf{ko)g!thb@iZAJW*l*7iNu&v-)Gq#*TtJY*Ku$uT0>^Th91dc?dKq@$+u0H!W^ z!_se6LKP=n5&>N2t(zvmF6F$02u7>N78Zdmc^SOxQYgrvkq5s1(7&2EpEw1$yAd>v z59Rql2<4fimFi}(Kp-R{`TAdpDU#?Te5XE7=BO7_dnDK(1-1V-V)&hW_A`(ywt9Ek z$9IbS3qVCe3fYZxy`+GMk>3&lzhwpfd2ny$xbxH&GBlMxwzxx;eBcul{P4cGakk_> zS~WW%5A6+EB2oY3sVvsyiPj-VYZvP~EgLpb%r!uSdDQ$-fhxE92!4EoMp~$pB#-wL zVymWH4EN{Ox0X<@jA=`JpkuhJlp3-!g5SEpr|Y>T&^Hmb@vK%@mqsl-)Ip@|`_&Sf z(OcjD`|uRzFmEcT#R}=|HR&s(?T$-I1%k)P_NYKra3S2;%X8>=GLPjWDLR1@Jz9OZ zkDYV)lDRBLm2lr#)w4Whw6&xXZY5?*!jq;SGzspx`X)nCl=5$Q^DV7s&5^I4oSa-L zZ@gbeU#Wdzc+eb`*wl}UxAZ|^q=ZB$i3_&4-Oj@##N|7RInecP{kQzB&T^6&{z|IU zRg^`-oyYvqTcwtRs?M$ubVG}C4*8BVPwRe}Fv@U_ld@KFT;9aWAl06{D!7tD zt-oxo75(Tiiwv5BT=x7VVT8h>t3#OQ6B&C7}h`-hRr50#rRLI)P@ALa>%Tc$FG-c%uVu$?S7y!>i z;9bXx_bz^G2cZ=sHwzbDR)S~8OJl{RVXX2>W2aSxs1JP~nuj$34=Y0%4g0Iw?@OQ` zYWi=bV#9n^VrSDPB=%1LdF*`!FMHRL5f%6c<`E_7VaQ$x1 z46#e)bQuhE62{2lq+D3Pmo5vynj8-3WnWe$E$dRkRdA9>*b5B_BzA_WhUPz{CqtAM z=^`dx5iwP;)YJ?d%LqEcFrhhsy&v-o*p-jgaNX_c zWL3X`1_}i`qEezI7f`3bwQLm@k^(g+h7CItRXB(QRi0hDjwe0>o@VQ;k9h6G*cVTc zXxt-bF;=U+Mb<07skO89XC4@bP|90|cSOayvXi0jvcwG6bnPh5{OL}^(om>aJ|+Km zhNoLHzG+hoAx%q@dY9cuu-!;F2o2i$+o|$DZ)kE1^(EI)SFI1lZKjYZ?aSVhIqm#^ zuK+K|8!R#gH5nV}qqfkB_nYLOwPI0YpecSYRxtP#kalwFM#^{66J<;v;2$v(fP{f7 zwXmJGyWnOVUm|rzzdAO8it=gjByqq$E=3*UoL-;m3QYAdlv)u5rN|-zkB+n&p@f zDOC6==iw)+1oo$V>37s@{a#OaLR4T29vz~dd8a*t5* zFd1e%yZ#$|XTLrFW!Q*7B{avER#65f6Z8Xu$&;oNbDGUTi~VBpl$GWK9>4<$kWtX_ zWdmB;ynAb&U|$-X!Wnse{+nA;trDa}Zorg$2MRJ293)uF52pFTznzzlmj0A4rW4UV zgQhOeHK->4Mw_M&r3b!vtjQUs%zoJrWx8;u(uGr^`5!b+ZQk&5l2gK0bt<}$fnGl} zoahqO^w)PuatrK&79`*GPZBFR8>LAffnf&RHvW%y>%kT^+kM)w zF05lqh=@;IYtJvHe2TZXEzstgx+l)GEyK<}l2hC<^074@;9dJj8jBnN^YNG)K1b9{*} zR*Op@F9tG^zNyYCFzjF&sRs8bE1+#P^~CmqLODrTERo)jEF1hXzO2l+8Y~lOj4i~U zEO=E0%E%W*8J$Hr7~cPy(C+#Bt?~D}2)ko#xiuZk4~Dn?#3f;H2Mln|j;AE+D`)C| zHnbnktLmc6Olo&J8M64kHY=^?wY$TvUn46@XGZg;U?>Qcx+&@v#?@U@lMb69W#QTO z{b^a8qCy_$8_m-MXQmOOskSXeqcii%`t4 zI)2d&G_>9L+0(h(GH#0Z!(TdsernLq19dWr)CwcRK=sL$OpVtCOoGz0w2vO!g1y*g zt9Pv1stX&N?}SDgdI=t4@y2`#gCg|NGJ4D{eBRmFd9WWA07hMaUadV|wkA%Op8<^U zz&h|V3A;1Iu7#mf>^~#DW_IZME{_>%YW5e*?CvoTaJm#AB;hwHYSXo$5};CDg#0olz&>fl7S%Zex3}omUaPXBZz5fF&>su%*lQ zfWFk#G;bY0||Q3eUE+ zu85HN62RpMiq)dbb@+#hgR|qQ`9|5|wQBaVL<(G;;e7Nq4;Go!CrSWQp@He`PW~e& zlnJ!|;Z7~IbRkEbv>}c}HdKFdlK2)NEB4gkbfDBV|F-}`DUlz_?~~w^fGNWR@4E@0 zbgMWuGROn4yXlRu3@B@9GJ@NdUrsW_<|@j?skI)uytm)q^y*k)Hy}j9N`P42cIO9L z=vhuMf6T=V2GY}npP)^f0#CKXbIURk{oDr%P?3@zmhUfcQTd)dupsVe^74sqPp8i|Bk`d<&@^=}HYRCg2V6r7LO2!jfB zxQOmj9}T#+8SEsmOlhb-YJ6hx!tPuRa!%T=cmiJ_7RmKz6_@f62qd328H$Ph1GoaQ zy7I61>0(I;;G{T3Rs}gv`;|x8h)Nb>N!2ajj}(NMFF-7nOq*HJsP8l}wii(I^pM<@ z+YY?S&`SdSOZe88zbIl))s=-Wm7XM(F8U2I?PsglVlYKa0B^r9I;PUB2))tOd3SlI zOhYP>udLL=xrEd^U5TO{-aWew4OyLpU7qLwwnZnzZr!YwkmZLR^7Q{IZ>Xa7r#eR5 zwNw-X>t-ZvgocI2wkNuMbb{B@KOLe9tZq)cInYbe)LQzWB0l!RY0rF&-am&;NB9L% zU#u&CFWtM=|7r>KMp;rZFr1u(hi(HY7Ng#>X3tw@(xb8vi9ikbxQB%nB0OENnUQdz zp=542+1^(3S|}VR!T@Lna2=0B_9w`tG5Y_a!mAN*+S-2gt#dsEWC3{|O6wy#A0gab z_tGd?_klI@DZDO9ee>D;Xz+t-vU9#UQ9Z26=|M`Z9pg%p$RMFd&{E35E#XlYt81mTr0kGSWNqrR6=@^Jod!%Ds#1!}4RiA;+T1OG?MH3aI!Bk>>XE z{=HKJw9;~q4a2g~D*2J`3c-9~!xw5QS=D(vW_67OF7@661?cAUc(c}h8*EAD(&pkP zN7B=k|0(4!1U0%ML)2#)$wiVLgt9yG%aafp-*48~XU-{AexU)lco?SE!m2e~#cYt} zqC=Wv*Z6yX=dZD*YJT^pllH*ZQrf(Bh2AWz6fnHff&ko;6Nd+fv{zzb4u}W1J#Hz3 zm98DApt}$565L$3VrOtqyzg%!8K}FZ_x)v;WzZYRmkIl;(iaVAO%^i**wGUdQ{Ge4 z{bH{%p0RJ4Q1N$FEJ&j88K8>q)_MdUo-FjBNE~D;527&U^ zFLosiM8*o2)!fp4!HOg8tmhc7Eg7U%-&xZ>HSSmHP8j^(U%lEuL*Y*4VcV-S}&N*CO$2re( zKhNvF74M2(y`hXvzT+1`mk#mB#PE#j8)xa3J(X=rd?iJ3JZ(+Yk2kX-i#-mRXW!BbD_kV&W~YaIAeYyUx9R=0t2HK>IiQU=8$3J!SjrUl1b_OP&`^3N zN0xADl@cOv>x~do`=c6jtkA!n5`F{yPQ&b{k`fmTHz=!6+s2w^>Fzx4j*v&Po~vDy zA8`wOdd-|SUUyWIDdw^01rbPFTr_6WVvPjpyfMxQxBmI$<67C(%*5%d@oUqibiK9R zaZ0$IjNr?>#Gvd~{oJql;|Qe99VP(E$Z?hs`b z_xt15Ip@6dq+3{eKrN;hGd);+&q-U!Hidc;B2W8E3i)X~2zf@CS(%Y_-k~>_t4#!~ zd%ZynrGNfJ%zXOZ=?*mlBp@jU%3=gk}AB{)hRmS;w02qarw0 z)u~h0CC(?<&$%O6OIT;ZOBBTr_A-S{!B3apoMNN#^?BNd)qXgC>vv`@$jO4&vgAui z9bx+^+bWmfkK=dVksT#vrA$I#m6v3S*h)BJ#5By4bGr$nq=@+mRllnHw|uWsiIBl? z?lH{|KjWv6Pa=L5>aaUqfAgkJY8!_tj<^4OY#tmd^>EcSe|4L+lvi({!&r}QuW`<9 z!+r9bpn80-%(ahWTDnwPQ}1=@O4*Eu)|FZ{Oau}sMJ?GD9ugdZ*hN z8})|u_kRkE?Ee}txI^}-!H;@!xbnNP66P$cZt_bfhKUy6mR$2$e!Bexsc2T9fn?l; zq!tkdXp;FdVIDFO$N99)D|V!u5ABmPgqi7EH{Y;r>L;I+3sFs z{u@*JnXMl7R+<g)v;CMd%`tJr)X~F}WHuPF<;m2FTisVYo(9OFhE8gL5+jVO7hC#uDAJu)aDcR$M zpLgufk6mbfIn{Gj#jY~L88=oqU+gHxrezc^x@)QD+MgX2=C|{aR9`XpyIyQLqAu-& zQrn$}Bl$4)*shIjbGB94nDeHHLLo7)`Q-eK8v|6GvH*2cE~%3m2$}w;S3UBmjMIgz zvQh${Mcb0Z8$P-{%&cLA9W&O76irlWpgwE{g-QE-Ei?v*)MZtOVx7oEW+BYM>(SL3 zRY2T*K_vfp=<$2r0Lxn#ImwgRhb!VDt3`x`+;ryhAU%8LK66#F$|8dIZAs1f`18d0 zQr`1wAGkVst~KOzd+aB6&8(jD@K{8#mcXlvSaS0bN#a~0$MM#qbByjTp0c~^K{yV* z2i9B&(NMT1^yyPr2+?t8sC9UtOOBaLHC_adat&opX+XA(m$QiXE>=#78!vB+L_T47K;kC{9n>|| zyGR6U^#r|WD?%*2o)G({;dz(%^hU6%+Mirwr966BSlwP-M&|j`+HFJqi7;faW4_}y3%_#S?-Q;Gz6G=g3 zO}!@9Mo%I+d)Thk_-8F`KN?b`$yyzkcn}YXax;o6eO;xO6w|2B&XqYsDvW)np!j7J zAA0v#+Vbd|0mcg^$2q@s#p}>_3wPgUeM`ZSN`5L^@Sga*@=MS>)8pTAJ$ZVx4c{;P z(2V=}kg+sQ#Z>y9?=n8itmKLkR;Brv-&#wO1(E%vPsw-~>o<^Q=tWynX;2PZ?c-He zyoFwJp(Fom^_EF+)U|=qbS29v>GPMI3Y7!Kid=4(H3fA4)nWma0}bCO$_J7(nyw|bh+hX-U+`ukxJ}t&-Fej7WxBI@Sn$| zG-zD687a*Fq06ItQ|YDO(9>r7{+o_!YD+M0<|l%)hz0UzLB`FT4|OH9PtRK=3j>ZN zX8HY!j>(gq?p#;p@%rgEy#zl-FxFgs!Ce zFJ65LVeF;GjTEWx6wB>~)jz|4d5#S%xad&{@td&bgR;y8x>u-J$VUdqo>u6Ot(bHiU{>1}t&=@w{pEsq7KE0Awq!Nhue zBvmTgs`%fv`IUMzaqwS#l>K*wl<>5Fno#Sks*e}PnvCnA7&D+X%YqoW_4tNS_9$hd zUx;P(r}J_0gh$bXcs8wqXFf=(e0g}7=7u}mh8})8QgW*4t`xV55c1Q{($_%ii5d@g z;mqYTh&+K+zi#sa^+%I2f1(AwJe~?D!r5KS3ZRkmlFJZ5q#f8{-_kJf+g?2 zX2b7!h6TpU{MK>A8yQk(Par_$x^zL3Cq?Ll$Cvr-r|W^`H!P%|rPL52m&fvJ$mR9} znoq-it84L}SHzpG-J7Q}5FL#kh3Y)kpH<;}e=!-x9s> zT^b(Bp(&!F_Mgh9ye3STDj_TL+8!PNdruRG(cKwo?q!(zMi+OQiO`RqA1sV{YXrs$ zt+=$mzdyEOZ(LXK>-^8!i}uiTqSt6N3+?WSI%8Ik4<`Z<;(okk8{FUH#XttBu{68;axXP~8-8y&WchyAC zMPo2=v~3XxQ5P!F$yn8df@q(ar%ZCm^Vu{M*@luJcb3Xj#kfuGu7G`QGV_tn3V|G3V$b zedgwsI%En0zr6tagh7+GI~3jEqgJ?ey-NpMCnw)?6c6aYKLLl z)WEY6?jbjow@+Nkb>7KH$T0RU(*#dOaBGQw{2F{|VDU?p{J-^G|8xVnj!x)TZWctM z3dcG>Iyv-9C}N}j{W^IDJNJj&`Sn+A#&R%XMXW^OU&lzC=%^L4> z2L5f_HW40k09==QqP$;xZ$oeAtXZ!jen3BMiOlRkjsJX@jCwwfrH$Rec2c=D3`E)Q z^Vd;7exFBO-V`eCN@9sF!LsM^dp@<7d{*Rw@t4< ze&l^eKI`&%nZ5&i9e(RG9Gu5>LQR{7>?EFl8svkJu) zdGDMGdyEf$Ou{w4#jFO&+3(KTiudJf^~86#diu$8lcq3omq~P8OshM0Wp+-jLlfcQ zpyMg>Nq-&(N~Jr-@z_9#Ki|kRcCtaO;|Y9!tCeD_M>d&*A}`mH-$I%+vzMc1;m4AF z+yrg$Jpg)VFGa_XP)^d%dx0>S)=g#(@)*oJl?1YW7V^xXnVqh@xT4v0Pa%D>u|o|h z4nx*)6O!?FXy&wcXmmX9FEcqN+2e)zM8=p5J7Un}Q(4VYD)>RVnWwjhL(VAA1th8E zqJv;F<~o-^Ld%F5(g#22>1lVFEKAlQxn;_rJh`#_6Y_+E2%kc(zarUxg zE)z6@Uh=7u$DtK3mf`JycW5$8Y$U5RUbeSGy5h6#@uRNx_Et6J#+6>Sy*ZSuP298l;Kw!e{+?>UEceQ*GGS z5IEfA4q&cuM0a%vHIB9_3{!=JXaQ=l0F9Ksytj{6i$LhMzAf;iGuWNhNrhfY{}QTY z*uR%5(Yd;c4Djh9?ZR}n-~4{e-M$3K=foXnI`>V6YTSRF z5*zn}a<+6^6x7MoOnuZJqBYmwML4UYLA)JTN~3a%K=a#S5wLJ_XREUznh^mD2o}B> z+u8NcE+9-8Qgu_eVH<)i{qiChv8t-7C3sb-KU9Ox)Vw>ndP$e#L6Grkdx1J)QkWIg zAS0}@>=?;D9}p0>2@rNdz~I=x5Yu3+w$oru$rTmMcZW5!& zGgjz7ddiulr=B{_eVaGQPl##QTAlxK3!DF5$;jTLaITAG4|oqfOE_8D)n1TSGCKGe1qA1ez> zs}EV#OcmQC?~X`}j+L89mHcx-(nBtRb`3k1U8#J))elF!K)kp=*cxC@Kuij;=bmtf zbWpshQ1+;6`w(a+Gmy5={&6>V8vEgPEzJ0z32%0%U;~^#0{Y?Qjd5XNb?yew-xmB) zCoHDE^bP^~V;^<)K|d}vwyL=MQII)G_I{(DtxfOceP&yiZ>HTuclC1ZdywjP?@wG? zGe->gW#TK2@@hjU!}Z@?*0oAkQLea7##`ck?Dj5nkb=_Qt#4?>k)b++3^O|(yNkf; z@;c}>^iXX%#10!f$Vh=MiuUcx=`O=TE2#XA!Anh8x~F2s2tL0RE#Of9vx2;nv=FNI zb~al7H&c|0!}?4=nJ-7ojYJ}m+0hssV3O)X9XFO%sV~>_O(#8mD&;Dew9GiTA?(hb zizkiM>OWugtnBJ-&4%TCy6$KR2-PKVopCf7Z)vMp!{5)`OFRLMl{~TEIWP9|6b5GJ zieRGn$=s-lsBfg*2-!&6;_N8)Swk3JzZu6=^GtCs8H16(~Q$1qjBVpszP3NON1d??SihL3cWHhKE)U zhJ$Y7ys9cHBov8bgx8B9UGp0r+euNt)0^6& zx&S*}f&t~^2I-}}DcLxy9HURxUP7hYc3dU^WVj19+hK>GJ5f%D{FAr|ClSc#a8-JQ zNK|UPgonGD?Mt+;;n9qO-ayU2P}@vV~50%=cBTB>Tmt( z#8cZB0+6o%43#v$KfK3{phDf(AbqQ_8^2q^M15Bjdg0`C%DyT}-->*IXLJGH2N%Z; za|J9Y^#rgT&Dp^!olnE|;2BZZL@>OFAzoKHfg-epU%ubB=t6E^L*2{*T2zdhnjUz% zJ)>~R1NW1?nL~{MQ)7ti_ z!7qpE_IXm}S@#!jFMlD^-ch%yw&BN_xW*>Gr)F)A7&kv98_zQyQ!1aQI7Sivju+c% zpPm`-Y4-8=BKx%X)wW%HoH4|1rEkr7%1Gi|S(3KBirKSIEf>D1lzUG#5i9t>`O%;jX*b zNjyn!VV@(Y9ZV0^IBn4yEqKVeH=#3$1%uteI3ha@0IYy$l)+${idsido@tMGDz+4z zhxBGGL~#Au1^;w$-G;j!>Hv(z+lhk}t0@%f(hF6<FgPju4&D+XIV%z9zbLN zI{(VPpn;VGZb2My2f9+TyB^%*-FvJO_q*UN^!e?9Y#LLrE{>_nwt)g<7kiMf1DvfAV9M-{HT1=D2*-+5lgSmQfY1zdKz83hz@=fPuVnNX^1i{3#ZuOAw% zXH&j+&uivF@#`E{f!MD1%cuhK8fks)npN0hZ1I4pC6$rN8usD~Z8Nh;`+f3_|0x1D0FNdz;$X>V zRU_%u@SNY5D}SQlojX~Pud(SE$|>@6B;*038~0#tX7aw_o%v8L@CFwY`QxDDd9-O2 zsdI0l^Dlb0Ndzq&G9R9{_4JpP7XNmwv+s}gI!x^iFc`G@U&;uKPgPY|7zV_8>@)_h zi^xi21_Q}3x2hThh=G7{2P1;j{&!{!we&xO()GWE$Z-}71_M9-Uz!{cfFqoNa0AB> z)c;)+ZdC+>v88uU?#$^NvFj&rI9a#z7fxIETX+9&?al&xbFIv#;tQ!yJ;TlZ?FAy1 z`QkA$RBC9{;cQxBntYudxjq3JD?hrVj(~U7k2HC!M(E zd19;-b?yLeeVvKA-5&L^nFi`+Q+ezjJ4@k5$MK`lY>$p78>Q*%q4n*^S{w|shEU+< zkxL@U5JWRK|J`_O2jo(&_-=X}g3bYYcRf4nT{*@^UKYqnShsDK-rDT;00_b4j{Jr& z6uI)cy*`$Bm+d#f26tvGiZn3}n47ktFQm4cskB>I_jX~*GZT7=DxH9VcaZAHlTkA` zhC&~c4286L0gitU8sfqWy|$MEN!b5)kiGI&ZXaCAh`za`1xD-6l$Ij2i4W@V*I2E4}t1R-%UxB{>L8mr|)~gi_JagHxcMaYxF5nnCL{+ ztzx#_p}DP$15c|--cg1gs%kAQts`Fh&*nPvYd+Oc@dxwk^mc79WC|k$&%YwOj5wV{+YZ$*`MFCc(M05?#L7WcD8;7`zOzZHN2X< zVSSj@!5H>x_F9cPo8Q5JzeWT^KX@w-QHKY#>cj)A<5pLrm9h=)+NzVBOzOVRfcF{S z8{GTXTzXHIZzOf-Y}T)~P!LU26)KM)1_rd*+u^pYboYVK0eJLKzOkQ9MPGAh9{&=D z7*gJaXS=ZOLZCoePY{O4A3on-vRFTV-|7%u>7rLZx`p0g+j&b|N1a@`VY8PPZATrJ zJNP(K?B;?tGb$cI-J}H@+i;6Bqb(!Rd%82Wca5`|l3D z(>I|F)J9UxDoT3Ky{UeY@A|rRJt6HQ!&Y?A^$q%+<1%`%KAj%KQyv$5or`jIFZPh9 z@%m;|*PeLS&jsHfA1;gq^zEWbW`;uNREbx>ozY;K6?~C?Dp+TqD3`en<*Y9LMzUGH zfGRY0;V-pbRlwZ2(EQZb-@oe!ci`WQm}q}%*h$?GH4ORdB1V9T#VvPGO*&%koyA3E z@1{OHOZTzikfHLgS(S)bQ{YRFXovegF5_Xs(BH6VUg#Pfy80N~E-~%a*~~V?b6~ew z6R`z;zGL{kzhmH3t<7xJ!^6_*`#WdfS)(dYQegJe`()^}OV9owbR{(}7**}u*AM}} zXVF{9%{dOb3Sa z3}zRli@L?HYE26t_6?oAo8Ig;b@R#IDRbgHYWUhFXsw0>8zWmwrP1Tp0s>OT$W}qE zZZ-O6_!=4>HdIR5rE^nkj*n3&NIZRikUk*E=*_n6ej!Na>?nG}wZ#PvDqc*T;>x)& z-0I~n=!`q1inN5kZ9Er@C+U)Ax+%eOdW&l?*JW2m7obBAb&Fa>n%Bdl@UcrLZ z$zWY>kreQ)&}qMvo}Zn4u{m6bKb_QA2GTA}6cjuAinNBBAk)nW*jop-p%0ctUZ+A9 zjK91H2^ASEUypVTz4T^sTw+od84evgv4`K;=iI~o@U+0KY1l?97F~a!4!^7r_SNR< zi^_|`LWxQ%hsj6pD>ba-XD_yxwO~R+ zc0?witv<2wS$hy7m_y1gYqp-q{3}~TOxsO4N)|I*y_CH}>3uBCv$J0C^Xdm}Hougb z%OiMODpy+WIWJ%F1YTR2M;r)~B!QfhxU7W0%Lu}816+JMB~L&cS>4N_h$f~R|o`6t(6+F9e>qW>Z^*Zu92~Bf+!%) z5Ea+3BSHi>0*^O0VjC*fMeGb0HSCN`A;vJn&xWk23yai2ox$nkVRfud=P9*sEzvAO zFOQ4xuyuN5dBgko3Sa))c%vtrS&fUbymyXxk6|}z;^Pp7NNXUrE8Rukj zaB)5yFtKOz@J!dP;B-&$J~t!NBbLWU;A@~HCnTQ&pB9i%^!m_B@O;vkH>8AoGT3Z7 zI9DLz(|ZHgYda)#p5m>X)2!^!3sb>dCfhjJ<3A_o+t@W5G&Li=kjXi%zT9{(8&70n zo(do>-M;gu#}?37_8*YUPyyV3dll9UJ{9UUkQ`QAG)zSVLIt~buA96@s^hb(aceI`3|=SC|FxW5MZ5|{(LzO~ zVE7_D^R9K`;^KUGwKyEHq{+2ojh;M6Qw?xC zyIeo7cnMU4-s0^)u%WF9lJ`!ag3^vygZIhXPaQs=*m1jKK&R9;TTW4ia|pfOQ!QrY z4hB!mGQQZ@J{3PiZr8QfH#!;0ZzZE9xf=GM_xt`ufYXUL!bPt>4WyC5&Dj?NR8<)> z8W1oB5=R87LLdm!ZpIvNo$xu_YEL!j2UqwQzpZh1vx971H;NK+9K5{7CsO&#_ZHF1 zK^^&|#Fd5!lItP!ueAHl$ycsljV^6lz9nM>(MG#-(Jc4r#*8RARAlY|s2_V?u&Jq| z?xhnfN^&8nj<|$!+xj+~KTdCrwp@3@q?aiYY$V5?*d>={CwO|;c?)LHwB+|%nIT=Y z(d@59y>*xxa{KZTOSD=PcoQu>>GH`IM`TnVCc*Hn#=JZZ^xW0uTR~#^vaTX0g3CIj%NT z^GAHLu zt3g_T?tc7%*^>mi??I*)bIfqW}%7P>2Rn0naR6J2l8@h#?v*0)W(a?s@m z-z{DxP^1>3x@b%o4Cd-eH@w!p10OzawJN`h$9W>&;)}OXUn^afPTViTcJ{(Id+W2_ zROc>T1s!QMG;}gi%rxl(v221Y-4FmV_HeX~`_e;C=i}EwnCga+{F+TcmKVj^KRLK- z>RW>=Qjn)_PHLiQ%m8RCjhXRVMyqe1(x&prha-~E$>?_dksLkz@`e`>fCu2ZNVQLG z48`ZGUkv_I z+4K1!yKCEkBY^kjI(KTNS1Fq8Ox(UKb~8)Va6RdT0>|m2Hk3NoDryPWYH}3g3D2YJ z1vu!Sex=0y!FFFpUtdNs>S+Pdu2J$k1W`WthpTGv<;y6g zkO<;y(Sr--+(MDh0$px%!{D52=8ECcdy<14h~hG08iERY$5k*Y?n+TFdZ^ zPp=bq(7TYis%;w^%O_?RzWBAc3prkBHsc#|cQnZ9&2jsz?CW^llkDx)JJ6b*XV&KF z^+nFJtu>D}Oz`u@cd+#RhAjXS$K(nhTWzSP5E=T|ABbe6NzH6(Oh6#tYSlk(ZuuS5 zj4f%uF*#vGRMvy?kz;G!U5+kIBU1HCP@Uu7~2Y-CmAejT6l@Nf>vS2+} z>6;7)j^ZvvE64@4$kb2E+|xPeO28$!-adiewmocIy~=lJgN|bC?AF9dOd|s;X3~30 zhjQg1Jgxprpt^uiRcK@0DaxA-en-2LM9o)50D1R7|MiBzv4B8xr4UedfDf%*vx8RY zk~x1fmWk^lx$xhFbfbz==61vGqc?a=?#YC6G%OAXj@E~)JDka?&N0?hxRzBNS&?V! zVXX(v@MLF2^TEnUB$>G5bw*hR$1m7bH)bBQyW^{1Q}CGb9{;(w6%uj-iyr**#sTKq zMN?IUg^B>lZew<~l`t~IfhgPcpqrv5%p1oc&x61bt#OmVjCNrLLot(`{?H&aVu*Y1Nk6R~F zESGV^+5KIu&LYMaN|s92P!!yNoch5m<7EVCb1xZzt0qOSh%<1wqx=NEw?|(y4X4*? z*7)IS7T4Y;dcphe9lfN5!PBjxlM!^d#5Ek12-YDk7%B9vk41e4v@wABfWecjr(ncN6%Q4X#imgCJ&=8*PYjZE3@cYj*k2f z!6BSI?Gn42%9L3eME~Q$A_gAVyf9YwwKmO&8!VsQl^v`q#6jlhOyOb+!LoM-y~MH)E~*RW zDKm~*uD!I{llyIc_7}F){eZ82McF3vbiObwtRygfCgga8TulIgRwdbIbR`zakXA2WS~;512>rk<6+Btt>ZoS%bhK+WQ|8(mfbKj{O3*iY0Q0U{%%5 z5YYknUyZaIa?74}0l{a^0uhNhH)D=+d#3@^LHDjRaAd(`H8p05Z?d&+k@Na>f=U!OhCj~0Oc5dU$pT?UP~q6@D-o{e&LpkBG%5#arQX)$ulPSFNY*}7qLh@l z0oUGRkLDcVM4To4l{VtMi#`a+8}iQwu}32~l1L;9yJXs-0p*w#i!LYr?c4yn%RQ|W zXrg|*Lw00C>v9+%%7$Y`eM3YLU@juGL()O7g=fQo5DoxhX&e*{xv=DIqt4?{~lVh3e?KoPk*^+ZP(Cj)re}iL&H}Fc+_+<2j}Y? zbqH;A%(EVqGd``D8ld!=X}hdoaq4`4IT1Z?FQ09S@?NRLSVt^ksINKbcd|R*Qa8XG z_4?q>HB^Un;_~fP><)Q9ms3OM-G*|TzfP7 zMDPwc>9On~{6%!}fzE#Mz&89Zc%8V2vf4%U5Bpy9`_u}!0dX2SV#wG`GaYic567B&0 z+}PMsYn|{|rCCLprlZfN&u1-@hCb!aZ>#Ng*(gS)y81!2xST@U8M;ac0^s=;((Laa-ucNpwSnfR63ztWdf*1imkHK-%;j#f`pciL>B7fAt#FkD5tDoiIE$w8~|1*5( z#KX&-d?q1|;|u{PSDZ+QJC7^t?x$Ka5zK&~aM=KqCw$@3zonK%E9v-4wn+R4p2}nI z&_p52%O4-Gx2v_w!VfrLC=?7u0;nl;40YtAfT+2V=a&)yiONPcEzAkRdmb!<(zLU7$;;*MkT&Wp63^6CcYou4JwiZm`X$M8n zva&rLi^0RPR@pE6A-nPivGqT>;WMG&-4V-RPigm30`wmT^rxu%T2bb~0BDzX7)Ho{%j{6 zCRK~BpjQmi%`NE_f;dNc2fxw3Z8pi1{H}5j2RkjZPMthcA;Z`clZM?OzUYWNW{ zIrr*-zuE^L42@0#;7`i1BSm=NnE^e-?MJ~_b+Upz=(s$0U<^D_#Ms05LMxBF$CQ^K zuIm7(dISI1f)uoU@&(?_WH5VdW@Fdl2vt=+N0Wsg!$?(5r2Qc!y>uDV5EJ39I+(hP);p9yGw+l1_NOyKCbwk+ zvU1VpVDRo=G3a8g&Lvs^H_v&)k!$tc5c0ao-cDL@%8y4|9#7(yYM3@FB6@olplc)b zKhLJ^5qB%HNnHdOzNvas#N;5Z$K^BHdgWMu(A zEi9nly=#`u%g3BIF?v{hP6wu!!Q0h%4PDh^QvaL(@Kkyn2wmPPQT|-WKPspimHGqT zTbg<)a{A!AjQTY-~7m+O#Jc+4f6ot=HC(+2`l%%(>I@`&UC#E6%? zVza!2yd5Bzcj}2FkAU6auzr?9YgRvgr184E<&Zo8NaSE@=EE7QnYO{GuRNmiC0$9M z2I)ZtIQiJW#}54fy@Q;=DM!oC_GzEL;G69$eN|f9%8^QD`8D^UzsSbZ-^dpoFE&0E zGWGYzkumiW1-=gg6>L?m>vD`JfUFLoi}jzl;)8s#o8n({2p#oK_0_pxvFO;+xuWn7 zcb-&8PSz+zBAz|&Z?c!I;m)R-)+&&*Np;43UN@yR1gvm}ETo4yZ5eV8x;!|?5_1I& z>KDs!9%57;dzhzH$@?;cg4JnJ*TL{Ar9seh10?drPG=po|0}` z%Bp4b58P!BVEgO}inClYU_WUd+o0Ewb!{_GC$7P}XRz~Nu5tFwME=rCCv5&o!=`%O zujj=2^uNyhzkj@-Xr@5g$A&zX*_4lQ7?&VZZ-&A)INnRm7Ixbhaw~gn-BDan_8a^9 ztNi_oY~yfIp!ZLLw&er|Evt)g!>55hwF8NXhua$slNK_T6rn&xG0V0-rORG*O+P&7 z<4V-`RQ|hGoD|-S|=RDm49sW861J&~^ zCNj`rGSHDw>z*IzAdK{t?eRgn)eR1Y)e2+UnRQ&1ZhzE22>J%ssSPq0o!ap?@vng1 zcCW?0ggfzzeTg?@r#*w3UR2$h=CQl#@$#x_IccGf3u0QgfdBp3e!AVr)oh?-h|9QC z*~t0{EY@8&=<*3(fuxZnyR0(H$>RfTVdzf-(*>SR&6l5rWh%b#R3Zf4u)jej`USmw zuZBsP9$yZl1b%WXS4!$rSN%PjLZ7%(B_jLf<*0CQodtg~rT|lamMEkkBCi%`j=V|a zr)5}{#>|M77|VJ+k`2fhhA9Vr$#f_EcDg`$HIeiIDneGbsk&8&wZ9SAa})o&S1E~} zT{d@xKLtrvt?hMB2$7FV@-0sq&E=cp!T+Gp$+^d8$fUu*QJ?&;SYbzjs83czb~^CJL?l*$T*c9>*k}C` z5%@t~04reTb2*#LH>AQhZX;mYMDa9zEnhK1R>REq*2yfy5o}<{q1nft0`HTQaspHX z3#=K`9IOJCZ%BBilinMkIyfXiQ2ii}v3d^{4hZbyr{*-Z1ey;1uu*JIktd=@D}y^f z1lkjm2IrCj>+tRW*3={wCjCK~0q~_JWeU>Vi}U=0oBUL@4yKemqA{uc?l%nl_6Gi!Tacl3=(o!ods;l09d#~()40)9+sg=mmuZU};gS5}_ihQv# z5{+*%eZtr1uAlI2z5oa=KJh6zj_2t*yuXDrVKeboj60U=@HNAKER$&YCPb3?Ecwct zKT2v(y&CDyon8*^hq-9g%oV@BM_$p$D5OumZ_kWl6vC^i9PM%a8#9B&60b^^%6fpV z-iIp`kw-1d!LPYHpF~1q2ZPn>bQ@d?13|0k{!hG);;$$bzn@o!wSg&>YyGEml_2pIgy@B%EG4%K>>u z(V{ZJs5XwX4A-JVxoyF5udY^OcWX7U)Y)%Ea#gn3(SJg75h5JK{o4{`90e?mfb z1#MV>gAEYD3BaGSzVYIV7hK6ajR<$%pNPr^ST(9=nSkI-)U{N?_B{2On zAa|c6w{20f^z6+W2>2Lcwc)^U;RY9UsWg;vgKJySPaqrfxYh;z#^6pB-~L+QE4yZ6 z>o?qNu1!WJ>4|a|$Qr)v55SvjDrr(Wd9zJtIWlx~_e`sosFb_q|EJST8*Dr)wws`iZc1JvoLYv%?6s8`;Q-}UvFHBWokhB zVm34&AZA!Sk{&q$29+`aNNZKF9Tp06Wo*N>bQ_5c>)7;pP3-%rKfdN}+kQiz`h`Hm z1cbP58iFkXLY)th14_q+?Qcc;O4if@)Kdyl3eCAD_gsIPB9(n#*KwpMDSw3o)XvO8PG+N%Tw)K^ z0Dp#Fz7(Rox@6_vgXIO8KAA?78} zC{(}*RCNQqlDoaXe^Y?Z4Q@m$f)Ut7l$0v;Xof(DCc$t#nyDpj!VElzuQ&ucEWvJ3 zoNMqA)r^LqZ1{vr>`JMoCAM@Ej=q#_Yq3UmXf>wey1eHh97eOQ0f8|?GLt;6bfV15 zfWW{U_{(<>_r*?!LgdI< zK(d&c!EF2CsF2f3`phWM7K9jEy79NIvH7n_dsz_WZL(r_l+J9aI)8+)o!TCi8|l#2 zPfsgO*iGtqW709U2Yq84h3+D5M9ZuqK9#TY@1@ySB5^`8pQrTWFeapit~l?&5RLHAmoiM;l*c`08K%^Jsu(rq$FtGk@s;XAxp zdLVcBd2qo;wbltMkCErE7{SwPuvQU*=c02OWupco{HuormOXonpDV~7#aUB7W_zWJ z+AJmP&+f=GDVJUZetdql_v2#COv38bGxy`HdNP)-H6YQvTi~;<2Xp8EM6jmu6lhnI zD|TDh*1~$wuDYcvRl)#vKd(dkFT1KVP>>nM)To#OeQWa}^Nw7c?dIRVpz6c}u=(qb zYrtHMG3++;i9P1*f{c$iqZ@DKzEvcE$Q@TO4;=9IDSeVttK{$RSNjB))Z;MPqobokV0{U!doe5u+Wq{;tj`Ia<4m_rI@ukv!&Lo_c9co8{8c*LXep|5 zob_h|`<(_&i1Q@CI?KAu!V;va%NN6PkA;=S!g9uW(}BhGLz@Dt_C;M@-{2k@PCm|) zm+rEF&)>Z(r+tj2EdI4?kLZ@uW1|7+wUxO3_d2EXEnV6|?j_R`PMcrbN#LNSm|sFw z7YXf#jWO&dW!A$F2=3=~PR1OQsVGU~w|*G!Ei-n4^;n?Z2^J}P7Sqo$EdN_Jjy;I+ zfT-lTKa?dueT9~+i1}04!vaj6mbpt%GSGXVqx4uviAO zc(btZaGz7FwN9&0W8nmjvaryO=R4LV>6^qbkH!4=d9UGY+cjW}EHW&dP$i#soOq2b zu$$GIONx{LY;m%%8pW{6StkHH*|amz;<7BP+AN&G;dv}-olXC`{8$`WDviFdpO%x$ zwyj8zsX3OQ?cHCdopq6bOqA4k+B46v-GpZsCB)wt!86& zSLBRgVI|NW@PlSqK-x0E-%%Qp#KLy&SdC?jA`4R6HKwGW<+yQ-!Lw=>7La8r6Bwf8 zwQSH+Z+lYzNH#l*Tny-(GUxHfGc~(L-Z5gwtCP=l<{89E9OKZ5IoTQ0FR0wfVoH!Q zV0$LUDJ$-i@zkiF2Ws`qteWEqFeHxHOg5UJH?YNmmvdFJvC7XEO?#)zLSx~G@zy*J zTrY268zk1M@@(w%y-Gv#HRjchiIIwl$xB=;*JlwF6y(t6 z5rnZRk7@&ly*U$)i|gs-`&25PD3?-ZVR@{4@3Erm$!=GWHZLzPivcTa=Q|-9>+n2q zzZU;~PikC3C~W*|ZIIjo{q9dBSuM{v-9w3YDcy(Ed!biJAgM0s;T=rdzo_i$PgWjD zMiu{m@7Uu;BvX=1{r715=;sGMDF4~;_~OovFSk|xC|R422Te%+c=KxD;!W-+neGce zmh)G3YJLpQytg!4ZHC-*;+H7m>uQ!2?@=>}3vKhtdDbiO#=`FnLO?s`z+yKJurQEeCzomcX&lQoBrxPag zb#e0Y=pKKkU-y1G)MdX3h88(u9g6JMmWWsVoeCP?4=9=qy!`L*;(v$l ztLLb_UsykR`Og0l_TFJlHBZAZ9i@u_LnzV-RZ0k5k=~{E9(t4BMS2NMdRIb|j-g7G zNR!?nR1u^|ucDyd@A3XU&+|RsAMf?%IyvWLvuDrF?#|54%+73ug*5{{@BGjzzEg){ zU~^QNimcx&C2lw5)Xy|t8V;pcb!d=*Lu_m;5ji3K1Jmt`kl7dHgGU&2WC|HQgdP|Z z^z@)Wz<)pr1KANrrH2cJxaytSyFGH`s6>+;zUX^O7j z_VE5N)8MNgBjnOrqU?j7JB6O>pq1sP(P(VxbcvUqtl4EN03rE3J(yj;wyCjfxDIpkIg8X}I^oCK+%{F{+(s=2DaaP}p86;oq9*C_Y5}?+Rd)fExZ=72posfGs6tu&pyK z8NT`B-zvy|UCaKh)LFk)XM13U&U@ZQC+B`_FQMU2MHM>lJM7`i6``Vfz&!OA{D0eG z)%YKgo39Rt!@`=vZVQB{!_FWB$hsGR`rrEgdu|uB9_Gvax4DL)rB@so7dN+syO+LC z^3ah;kWM?_YZ75~PM~BRWy_#~gCTif;3K6DEOuXXFp)q@G3~-y13*D^92vIBBycfK zRbUcEbOk8eP*Dc|o?S+!Fx9}f#opfDiRY-mPb~{L!`+q|%S?b5|9$zt6-eEOVw8cV z0-114&lN)GK{|Ft$-`(AT9H;2jsAND!QqlXx+Faq4lPMWO8%|?lU<}VNc=C%|A7e% zJ+#I|sV0<_R3VqqmNjaB?EXZ)hraprX@9bZ!uk2j@u9x`Nruba)PU)O`m7yiE9=WMgW`>oQ=A zHm=W6FQ575+hHm3V}pJ_Os4DN;C#cp!p}hcBX9AT%Q7<&jvbEEP+wxFhne2Z>OT}u z-ikF$T8*`RPh%q*l1u&D@j8kSkZo(NrXYgM*|@r{CMteA>(9N{3zOKrz`yOM^B?r0 zRRq1%vAOgWghR0?)L$$Mi;bm-0Z=~azq9)}Yf|O(;F$jcC zm86hJ0?z<%0-gol_7^MuBGU%uN!lOWe9+5y2eT+@^~_i4iF+a$N`+)q1a}|A_+T6g zoaF8)Djf@dZQig~k|on8&;(a^2Lh%=>|8*$;hdljvN@VK4FB+6n_BZ{LQ065M zVR%T$0P_DAjsJ^Q{oedb(IQg@2|@a=t*1(#eBc#+V(@UMF67bWpX1B<2`-vT6aMoR zw-)f@l!`cF%nv942T;Oaf*A9+4HN-#p!l~*{`1<0QQ?2il;Y%)0FF5IH(LoXKEbeu z+FwwSrq`j}ehqOSvWFVgnqFLqT61Cp-IF3hae9oyjDmTN7kknh*GcZavpsw7Zx#Yy zRLWg!87};l|&#IlW%Tm(aU#mOt-;p1hY>a~X@L`EC^0>h0nS z$Ic?(`!7z}>tN613hXl*N8MSX8-f|}maDED9`U_)1GAv6B`dMq?du_uI!U7#f1<*= zMW0DVtqvm*4}nbnJBtj{{Jvw~o1dYCyrXX*3;d?_ZlZJ>54XC=Erost3 zUJ7|S7<`*Rl>KslOna#gQ@>N8cwsTG2zIHUG0ZO!dHEtLBcSOH)|YLV)>kGZhZq123v~{GGPA!j%9o&{JNe z@y6>gT;_4DXXa|Feam?u6O?3Xc#OPZ_sG;kI*Qj7m~*~)m)qEl7#w}A)Aqob|H?Fh zw9FR;V=;iu%4x?uQ`cWqcjpapeOusVk#+8qz@Lh<^seA##6|M%zVT>(j2ZkX>E&In1{EE9pO zq7?C@`>x}eynIr+S>E;zgK3fimG4@PISd;nxhV=!?wg=TY>#ot%I@mU&Azwr+7Z8A zrmgZ^Vv?3qzcoiBA!y2lDqt1)2pTb7P54ZWTJ`S{=@zS%B+H*wYSkaU)V@@BX|FN! zA@93$$@W0ajwfu`;L5nVUMLwU1Q3-UM#B~G`*KvTWLhP^T%T;t@35J?aj(oCb@+x- zcHGv{Hbt4(bA0m*W%zvOTtr89#3<{nS@(70LA|R;LXTaQ>B4kS%f`Fc9cQPm48@O$ z2nPnfTI%Y~i;m11O%}BtkBlx@8w*A4zCz$8`NWC;zmISrBN2y7ORftK>_@zb^X#NH z3YUON_IYclmL~;+MDLfrLi{)i;Fio9M-WVAjSv0uc<%mwC2irA)Gue=%6Nm*6vxdq zwXmV7W3QBtW3~wJpb$PdB8f;iT{i1^aqJ@ey8B^ZynB*fZZy5&BU77z?xT>}@0Tqo z&)K*APjW^&f|SFmD#R88i-oeFz4kn{?TJ%{M29ONDm+axYtERDs&mm@&A;j8!Zfo2 z*1K+kM#;?(%;ilU{#ikEr7x)8n`$0uC_rTgEg6`p2qm3kl<>g}WW`VDf_H;-nQ>@t z7Fx*ZZ6h=C-bk;wJ6--*(RagyXXRTn8Rjgq4Ae| z0Qwr{w!i$*c~!&6w5R%Y`7=?iKJo$_DoY4qR?G)W&-!t#{nvv?|I6Rc3T^}kg>zS4 z8o$H)x#4V!i_yKqtgRqvw9b-*;5N)<0e^97#!BpFh1`BHNJ`*_u2(?^uC6q>)hnAc zaBzb!mxw#K_s4@|g_3L$_o?*l<8hOo5mB5#h(z%?T5E z&ZRl|oW{t&sHwd$pjNl%m{Mtf8MmT9rF!ed&iu3!>uYSm=&>rmz{~b;wfuuab4>RN z=)wJitjaBB_uZhZkyHd?n(ZeAj+SEkJlXDuc*nZ}x~8T}wF~o!wgaw^>du`q|M#l| zD-=L~zAd7$@yE&@roWI=>r^^hc*NZ7k#MJi&E&|Z%&Obv#!yw$P^NXoMnMn({v;2& z8=;n41~Z+;OHV1aWb2ssoGlG4(0N|2}SC!TLsGYtFVu{U25L? z8ARO)r_F7=c>lV)PPG2^sByxcIT0$bUY!tF4JPk7U^{8-2{2z2_wD_9aio_g|6yy33;DF9Q zca~~9OqB1>;Zn_1{lz#!XS8b#PuZ~|i(_cPUhoV5s!_rJ-S=(JoLgn@ixey zs7{%*_qC;8cYv0v#j^rzw~sih>tVX_Ezb$^$o%IKM`o6~ zbHGlfv81{IB)q_87GSF9@hX;|R8e*odX5#{ZtdoV&Li^n_Op;ZPdF0A$7VaT3@XXj6N_P$( z#1Z+*OC`u`M@HgvurN^&oHFrZMx9r|gIx%nS?Y|&2M?-zqIRDp4h}p^vLdg)|7=6U zNH2MMe+hp}F$)Yk-{-^WT83R=Vn0xoz z^TK@E?8&}s#l|Hr&YZj{Phts%0eKqlK}GlJgcS&NS@nKc7YA0~Gjn3mco z5`tKvC}47=U|>L4<)&&Q2Q4;HRjr|Ifh4-Pwb*dlgB|QuMhTrkv!9F&7L` zo;PvT^4=f%tTwGixQnNzFcl%q!<^OCAC{U#qvz)}UCDKAl1%QQGOaO*AoErcHlbH* z@m&UrM##g}`r|gaH9p6~CkQjErtAzl-W>SKLF2h4t7XqCR+T?jBDZl`uO96^*wm9P zm3-=NpijdB%G%sn2|e85YIu{i(c{tcqEokfSoqb-*ekpIjC&v*8(BH2`RNzvW&h1c z7m|zEW`T(bzF)6gL_=52d?YUJ*fv-3R2gU!%7)85w%zD4K9cf!DoPj>`2+ooxj6{P z)E!c%5M$c>Lgy#j^W2fzu@BYeE!mH+6A(N?hGc?cCQ|qIkspyJ2rS`EOS)fiITIX9-^XDDwtOrO5X`Mnwg2&9=UMMC7ddq7=XQ^kKLkeNL=4 zm)eMFZ{Y8a!mhxD;9p`_zr=U6mMA}P*P@O-akX)`%5|h5PQWlpip@(V+;>-CX=R=F z=L~>ihyg-LOvE-@K~vgVIO(%~VKwjV>vRt5!%Y7<2Z ztDvWJUuEy<-Hz(QL2~jxJcIUZV;3hC|14}5I49K^W&xpU8e3_qhlLv(n@b&eHPp;Mz;%+AKL-P&|hoPKHzGl+P;CpOJKMyKyw?y}OzLP=dQv-h_ z4~_Xk?pI=VB$7GTkLW3~R^55bD|l!hQRKXE<(rfXNnCa1bZnbGp0QpcHKM!6Mu6vw zmV9>MLMqGokAaSThiX%9+vN$D*qP5;jgYmF;pI(UiqApWJC5gXN>=#)i12Rw0_j}+ zF~KX%c_VF~?W*asP~e>9ZenI=I5HAj*^5$&U1~a?1D=s%XJJ!SlOvMTtE58W zkho?#O_vmrPF#FC^O?A4Uz?MliqMtQHlU+}cnxSmS(Tz+t+*)PWk^w)Ds@r;xg`(g zT|QAr8NRfh`T_j`e}ahm4xRc<0!Wr6I#U~^XzbL~R4xqq8wnRZ341<7TC^*Yc3;fI zC3x*Sawh#txGXax6UAQ%9#BRo+oq5(k_cL3W>Uxw9*MYiT6i!jbAAr#oOrBc>F2Y) zvcO+BFB5t(*g4YTI(A|yo!!lpoJt&pu+>p2^=b_&3M!}}qra;h@y<&ex+iFT=`Tai zz?3pb5f_EQVzGykfS%FQ8jIb)pp=OQKx$AOIV2$2$t7&;Il-97=v8&I+Nu{EeazuA z2M!-XnxFZ!Px{kObjqnM=a}0HdRk`!BJE%KR<5MWZIG8_h-9L!e$fmJ6BoD5_dl&) z_V!&>_VGN#M3oyBwQdb*I0ZHs?04xdKMU#$&^-~UTlc*R{`CZKrH~|wK<&-Is#P1XMPC-sIMD$nw1o;DsiGPzwU~oYv9TX}`EnN9E zFsQEay0)U8)1B1^%s(ewa5l&W6s@T!BBC%;z`vM{sY9K=z@h-)0jQ^nNZ5#p09R~O zR1^Y(ijt2aibD`G-i-ouy*RxvQe52LM;TT%4F&Da({ar?2`$@|o$hB^owb_Ta^gZr z&M$*zW=(VjVR%~PM_@zTRDL!|8)W`7H%B*>kE|u-_KO_?>xuhDT-TVHuJ`c$(# zK|8EdR-DZ?Qe5b_TD`pDS~IGf!gn4z_i7LhW%Qyg)IC@Y{9!vdtNDGQhOUUWa&vsb z{9KhwefSEtv~h>npvVPxxNz%zz_SqPt|MqSwW`E~qKfHavqhd{VWd>9Dm9~jZOPnx zVUURj=d5tVQ}&iJj+GtbmW0*Nl=Ejc`4^82N%_e1m<;Kj;+!cougJM28t1OuSM@4V zqH9N3TBd^@2k7{US{PTKbvk#YbG=sEQK3OLF-c;41jAW zWyJKVmX>#wzUn=CRU>=%WmT}ce@JHll|ox#n&Gy+^%iPIiBET^4#m#aE6D7kT4y89 zB@YY*+oU}D1{@{zuiK=VT#w0xVs5l*-#1rGP-jQe}7n%YqzJF4^{MsgAv5OhjMQNitULCOZb|muM`e^u9NI zP|T={RX@uC&2pQtysmPWzdj?qLzVXq>pQM04k;c*%zpU5l*ofN9V%cT&hs2_IB1TF zR|&E3>dahmO|%ix6ZW*kZ29drCkoxFgV6M&R5p2}3+!s@MC^%mPDj`9!~@m4&?1&% zXLcSZCu-^k9YT*K$GAlsYO=Bt;w#r!boy~!*k46g75f(O3T7BmU1K=!Y8%zH24Brq zq*7#7e}7(o^KF-Z$kiJ_W1_(!n`-_CGoLU#y`Lj@I-b8cqG@Vf6J_VTyN8lPLbW23 z7{G!~fHs$C00LG8$fPG6dg?DONl8R0eUaa8B2fT%s+LY+;o>r2!9c-4aX4ID9I(fL z+yEk3N=T1$2Om%O`}Iew;+_4_o^jVFiWL{4!wI8jvO{lk< zH_xP|)?_>sXiu(j*8WG#{GJ;60r^RVBg5R`MdC~6wXYDWr3P#R*QEI~any$2Cn!Vr4hu$TGvW91=E{HQ4#8DlY%HddRL=>yshu~X1bZn`?pb{_5 zdW0+`<5g6eh3@LA#H;*Oc_p{|E_%(n&$5osaVEf_-8W#2}E80=j0}hi< zO8ewx(Pqvp_n7@>iW9>VIFf0u0@@OoyXRkge%)onTexm^;YJQqt=HEC)2jmAMo7wTte>X%dG*A^ zDH*AvqmZcs(g!R-+9hR39(5uRCPvV<7F1RPbOvN=xu9^qxQE0EM@4rDJ3}`m%=dq5S48p$ z6qz^Bu9mx3lWwj6k@l^Q)30meruhmdWwvsXEB7_}rTlhtY+ZZ48%F~l z79MJ;p$9o`$lqKAy9XV|em-AKVzDgC2LIy>{fJ!YgLiobBCO}I<1C9E`? zl-7KbKEL8I&BCtVj*Ll&ji%vEn|r^(!_Bck_VedX-Qr?Cn*M#xF&CdIZAx{tduBmG zNjh^2+|ShiTgeP{_2-53OienwJt!-`u=08@YK|a@G3OP zKcBMl{ikT`qq+s_Q_T0Odf-xEGsJ`!zpLdLljmzZ*%Y~9SP zptHq-NgV0U@T2XM{Yxf|KH<->Gre*(wDCn8#IDdI+}xAVJ=-~M9uMq{3{625 zVO%}G11*yZ+4)KNdEMEv2RFSEyo;G%Fp4&NM^|Y_N8^>Y{H%Ur<%ZX*|I=}Nq;H4b zqnpwG4Sl(PK)Z1$Mj`>wEZUq4AH!D%vV!;&j|1qoi+hwmqXToAr1*v4`bb zu9uC(BO1}C+f|Wr_mimis3FRYHXoqx1V=H@(UUt}HZ`tIkc z1fMr5`q*wzpURcKebC%%8}2DHvZ!i=$%)Ivh%w7uMDdri`C=#?=@$LqulL6IByI5BO}-i zTv=6es|a;$%T%iqRr+(eMe`T((tH|7raL+8txZjM;FTBSHwWp?IvnYrc+^zubNI#$ zhsDhHwfvCljqe9<=Gl{0*5nW-L?U;&)VCG9qr?6gI=NhW{Q|eQ7ZYxO;N)Z@RVA!L z`{0<06omen4#&tL zNuVI8B1lyc2R1I0RgcSzVhO9Nk{IWeouCknUethJWyE>*u?TJATeh+TcCd(*Hr#njNxU2xQmJiu}H_efDWjnh=kZv!1+0FtU=M^x%AQ^c@zZc&8*%M-G@s z0Mi~_RcO!eUoXa_3DfP=MX^+fvWKy_mr4($j09yEh)6)%Na$Zi3zEk~(K(#A8@)vk zi^*A{nXD{ab;a`7UD8F;Yiw@l8P^(bro{i{plbhe(!WeNL9~0zq?Vq9x*Pb7)SYD*@raNO~p@ka{716qCbz07>v%(k2^H*8o>_JgiVnH zYG2$MDdv%f&aGh&?VMCevRLl2r@eu+1%=9OJ@>auE=|7^`1(uH{ci`0Q3JZ;xyz?KXH`s)Qj2LKk?c78dIGHT4T@=WNqyY?#h;f6PZ5QvwmX zK7|Z^newc2f#U&_F)8$`K?t56$LJ*UBZ1o-&j#Ij-9E0Yej zFRsp`LMTr6Di{<`=Tog7H0~U}quG3I()l{D0vE@fL$%d{$W`Jb04F18af;%5l)_s| zaX?TdH7#$l7wc_G8n;#iROHyJ9XF?t+Jfszf9#?EqrX}Z1nQOFf}5u=96EIgVd^ji z;#!hX603A{d|!#rr{3Q7ZBhuKmA;@jex%yAQYdGbdH&*Sq1H((W7hargez^`!8+>v zHeike8$9>j(PxSbP`=>H&cuNFGgzI}+p;#t@2!3iJoXCK>{;EUZhreF$R}a#w6C$f zE6Lq@v6aV7bSI_h>oIX6Tx<1xsiLFp)03ubCa&;p0_pvtj+z7!#AeGjsBWM6 zz7c0-C4VDl_)zG3)*tDrezTo8FalgBvK8EU*$1**JTs@rGX5zzP&pCgO4VU}Xa9GOQ6cA1kwP+|*-Y&>zIoc^~2NgJdB6L4ml^}eq4 zB;(!9ZUi%=c4br6AxGcsejbruR0E$CFdYtud&6 ztwC~NJ=#!xS^hPmf3|8~y{pIK63NI8AX|V9eE5OM94}}WOAjtRvc@I0x4uc%nUN2_~DXwCw5@Jk58Hc-$+a_oOo9! zTU!aBjqzSzcjo2gh9K!Mf$s%k7G->h9fL>rgEaB&H;Lw`6-%tjf31{8!FSFY15Qf-Lmp`ZOsPkKUD{|m1F zfP!+QYB1C2S0C8r=Bq5QlS>#!{|ohhH^9f3Lb+~tk^8Bg6XAW=%JN@Z)FKG8AMoo| zIMVo{DXH%T!mG!q&R8Bi-73I|&UW7X91>Ix*!fHO2#9bF8sJ4&$`iNW!n>u`!Lt^n z-gf!)^cmhBn#1VUd84thFP@%m{^Bq}{9;CYPh|pPg7;c{vr=tCE4yYd4qE5E=o36i z@e}W8TFgpX!jIQlYdS89T4&WmoB|~oQwAu$taUpa28J&&VSAAg+)JT&pYZT{PoM9c zBge4VttiA21VSgh|3i{a5%b#Y#0Irt*~*wqAs?EuUn2w3k&pVI9Lm`BIadsWE_;2o zwCGYAMNFJ~>MKM~kHs#fyx!RJW#lIedLDSqnwBjq9w!^V9Vm;ky*HOJ*D-U-h~Miy znl~D{?!C3NoxUktd;@6T1b*D$o3BZl9Gh&w2q28)vE-EUXzXF2psy5!k&`@`?D>*?t&V_~y(syPFrH#pZ(aCzf5*Zz50|d}@|=mF z8|`fiI1>8N(XC#qgN})(Q zme^Sg@i8OQi2`D)4BcT{Q|qvqM(#LVlEt6iEf#w2BRU!=&PYxM>3$wkk{nk$J#}h* zX}x)7;v*yDn(JV94eYksF3CiA#h=f(%0k-=Zl4$aB9?po1W~5+COZPcrLApK$k= zhNW|e#E1V4oZn!ZKZtr8Skgubu zsk-eF66Du854C)rd51g~v%n^9pR4jU)oXEWp6^ObYHoji_~;|LYH`xCGVaaM|Ze*FyXKKcAQRXJ)3 zqb$EW6gTLeW0*1+)!q?W%|sc6X^`@%XqkXKg3oUIj`g#>PsNv}!+eVl3)>BC5V&0} z4BGWSUL9Td{Qmu$l0hq}!=<9(&fKz~09O<;ap^=#{vN4|SeGSUZ_d0-UVFky(Qe9V zf7e*dc3GxN`}$2lmGqc{ zw|PoF+k`kD5IpYr=B{>;h_Zq0se2v1zjKX zN)^3WQMlL(@5ol?3`!a7klw;zXK6bb4pb1$bSCrx?ctK00cGj39KI2|+9lbQw!?=7 zWEt#V^G&4V5-It+Q-KxsFc}ELgY|%gfEBYtff5d%!p?N{&Q8ta0+*WWb)r6_As1?6dez>`DCmG>;=n$X{Nvo zctgac(?jw$%283CJ(w3~YZM1;q8DCAj7h3lj~t>NIvyg$8uH?}48;t#x*GHo3}L0|IbPFT6-V^5}Wh zB3?lE)T8R>Wv6)*jC^}3@hmexOww7zYiJ*tTh145iRTq=I`|~yO>jEGMr@P%$mq(( zCIf=jFAA@NCPKP)W!8OOpJ;yR0q+zth-8ux6nu+?^{_26YYa1htX(6F<&FAGvFVyv`f#2@YVrOl#we7{xEr%Ndodx~y3p{9TmE zfWNx)_#%4#aNWa4)L-@F8MOe_0~=dutL84XWBKz&ExQ ze@;@{qvmO6ob=*4?wvwFeL#|lcNy5SnTKSTTHL@6n3g4RassxWe6c(wLP)S;5+}l z9rUHx`gfkcFS)Nd-ViuS_LPB7mThnmD*enx2Vhu>Ukr zk_jmZmSpOp%cl)7O}}`gNg~7e4UpiJ6#WIQ=N}}446-b$>n(ZxyL(NJKItkr!s{*s zRthCKjB>BME#H33HAc!2FfT{p;Yf@HjDJ<{?!n!VB*yuI@zQL>8PY52l_m-=#KjFK z@mjdGSRY%zG<$~ht9T>Zbz(tq=ACujE$d@j#N^maK7Q<@yY?ti% z#dKr}<=w&Vj`?nfK2%X$sXSiC`AP^=PwK(FCxh{P?5cr_TdKnS@qB;SehDsqqvy3j zMcH4^WIh|d7L2oryk6j5wS9vdaYat9ctutfneazQej24jo)izt!V7iG^yOWM-tuhhBcDJt zc25U$=?RwtOEWzDLXMXbhlsKjhX97<1i|HRgO#$420gm z;ZM>Oru3h%=a8z)Q!%?Q_&=v^cMvU=4D) z-Owm_*YXB%cDkB*pV8Rru{3=^v^i||ZRjUOA*@ypJh<7Bp(=F$EyTIHJmWC?nO^5? z#ki{OPeYol<>rizy`7y^>`0!8B~4cKdJCta5lz-eV_R*#!Ay&p5lu;By)ZvVQPI=?#d3YqzZcFlBeV=JBm)53KM&1BfT)S~2OtDzz9&n%#f?w0D2 zdEW+-nQq=X7p<&`=KAX8t{NYpT=SZ8+iqT(nZ`!6xe?E`QISV|OIEB%w+p16SAX6% z*|3JUZn?vV=fu3mpn1Ua+->P&^DM+LAEEZ=V{F4o@b+p8@t)Os+m=jMtFZdLb1n9D z7}K!I%{!U#>L?W&7MD__Tb7?n&BRFLy@N_^g(tK6Z_HHGx(&Wp2VfOm-3^f93CM6< zxz0EtBQ(*|;LeU0)k%HHZ|2@Q9|uH8Alk#&-uG(xnq!jAk2qvlhA_lNecpKzwA1fP z3+WwHBkAq^7=>?6D&HFMPNMW_v9I=q*I-m65<0?9t^;E&i$f6fB0=H|PB5|nw6K#} z67{|7jh5j1ZiG+DT9x455H}CEq8BE+@%C zD#cp6Qp_jcL+f)^W`ML&+)vl2HC0g&WToUA+;Ywe`TFu|;9m>zC(+Ry=`ZJj zZ$-rR*?Pnl(35F_(vu%{;E zz6o_R9S{RDB2y>cDWFHCm0whD)$Z}0;c7q^Oh$w&Mg_FLUy92dba4=j5~Ft;3mRklgLjq`D)K0&LtZN&8NsI zY@berTn)-M3(mL8shL?lbE=sKGqE62t;o$MrGWIgb5Bi|JDbqJ2h{op$si`|gK)ut zxoVvzw5e)0qaXiB*P`^e`e<2}BR;{WHPDiJlChmeEq@G;eQvpdz7wCQuCuOgzk%8( zU~e{^tO{Yl{w5O>)+}Tn8EK^p%8)0wkI>%QHlZqslf<5^3aN&6vHh5)#vz*ITvky# zGsbJvU4b^XE%!jE)qwehjFi;!G4`-(G*7+}drNYK{%A)hxB760D^EUh&!k*XZ3sW8 zD&?NBfkB#cx}h+Kbpgp-BhRNaCu8kO6J6&>?4Ge|m3X7ZtEsvECa-h`5>Eqp-HM%x zDjFm<-*$XVCuYD;kF$0yQ&m5YJ9~xmRJ6*lHnUGjT#R$sJsoKi3m47MuyGJdOUiJ= zK&p62h8={mT!gCFI5GtX$+)X&4K|*;l8=(u#_mtoz!oaf?X+tIviXxBJZyA=!qKhr zHkgQN@i8|w;e-g4q!NB=K^|2&H+!MJgf1tPj7M%H;=T2%wOfBpD9@^}nze1IS2~1@ z+S)qNyTsa15I&WUke%Tag+a))VU@AajHem6XsC8sfvy{L`J*9GCj8D^BYOtE)2thK z%0nq8{ke}#G8+-p9oRPm+>@*e$ z%FJ@%X*=4T2>l{8LwA(RdK=zfMdFzB=5YwlmkG&TgHT6-zLM8|&a7RjB6<-S#6^es zCZkS)T&42-v4`KI02d_4ECe+(WGJc&4HhDbc?D~w;nVG}3-BxT@hIn8P}AgWu1XNf zoIf)fuqYjzspygNST5I41f{$8mDtW#yMnj#40NO{T%nC1{gRS6+oT8}K%Xi~iG=^I zqLTjjKBL;c!Fq5~V`x3Ppo-nndch||RkTYX=AAONR;tUeOS;PvWTAzc^T>=HIiNw5 z-Dbu=GcKxDS;!RgNMB6chvw$IFIw`_Z~fU#0uxs!gTxyLW(KJ{gWRfjrgChR8}1NLi(ltFD22 zWM$#`L|z%kb7VvhzHo+cxd@HYtxEw|e1A!p8eSPYm+)XEQAx6KHF}V%sr&Z{qsPr# zv)vFsY_j=YSx{#>dAkrpM_m{$9)6&QOcZ`G-x-cHZrOfd-2F`Adibw!-^?tI*Uj+HIYbVe zvB6?zHXBnx&PYUY{p3+p}WlBUt09%YpUoe}K$4*e{g#Eg0d>gB)iWqV;l*i)Sza>kVxm1CWZDNC3s zCw~~U^bK*!7BT)H#rRrE)2N4w(hRHFc69XB_WEOk@!@RNXSBdx&kJvh;xdL(Gdi-Z zh;A5l^0uDVzjLsqS1l73-B-}kkAKE=Ewf-GEEm)(o|IjzY?R@*{qe4F6G`4|ZTY(SeS{QqMVo5Vj^yPGXkQecW zb2Hmzx`1GrJ0$I4U36hOYE;0mu_Fa)M;@sB9?Gg_*P@^l~Uyn z?vp3`zka?!$KpeC1&IyVV?GHcr-qZgjMbdOP90Rh^V7>!wDgkO{HThgX2eV7@y*37 zp0VElm3%1~=(m)i8N{H!WT<$o8BCkl^QN4pha(VUuD;BfJFT3mMcp?1g$BK+5GtNj0ZhMYl^#uR2U7*SF~;tO(ASbr?_%iW}@} ze>)kHoH+YcbJN$!8N2u6!CTDo#}y2c*X!Kr{Cajv9@S7}`QVv)p^XD#r~Q2>$f9#y zv&+NBX7IN?gR*;EbHEAWga10h401V8ABFjJDV@KhA&r>$x+){dHdw@rkK5PigQojCsWiKO&RhC%-QB|G`e*?uI^T* z!7Y|nm0hZ>=0mU-yZOEgWHpB|giZ-=Wb(~YKgXaU`(qCqRIcr{UzyXvPGi5AE#2Gt zA*~AHe`FU5I}~0w+K{iPktCI-_vy!)kXw(tlw}#QtI~`%g*q3{ZEv0gdD}&fy6!eA zne3nUKlQU`FR-ihL+coHf<&{Ik6&u@;+>4eh3* z^3yxfi1YKq2cwo|vzAH8@pJB0qL7{-);{;ZuZEYx*Sa2yIqdzdi3-nGAtkJ)d^&3U zCbkN#vzjbNq4=iisSD-c>LBjGQH_g|v0@@>tdH2Y57wXHjb%8pKb^ zjH{%3#32jn1L~N)hu6|rgv(T7Xg}w0Q)WvwiO|_4uy31+>9A|j6O_4FP^X zq2yLXlu8{3{9~gS%qKrgrlpc3c_Po%=-NC}ioZ1Y;yL~d^qN#`*rPLOTP9&A2X}mr z5l?r~Rp9nu!m14?Qz^Vxnh_u8)dnl>7WC1A1Y2bE$l3p)>MWz$*#58ImI5tWw81Y$ zi?jiP1#6K&D1`=>0>Rx~Zz0945TFzf!6CR?NpTPE(&Fw#+xyRNt>?`%Co^lZCdtf; zIp568+559?9}~vDCib#w)e7ior3<L$Y+1ckVyINx6Hmgw0W0ixqiRCTaY0^~|opzq)0uyW2OB^-597v6tT|J8cKl;>AJqt0TRrg{vwd5X?0)_P~%s35?eM**hl$C)Mr#lZf9yf(~JsR*(Q%>E_#wjAWA9G z5e8!vzc3`VO6Q%_uj}2Iqg9eFqJZWC|A|{#Iox4k+01n&y91 zR)EA5isp=%=W)6B2Ol;pdVq^g7iW5Io)CJrJn)}5dsKT87>sb+c|)|edr<1B+|e%= ztvpp6#2TBF&U|a_jvQ)oZTeaI6@JOwY`jQakHJe7dS;l9R*9lasI@=J`Dy(=?aWg`QmVQ$oM}{%yze?mqa$|EQg%-@5xi zG(vxCq*g=JMD8&lKG=v&$Z^q~(}x~9 zokQTrsF)OWx7q0}>$)|gYt$Ah+At$dB{Us~t2309B~{wJThOQ+IFS`wS@%k{nN(Rs ziLoT4A%DL2;+Y(HF)t+MweAk04>Uks!H-;*emMp)GTI9Cb+M>=mR7|Rt&pIz^j-Jx z0}&3+eP(@PTtn3H;k^;B-#G>Lb92wmRj5OPJa&81SntCe{eG{A_G*;z@5ltrT@Odp z%%Awv`cLl5yNb>44Xifoy`8L3Jhb!%F?$ejH|2iyHIEjmu_T*?Woc8cM-}@9>~viAU0Xy9{23qy~aMh>Autu=-a8}cu*01$33&8mhnnQV995uR5~W*L5R$?<4IN}qZh#J1q%I94 z_i8&2^nbqITeNRJpK-|;^S|&1x|+QHNI_0PfiGqfKnI0SZ$!44+~g_S?S~LSZi0tbjzhwWw@svHUme}C#P@l+REU$ekSlwP$0im* z%h-oyYJT&`+pQcvGBCpt*tMdtt(#b zQk}V|q{R(NUdgf&QewtXRTol0ux%w|EIiQJo4;{%`bo}Qikv`78F>>{*tZ)r!*P3> z1jSbMXSj6YI`c8@RF~m6yClUN8F$6yNe%EH z6Ho+OKHK-qhH$dIhWr|< z;}`1B)_gu;7iT-CIHt9WP1`|hh1Vy$x_UOOzOOiu9q}NxnQrkGMXVIGmqs&hO2bY{<^KRDg?Y+C~d9Ayg@%3@`-1ks#nO$T^b$Z%ZUpBGwxHN^(;2>My z5)`+893bzgsl2A`J4pyZ=i@X{%Pe{ZpLeld`Fq+(KIY_riz1Hg!2O2jg%I83k5{XZ zX5valP)(kpVavLTee3h6lS0ZV0c!7t?#QaWg{x{j+ax|c0KrJ^KlHNU=suYxiYVmd zjcP~N8_8dhpLDr?%!A3gCoq0{5g48D36B??wZxLOPzx)0^VnpON)AKvje5>{N1dqc z5@Bllfu{%Ogx-|tNRMXSVU#xOQ)zcZ9^%`is3i`et`Z( zqDT7h?pjyTc4d6TEHk`6`nA|-!eWoV*FI|B(AF0@D?6}bK5O$XQ#>gSKFq?cWqwQN!jA)(Etu?5Rm97a_7@BsbRfF2hL3Y%!p>&&_ zWS5G6_gB>j@Ng6()Abopa;*dINHgd|5 z>f-5n)8%ghot}LgH_zc72)9SNYVxLtzW@pucAwmx=8KE3!@`nOe_Miz%+v1gC$R^a z7tRh_9>UP(u!tT#=xWd?8w0mM%IrIx%i5him`&%s_hIdUC(G0Czkbc@2IkFe%n;Vt zkLViYrLf*&cN=^Gdv)ctO>=>_09*CU$nJe1E>Xyj{t{?7z8)qO_dKz zvfJv>WseK*M|Jecd-dM=<(q5k(7oh5ym4#?PAzeL`SVh^NJJ1yQ6suOJ2238Y2Ptg zNFE1-7xi#q5fa|JCC6oa1~mHvAwOaDMD*mI$Yqte8ZoH?Gn!C+;MIxkS_v-<`eDKV zC~#kObuRpahTD`!(ED~SSiwvqq0esddzmSMcw7k}9F5&ch03R=AT)^b9jom$`!Sb{ z&@11XeogGWNeNCf3Npta$VIO}A+_%`=TfU<&_6CQ(>s+hDD+bhJuTVM^YnOsb$VOQ zXm49>{`4P7QWtbF`iJ=Y8MSnZFh;vjxH+^bdbnt*XEu(Mtss6X5UDqQ0$)4O;L0H` z<%_e__^P1&5Xba(dn|Jk=QdjJ+5MKwA@)MKnTU7pX@@ENEp*wYRpm5{PM?sm=>m)EDAi- zNzo;oOb6E+{y#q{Af&W~gtxaGj)Rpcse1+c#{FmvWNdn!7#PISbL!z;3HcG=5ZHcY zRXE(rrR<+N^2UB?plzleX0(WD?AMDouQXcyB+DEhAnj{6$(C}{w$DCOZD~ce{?8sF zwUTeNk5@V&68+q^NN`|s6+fbT!a^yy5&?9zb!Xn+4!V%+1Fs!;K7RPAN4MTRU>5c; zkK8Dr5q9#cQer#o3Tt~Hh1=Nfu$}Hm(Dr(|c43Z$g1v2R-5ozRE@$I3#1@0k;nF`! zQgVGM^jUJHUb!C!%={6Z36H1;>KbHGYCFng&7DD{cS9S%EW0BV5ngM({>1z)!n2wN zl1-1c)>5qv+SQ&odA(O(q;{76XzYV{i1!}qQ+NItSUZJev&F}5?Rz8{KI=0wPA7hP zSmi>-KR3|&HH}m>mGd7lwYLRY1Q{tC7gqGlj{cH0qaz9I{Q}!nWXOL2ooa)rf5^XE zCRLq~$%|bXAAA{_r}~Fnu#0pho8V0Yh4+D{)QJN&@WgMuor01WG1~ar=)fb05S=-5 z)D;>n&FphL=k61Ghrf-s57bWY--jMgs4aK2k)@#~cXoihccvO>EH8E_2AS7782=ht zRyb7BISsc7Pou3#XArVxO?Z4S=1jT_emh%2EH1iDLuq?F8 zDN+`yGqfkRuA<@Wi3+rWih5>+>B)TV26A3(m2TATHr^e!t_@}9l(F|oPNwm4glCr) z0wWZ*!4^d3)4t6fB2r>YHq%TmXIi_W_!SSKmn5w8Ag#v54BbsTWze!H#V_g+?|S`( z8ZL6rAMfoVHL%BqUrugby>qhtaI{E9&n>z-T2vymc6ZotTBI>HWS2y1GL7h$x!DgL z=}6e^mOyGU!BXvGX-+^aOv^&mDNVvHDm9s!X?v43E!N{JNVHRq-O;h!^UiBpPYMJ- z#!}kE%sYdk-FKcbL%lFd2@AFv!^X+}m8MHO#(qq(CQHY|EMY$T7MBt9B>HJb7z?Gu z7RFT3Cto|_Gqv~81p+k&VmvII^Hl{1Wi3d0y0?lb1LTU!F5eJd09AUgmW*LHOj$eV zn-(*7*e4xp!|o2Gq+z+{K|i9r+{i3ez!Ao2v9TZHVXq$(-~t zx+b^~IA?KU&nPgiMGtLs9p2{vx6zdFw7){l^9J1phexdIpip^l7ZC+?U52Dn8>g2W zUm2J+)SS3C{h2M(J%4m*h5vA#=gjK}H=Q9CqQZk#c*sV)9+^jIqX0&aHFjFbn)PtR`5E zPL3x0Z@AFNnV7BRH^??Y{?gpS;Ll>Sg5>nWayuHb&iZJ+*p##S@sKcai>+*a^Jw0A zO6Eoss`f(G@71ByC@9WCQ{z?8f^dmrh9cIQC`abU^_=WKLFXg2!nVG=#n-(klVb@tj~t@Sr9yC(~Fh+pH#npG>HJNLuL2xN~_gC_jMu zaxNR@Fx@cx@P%%UD$A#OZlYjW=b@$zcCTmHpE?oVxMXVp7XM0@% z7)gY@<7W(Cc>iURyT9eFuKb4@kfvFi<9q{}3o>V}njb_ekQnKf4zlbzcZuOI{Tn|h zz2TAmy%M8)-hOK($d|&2uKv)o<1M04ZTW3DD?WlPI-9)8cR`Mjk*(xcaQjBV9%Jlq z3IngU&K{h5qqxK73!Ch(XAax40k5_=p)n56SLV+VbI|qq)YaKw?0Ky4l4j6ITR*s2 z)aNw?+(16}=Xz#U#kfA0eBPNnmfX=C5=O;XO|5G-mj?m>VT$QwdBdnQt~4E=?j}I~ z<~Ic|6yotT3n>+cfT)eY&{Ib3_%Nyv{K%AocA9WONHQw+%jmsQnehJPx}aY@^eL@o z8QbJ0gZ%4^f1O!O$1dj0DZB*qnkuSQ_f*G^N%y_c0Y&Rrg?q%8+y>=8!K;43uNi^?G~hq-*p-j{wiO7 zn6dsebJiW|@(n4|gI67`;ibg{4`bn7h;h`SBF^UPnDp84*UZ(|A%zMP5yn1S^%$R> z0PL3%FpJ6x|18F5#( znKxy|>2W3Dd`T^xjMKid1~r_~x@{Z2R|DmAD3}HxFfsDp2LT*y-EQWBII1r^eGmg_ zBIxWYT{BsA?z^Q4nf0Q=H79NaXR<&-vPMORp z-wdY9>XW2E_{9evYz-A;XTigpj=ut|jlQK;wkq@1=}qL_HBb!gm7d%utGD?=)K>!= z*(@s~F43A&P@GQ*Sl|~o3E*o(ETwwO9;ulibYSs4=XfC*?{x{-fa-2P<04p2eQ~gR zu7nrOq4~a>XSxKtOyR({5Y)}TP9&@rWRmn9A{&KE*7tHW%(9z20DQP(sR4adH$}Wv z4hi+#{VokCGWYxnZV*xQgh~1WT&$Mf=Y4xuU3JRC3{{A)`zfDEVlT?rmceN0bQ8eB zTgzcD^X}3!0deMibrx*dND8+9`_gfEf9(g}wC|4b?X$m@%}E7U?qkQ4VYdS}KYyaN zc5Xyt49WY)R}BU7)4|XX4crY;rnZ>AgvVtJ57A$a9PoayNzjqg^4CCo?25;#6wN+L z;-bzC+2 z+q=Se@~?#c!BTkbbK`doZ%6TFphnw$urCibOljgoHiu_Z)LMIRQb}SowL_X>$e6h5 z&b@38i2btO6aIL&symZ$a&6Kq_m($r7z*|gLuLmDu~LNp`5w$}@gssP;KWeqs0(*5 z`A&Jw8+ouhTNdjRjl%^60w#OtT3JsL=;{hjXJkN*fy8-f zKeqR;?F3U+cCN2^^2M(V9drN3yl?3LhkDU|S1I(%8?nz^T6~3|QC3j%g1QqLKX6mL&s)KHa4`<|i^w00}3tn2KRW#k0G zU#+~8ALNU`TDkyjdE-c*4%z^j1VSD4lN=4&22!1iEUL5g^vay7%fL$X`tm6+<`gS> ziAXroyWW1l)o^6YO~-uo^BP<}KRbmJiofx^G5ye(r!ykqC%sq@wwwRv`qssMW$3{J zr}p}Hn;HRcpyu3%ekCO%)#;XT@BxXK!T=PVE+4S;SQG6pGb|#4$gLY!m)A@beh3&V z>UcJ>_hLEK*auIidm|u%s_x1nTJQyX9euQ61^e$v%v5IGjMj>XNB})q2uY%Ow`vj1 z^=lV)2qH(TunsW3M(Td!JRAzu35I9-H=r&10Ev2!@vOomIB&T1ACFF zl1D0Uv>$#t3hyP6W{o~^gdsZKk7xY`iGf+bi~uP-VS_n5W1mt?1n9YUBYNTVTcf29 z$?-5wt?D}I{_-?CrO3}&5)q57{0MT>gvH}-PS01yScCJoX4@36v!7ysYJjEpoN@$4 zzH%(REi|*8-SK;W`6pU{-k^3;u@Zf$o8vyHtekPcxdp<+^c#{}O)x3ID*C2+E+b={ z;q^|i$H?YP?<%6YDCbe7vBdGdTnAzBcpF9N8%`Rh)3(Mx`nxw6t=gqXVJw6SHx@B3FVol zfcTWJ7Af}O)02(e5#3qpjtA>Q_U{#WVpUwdnI_a%wG4`0#PNPpSeGhXtB_{Ru-jP+ z3g)gq2@D#|zuQ}M+13zYKw{4o2u@KI80=iIj2G5X)|C6>al06gcoe_+JQEEGBUB$_ z%$dUv3jD?hz37$wLvyoekv+yL24LkZ`5s#J^7dvNPmQ9$yVk319q*%i*}mAaDH?qr zyAxx~~n@^NBi;~ww*8OGD=y&5uux{pBJ-P-tzu*#Zu%;h27;cnHv4ai5a zzCchk$s!l?C9v|VMxxuhq5Zdx8O|Fq;r%0lji z-Q3S$VVzr?Hxom8PdQtHl26DDL-S{(QP%XCB~Bf|LX`KuCWt@x_9_>pxWs)TB?I?f ze-q92DaR_8<8jBGQ9u-@?+JkfQ+O*Icy6V>x{(=hCj(EDff@TbUVJC$5WAM83OQrh zjlk9R2ytG^kh3(<#j=1Zjd_2Cx9V3*Ns+0Rek*Dcp^a%ld=QksNZT5FpP0e{W zvY=n4?du9JW6R%@H4Lx_9`;mWqsF@Q+&Y^yp4;QLa7V(ek`%t*<07bc*!+p~My07u zgU(h6*9nF;gZ>qtjmh>qc6J$ydzd zZW%YPzE0&RK(Wr{-p9Z)|7?geee#8seP#`(_klT-k%YIJCFbeqs#knaU6q$5fef{3 z$9S@t6%Cy>-?b)m{G{Ap?sHq|dD+5pZ+!j2&stdh0s4`Z4xaWfUhlFcI8hm^)7@;v zU94i>i-!b3&edMj2%w7OOQC%HM^X~4n47sPh3f2sK*ly^K;zfYUJpMM7S#|CJ1Blc zDMN8KLpBVtCaD7P`idQL8j|t10T<11iZlW+}gLSA=dNh?go&q2gy_* zuANW*Uv`+Z2-<%K-W*&LA>2iIGzIH2a zI&w*4AsIBOlId$ZhnJftlvHGg-(rtsChDNm0e$OMW-@@@{{#y?MU{5uPi|SVA_$7` znLSzm(aJjh%R&STI`X*~^JJYvYeYfMH^}9ym_-u7{dUecdU7-L_#61eY!PT#>3|^7^(alj(Q(W7b0I*uT zYYG3`jhk}A=44pU)PJ+O8ts#hJ#;lDXUkBov&2pwn~1iOn#~_)G_vQ;`L1$iQ&1{@ z>Acvvzm{aAN&lG$_Ij4>>@^4$_yZ7PP4?&mI%u75aRzfl9!{~jZ#k>mZ zD$T9gJIfRATAVc|ifYl(=+0ikB)`}ePWyTFirc*l{``IK-|IXTyrnGD=ygatPj>g3 z(}p_qMfY94FsLW%CVxS8j-gj^HmC0`wrlv0?2n++#5B6=tp&CeHw>k!>F782CC9+& zdUA5^1YEG~MQc<54Ug-kvU5-iWe6^ivWu-TfsfdvW7V4{o5JPdzGudMaRPm+j6PNJ zJX|Wb(U;YlRM;r8pIoO7`mTLHNe7a!3!E*il3usaFW>L9bd@7Ej}|fx@|Q_yY3y@i z$rdAvn)K*ZPdQV6U)NV2NV2rFBLm6ciMP;FWo=;)y2w9jKHX|<|BfeR5o#CHY3Aih zu^u^scr)lhufL&ir*kV0&s(*ZF7Myyvx%=q`JAF(RWSE;oNXr_{vOLXPjx$eh^(^) zodu}j1X?HRuy~zT9JIQGLki!W#9N0w6cb|26-v|Sod@ixb(9*S^IZ&HcsR<>i?=1g zRO~Dpj5ss@_sMDJ(HGoh0%7_w=I)zM=1kHCI7FzvrEdW@cBvF!Hu0sTSe2?qcxves zJ6-v=oLPJ0UA_UoMW^@m>J;%4l#1TiVYl?`rqb4lO`>Q?XQX(nWL_r;Jo9h#o%ZumUzVD+$sUm2S2qh{gNY)6#ROx z+j9kWdprC`yy*idQ(WRG`P9lL*kr}UetUL^GLpPNHT|_P8K^1ze8FJKx%oL&UY_3eO<1KEU^n8*P4*jThW1qttFg!|p5kDSGUA;51H@*%SnB_k<-TnDKn631v zP**1%+#Mt_bxFZdpllnMY=VgQJ@H)u-MtbBJFCL!&Yla?bhs@5gZ!FA6BlKUn%IaH zY}VG*udf+4=qBxiih5=pzrMGD{P#L0Kf(!MSv$?7Tzp~gj{VR`#E=Hh6VxUZ7xuK3 z3EGw|kImt)zuCp^sbWvoRvNkvX~utE2o=zOXglb1ca+h1jBVP5cNX%@q<|Pf3{vsY zw!AxV@7b&qk&w%x@$Fzii`NO&+MW{V&TH5TXWBOCm%6+s?)ngEtYJv8DOS`5VHLXW z8gE2-tYQ*m*s?vgTSyasi&kcQxw+;J+en&JmGpTZBC>Hbw7fh+7&6h#qved~DQ}@CzU?%S+Zpu2NoNZs087nvI#2 zHt-A+%O*w9I}wwMxyl+=nLJnuhFj>-s!{{_wr-c)8WlWG%l#Q4 zdehutact$3UrwaJ6iu-t;~_KXpde*WQ?`(5e9S|pa}X0F*3}&ZHeX^$sgryWmQESR zP$qIUFhlroY%*3&Na(Cit8HA{c~K=> zw#^tyr}FSq=iQDcGX=?5?PwnY1=*MYdhd8gte`B~hL5*by-$}h(Rts7&c)9$uN;k5 z6pf57e`GM-_2}O8?iIKfN z75mFt4_}W5n-v$-q>nr)y@}f}lv;|1yNI`2WrLGinzs^S52p=&HVEY&^E`BZ_%*=o zVdpcz)W`_u+T!>ec4wt(pZ%M!1kgRZ%a%1Fd!IohJGMf-W!TInCVF`fCnC&0&5>r7 ztN(}qpNEY{E?mXN*vE&l*tH8EIC_FvfWF~f((m5QHO;w1vV6+-CO{)T8Jus{e%CtG zWtAqFNu#xcP_pr@;YQK}6DzjQxdJX5GE?@?<0Q%%LZh#fyOPJt8;pe=LDwxBXn^mD zog}%D@_Jm~#(t@!wp8`rDN#}7?sJ0)O0Cv99p{{*coB*@@J z$RFA?3U25|hU~MTT=>+Y1MpbZMKJL?vLv1NzSIGwZJaxK*q*>eH&#zGyJiX9FZ^8o z)uy*gw%u03NdOZoN)Gma*UaO<@;a;a$`5SPr)4Mg+~mmU(gt^nu3K;DBIfo8nUjsO z=^MzEmZmA5+By00c4m(DG%1iRShjRma zt-g)ckiY-^kVd^-Hs!alLML!9Vt4#^0v&56!0ZAT_w<-$i$a!?2^Vy$pK*%&aJzIl zGp6O?oPg^4;5UAGR_5FhJ$|Y|@H6tTK}~rULS~DtFfz2$U$juWSsXv(V6u;2ecL-< zy$`msP|$K_W>&mfZ|wPC<3#1@BSZdQPow`37+&JjD|= zuMB|NzvHG;Z7&>2A9Z{g6x7jY)2m&&{dBCQp;KWBlezwEP@y3q$@}Yd^ZEMi-}jYS zj86Gn7k4v8eWF_lN7F-gr}0O$iSkN%M9+jESK=@UpuYKlG=o%;ml$=ws5$>PJ1*w` z~!T0B&UX|&vr`9AC`ErQYAPmp5%^;MW158a!RhI^4unScQWBd+4F- z%5LsK6;*5Pmzv0j6Y;+^eNV=o1DLDaR|R;2Zk#&E$%X>ZMTj@P!8jB-#995wamCtQz`%J+?sb>#1QA0Od4%6I<6Ugx=Rvb_&qErNlQWE+c(nU5ZN zVn(g;0{cSZ2LeRIZ;FYC!n{l8@Lq5jLg7v4$rI$O@Uj*puW;xYMsXb{@Wk5RWz0Vz z_qmcg9V9aHUG?h_-m(*&w&6k9Iw{(`-4YbW-Xt_GjE;9)xhQq%`i}-yw&eOmSUHF) z!V3v=E4JVrEQ^sF5!CN3UJ51>%62#2>rH) zmuS=ZD+MPtWh3vTZ{2u$mnmDkZTXune@*Z9=DjvT5+opyJv=qiH!RXgubm<0ZKGn$< z#k|FPL(EFpB~7(pdS>Jxf*%x4Q?m9St{;m~U`hxjzc3x>awKznAk%5Bg0ysUMshCc&6PhwrE@* z7*q-U6;W=nHjB`7<{$PhQmIJ^^(Tqid|jk|uNi1$r+EwBA{#C8Y8Q{E2y-;R_+>CT zA9Ya5C>wsH)qOlZaJj!v9WfbOS@yz9FxCFINXU<}PeDN37Vzi8C!;K_w>s9dAG!0- zZQfHuR?Z1FjqK=4k3)FYQyiDpU zI4(H+zY5b?5t)%Owo!V%@{Yc~*Beezy+fE}-gs4k*L9|%D|+cC4O2C}T1Gs7{a1wy9caQr)L64R8P*7DXglz+3Q5Ron&<%&^aV+ik>SH9i6YGL zi@xjd2<+Utx|)Ac)!HrZj_0n9&P5RAL(>%9hc}(LS0&WxH{WAl9bE|@uNg0I?XUQ? zpI5N7Aupf_M!E`g|1I?LwI+}p8}B2LIx7v1gVRn1#{BheMl*XWHFX<5>z$0t>{n`P z8Zo+M_V{f^da4Tzm@@w8O~VSE(Plj`wza^#p^|YrfS(2#4xD_&kN*aLfp1xso6#)Y zUqT-}@UNyyzLhqIq~=-smFo46m@<36Z^rvszW86X@~$}Kr;A@w51VB;uR4J52Z`R} zpYJ&7@fGNP)fucvacSA9nLif@I{_+pZL#rC7>u%|J&_x|VpRHb7vVZ)$$w=-utU5S znB>QCLF>)^6ni%@-LO!7UUpbE(r{K_QhM~{!CCGun;ZdFHV&b%h91YB_>oia510@| zd^l&MgyDSSQ@qQTd7@h=5Fwq@Z&RXM;(S5E?Nt5dCI})jW?hOk-x$}e!;lRr3gYPI z8UA|LZ4~P8UA>F{s*}#$UjLsERIOz?Z5S!Ns>(DW%8{%m4kECiB$nc3np<{O|L-Sf zai+NN!pqXZ!KrLoz7F29!aP_3&?*+q4gX<4#%(~yK-athZJ~gj{00>jwYb) zHn*l$>qk=Kp9%CR07waV!}-*d5S*z(IzTgqFExrk)OrLMbcBRs0j1a!T{0~|I50NX zG9@;R0l`^i1q5P~V@rk001U~6WU4?bGR+$O!UYZ|J_lQ!5(mu^J}M=4b9Ovg*j%x$ zkPILsPznH=7a*whh1CFwpQ~xH(P{vF;Z(BZ!D91g*i<-V&(&qjDwlGR~wLGGSG0l7TK=EEVD<;>iyKEkI%{2c5zbq2#nOc6|mb z)##~OO{i0KX>xgre9WW4yg?E!r4R&(kN}|HEVO&D)LdQ&hMLpD4 zoQ4(BRsBZxG?vVYF1gAeDV9uIh`0Q0)F=oHn4{6FD6Fxg-_<5PF%6Czh+maB-0oe<=Q-15?TWRLZBQ|B{O?w6j;g93sp; z=vm*iO76-@I5#o-v-gW~^ylU`kC2p@VEI7~0u8>W)izb_*4Pc$Ds zPXi9aR$E1CB;MLR+`Ep-{*hWs!=;O>>v@|$hMk7%Euv^+!urX)YrQh z>Am8&|JAC;x8{g+*L(XH^kIjG#U~rDYZ8Q7cCVbJGgevW&(!NK=f~$qq^z1qFGmb7 zB3f-^S@gSFEz0(TDdOg~4zK?*2hXm~y54g25y;zF=9Gvr(&6CnDyNSW_lD6{e%StzXu8LU;(yVqDJi8b#W+H!2fpTF^56s@#Brv9c-w~`m<0WX?jqlyP$8iMr#yJYj7IC) zZ<#&IJ!zr{_NpDAtJG}hw0Fg2w{ypK<~P-j$*(KRx!QPV;sGzRWU=Cj~iFiWypj z2o0lEn_v&ARlvjJ^w=lgtxkH^j)wn$W~VL}){LBAaxcyl9~W z!X)cnC^pIRo8=mO1DT6$!r!|N3~*^%CcDCquciIHM`YVQF+Uew9Q6OPb>$;H?*MPVE zl{O$<}T`EvGGWYkAQ!w67Ox^y?L`rH@v}@Z#@#R;J6M1S#3N ziL%*~zpP>v%W@jx$e79qnLfJGjq=KWPCkYM!Ewa$9@Rm}aRlN9&t*HW(9h|t7nf4o z1bZ`I4LczhWO>@WR073SY`ThyCy#}0*uJtM&m?U&*#v``{-|dfjLe#*^z}O|_FJ@_ zrUS&+!SJo^+4cG3G1f_`hBLO;nTx6C#z8#d*G1WsY&^z)v;3B%Wd0jheLh9aQT5k| z|2!pt7#A=9$6^JGi( ztc1$z_v7B^UxL-s$3fG$kwqs-YK+w576d?uZnU`VbTB~(f>^xl8P=1@$t0!SS&Y#y z4ChVlm8XrvkpYOo%@LWmAR(*)cm8CEg)d)h0?e;D0(cX)Q_#86j8Gtgo1#E6?{9vO z5`J&8os*8pg-;tk7y6s!Q&#Y?aWj3Tt*dEI0Kki`NZ5&HVtSGnqV!bhQ8dqQGM0q@ z@Y%zm&E(`ya98o`-n+3HSEV|0;MuT1;-i>O3It(@E@8+qXJr&q23f(osvO!S?e^&@ z6AMCppgxd{NoNWlU@=q2%C+@!$(w#^M<%orn~UlDvO!8j!mHk4^oLjh3+cm#oN4I( zTN9Oyd8ezbqvT1BB$7D~5p32Iu-H17AfkFej&pN z%N-yXo!b%X)6mD20(t_x@hZ>ml`j?>ra$Tm>GulZvpc80IN4lAWxUhnEtMlC##UD$ z6^ICFp(MO-by%p#XjMu0K6GjkkzgY;^hN`F_~-B$F1CJgq-9IOV*x-b{i~XKBr$A2 z9pRkP+J3((;0$K6R#&<-rHk=%{J+AF;{j&f)zgym<-O zQ5qc|r}}>_@cV;fLzE~{e**20tbiaOUdoCG zBZvJj+*XMerucUQ(YRL1m+%k&nh>8O(4IA$`LiV1vpQ1zM)^T;#BEDO!G?^o%&x0Y zYMG899BVC#(Vr;+>5i8{>WrLXU^+otjajxyeukS%<1qQXyuEeIbBFkPrKQ|D$X6Xh z9?M4$fOtkPMV)a|>coyN8JTL85KNay31|iji6PPf0QH5n^P;&P!rv;x;n|d?KRX)QR7%f`xblst@Dlj{y>jt0On$0F(*Wwgna($r{*v#Vp*=)wL2NvR5Mztcfh>qE z+9M&=TyQ~#7tx?pfke8vyvQ#z(LJ_k+v1w!WTj_{N^!92a(#^LB9moO5>${geS*FQ z$_39`c=7*D|Ah9~YC=@ypWGFH!n9gzm;!ykiX`drliVues#I~VWW4Hb!!=-v&$_h z!@MMhr*bUe=N_kq45yZNk}Oau*oOw_i(tjtR{PTbTn|8uw0;NdCW*E@T0$^a054r%aW#cpkYRTYmvmg=Zm zxJ`MoEccl;l{1s!EfxRkGt^-K;D@*f+n?N~`H3L5kSWmPH8`#_qFNnsz(kzrD{cGy z6BeFg`UWWNK(KfwD8~BFkrZ*2c>t%vL0z5@%ZA&H<#a5QHL{^DZJzTSwaOec5RzNV(8PzPn13=8GOpJe!& z#*0rL2l~DM)8dofXkomt|HW1+(c;%~^P-eUfC2ykz{}Ap5Kr1*!QPO-x^CK!GP7jS zrrtr_8`Bk$v1LY9=rpq05-qG|KuE7PQ>H){ixI9>Q0?WX+JJy0TikRxZ@ZrJa30K8 z^*C|kS$z7m_EqL;WaSK`M0&qe=?CO5Dbw2cp8Ge)TLrd{giqts4&||7@ByHC&0sf# zWQPxz2YbPr_aP6am=}5SF6}nVzc0?oB=mP2(eALVCxb~!)uB-oDzp;_N9%;7>^qu9 zTa_<)FXsAAVMllfh8aun6lHX{W)%z!+3-HPFI6mT7|2&rPy%qevky@76~KT zVx$y~0m4P>iABw>Y#R|taW9v_x-w{;(rv8|$WCi*Wud=KH}TPWp^6;GWKaZetoC4( zD1CS-EzUC$ep+m7?gh|+n}4r;B&r9~t5dhn`9He8JFbbQYZOI-LI9P3AvEbBfQH^h ziImU-gen>!AYG&jHi&>AH4vmKp$SQ-Qba%r)da*)1u25kMFc@nQJ=d!@B4kfd;hq* zo6Tltb}~D2X6E!WV*BHPr~BFn4Ep!kq_V5S%hNMnUOo}rN0bGR;gIMCq}(=|Z^!Rz zb^o#8Tzyl7p5Iwgq<9fPk4-gaPn|5cBzZGQ7XTW*)(gY8*4^VI5LFgwe|7t6|%o$YH+sfiqjsqnHqGr zrZmGtb<2{EL(O_fTxZYlF=CNq|AWJ-i@sY)-4w#IXEdsskrbePh-&2SleqLX zIZ!_Vh(>?h=J(yipBTXx7Y1F>>-yR2rjbJOI1gDc*0{{6cAn1x94elZTe<&(Ts&8I z)0}hg<28Mb;{=h?J?5w-t=*Lje!50dDMA45EL z@xnPH%)SaarFUL;TrK^4N`OgC-Y{=9{s`44TCh4B8l33Pjy*5k&2#tBUZ$PBC;wPq z3^V$+?5R%k$EM6ab*}k5iVlD4_V!{?WME^3xpWo2kwj#mjb9g75X;KpSr_ZgY?)}H zWqqFHNUywc1w&a~rn0Oak#zB$!vk|AL1|i9NscXA5peL0@wH8MKtDC-msg61muJal zK2@yG9*_2DRqAd(C(cBQGi*1izSjD%YE$pL^QRK zQv)xi9e#B&q*bZT*{2%_nI3B_cjX04a5z+eoAdN{x^-}PWm;St*K!T%d3uo*mVCDM zS9#|qBDIf$WcGri&!W?V+1cr??8L}@(w!6FU{OUt%*p@Rcz}rz<~0nhNUR)p!De|` zp)SmylNJy=_xbjn*Lit+Eq~uCWiObycXWMd3YZRf{UtSj&^u4+yK_Lkxo^9hFTZT5 zY*I|UfxmFYG(L0Kd{YX`^LXW}ruzVIZLjZ~%FQHpPfy(X>3@#viQTBuU+1qUOeFh$ zo8R7e@w2praMSrHQO(p=TvAFbXvT#}3yv&`Kt>}&%$F0uP<^mLX5Fh@M|M=b5fqk% z;t&H|yQarZu1!|0-V}y;GIw@%T=!S5HDK@zWxb@Xam{LnWoq;%XKg#J(d_WR>aTlW z(qrCVdomy|orjjrCRz|HUYBttdHbTBX!(A27jr1SvJDse0PxZmk3iy!egPr#e!xpT zfj;6SZ$*jm`OPU{$K7C#E?YIEj_ah(}lpxQ%aCCQMn@#0qNsN~G)_u1&q0bA?mjwG* z3-a_Y>yEldQlHlpQp?S%27~4=E+TDabQ4}pK2sDG6c+siDa~L8DB9)LJ#KTD=H0Tp z&WxA*g|wGNG@P3swO972C)Nom0wEPWIS3NQU?~s+Ogb5ywR`+YLoMdHc+C+&Y|2_T zNae1i6WbifXG&a!naWn!So81kR$b31>!bX;?AzaKA1LEu5_r3>lbifm8kqt5ppJD` zZz!M6<|51@3>(HhCz7;}+Dk+-nM?*0O5>a7VgC8L%iWIfvGZIMjh#PlVCi*-?bj*x zSDXSyr`*RxDN;lCzmM-daChrEL!p}}-^{Y9z-kbGHG^Y7Q2=uVL7YZ$Es9VN??!v& zfg5r`3PSdS^31fM^URmfeG}Wq%>tx9!L9NeKVK!r`(G}1u6uQ=^5+Cc=Okr|KXyZ; zpNm-={zd*)6XG|cdl)lp+f+H`qM_n6*znu(t$nHrgZ2*VRNrjDbSXeMS5<4c+PY#) z{dx<+r>o6MH2fomCS;lB=2!RlCMUidwEtnhw{jL_nErt~!$05+V%&dx&{e~mn#`Q- zoXli`xu7M(ACdqvMa-(~If#&Z3gd61ib@78ov;-aA*S+FP8-tr*)9D_5Qgs z9xfa`1uCBHcM@l9c+GN9% zPZ$y)P#|v5@nVm-t_LR*?2QRf8m^9x7f-Kih=4QX8-lH+OF2wSJ#XxjZV`$vtAFQE z)2qK?YwX~dpS{n8>ttZ;6hNHFzlg?i9zs-_?b+rh?ans18;Q!x3PVk17+o|0YR;w< zze^=jtIl<9oDJaae6mD6VZM_?{h;TYge1=&Kb*mK@xoCfho2FBy6@%84H_~L3M7Gn z6rVRGh8HF%j@hDD#kQ|_=?f;kC8QtnG`0J#_wtH%&<-B@X6>IQOW8kS>IS@ee^B-? zMAFmj1_M88&d`Zu>XfLeQQb&i%9Y z)2p^yq*GoqCi|YC_#w#-f~n6o5Br}JBqUCQZ^btG<|LQ~rcvAjF@J)-9Qs9w-mN{H z&W2^p%O)79C_5PLrBLGQGZa<9CEb$lq|=)`>;H%~0MX8JHNeU033#Gj-y%Eda?AO5 zb<0rhx_8Z)c0{cBD@v_OEno5L5}mXv`rp-RSn`sffDSS06UmQ{VDJ(UnEzF z5%GQl1_4LJWvkSAG|(Dk1r>Z6UFw=CWmCUv?e2Da93M=7#sl&V0c#v<0%X$ZRPJNeVaWqlq9R&=Sd2Iy z7n(eY5@0tn>271$<;UBxITPB%F92Bm}c|ne7OV0_O;;g8bu- zz86xI8ugJi@{d z?UOFrbiy&8Bw<3flptX~uHV@83w)g~{1PvS$K$+@5g>I!JsG=Pi#j~Vt~~fq^KDKs zK0f;am!44EcR|Ak66GF^4g!=OoJuuSr4dRapx6bOjk#)e*m4842lKba0yJqN>#U-4 z^OKR>4Nw`ToxD-!I>52R@)@OY!5j4L%}P1A8pg*L+pDI$?)`cz6P^4z6^NdZu$TjZ z`>2#Pm3sxbDqx!eUVjP%-KF>vqUq}D1Q16YP1vE*uin{CP_a(|)a1%->99Ug=Hn?% z&y(dr6N5AWGA;n&!i|0Adm=W8`zvp_%+CZcAXdso%3|Y`EugyCo7sQhl)^-$U0tuB zlLcTcuuHD%nO9Tybudz5>toOO)yH$(k|&j03q7x$;@~*vYxt5_0J5k5$wUx;b49(i zC20!GP-jWIw1jUPM6nx=>pXsq)m|3RN_rNEPFl3D?jJMp;zRyHZD9kiz(y2M?pxd+ zkN~xOi+}malE9fX8@mou{tqhclr$28`5?N$jMTXW^dBH9=4Nmgf2-#IB$EenD$)O7 zrpj^b6RI;c^)*Ipd+~ESyq?0}Y%t=?CPuEEq ztlyO&L8g9FP)H$C(3*?l*r0(8fA{gvxq8Xm#}~;(x8d}tz-xK zcy}?T8~)d3UBBo;hTMG-^W|AG=6S& zDO9YVrqFeR80@WZw-O~{F7XLR)-w%=vz+vjY!_Chb6KPcr_!1N7OVkS2MCi83lLXa zw?`_^{A9MeG~Jl|z$TaIW1j_ukK1Hh2tYhfd7|rY)Tv9CB|S@sssY6w!K_WcapwEMuNk}V?Zq>$uL7}f6)D*0XG7$TDUnI79sW9%VZ zjSzM)SZU1_+tGC8eIQ9jhRtPM$^W)Oz`|)ZY!e6ewj@oO*>1vRFD4PoN~%0Tp{%(P zP<=G}d3@Zw(!I8k2MW}laQ0*xS}E~^N)4jdAj-T_;2q?zN0oHFsV*<2p;3?r@q8S> z!2&Or^~^t@TcM3|9cQ%18%agxVoo zA@t88Tsd6B{Lgl!J{3|3)uFVredYF_ubdq*z>V4|%RA&ylJGe)5FD<==L!u5cDcO;_2`!MOeaV7OPuewiSd2T+QYtfL$wpSd^_Vij$6@~-<rsHuqnsZQXWnrs>`O@+A=N<6Tt!Rl(MAr0&>a`O3gVGWA4v_U~m<{O(c3bWEpx9 z6oHuS-0bJ~{RK$mhRb6<09sU6g{ym#oXS-sKT_qur}Lq{<9tJlP5o|| zalG(KLnM3Li-(HJ;knCNtfDl?f)fz#7GNp|$;%6eW2RKal9c1UaP<}r;0HK*T^Ea) z-Fy7;qSRr_`v5x}Xl*Vy9BxB~a6zC*TU;lS3c})$xD;Sw`Fs4zp-oyfj5_Ule^cXR z)!7T;%Eg_XoxM05ZrsuA<%vv^m(5MexT~5X%+4qp(d()(WyksP)TqQ6_w}>)e~xRg zkDxcjZzd>Q&D}t_#V^V%+5C}`xdUa~iX{fnD$q%!OpljNBm-S(DUX>TB<}WVFONq1 zW978)Ux{Sf4v}I!7(F81P@2fzX>PM1RoMXtkWh6u(86zv+jGJ4pDo-Hm&6EziSakO z6}p0}sSH5&`tm#p9fj~gMiA;6vqOc)&(N*x>K+Y$Pej`tu;|G~aSUU2!=%cj{nTa+ zfQJX%gush!7=}ojlKa38FkjD?JOHt?bHqNeKhuQR+2%RbU^Hj+%3=I2vv54lXaVtN%PMLMEe`j%tKVb6Vl@kO#kqt;5xf70@9cOc*8i<09XqT z8JReU&y3}9DY0AmxpE(lN#GI6nT&NN)#lf(*%y9RcW0 zK$z-IO7@+=Qi6VJpV|=cI?KD#B{cHzj2e4ql_yZlKULn^R@3!l{?FTsq7#J2hNOuj6Gh&Z_4Rw_7Ci-Ecrp= z%Ve87!N7d`st&4b<1JN5(yRupKI||(Ltms@;Gmtz&UykA?0hnLN`_k(JEnY5m+N6) z`7cj)fn*%+UB>I^d!-8)vCf}|zD7NXjph<`Bwdj){8P$Rd!eMk@(`I=87%o{JDYUL z1l-jx5N}Sb$o2{PyP@tvDF7*)Wcqlyz;Fck%!@~KI~7u%1=AScK-{i#F7Lz$?J0TmWD3O3S4V&+{oCT>caK*SOX)zg zzu5j7T?l3@SWBGP#v>JbpZ>}xSS^jh2t#Pf_VsfBad%Dv=65_iT*%-+2}wzxU?ip< zP&4~s0P2h9+e%Gm7%;Lt??1|k@v64G60-LAIa<&2WZ-B}T|jEjB1u?KtITV#V6bh% zyEVLEE{K^tAfJ^=VOVqjVl*0ti*ei z9$~?|)ac4k#S$N5)6M|c(Oxc@1Fk-t>~2_@dX#*hY;RUliNF9lGud#u6O;o4WVldi zQ<4yyz=2WBMgRqoog^z+j5vF^Q?3A@Ws^*_sbrP&9|=&TzT)5k)VkgLbJvNSMKg!{xc(Sjnr_QO9rN||#ct5!Uj3K9ROGh4m-1xZD zEcIsEXVt1?bN8%AyaR)d8>Z0K|{0aPMor8P$M8MQ1M9?K5a0VX9}O%d{DYR}){$t%4j z(}BNylRMzrZe$5!w-@F*#))J@fiNpW_*dj_M< zV+kJRQ*w8Ek4|CAtrRMsm}Py?tj5TM{Qe=>)461W)CD3UIxc0yJlyjLTaeH{H~_J(0<(Awwh$_l+%z+s*=wsx1Gqr05WE20Hz?$N91!; zz)+-v88ZdS6X@JL;DWUuOSyQ_``B3tGCuC%+|ye-SHXUDEj0q97%~U%DAt#Z^%=yBeg2FsmX9ZdGnZ`o@kYJ6T!k+g+ zt(u(-b%tGPN*2LdgtAB)YH~!hfi_@54l0e(*_J7*(eP}WD!Eek^)PcvL5kh8wO6UK z{25F@Q4;UEiVufM-6(0U&a^vRK>1MP-sFl{wB%8Ut=Cvy<2y0F-xMw?eQ8{0Z1}=6 zLEhk+CXUW!HDR_QB0(Rb2zU2* zj=Aw)sN=79e5aS_&R<%Y%v{uw+#uQi`I@T&OsGvR7m68j?_+b-5Go3r`7oVa8Ef@p zvIXopUr{ABSpGr$(RUq7q1B&=)!4;o%-v6JxRF%s2qUwYUShTdm9exHa>wM@d&T0N z1sM(_E=uu4c27_*K*{;FPWV{R92~ZotVRI65(e{daq!P)+p};EpZmxuv>Z^knGe<# zQ1gTC@np{{^^!v*K|R-OYhJ1~L)D#y2q$tIXcc&7Ep;=r7WVvA8~A}c*@aT)3>HGi zCU-LFq*x---3glbf`}_=H!?X*t#+*f+8sg-pt2uJjOzOfbJiwjdo;s}mN<7IRBg!$^YzLN7+iP}~ z7IFY!Ro~x@lQbIreTI!Hn_oNFzZ-6XRM}GkrX1`U&d!Q73kPEb4ycO!uNMC6Bq0+Z zl=k{flELlo4?fkx5+z8dc(E=p>syw}XKy};7VDwt$nV=cEcc)%(`ZIsmpflz@ASx! zIxHzUv0t!w-E`<Q+-Uq6ymVPgmimPka-A9*GMW28P(!VBpyp5B~k$G56ztJS&Lh zzt0fdg9;>BtjaHvzj`Mgy5rhWp9H@l-9BM4Y0O?-Y2MKG}qp2|Kq@gId-W#Mn za&Gg8$oAPoRc6Z!bC4w6_SG3qc93InfQ!T~#{Etq-s~PW(+F}~XIS{{G3~qi<($W^ zJX_QTKh^7_nyZxc2?W@@dhu!4W*F2b?*QgMq_p^?4RY@EtBw>H&5}Ck%6^?-Iaxh` zE%&XsdYJj^(`P}EV>1PSMjpl}1(yrpmV(J8!*H^#859tl!@DKol4X@8SP?wxsNkS{ zK0lIO$b;krYHYAbqRG*sIrY&`l$(eDsEa^aQ>uFs^RR9PT|(o=!ht^`sujN6v~#)N z5NMp%+<7Orn3g3^TRI^;#C}TS>rVx7GZ5f*jy^Gq0@>0QxWc0Rjo=Z#Md zcnmTCu2u=!@F{hP|8rlOHycDu5&q5@s^P2VD)jqTMz z0=wnE$!u(vW~QfOdHAK!#K6P2{38h|N7yaZe7=cgHi;$V%RVY*V*{P9%!re|cUnqD zKl}Wc*pqCSN+3V;P{yHRKFrcV)edF-bsca1N67BZ-Kv)iyB2M10Btm6*}JTcIo2H+ z)~B$lig^7R?R=%UD$U<-+TV++)|`~};e3W<59_G))@`}@(Cy0KS9+)NTJNMrwiPao ze|`E8I~36Cm?(Nm?A+zq_BnxwpI2o}b!L}^(y!$qm*1n}lbnd~3v~9I{V?Fe^iZvqsuhlt;3fE#Su5PrHXz>$9_s2XPt#E*8~vgvC< z91(&8(G?mK>O2$nN;!RC(bQDlgnmy>PtPYIK|ztlOMW39{#l_pAt9zqr^v==B#t2y ztQ@y}BjWXHq+X$}m{mF|kq;$0)XyvGpcUL!sC}b)adopWH(CrFp%tkQ4qg}@o?n>X z3JdeB@1{@o6QHXL^Sk5&f>C8=U9Pr~OGCKuBB zdHYQ~OG``ZC;Q1Wn~{3C8-9Q}yFH3{UCE3{R^s2$V$1#UP)F$$H%C=+;pokw^k2i( zuNY4yQHiCMTkxGwj?}s^eGw7SWPKPfWX4F0zwU>=XjZ(QXj)%?DS4`@JJEQkj~A?E zTPE=j8z2BJVHh&_>wy@b-J^WoDRTT|JQ-gFMEK6GOGzuwzLjy(FfF0Wx~zLpMVwpf zmVDj1wbA{J4P2IIeM{FsJ(^z6XmG0HyxJ`xS4vOf^dx6Od;lBJ?C!Ps3O=r|8`j67 z`QKm}HC7^*8=Azd_QNMKPU25+Fmu*>Bgp6sA$hngsrR~Jg2ubbcYc)?9^_PN)Wh(f zviVspRr!h}c?Z$S)JY$FQE)`V&40p)4~5*n&R&|pKi=k>!TmD>!2qsrF-EWhW95{C zQz{n{6L)aM0fp0z0m*wZaA+aL39UpwYy2PYqQC!aeYNZ!-U5`S4ibSp|9JqozWw2+ zalAZ0{LGggtOLLyzLos{6sHDf{kLE>cvlhdWH-0GPw5tpHD4N+dhlmz|65?V4Ejf^ z8T?HgU=;A5TKwm%0dRr;Q!lcS_;&Kyzh8b^|N8ak3joz{j4_w)LDgXpc&Xd>FK%;u zYjU0(kg%0ods=`Bx(U$-2hy01)ZP}O53$d9g5ar=X7Dd+sVM5@Or9e&$ z>hB4YxI~~rIG`lppe(u6$|066>8!ZWd=}FBv^)piJ&RD@F&J>zcBtB+lA^Iq#ONF= zqBp>%oh%(DfEMWlj})MrdjIVYO<6DyP7Clv3{iGpPQQ}lVz!-5<$(%vJ|sQ)x(aoT>!u0JoF4E zS}^{W%K9R9v`j6!tyAPvrGm1oINyeRya9P1imOO=x6JO!wc~QPkdH@Jj5L!PtII>3 z*RHn@eY{Z=vP`wSJSaYMMd!XOZ{p^ES{8stA(^bJU-M+!M5u{UiB{v?rO^IRF~qi| z&G*CkXldewsl%mZS*8B^_NaDki*s+zI$o4|;~{Ku_+!V3Iz0kOTnie}~Zj z@B09ROUa8_-*fO+~TMYfr zNc^9(iO0V+`=6h2=>TkEOh6}1)~aJ#aeEo}XXlx1w|mQ2$e&fsqAbmzN6B(7 zFZ5sgyG%4y`%Sb~`;(eJu)Z_k-#f-zt@6{(oe%^(9Y05hb)Lwc$RiRg+B>2++z;#b z@Sg5=oj%zV^7;81Z&q0SC01;0TQy2Eslh2SY@Ppl9HW{3z*osL&|zpZ(a>V`I``Eu z!>z#PTDPq=_u0`(%WL4F*NKk#>p?CHN%4%Gs&cE&d$^& zo?f+0qTpcskZ?~eK4U)1ogcSmZ@%PXuB5t!hp*pq{{D1V)#9U7?kzd$=0A~-c_Iz? zSqs}*!3$}rB05@OKC7z>-7?F-I$D(CDGKe=mo44$zB-zweSLFn_R(M=Kx6frwS|S< zdOEhct~(yQkP@A{kOD04iGEF&l!w!xzf)p{(nM2&`_u+ESF(It9-q7U>swD%US3|o zVEf?U>+28Z_By<;Z~^YM0#ht31_vj+y|d7H`L8RypQHVTrun5bKAP@s1S8i z*4y`L1CyrkOTi55L$lxZF5j0g#E;<_8AGUU2?(B|H00_gD{0##+l`Xbx>A94lh%Fis{33*(}-5!I-~>y_~keMi{-b!C3BrPx>FNqmNa7Vp-3tkgJ=WF zKuttmSgh{Js?ZDmiE8UYY#&3lzEgrEiYMMr~nER!ah$b!>2(=bL#LBMh9C$K<F;#ADW4wmFI>JFjoo)SyYFd%p01 zJhL15tPqPTu`Et_bpO8By_E!Jtqg)F=T^?=Li%`k+;8C6kOsBa+1}EhvRZCy^z6Qr z&XBqDvT2EFPY=Hq$+o(Ae$gxxlW()}v6*Ltc{v4=xVOn!d}^IzifCqwA`s%ZZbRMU zRq_$%&hE6ealxA|-+C|l#rg6%K7U8;*M2M7)s9^|Ef4dSfc86R#LFUIYl%CRhom!C zp5%zBY>{`#tl+cq4qLJFhldSenA@pSE#jJ8os7}kv_|qk+N5HYM}pl>6neBW zQmNkrEurrLq2y3Pr*q?4blzOZ?@bbkmjL3-e@iYhXNrXV@kIe=s$ zDwG`n=jPP~Jej%1#zM}<7zZKu6DJa!GfxO|kOYMUK+Z>CvWEjh~W82e_?a4 z=21W~?cL-1Kf%X?%nT}nHN@u(s*g+>to83N!0)_3Vu*Jx;|F_vA9BkimH%3N*=b(? zY$mfjH%E}I?ojMq6py1)bM=sk*3yvL$4ED$&@jK&8lg)~fSD25{vXqBgJH^>u@`Gm zPwM^h^4i?Je{4^UIaOR7{DLiNv6%ThO7;}aU;a|#*R8CS=V$w_*$^-~GJ`h--B<{k z7*%Ogjkxdak;5@L?AMfYA|>%+bk*71X1tK&3wA5rTRfmKdRseNPm_`QrMAAR*saOw4v z2GV5u-}=9u!GT8-n|5uoekJ})-%Un_8C=&Fk0tM7_R|3?GP-deCx}3&-`fqtRU~?g zrhgM3{Cn{q{K5j^I~4OH>dvIb9jU~v+v2RUtX~hL?^qKcHjh6M(@TFIeP!_Q=i<%B zxtY|(RQns$RZnahA|m&*L&*~cd=o>L|8OxqE`f({J?o^OrSxJx zkwLI32rMhb3uK%N@#s;m{;k{}@*!(;JYw!`q!Kvjr`w3}#KdS@{@{#-8FAXIr%J(0 z#zy6c5%>(k%RV$FGH`Y!VmjcI!ReUbY$D49y&$x#w$a=M^Q@7=&Bn__r=>{bZn+(_g@g(fRS%2b%ApscpYA|MU z!^g+R0tUI`Q|bwzi+zcn_4In9iFCmGejzM0!4Y zP)%-IXHB^VXMnuP)rZOexa9aJ2P&n>g$j-?Doq53D0jDeVwvsZ?`rK5R=-B~>1Nr6 zR%u8z&SbSiksHHLyAxo%%xJr=N02!z)nV6t&C##JZ@pGMOh?lbc;2)9t4qucw=Z%n z?aV6anyf>BR&pJ{TYi3gDH$=zTdZj6y%Hs<0u#mzpf1R7f1a#s{w zkW>#?en5Ooo z{_Hi^8>V-QgGs^HwU6A;OtAVEycMMjl zom4a66fe?6ryj?s$I=r)2sbx-#KzHSm(Aqxpi7aK*=wzXABT6YYP(fOW}Q;0YE?ZG zI5M63IcLqRWVQulwR3r)T^nROcOl}yhG0CFAXPuAP&3-NMDzOEu;j%Y5E8+MTG`B1 zXEsmwT~?bo)Hr=J*p^y&^d};iB5FYr^_p%*M{EvIBU+pv5F#}b7z=drnBIr+T7@d@ z8zm13+!d7;DQgb)gft4p7_iC9@Fa$_w&dV;QX*1cuAT4HJ7C#>MUw&2KSB+@5v_}= z8ljfwgeyL^l=Q=T3sDtERgGz58yIqNI5lvkj3d?*%5|(9TaqcQVe9ku=F3pc!OdZP z5z!Q3NTjBFbZcOhXD8d!q)%)j{0e>E&vbH&W*_nL@EOO$L^%P`R9A!rWGevRW$a?A z00}d06;qF@(#hEJiO}Vfo(KG97^cM~D-t!bdh*eY$_Na>!tlXxE{-AWSJiT~N9F4S zD7HtgWd z1XOHt^H*wXj`Etw{WaAI7bODgP~3PRHlMQNC^hyi-HtK8&L0;6w<$^HF9uB7!LS4E zyL#gU>0AvBId+e9PESJd7H)C0V~O(;?MuB#^pI`2VL;W<_L2`CecknS*%88^eiWI& zS;|QuczP0I0cbbw<4FZ*>N+)Kkef_FVNRr8QL7bkKo=6GfeZ);gR1EOFz*34)(=C5 z>A)aXXrdJtd>2oQlqKH3Xx1syJPpcVC7a3EPf1HPcO|PTHBY)iar8-GX#hqXz%Bu1 zB35ZVxpO`(fj1$M6Gf0&RKI%5VYXLv!7P5|Z0H-U-&uzw?(QO1H>3OXtxt5-qD1t0 z#rRP5Q-}8+{a80*zEJn8pxTf7H91byjQiDp7cEU3LjGX?aY5?G_cxQz;H7&Iz!`%M z=R3}Kq+><_S}ozXUSo2PAI$`*dJJ~s_o?2Yg^gJYy%z${7{!ZD>`kX$dwA=!reE{G zFf12urib@@RU%%bx1ZU}2l{)y!qe)Zk7|pTLaPB-Rp8cq*CT1xUk=bBz(VAf;ULB_ zF5rtBZ2r4rWV!T*y>c+W4t7ZvFBqCwEiD_tw3yMRQ$;*gjxnkCOAgwYa*z2Xr3Co>dXD9;Q8&y{t2s z7xhWS>m!Zv@6U5FGb@!_0-L{TA0C(7FDkej5&cQSN8)Jg#RdR$;ktTAKTCl4u+1)4 zLw04C%UhtMA~k%<;jW(e@@fFEQI=H)A(HzPtDK3$FZPqLScb6#EwdfD6CK6^7=)||!g zl+}t{o>Q6}uAunzDOc8vB0^N29ZGu6JlDh8^GrDiA__4`w!M8K}y zX`M~MN?2Vbm)`f0_&GZn>pA;1+tfVWu}p0l!N>R|5j9;HqEA~}B=_?d2Ryp`FzHy7 zi;{ONP6N#Ui6`oXfBm#VlS}ZZEhAMqB~tye!b0^zvSp-t_TG@li}pd4ozLux+hHH40AaE55&w_Qqj?ttB&)rR zo&Ay-k2)i$?-f*P8^64nKQ*+|^z5Kv=Q7eGVid$yZiLUYz4-ooF#l)TP9gJcx~hWE z)=IMO+;IPNVcdkkdYOp?EFiFaUh&b$w~ZW24*t@8Fh7?l1g-l1Gi`a(BWRh5Ee-Ez zewsfsC{k&hxA*Zm(O8E9$!s=W>QX8ERX$;!tb$AtNu$TDU%A5lhWdP8y`3^A9u%~E z3sy98d&K!r6NPj6jDR73Sp&C>MD3eMO{@|j5}{pb-yE=fY5Z7lUyA49<;viZn!txy z{Q2gZ1Lj$_uG%&OD&2~i(Dp&4j0%-Jym_)F5_~j z)z^#*MkkXsWfH32uV}x*=Sag#;5JqTcI4s$h!qzMa&fcCwLWL+be|odO+Z|7c*g3b*A<>o>({7(#`kMS<<4Fj%ozDX_`GG3aoR5J( zpj=A!eT{x)d1ZN(2I(rr|2b5?w@-(d5eKkFb~WFshxXbdC&KN_n(VO-%6A9zUFBz= zeRysoe~$?#XW+Aejr1{0>04ybch_Ue3cbxAY_Vvx%azk# zXmJ_9z?vXNCyd=s0OyOC+=~Zii1&$mn16p_ti3J)tQp$UrJSV%%lG4<-{X;yq_LFv$k3P zc|_PpN9|8TVW0c?DTOKzryMUbu2e`QTQX6CLW+H|f`};(XLiAY`c$?ayp7P1kB%Ao z7D)AUZM)%=>nxNMUsI~YyccrBzxJV-vS|1urm0cIC@3qCq9Qo^i9i_u50+dCn+a2H z)DRrNd+7$Yp59EaDAy}T;04sfEyK2UR$^{`@7(}el_cc1Eg_C8y&3UplS^A{^ysu8 zKCoH#jqWnHdQo#@6Mn17<!(XC7pj0p zF(TgUqX2X3IIuHebuW-CNvvGa6)1!zX}A35<{(Z4ouBo{G)9(A1Qw15z$y|COwAW{ zpvagHqx8vl9F;1zA`Joftgn`Q-mlmGox=|%<=k;+p!9=13)VdAV^iF4Cm@$!nv5?o zk{taKJrS}!Z3_r0m?qPK3RqdLFr^Mzo zv$pH4gN@$!%I}6E5564wd5G=haS+Fk3JRkv)5jOE;JD3&{*iKSy>`*S&24>u{WEqo zifHtceET`2!I`<#oug`rZ>)AEPWmT*C}&XBri=`8Y)6>V9u}O^)%MNf^}`Z>$>d6d z=hHG4t=zWL$txOt?^>TJ^j;xh7w^2#PxQx%h&^7Id4^~GBcxu{o=<$den(X_l|es; zx-iq1n-3E=<}I5ku+rIf6u0}T{L6a6=g-H|-N%)G)PJ>K(=DKEh6J`pZH7fT>H}g& z&%_nu+LMLrD=}{`Gd`wkAcLdeVH!G6Jz*e%iCFMTq?G6MmrJ5NDSNj71QWLsE5KT3WvyURZT>Ypo5)u-h6hO~D99X%j zzR1vp!Ng*!9`W$-0Vo%HRb@bM7@V~W6M9?1(BlJf0)A^(NLf?w`k&5y3pp3~dFf^3 z)X(U>itley(o~DGmr+x5SA5i<{;$z!vlpRn(u$DRRGVU?Y}Q;Q3PvOS>;@cdk#+9r z5mfK2x!{52eO2Aal!n2WX{8XhDd-$Hk%1VEm+>IpEf0D~mqPI^x;Sdp?jy&;2PnefLjFd5#voO;SF;kbp z%#Y>!nZa#fah;uNM>)^4=B`pGZMh%QiyQDo=#3&YL;G2Q2n0iji$Y$f$EC%OyRsr_ zgG1WOkn(2$wC6IvIr$jUj!po> zvOI@b-`-yi@3^9HO%tE{ozk1#}-%a+aL6EQ?T3m6Qlp&^_QFANnH=Gn9$UMup(uLSz5zMXsCVtDNEv7=z_ zz?|xw0k7tL*&J(5PLFocgsjep8uXJGhLkzOU0yoGZu1bJrKkN?Z(DaqM3m9|3nrRH zAPldvfNdjYa;9*PJkQ$F6-!Gz@C8{v$(jrRgp{diynNE%WchB)6rtPOp+Y%1GS}x* zUBpi&9fuz+w#7(tl)HaLW_QgLFUz=N?lnV~KsVVxSb!d8oz2opF+X`<>tRoOw!nhg zPI03G@rJDE|^2NC2P{RP7 zkFxcX9_~sJ;{-2mE7t0-ytuJU=*;Cg1B$&s9%RT7ldhlDf7gn|Rsn+MRUgdiJm3&z zRY#1spTLQ#Cj(wAWAF?$jRUf0atjd4kL4f^kMuk|*{P~?nV-1tJcoU8_2y1%*4*Cg zI^f@u55$`YkVW&8TAccqN#|`KoaU?Xhz$x_gdxwUtb&=KAISfd4B(SP0&#GX7*aq-*c+iOwmhclw% zkIoc-{R+OfQXA9p^77J4@9mYRavfjXRMRt`03@~ zRi1BN)9m~fW_5CMHN0@_tIcBe@uQ&F;v0Z|hp*qfTJ;&34+WRO`lm|L`T>nm&gi$U zOLIFj1EHWk0tyJ{2b8#&n+?Ee+fu*RtU?$^?D=3`wr~Z&MVKOKF?%DB)lIMs*A=v( zlS`l4hTT|Hv53zE+*MbTU6C|YXfYcc=f8dWD8a|@(PMR7BIF|2FPFBzDVyN z&zcarB4QGba{=1k_b4loMK2>e4l6C~OatPqD&KU^`m}ye(Ko2}2tAX~v6Zvl!=GP- zE%{C5)duotUOygWx^8M%N#)}ZON)mIizRTK<6YdA3-Pl^L|qusS!H0d3c z`#(ILdpMK-|Hmt#WPD<2ITkwz^+AX^#hm8Y}%_gxNLs3Ld ztsLeQA_+O4&!YO>egF7fm+jhhjcvEx_xtdAJ)e)K=f7TK-^?BO=&#eBJpnds(rWtS zj}<&B`Oy7pyls)jdXuqfBs;NZon-m`b!d^uZN@12qt8{9u$9|&-O@K|S60eL9G^H7 zpb6m?xCGC9a=gpe<;_b;EfLv{HQt+s!vhIz{YAV={{8xs6>W~v9U&n-ca;xLq7i)| zlQxKGd!qz%$HaR54;f>oUfq6lz^F-sH#(UI0*MEURIl#`cgAt43xi{?8Buxv$71Pz z<}{^J_Z$jy+wCEZ*vTWxEEYC>EvGKh73_Bp$!;hc3Og^r$-x==^+@o71uPxGM}M1! zsJa_0pZGyll+0<4&jMe}2my++=WxwbDp;H(_6|?X1*(c-@gUt0pNRm-`t`F85VAI@ zgC;`e;AK>ksxYqtemAg`Sf?sr z2A^+v)v)N_3F83*x4UkV*=`JRaP!1d_1buKp}x3@B?74F5*DO@yhk_ecXd_Sxw$p4 z#z%?VLyKUQlvIVFzJaoYP}x8t{*j8y8(+6hq!;!Q0_%ajt0*m9sF$y7Fd8k}@{(3?u*95W1$6V`L7$|b zF-$ZlbdW-A&IhZ+U>S25r1rXjwI=F>ufMF<|G%*-Sa;;r6#?s;(^~_nNuFcbUW66WkYp43{v*$XuK}hN)F6AbQ?vfO4rrB zXo4xy1H9D0c?9EU!kl&Z7CHxp0)Rs^;0HpziDeFc5Yr-Jb7eU^6Co^$RY9q(=7M!w z_i36`O;E|6n4#In#OhS&US55Ptqc22i^QAoV$VN@SN0?h`b~^zacJ_l0_Z!3$OX}M zqg8pwnc_V`O^JB%!=!Y1rxe=294I!sAFoGh*YqGS39IP4?UMA=gw;tTeK*#mgIJXc zVtSygUB4_3Bi0r8x*XNI>~Qx6GbvcTd&{?@ny@ABBykuoQ8(w-8ldl{KkmkCsqAg3 zBZ-hv#ltIv-SXa%sw8yVv3q)@CnBm8=Wi@UWPtR?HkPNp=?ModNOZKcim#r-a z0~{r9a~~6PkB#H;;`b*6ttPlR5l-TcZfKd-kh+`I+MFQiohK z4%OV*;H41dP?4VZXqqT5>VBnl@B&&j2Uzm$xUa7-fmkAJ$!!>+S~J44ay}tp&Mn+9 z7h(~GMuY9ht>EhwLNor*BQt)8VFcyIdbf=9^*?mD4J->Qic089#8XyOal>oA-^my$ z-z~Y7KvgjeV!*>ms)#F=vSEz<3DBQ)Wr01@k3anCUq%wQ@)Gv)5;n>08kKt)9jrb5 z_l3z~;b2vIPDOfV=|_mk)2B~0v&W4zA3ulx3`ti>=K1$Ag z|4pG0b!BPXvR`H92#P0rTlC@*H4@c@l?jCFzk9Xxn*oVisNtm*A0HFY4yDNsQ<60V zn@i1lZNj45f+F0YR!q`g^YNa7SaiZL?Lfa5ygt;=$yD^3&8Z8sOi%GHizY1{Did7d zID3cZ2$Ix48IlvUeNa-f7Rk*!5h`oO>Bh!l{fcV`=UiTP-ihlQk#g_bOHy&*wEc^7 zMM;buS~OANJcpOH(c^}O|5OteBN91cdC1R_MWDSj$p3D?qg#JJ?RpoXfIYyHFYl-e zI_GgVRpC>bb-s;gcoH7eOeqb%}h5BRf!IGn~9sK^7(CXc$S^~>er25_`F)> z>C+$T6l8wzP21=G5dj+-HEE01?PWZjzHO$1gu{fT$CWaMGLQ2nLFNkEnve4Xs42(w z7I7xR+1ZtzA?S@rl%esN)M90&49145l0X}ROp46o3VjYN41g+S2thcw=IRBq1+vew zS$dXQJ|{?efwm^Z8OdU$EC`>M(76@$vCdbqgkkf!q|WXX<>WbWF1aXKDe+hd zm#7qYs%I7u2Vm>4O0Dm?-S`L=sWK8Kaq#J<+*+;0vfwIKj^jPO4{MHdy(ncULo{F! z6yY8ibAm#;4v244Qtp)%DznY%O$7RZ<`*WJ);?q*O{^YwSVUwX}pB#zNe0(x+2lCcaG-*If|a*I~7xFA=G5)=Lc8<5{AZ!GI&`zGADN(fSfWY=e0ReJI;X)Pl7%|A<@lanmvdcQ_+ zW{MXbOFYA@OaUx1}?-AYwp~MYB#JY z>9mJ%m?YN<;GQ!rV|@&sRZE|P6Xc#nPaS(MCzC-160cXwQN$6~ODzYjg^4xxWv5)O zXtyIXt?+i$=StFTtSW5r*!*^^dmM*U??v4jD_8mVpDo>sU-*>Nw7x{7r`VUYI#|-n zaIPHb2Gz1MQF3@=E_`qPK#GRE(r2LZx7W83t+p^}-XhTXd=tksMrt z)aMDY&|VXEXJ_;HZ(A~w1AejcsOj%~oCHpsE z=;|ly%Rd-T{60PL8~jvv>rKK^g zq-x$43xogRxc;y0J1gwM{`l_V;@h(cm4{ExX(gdVw@zkym6tW%?Y@2H$Cw$00LqW@>VFl0<&_RuCW-o_p;OV+&w*6 z3)`^VrR}-cae7+ddMl$=xakWm*-O9RN4k)ZPnp(dQ)|ADoMNu_N1QFMDVwg=2U%m^ zG;|scoKd9?2LdEsfk9iThN8{yGi%U#Vzw-{mX{TXeij z9k2I-8Qf5m*F7w&=qd9}{avt;1~>{? z7rhP05`0~n=blfz0BoC^TW$(NKv%6y);HSpGT0bwUf*=$h4?GVcZ%-Cpj5A}Cf|Mb z6ZmV;5M;Z?SyEhD%R2JUr4mH3KB=;zCVxSPDXZ|Y4!-aRr@^U3V#RdWi$_Ntsb)V4 zXA3tt@|@2AKX&9f|37khSjcFPdK#ZSET*Us#)x8Ui@+-m~9GsHyJi6`b}$X=O@xx z=u^{q=B^^~pZ8sN1A0Yt9{vS8*T$2>=Nq_ox1u@KbZ47?z*=iAR8ZQD z9t)L91U3FIM`Sm&RB{&o%?bW?X$?78YW+0DKUh_GA(xkP1^d;ntaoB-ZO`TP$RcGT zTthrO9Zn2rhSN^BKkh$94G7!J+3i8JRF)^Bx^`)S_s32TLIil?pqfK)Q30(|7x;Ag zCjsX9*K&|^I?MKpwI$4?hC@!8d9;5)p}@o1BX;QmMl$L2k|Q-ICMrNjj5U0NnN|B; zunXT=Ukm4#N%=>`<=BjnVX;kJZCB`WUH976%r=PE0G@47DC4VL^6_N=B zc*vxOjVa-hCjw>7aq{J(M>nhjq(83M1_gxzsB0d<4)jjZS9PdRsIZ_2PZ2{&Nl95K zhg0=jZOYulQUG#$RyrR;Hcv#RDb^_YI13+pzr=IW3dGAdS56Y9pT&n$UWxYTP1s_u zr`v_tdX6E!Ug0BfA7vZ?;xb zX^(pr?-x`jZyL`5?jX72*cf-c4RYBjz4VO=&|v2c`SYl$f9Kx`Ti)Hmyk~Lp`fTRNymKlqfSuL| z#f~XIJqtzf%tKER?gX`tmK`%&oY_hdfhRtmBOG*fyVFbIw4qt*Pf^J=wQV$|Vv`jy z83b2^n@k$iLyqUA>*)73Y#0n*yq;CXFQtRGI7K|FtF1Ql`SF!_cwGL4 zXvGWd-}23wh+TylhW@q0^f`215KFauOp=laRy=%t4^kn=){j}wFEKAhV1KGJ+1izCuQXgmFy4yWFJoPq z4~vx!-${~L;hL&xMY*v+04F_JfXIMnRftxZsA8|4_mzIxnt>^xn3ok*FjqA75kfmQ=I&h<%}PgsvabC+K=ZUT2A)T#2k3cGLt67-g%l4%<`-{r z5Dha@9uIeT3qj|kmt%4^oGA}vTd7elC^v~Zr7=Lnl^Ho|+ek0D1Z#-pO&Yd1Kw7-& z3xV&y@x7jNC??}-m0uiP39?t0g1;y|eAKVoV4M1#Oxk8QVdmDhFjaBLDO;_1o?66OH`wHH}cE5sE6|4?C zLV47ot|^rMYgHk6YK}j`_Okb<8I~aDk!C$CYtd~W*Jr%%Ayb|ycrif^DUopPWZS2& zV9wls1olE0ggf0#pM%o@oY}7GW9%SB*tcu=fhSh31Y31TuEBd!`*boGaZky)S~1J! z@^IW&&?!qP(R%{M1ciTH?@hR3 z#<~9kbq2Nw2v^GT!(dj^4peW!2ro##+qOm-P8 zMSrkZJ*CNX@26!UgXVt zq6d{*lG{JACcMKgzK$*5-my(ht@Gr(fm|pAg0g*;6kScsZ|M~oDHbvu*GsRxu{T&~ zSRR5@XTh>;oIO-au|i#*SY?@6V}=AAhrc1b@r|rAL@kyObAnTH!vn)b7S;56H)d!GSxbPYqP8m^@g84<_qddx3#_m1=iC{B?T;Rh#L@yY=Mq zDym9}+(aEGMdn!<^PX*+2c)Z}cI~Ub`0O8>-lGef}ip0V`v$q0o+N1107{@{;ljDeJJ0(F3;4zR= zohzwarDl`CobKs*7(QXM7+M)3A!ZqJm$J%41Bp@t)i^y;#tuBJqPJLY*cbmH?kR9( zVjYDsgqnc0m8-U!@Mv4O_e6v+7o~PK!BUJfI#Es{0}X)87%>ib@ZPops(47)yI9;J z)gs46SuH_HA-lr_i~5chF`FQ3s9%Nu`f8TBJ~Z+Hv2~1Z!@=ly-@<7v7p(D(uIXGX ze#-b^YevEVP~lrZexCykRR<{`BCWw`>JPUO52?*RgL@_ZwHzEAbf-++_ddhjcy;A= z#OAlV=+Oz9R)O?Kgog|Mop=rpw&ir8*WY7qXz6kZV4nvjPyt0Z?CCw9 zkSwAV!op#aeh|F-O%-77BkALi-D$h?{<-{Rkmqrhn_F;?B_53#A4UHb78! zo#S@&m;wy4&#v250>wgMiCgVSI^Z51}M(%Qq zr>{x6ez+^5u#6BaoVPc;7f7P>`$?bAH5&_>!h5aqiz+Gd;qV^F-5vU`cmIwl&Uw7{ z?(;5I7);AM0^;gK`=Sz;cKc^kPS~Zxtgh%iiE-dWxtXHSHd=b#gJpJ?6W%x|vh3D`g zKHo`GWuSx$Tw{V+U>*`*uA*d~6!AHk>-Z`o6e|HqSER8S(WLe%wm=Rihnh#a)AyYc z(+jRRVDX@Ku{>ryYGst%lK(gB&>q{}=j@{aXCf~mv#JT$eerDdZA&2>;t-yH&-@9RF6+j7uiqUYWpfERp z*00+`0~&B}P&O5mJeV@~5V8oTO?=i&j4eN36cz|mkVDu?Pj~Wke0B0OOT2V;i2C!3 zSq}%tj%;MT1B3_A@!CiiVd?^LjmpIR(5Fv*3;{=CtqE318Ia?&kvC&`$K+8brZEmd zNDd(KfvD0K3}8VKqtY{SIj-QX19(}#G61o?j;PUQ$CSm;$SL0wJh6!JhAriON`NSo_oF|=esXqCyUWcU<@9qQ`Q zC~Z#gMnq0+KiPRRpdTHAByJC--^}j}qqf1o#M8C);yQja;D!jCN~Gt?dLVe(zhQC% zP=wS=rr$?R;J=jmy#KCVTGLH_%cQG1ao_y+K>|{PSBxX>c2@moYEjcbCbg1UqM#tl zR3&Ke$8k|O;P2)2FveH~tP8JRsy8y3-r6c@L6#4%K%3B6R6Ip1LCQFI!ARtfM08vc z#RvPt{_c#b*{v$3MB?{}-gUJc#=ASha(3fVtJan)H+o-k-p3z83E`UXA$c>;G=2Am zYtawAktMRx$K6S(j>Djz`5V{HH_m>63U4<{t*u)HBiruiebZaIF-6xR)SeCCriodI z=dkp`XbJC2Y%Y3n5H6S`Ajb8`vv*8bvix+1Wx= z_ijPyG%LYjhu!hjtC=(Sup7Wl5`EUK(ecfAqgV3cvMJLC{dm>kDUI#LtBD|Z@C+nA zK~*%WS^bjq6|k0fAGC;O1)t=bpcwYKu|x4W5R%fr5x&_F-|7XF;Mc;~8h7e9k=Iu#PS>bi1ufA45btPjJnA{e*I(^Rof&*dmW0_zPuG@juW?k_H zJEHU?CXHtyQSlvseRqjktmbOM-161n#4u5+M#Kkzzf5X`|1`P8LpyGqBUPy#>uQ;* z;Xja$?R?nbfTs9ZabRPGJC>1wXmzpNZ~7q)huark>Q?V>y~8KLXt$@dh;#eI7q12N zKXcO7dD<@#x$o*3WHA9LF$9^dvJ3w0+w^Ms`V*$yGwM`-YS|$EiJfUh;m7*BVZppT z={tuKYqqzO1;xlW0K=dauc{e&0z*wMNlL8zbp}ePe z48@8!SL^l^LIVT^5CSkV(FN7N(Y+E_%a3`A`lty%Jb2@`>HQ-A5=XhVzH&KoP3+rSiredT{QE&o@3f(X6sVli-m$Hrk-R~2#9di|PEG8{JR2fK182;v_#k>%Oze3iJsu+!F%_COs zi>1^_FeUhc77kxkVs10V<8rg-C88$HvLe+X&0X}CV;=$zotN&Rjt^jxnZ9E{ZrReL zA=uec7cj-T`X7c15;-p2ywz}-P72w*e7_wlV4@n@>G`8)S^y8-Sb;N&^s@$;GFx6=;l7m3OHw11c^st`d*M7S<1IAv zblg_B42feO6*V8_8m`~gi|@18GFL?8{j-k1OQZ(Qk5Z@9d8>4JDE(rb^32Q8^{UwB z1*nav2z|AgDOnYShP+4^o$u1ZC!Yp**rN$Z_Ncc*T~h(I8w;0@u`b;)J(BMLWBzr8 zPdbp2mHqsGz(4pt6%ylYVNI{0p|nnj@7PIi7?)LoYsRRz>F4&-!AfEZ$+*d6fBP&P zH73b|#D(l=UL&X=ptgK6GNPv>C`fP&QjkgDr@C;Q0(~D?dYVoOeh!}!O{Cn=dQK^E zxAJyWca(0BmVSIhz}>yKBoms*-@YQ-`6_hvdN+5BMT+--jMY)^S97c%B)fm38y=WL zMUN7(#G^zbji3(Z!a$9bx@Fg!lKv-!vsd|ApU=GMf1J;AK8{!?w>V;ss|npw+ss+C z>#q?dO=n^8sUbuTH9^OUU`ZP0ZF45e(~vrBzuCQ>Ej+V-Qv^E^oPD2H6dW`fA+ORy zWIFrC1oTXdf*Q)6A-SPPXw!> zDLg&l6!^dm+hRqO^ed@0yV2t;*2HkLKBqQwVwlF!!7d~uL;*cv;PgUmUhGcDpUzoa z%E@z>!-FoYwFv0#p^+)qaGjrfk=q}qQ`V7KiBw&#ukSQDk<(;trs!0u*ek%F;s`ot zEKE?#FP+fcSpDS#)MSLn8$ec*b5QX9i_T6F?7Wx&AzYO6%|iK2^;y2GbDSTV=Zj2@ z57Y!AzRx<6+Wp=DYAatgEaaDkYZ<&LqiH^(yaI~WiEqPdb1KxtBuqSYysZ6nnbH=z z+}s6J!z>|JiQ+h&B-J^uNM1C=&tQHX2toPX?`Y0kyp53JA_^OlU`f!#c%B6$V#`J?kaZ z%MXHvr&QYJ`FTa;Nhrn=D@?3rC=FV&3>}jyckD*p>toiA`T<}3%rqpUM zS+*KjK_SCEi#!erjRfxbAAXY-7Q>T>Y7}=*zBpsxU&Z$Lx^KNbN#_=udNi0k@U-35 zEj43}`B$Z!MQ4PGIMMYkz93!y@5K@~yDnV!!fEPa_dBvzmpgY!3Y5>hWgUYQILk{x zO5^0Z4F3dc*`*jhaeXxZg9-Bt*L6_4I-I5a(JuTJ1e~x6l6gDyrjvN({a4KZg2s}X z!NKu0w}Gtr>1XUl2q2(X1;H~0$xdj;CR~x`=J|6sPpJD2WA!W9T&9+Js}`#aDiv?p zKkBl&3}d`qa6t4Xh20S1$L~eJG{gj6Bc>o$T8E?Ub9kZ?~9k+gkUja17wYAr4OTOtJQ0`jeo80sMVFzMy?_;6ZL|E zSps(8di0xZNY-ZuKP;f7OPtP$&%OtGP>LlgSY!R6caPMzZ?t9^A1(aPevIuuA3v=9 zt0>^BeWj0mX*;+~{wO(}@bQu;sEQ0iY7=lobAJ_h*WSNfHk}QmcKVznC`R*h9(|!p z7jL*jo%>eG{Kly3vr9jkQ(Y_-@YzY^hU%MJl`n=&E+g>MIlIJS={hu=R);bVt0YPe zv%rj9KQp$bfmCo%c)uKiaYBKQ+<8CI~1=p)ooJy1mS6j9V~qk6m{cj;@?-y z`O2u#Nga2y)XB^}?10rzrUc;Hwk#p>ij?prRs@Y*yG+A8{&c5EKjRl~v8oq(5x%uQ zKhPJbfpKdS?is8`Lw?!hpn3J1b$ND?2Ms#IekN%CJ|>c8zs!$=#3%8yndhm8HF%36 zi@gPy!z)mKO2gC5#S2JyUVaZID&-3N%XJ#Yj;l(4^A|6zJZhczA=iv;w-X>& znK{+ILd~s3ekC_FHkP}M-?@Tu|5oLOf!?o9N#5pZFxlRly-V{Uh)6gN$R@9XJlow3 z-`iiA?U?y=2X6UnsC!&d+8vpXHBTR|x2Eoi= z?w`-qIsB$`D2h2bGO_vKDQ{0PYku!r)ZUzzDsWGK1kIcKVWZ&ou_YJx8`ozb9Q39t zJuIYi7IM3zU{-bGi`*A8A;65}^Oh%*e=xyfg)8B}o8L~WpZo5lf~SPn%+Rpfegn1; zZ9m`iGvbch70!q6gVw_-Gk#{&e*Zqh%@GN_XKdA3)}$yWNi6rB8b0M9SVP0=Ezn;G ziLbhc0KEI4*6rw6YHjG&IZ+XIkwnP_0nfnq3OO7t2?NS=Xg`yQgQ5AiGoV;|9hIOf zp!Z1@cLTm*0Dlsq1N7XTBymDG#)Y zhpnVVZc>WmOX{%KRhUYhlI0qwg7a{{4qK*WP(Ywh)ET(ViW&U-%X+n`5fxOGGmF)y z{?#coot86x^tD4vUBjz^tpAj@*^n1oTtHv4ZajqSqC1cSUq%@;H?wvyp=Xhx`6v}KoGNAeiWvXF*R%^n8DMQk} zZ~}1xGlSs!8J64nB#txDXi2QKZclK%d3UgR^0Njf%@2pq;faNMe#nI{YI|df z%0shOzkD?y*gdpk`#`wK?*PEK+n?I{lk(CtaPvZ~$gg6TGOV)mTkqlf#6(t8t-*Ip zq=>wR)9k)NIj74~Pv&KO+VEJyYBR=5=QZ8gGGGQlQ-S+V8&vpM#s=wx`9cXK4@Vyc)T zPMX5QUCsF1bFh8uoFjN855paQWM3=~op}`r;GfLxDM;=MB6+Z_c~>_=@L7R6N*7Li zA~}>~vR&&|(SJGU*+x_OELW=RKUH4VS=E&%Eybak{4ZYn8cX)5vJ4=aS_p5}_rsO^ zvj(EL+EP^0CA8yWA5*N&3vPiG;&iSwg^Sz*7^3!qi4L~e+$3@4hx5xczq6LN%ze8) zzFwr&eGceU@SkO^O*x;zUR6UTw&i&>y%KSfBV-hG9#OrpsUpmyf#}i=LJeKCjG;_Zzn?3C^(d0)Fv&oHin=ekSo+ue>?$>89Sjw5J|7 zO#<97xsrE!=L({FWso`FJ4U_gFAZIXoOC{iej@qT*z%>vA@oSsT*xI{(8Z_i6=HQP zN#zBvR8HmWmyJ)Cd7bLn*8Wi+?T*)~tGZo3x7q7}tQG)UGv0(2pcV2o*_84e91RmdrF~vX*?k zk<+y3Bp^vxSXeYe9THDpvIS#A0k6RDHNori8>Y`$i=#x0UCxUH{go=Q*n(Z2WaR

TYf5U0sok;>*t4~Rsuc+oe`oWTZlQFxZG#?u@nz4yrq0FB98B5%;? z+Cd!u+?p*?D57pFAp*}1=XplNEM=WSeU^F3TV54mjfucgH;X9m^x2_~rPIJ@+irET zvRc*6b)+mBOX67+qF|+)hVh7SK@IXtw(}F-tM|t`%QQq3y{TIoD#Jhf^Y>J-`IGO+ z#Q2H*)fso(HvG_e#|$QK0zVYSDv4P^uNO2V?Ws}jMNPO-m%qTro`SYLot2xH(m#4! zt`|v8n9pZ$Upv!qjW*xpf7`Cjy!}}~QKQaC%Tw#02XAMY;)!y&JJ0$Yb|O?W)xG&+-m+ zAunid)VKAFcpK*S)Qj33Y2P(vsC;YMZdgyw*RNkcAN$Wn;N-Onv!82aK~)2Y7O2G{ zv6C4x-wK{lm?*a{n6jF%h)V5ImP%Xrv9!Y5aGsSY%8OTlKRI#@v%YRdCuL83VvS{> zg_MD0Zjb>mu@rK3NN2OmXpqD()HxH(`CQ!2h8<2uL~2pGDhK6CeT-0?#NiBCyzzz+ zntKU1kp&YxtEC5Fhk=#6;ESW*0>QnL-76J@Xn4Suygar%JZR(V99d6t-WJuu3ChO> zOo?tbXHx{-Gh)#TKW@+%j^+wBX;_0j3K|QQ$ z@b&&)Wlw{l;bmkObu>!*Lnv(2J1_X&H`>ISI<|k2;X2OX1+3SeF7fy{q>o zP37_{df%m^o;v~e&J~%1c!xey;Ce3%-Abu?Pf%Pit*iAf`>r|9-n|j_5VT~_KTuXbb8Cp{aWXITnU26CRKxX;PuRlyIgxT( zC6p&cl{=%}m2*L(hV9tOtvlw`EUep(zc z*imD6cl0$c#^QmV6@Ns5s>yfuoOruoXSV0py5>6F#@aPD-$u*^ADA^dkPSNO#%tVu z-GD8qigeH3UsETae2^PRzE6wi5fRbnA#?Jgq`tSX<~D_u?_J(eJ;+w}4^j4$oBm_m zL8MiZX1T-k6BpiCy>N`9t!vKan%!r$tBFdd&6HV{+Nt`N^bhE=IU-v$WjTnSbVg)wNXCI1k)CEqQyxNtHQgQzDz}?o2vYA1ROjea^adC473pglTe0O^jNCBtxL@UCefqWD8aI z)WnGK++upkP-hmc`7gLfNWjnk!#wlleK*Ws+-Y(WOaY7@2fZRJ&@BRbXPTRbU;2Hy z(Tu^YIsbNj?Qj0<3~Nt8O_X;`RRltcKWLc?M2qkadxee_&H0OheY41T1x4O*GOh9_ zOqQTQj)T6>@K!prce>JZsX?%@vwSIx ze#i@$=_knKV9%XyCV%xTt;v&^3(&t|+Mxmp++TbZRugTU>isum_<(^J-j!PlR_}TJ zeX_iYAzI0pBm5LKOPFB{L~J#lag3)j#9;!Kc?{Ib>j@q62g%Lib$FLl1EqjqPin#Mjt<1+0Nb&LKP>Yyq@jgq>Y9n14OS@7w5Yf(u!y?Xzn?I&mIE&@<}=z?3ie zBET@WV&F;!QgH$&BvZH~({%(8C2fi}g8kB`PSb1b0MF7>7_E{vt8{J88c%_O5r|cd zIRWRYg*~7CPeEa&411yg*aeThR;ddwXuf44Vac$hrh@NFmq~NID4wVbEhxCo8cdU; z7Ke^2ozWpq!{TYwh@x8=vBvV2{3Sl)W3X{N}_g~C;j5}=YYWRD#Slj z*Thr!!qftpDsA%*I9F&v;-h~mQqwNz!V|F;7GP4!Md-;}3`?#`Bg^M*5{j2B3vb*i zsYtfdlf7iCXH5U%S^crf$g|YWxX(n8K4=G2o#?evv@B^Z8C3A(zU0})1zZw;k)owd ze|*tqfPqLT={07+YY2}N&6$Q-R*aLbANXP_&)~rr@#}OP7%Zh#V=Fai_sqivh}BN9 zP=tr@Ni=`|=i-1{ntwf+x~29PcDc#`&1aTB!90!7db!=fvG2V}gm&2u%RmNon^6LK zd|M49n0&L z7EE%@DXFohd?}lH9hhLQDhMQT$z)I_%~k|OlgWCZkJAkxD9Pl||D2Rk!v<+^RwiAt zmSTF=>3*TI{^(E5j%=8ahvy;`RaI3l>bGF$e>4A_UmG!{a9R~sC3h*P!v0!E^31d#-l)huUJL}1gP4UTVD&0#8jkume6y{zNm zmWrO-vbEHfIyu%+f=B^y(Vam2h$hE(z*d#QRHj7rPv?;J&4YzSz|H*klJ7IhLCLVa zXDTA1g8|m<^_M$v;EuV}fuvtY_AFNnG@Z^mhXT{;J&?SB3Gc*TJS<>3J&;#-D7KV= z=E34geZh}ezulI|*_7kVo!|Xn7%@~08iHC!1ywzB0cBTU`+Fudr+Yh)vCLp@GRDg> z1MO;-t$UgohX=#pXR5@nn2_Lk(M*e7#@Jk_K6T!5rrdBLSwxs5SZ-H3-7YuVBhlt? z*72=!ST@BE^oipSDRV2bk>KjGZc-xzX#@w^W%xA@OQCDr2&-RrkJM>(=pXynj-}=^a(YjkThZoae zT|CyC^hC03vR&R*($5U@HAy59%@afYiDoo7Zi5XqOx=LX%nRQYKlJMy{THESqH!W6 zgF!0RQumPbVSfsII0uVg^1VC{D9B_};LCez>LOVhe?QR(b@Tf{UfulroF1-7fyh~2 zGu*!k)8GG2Cfk+MyUKpbAu5&=!^6D@KvDb=LcmOaMGYi6{i5eEcTA_(H0TqyvYTa~ zOPzA-V$&EHev^Tw0REa$)!A6{pg~Ue0MKn*KnC|S&XvNH-Ct@OekP>&xwV1sBg1=y zfx^7_l}M1O8H6VHI@KMBh}|hOVX|1mxC8j13PQ@1-kPHmN#Ba3ZX0?ouYjR`NCFSJ}OA!T-hwQ!rR|&^V!kD^axlxA^1Ryq_gY z0ag|(er0U&lVKu^noD+14g=1FyL~QC)2x2*>hvCGG!vSFIEgu!;Q`X~UwUlTB4E@e?TmrkMZE`Lsd zFu_O&xO&BcbqxjHX%z%RlxHw7vBpkn(Al%vvSd(n_6vQXJoCdFY_O_jlaIDRgoN)% zi+j>CFj}C25}35>|yX1$9;eaf}<5 z1VqVu&+11d@1W23Gukyc-#XpfwWL{(+GVTd#7=KoTS^a#Z!)SSDMMiljA5kc9Mf zz4*IK&8SMIGM{rvMaiJeQO{E7AV`6gWq_w^@5z$)gScz4Vx8RlOwC1|l;1{|z?_W) z==D?_6sLQl0L(W9VQsPCV<<=@1hA zqTIpX)zOV}wt%H%M!BRVW+oxhVX)KJj%cOB+|FeR2xy(wu>q$7TaKenEml76wwaF~ zH0mt*L#bf;A$XkHsfHkn9EZghKE_F54aH*tsCa6k*;>NsLvH?`|3vaGU3g8dQ9q`= z>BLpvAU*MU|08zw$W4$}=w16q{7TL_&D6EE&$W2wOZS?W+)7?E&(4N^r`(8#c&<~g zoTWN_MfQ0qU*t2;-^J>&O$=n8R(p&)iLbn{6$#<&b@jwn2%bYu7b^)EKU^qFwqnHV z$qm{o2k`4BqQJ}UF-}rEmj5w?iBEAznXjBP&2JOHp07>2dE8q};Zx}y2i=;w+Arnf z8Uev%&jyLDj{F_Q=C6|umLl*ynQTzWNz2bKh+zALS_AQB7Y#3NQRXk4#0UF|fZ1>< z`62M89m79Rr)DlQ#RI9q2+wuvua0JzHVsHNv>??y2})`|ZHS@ko#JN$Pi$=_c1JYL zY49wo#d5c>rLVmDKzeNJVSQjMqJ_>%MjH; zn{c;26`b{b%NA{o-VjZff#60(jq<{ce6wc!qhnajRxU9r=GQU1AJ!kqQLCbHg*%dk z2M9~ETCRs{!5R-UWFA-X;mi#R=)`03zf<*2G+$dW8#+Gr@=*Nt1+QAG7}_2z8DheH zju(g&8-Hwr_|MO5_<{4@U`Yp$WlNk~k{=_%_lLcrWs9YKvXwHSLuyjqtXUG=qk!-t zD(K!fc1yGQ4$3E9c)s?00ueCAM$`MJ)nyL&H6G~}hNp;rP~(VwI7|pP5Pkf8i>$*x z6Ni=6EaNlbW&eAj{Jm!G{ES(Ppu7i5-0*@J$>BW(9>Kz7i+!i4Ki+GM&@89I%c3>m zr^fdE^$XK{M(dkgPV>QPKUR7>6lTiw&G5s@*R_i4{;7(IO+6)Z&DP+N6wjLYG4b<6 zuZFjykM7?IyXr2K^E6O0eP$+Y0Z#&2p)G!%Evk@kY(_po{>VbEcqcKB4XLwl0p*E*XMQvccX%6G^3;*t?ZW!BHr5N zNR}U8`;}R?2s2KBPYN^A0>GOexUv}ZthVuOfql19v?~(^zgc0qmiR0H90&y%THu&t zV^?}o7Z6Y6l1b5J7ceM@1p_$oiIOR6*PF#Y*utZe{;#964`+J+|M>Yh}9IZM(?VwU|D0g$e8Pbhx#6BN3Wapc5lY4VceNA?boa(6P zuvC)!oB4gt_qz74>)N%;`~7;pp6}P|@iaCHn$PbQq&5u6D3=7dfzVivrL-Jy24NN z(E8^$ClR#%xx2C`jHFC_*C1bYiu1qPjcBX=#F(ZnTP`Fp#vRk5PZW)IP826+WOg>9 z9EzwUf`0}A$+ijL0;SmRI|wJIzdIED86DcF3TgSA0gW#3K05xC+0ZUe9&A&q-n8;l zT<+*+ezvV#wnTXBJc=?1Op)fRLvg(D z$eQ;Bsqg9;uQ+%5Kgez~!w*st116IyuC6A_ZA*c(7cN4OcvbV~U#iKso&6S{ERT2` zQO!#{@HuMGF}yl*G6=VE&-umVg@T359zoi&r4X)@_|GBNg&#?goXxoP0`DO9*U+MF zZVV9BTzvrGN@>_%HwAvbj!L>GNs)g)WWL)`4}7dzlSIaL{IzSvXnZqkO$=~luc5Je z25T&U=2Y)J!WItFjgxuR%yBgSk)_=cGw37MyWQFGsVuG|SIKGUgRo$q#2!8y?X{q6 z3XN=r8QW%Vq5{?gDAT%Z?ltCV<9gB@+{D|<54OEs-C}RJuC26k#|TH~)A?RQxEI%# zT7}Hp1(gmY=8dTmuYJ?NoCVgP4}>-*5jAfav%)!ObOp1fGHt#LfHNF039Yt3ZlZQ9 zkF*PYGPWKO^iM$H_!o%<>#3tp`?ccK`DEEr=4}5lF|4NH3Kl!0N7*z|YXexn7(Z!y|9J&3n{#zJ= zP5sP>zX**u#*jY%i^Jb#2wlT@-E$rPF?=T*GszB(3VFXei9QF+Q5TFEX+hzw)k$x- z^+2C@_qe{;XT{$|7gwnnGdfW)Qn6g<$Z_nFJ(S|FE~MO`G4U0x2NYi3;j*&fkok!Y zBYR*TT1yX{2ABuQz5D4r6+7M+W`yE!O#v9V`1$kGjjiCKhs04hDo%%4J;RvNZ8eA- zyp^X*dg)l(Filv02aMh2^;MJMac}%=f=cs42NuHU1_${+)B}O{JOws zhs3Ut0Mj=+_xUf_u3!f8wtIVH%}E=3{WTKXxFG-A+gT%-OWB=SMPrf8ggDg+Z_nnL zXKYSio{dCUe<ez}iYYNi8n75y-PqAEF0tq4vN$iF0yuYGz$rG(aZ|59SoXIj-JYILvOI3!ryPeF5^>zXi5bdLTUDb)&n2uNmFhrD$8@sA ze72vC&BSQW4I8bYdsWM4*|+$LMs`zd8165v!?sr6`0(8h+mM{N$8&7@b{l3;{KpOk zZSjrsr`;;0!0A`hAw2>)YH^2jVXOuiJEEHSLVaYxpWzyC`dPEa18tnP*c9W)*ygpu3eIu9seAP9Vji=@H=VG^D%6Kdz-LJB~_KqUtS`N0-!-Ri32Q-C73Qtfq9I54h z9@ajx#O>|Ct7tid(2ethlK~+BN69vE;`gP~0di#4=C4=r?avxgf(aK}g&!DS(0>)p zu(r3I#L1{Nlrdh{C%VLTX`ew%(ANuoCLt@Q)UvKR&wEFMX3TE`?VY?^o|&&9BzHn_~ zdp5;@r9!)vzVK=&?G1Sa28H-WQr81%kkM42-{|E&4-!>?z6XA?Q1`S8nLYr|mF`l~ zc;L+kKRM$gvhzmvcY=7iz&YrdMom?N5#A+RHXDzoLa!WSIL4(wJqIJ$Z;KGk02$+lrP zjVWvJQEsq9rvobHZiDwE3;%4d2dURqf^(5n9(so`zR6b}8al^OUnQR>@UCzBA8RXWU=zO0arF zwES;dYGC$U@s9l3(eBpu1!alyf>FuP^n3w8lP`m*D~ zd*ow8*ObucF8Sv}5C9H>lYVQq8}S`u_>>GUrI&)B!ELg;S{Q2yaq2vxc(;X`dzkhJ zD_ZcH;#WrUD`s@CAiI^n#;f=c-1f5@GrayYa%9KG0FYK>Lqn?Vru?Car^coi5xr;st# zq=2s}c2tXkFIiHWoSui1`Y9cRFHYw7ru+wBt-Cyw7OdcJIL-|R{4V_&Z}jaQy|0dM z@4UZhKz+_w*83O(yy7v_BY@2W`y9L!toBf8%pxB90V!#+5zOO?CH{`t?V0PJ`Rr6b zjch@2zI}o*Y6HTm(Jj7mn$DA@C-WX$VRzi^e?!|CF@<*txixq>X<0c}dl{uVVNjF` z^vJ*McnZ}nRbSeT17=b(WH-7Ofh+iR-3!6%`2`>Q%NfhyQ2!*OtCratGOo1@nCSr3 zjOPrkZgmOnjlW=-bPXf+?zxE!jz!t%V92=ON|+SFM>!owQg9_C0?H{aoF|9vOQL!8 zJR}yniDaoEfBSXfH*XTcDIfVg%c|%0E8B;qz3b7oP0&XO;50-4AhT+cxzAfx#H**L zljp@212RhT_h7s5e8@%<;8@sU*09-qxo9pA-#$iOf?nd1Mx;QpZI>(a?&}u1=lMLs z3c8rJ7`#yI3LECG$63UBdVK(0^q7h7?F*_c6)R-!6F*6VYnvvZ(1CLI(}r5;s7wpy{20W z=VZSL*5Ku#F{lAKxqGXQnT(yhMPv4Dt7Y0{vy6aYDcUteY>9smH9_bl*4h5F^cz=b z&wp6;Cem>BNI3+oDIeReZl{R)*NtdZ8);0lHoVsJke3E3dJfqB7}zLNonn52Xe?8^ zGEqgN>tLjWp}=mGcf69xtVZgkZtQ@~k z3mJRR)YmV1+Q6O8ZpYiCsjG5s^=fU!rE`tcy$$>v>upWJ^G^)6IGszt3Ql7??;*+s zT$oy~MZ$&c^Hyl-SgFDxt@NT$x&)NN+63V2OLWiA2jle^wETLrd;CZAbgtqweJ8=U z)H|2|c(mu{!RP>^^b(BT&To}bhfuL6jAEmdM3G(Pch+1AZ%VUGTQb7<9g>?L4k$HV zEZCW>2Bm&O{g-U#IzQlBjWMINn}&uj3ULx-2o|;wbSz7M`t2g5c9AXom&3bVV4QgL z>5fZeW0-@N8mmeaS>y`7@Rsfd#phRjG2Eu99QK8Yo3Zdad10c92vo6?ES^&GY)CEt zc7c(=QR38VzAvMOI-AH%2rS8m&$ZSX9h5zzdyH^efJ`FPnuzLNQGW`N;HgQLtX7U| z<00{)IS$B_jSSuof#%qU>5C|ECh)%PlY zz@Zr4&`453z+i(aF-I7Y&)?+RulfnhQ0_;D3XE#XAGq)GI_>DgB5o^MupJf5ZeP^3 zvqnzV&etT}F2>*Hbqv%!`-X#8*}ih_{^l$%r8{-uU^Uq8cY_Md<<`_2pWGp(9pxIS#!g9YRj%j*}!K!Rx>q_d(9@}(^lGbevWc5PL@Arb#Y#N6@E3Nz6G+q%Q8bfa!JOquCo1 z=xIy$LVnT_V-5RypekiQ^A9>>Iz|rdB08{&x{c2}PKz_`l!Gn6;Hklq9}i+3!W*M% z>u%)s<_U^Ks*Qx>@zs?Ju0g*SZ6-SSri^;cz}}CB8~dYCN{?69F@}FBz+uL~u1{5i z$}z1d=&k9Zn7^)8%ig8LekOOG$3XAA8aHhJzG5(^N={(1JLG6Gr)I3GLUjd%A6gj0 zwG}FIN`&cf$S}S~#bMuIo?8W9hk)d{OXS`Af#i`O0w}jf=GqWxa z`;NL}xq4&=0>Y@8%&%&qXvXidcS&3Xo4=gMPRknVDcio*6c?yR$lXs!Q)XnC)zfo1 z^c)>R9(?IH$muQ-M0eM~-TO&<<$~r-GCnJ)f>$|31z9ro1G`I5vtOgJELK*{yv?}b2w!@!eQ+a) zn^MH*tbGL45H^?NoM+|?x�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 SB5$Md zi43LXWLSuOEdkV;upGQ_7w2NX5U0=5-xN~ojso#RYVDWYG}V3R8KQC2#&`Xb*>~+>KY-Sd6o|a~ zsFKd~!+Mn~sacRl@FjO+fbN@`6bBrk9HHGUsTyt(HEA&n_0n%Mc!M<%)8?H2gcd|} zeioDYR6cIr6S)b|;3?<%XAPmsfmqV8y#sTgj#j@V+jj%`gCt!ewaJomkJ@$dVQ$Tz&@2sL*&y$vVlp(xY4j5b&#(+$3TS4whjV2}$XnaHP{dn|%cg%Rr zehUz7O1BJr;u&`q zmHqPLQ8i6GHPs#)f;XPBu|H~~WJW_Ho?=vqs;>kBhj0bc#GImz^`1nA)c(w$eY>A zs43^ty&;kNcWef|2ZuF^iFHz~e>EK2u@s@#A0keoSf;%gRj87xfzd4$V~8 zvHkI?dwtgqsafh$`uoQ=yhXFBg(9ST8o$8&@893{^*De3XKDtLd)!C?IowD1*$yy>eiF-+fA1sC zECPR(Saz*nQC>d@tUR#jO_4*xC_y7cBW%Ku0}?cD(E~uQYz8|Y?a^H7VNvLFC{$VD z`)S~pQhu$q1L077XiGjt2c4k4+ze=T-Z0Ey=H2x3zND{MMBS<13MmMQ63kv+`qr+> zDeX?i@x0S=H)7#3>oP!NST|vZE9W|Nl!Y2*@{As)>omW%s3Vd`VcgO$Z&4~Pt(5Q$^bOFp^o=-)-xw3bV4jF zrK(TXm5PWcuq3^S`ii_L5cmW)lH3gu?|TC`W{AKYv!RP3Wfr+}%G^@rE^ROI(Rimv zLy4lWlYdA#tQU2wFAtR*;2!65TeP#4%!me@s>`^eAtl8R6}>}u%W5ISL8qNTZ#g;w z-$DFgNA012mfIsaf&_~qUW>NmJa5!`4qw=ao{s1J%Ot`lQ%x``A-P4~P<-rHCJYgL z3K4Qh?0j_oj=r!3EHt7ed>8w-7BiTOWr=h%E;TMR?P>-!Y70*YL@+E_kO=e|G;T>W z3>6inOfMp^sASZDE4Z z5%Q_np)+VSA{Tl*RjK5h<)Sk3RVvY886?;c?0T%dIdhnx!w`elBvMXK@S3>OkquwM9+q3-?x3PJNm*3@i^IZFppXaiZphaR0{>h z9RzcnubT!?@9(@KWG2&O7m*xiPoH?;0yk;dNb2d+D2u--{VfouMb;g7qQN=5iu--> zvi8gCoTS&jJ&gMvCk}Qo5#@MgUfJ5@N@rYa>3Ct|p6G*^>lO8r=Z&BqdMPPM8HVC9 zV!PIW)!8iYb_PXmd7gL%d(Teo$Z4L0`FZV0=vj7%p4UUY+vR5Qs zsqqF7vVHui^-8wuo{hjSCy0T*t#?R03aT>Zl8HeRjNz77l{y(pUe&OJv(08#RvQsD z>sQ6~)9OEE68*&kq-nN>%F9th6T1foV@||ej?%efs>GZb!?(E_9OU-5MBN1IZf+$s zW`hSNg%ho<1(F3Bu`tD6ZZGSJ1wlx;){_7U7h)G9RaI5C7~K>cCju`YyQQsV)G`W% zT3$}E8`wPa7h10Q@ncVqz8FwLd5?*Wzv)i(s0{~Q%^b2gVQD$Czx6qG5RuGivbv-I zr5D|hDCbtr^l9{Cx>ij>QW&|i6LoVjM1t2AcL$BxH;b$B+O~N8@?$90()8|n+Uj+&|SNhm3BU{8$R(X8nNsX z=ju5YVm_46j73x&OCHJEn=F-2=#g(mSR+9P;q6Ao-8=y4{cSx_dlS~5qzRrUkd>1 z1BB#r8UJQ>|4;HC5NU3pKLaJR`MTCl9%r+4?b+L_mD}L*Bo_z9n}5h0Pwm;Ck-ukGFT95z>z+ zd|lY>F>KYiRgL9c$Qp)@?vN${bE^ug7bwCj#ellVLGY9a4P)uZ&6JgL(ieaR08cKv z5$v-$^{HEt;v3z2ado9Qym4?xSp0SkFERt+k6-tN&DPqiQL9Tauu^3XabzL$io71% zcGdt*JkH)oW5&BBKT)yRgm+6RF0qD*&_c<^{;pKTRu$eO?4D=uE48`=Ya7RKt;|$WdGml z%h0MS`rqo*)MQnEAmw0%WZJT^5vwkyJOzJWtV{MV5pmv`T%U(bwM9p+CF!8U0|Ze@ zYn2lCSkH2hQ}onP??U@UYhm{3M{XktfgYjG8kII(dvPoO>vF3@_zZV&U|J|8|= z8*u4mejr5hA4mWo%m=O@kej+v;pm$n6F2Gn4@|U$?T3@*j)WeQ=1$mgis|eXr95Qp zY8n4~>LPQk85z+M|CK`nBAt8F_cr=`?bg#1o&o&27THRMNahI}9DX(m)XE?ytJI?R zc;B|iYk>F`Anx}sQ}?mgKyjz18Gr+}(u{Ey3MG2NQOOW-y9}*FJ9=O}fchB%Ac$4D z|5i>^699M0+c$F=+Wyu05aBo4TygU!@G5Qn)~V4SD-)F`3^8@ty|YCh#MCN@$OCbeaKdVz7iL`af5nHy;P>R zqjWOMd*XFU+46-l&Cg=kniYS2EnSmF!#-W==Mcot)_T#iz5o({s=BXn~Ym!IyK;^&u{pT&`AnVz@|c;vXV)h#q(gH>c#K zl$2&Ceh2T{QqA7topYn&Ht?Z-^2V{l;|&$ zxY!G9%Shlagh~XmkOU6$ugM2CXC&gdls)`nS{EE6yKcb%sFR%Yy zFvR!`*wx1~{nziV#iPzfs$?%eSruuTtN(k<;3{#uXla^j4t9Hc1#kNaeysRE^_8t3 zF@EZ=|79w!Upe_QP+vgshLNwlb?uI3RQkV4aUc6v#zeblaXXr=s5jQ{5BSwa6q8@+KNf6#5ocjA3)^;&ea&-;dbrtFXv%$NK^E9S7?#e(&a z_s=oZ_{mS=#yD-pZ@R&VFh1f#2F_Q8lugox;y+?_-Vt z*mG}!UrS_LhFT<2L_#_OQ}?L{ZX&#xT_Ygbn^YV(`_cG?x9h!(9<7ks<`{to97d{(0o#jS}Ghh-8+2t$TR>Y(e(;SczE^R*`M*Z=zPaonJdw9 z(coIc3=bJft_5;02A>OrtLM}3+=~dZI<*>{`MJ@xh%vvO?YXNEMN-Nc^GIOQ zjkB5Eh|sRaO;tnqd>c9*jpFqudQSBP%G@xu%0?=U1TQB1YC&?pajjy5>$z%(cGhD% zD~I2(kfKF}$Gj54C@+sf@g^^B|JDIx2HK$Gu_vLgB^1@ayot8ddWb(}tm1N;17g559(n~%B*Ub;U!_@Qe89hI z$}=BZ74*=9#E+usMtG_u+m&aPUe97prYcHsOlwQAu={RrjllAHuItdG!>44wd=48- z2UA9ULq7}LeYKOv924g3{?&@{^INA#s8QR!qs?rZH82#gYvGF@hNLk?E(QyZg+1*wW}L3N<&UqSPR=;aN6Z%yW?@o>S6^hEVrTTm0uiZoZt^fr(JAwEleH?GPWL@_;EpMhxMDj* z-sBXR7Rp{U;)~X6BkqE(D;ZbFAo%Rvnpeln59gm17ji@gOo&cYln8(0Upud=22tlI zSp_{2Am(fbc!FBkJj0la8pNtH4IW42;8F?8jpiG>xIgVSf5y=Z6Xn-O|5{HNdP*TIi<8pnWqx#K zWg_|^N`(yC8GYFE$vdfv_)x<8t@Dj(DU7y++r#1Cgqh3gx`GP1`j~=)ncxZld&FuT zTRbCaboF`mdh~O?2F=KN=8I=lO!m(df_gOtnP}bh%dQI}2Zyy4bV}uAZ=oeqmNwRNT<;~h{V&gh7ZbUxnEA5QFHjs3@ zZm2?|-n^0sp6e5D6yLO2UloWWdYr~JH1kO(&~W~`siZ#fONeOzA@Qx(nc@U8OONa7Pa|x zooEvv2u`UxQ)T2C%lv}rV}?`4aCXpoPSKWN_tIPaqu9JfsyKI-GD$*ef_KNzD)lQj zkGivYndw%d?w(V>`|cRgKg1p(!G-E{S%XBU)*>Cm;m=onZ2`@NG!CkWjPK&>aP_43 z9aZ8ry7dMoO08%mos3u1<*iW}RS93WOlu0+;{{B;V%V$x5SxmAw4!?Gd5e?mxAt9d zz{OH{v!FbX7UrTMZQ>Z+PEkz8V20u^tO)XaSX-7Sz z8GW@h?l~ZDtq`BhFUN0dp@g$YUgUe-a8cGx7vfDVnp-l??8mJ*vG@=RPz9K~XOH4e z`mI$+&+8yo@jqS45xV!pJQZE?$wrPi#qxFXzNu7-kkK?{&fGkrS#U>phI)CuXVQ2sHo-_FuG9HO+#4~(H{_}gkUC+~1y>EdV z`+L2=@4P&9S=AuTH%C}Faj$zRwO%(gpsciUCe~oQwDN^(Pgz6*X2Ts54=r54P+>ji z@209?Dk7Elj`KC8+-)gd!}_uhxD2KNeOZ*ufQTO7l(UF3Ydm+DlVZ1({i~YwTD$Og z_T5YmV(qn!v-b9S_4!S0i3_TIbJOgF*kNV!jyE1(raSn2Z$5Aa+`irv9s8)N>i9CR zkw`y|BB2!f5=vQ#{!}DKzhq!~Hpt{6L9lT;xXb(HbMC4awBYm4htpN2m6frlSJmGe z=@yiS-AqR5tt)SD?;mKb=6BjPoG;y660c86r!ffw|2g)u79@Diqv}bf7 z>bW2EQa;gsu8)m7Ki8gJuz8m`0JTN_`TY5VY`nAh?kk)O^%*`vQqay)vK$>dn4Ojx z$A{>TGuO)36D~ck+Ec%@4;d8z)WiUoBa1 zJap&#z9j5Qby^Vp4I^UEtnhF=MV^cutm}=`blE??-RMk}{R(rliMCx@Y^yHrvYY#m z@7;3oAg9cr=Sj*zVYxtf)bQf1^3R|9y-I=YhV53wFsBg#mgRd$!v3mBGX=`fVFGjf zd!k`@!7@2~gc&0|hL{v1KuK-@KMKERn4ogRT*~kjI@;EbpA9>M9)Fd7>ecj$UL={f z8d*Y)K=x-V&WAHIt+%M&AHz`Xmm63H57bxM+8?GQlRIeLoBQVl)RgR5cC-@9NIj)~ z>Y`MV6SY_8w8kJVrXMe(ea>&Er&w#H7Z-yiczKbp+J3hd!~4(X0}t+o)N6-Oas=Cb zrK9>ePAb0~&=(;TN}+M=5c?_2*hf0=#rtw(HgCGlY6R-r^oOn0TZRg7JtHQ|#kipF zJ!+~&Y<8P04Z`Wm%rf0DG-v<3|KL*jjI_JOez74*lkhZjnOAE$Xh9v?RCBN&SL zoY5~+t~5CN)1%X%n9ySZX|u(b@d8TS7AI$_6nHgTk2`WVczr!+qAzwP7z#fgQ51mA ztDzaj{k^rj&rE(uegWg2_T#2z(UZwfR-^U(z9YyxwbrWa`s~y>T53JO)o?9ZQ#^^8 z?rgt^4yf3#EzhN~`yx%fZzK5(T~<2T8Du?-#t|u9TemthE?@*`gs!m{SAG0S@kYLZ=>BX za_pB!>70)4t9P`JmF@l=?W4g8-n}u+xM!ZAKe&v37W`7D=Jq>W)7M`d-=7DnsohQd z+{mJY>V0^(cm953SQyzDZ?*6%nxCKF#dO|M`T5>j@`_uC{M!%HEeP%+T~aji`3&1w z3Uy|u7uECIMZ?!tOBudzpS_oTZZw|$fs4l5qiVsx%Fcr;pN;)PG9 z6v~9*jv|wt-V)lIFPbu2#lUW^_1UX#?QLQOh6}FQBdxZsD`{?KV#uYAWixp(M3O!z zEJ=MdcL7>o2dNrfaHbh_F>H4sch0Ko$bdX{L_zDaMeImbM&}&r-Pj!3Rt)DmYMsr* z>T8WxvR8RrK=W=SWvROM@%ZR<%q0~jtOG48X5dykw=7pNgOw#^186EgG|t(y-Fcx> zLEccUS>F1I9(PHzoZgBVWqZ3DW!tKQD}T9-n}$O>AG}?|R7|YCgj=naR7Y7p_DTE` zOnYNxDiY&Z*2h>X3iyv7HM_dei4oR1cdWX=Tj4I`w#)T~lN|+oFxUDlH^Qu@<&M!w zHwdDsLk!W}Y&gCmCg$cw)iGzg>T)yp&0T+K?y{I?{l(tf{Kwrd*59^5{~Z3g_H4^x ziy?5gQNae78p=YfxZ#oA<+YfzUwmup3e6ita#V$eV)%{srm#v(6W}TxgU*6_ay4iz zB=NLtc)4NdZGoxbwtZ>UMD)KVBCrzXbX_aIcY`Cu zdHmbRy%MB2)wxIcRzy}~7HisoYnhnZP_{dSPw1)bqnUx)1o}&Xj&x>3cOcfGZ-0^V3`Hz;)jeWYoT^#oz zzSIe;SCuzXJoiZwvPU7J+E6L=Kd*uXJ~(|rEu3#tpUqxp{Wh*#%s9?0fPQnftm3`* z+y40{Y2q|{GI>h2wd<$4w(yLmMjupm`QD5_yN%&Q>9g++9&e4hal?#iHt~Zz4 z7|a6pi`HL$9mmzqqZQ26o(^v9x_4^ZGU`g{4k(1kFp<}&enn7cWooD*E*D*_p0+>j zuKs#5M8l*1p;W#z-=?mL(;?JpV>PVJHgR!h$j--`}*_SB4snB9(?0?o2V>B9DjxoVLF z_7!n#!0jI88V7A~`1tyP7h4TvsK0mktY~*B{c}a+xiC)I?TdEJlEdO+?ByKnBZQe-|T`8=FFO_q-@x zdRu-q)`45j=(B3O{T8O%`*6f7a4iW@VUb}D_R+hS51WYfcg=YIiF(D==Ea8B+n(Ms z)otfe`My%cj)2FT%r#aEH$6Q)BeH;F`+YY9{AfvnFwbJSpwW)<&AW}sQ7XuYjM=`e zi-zI*>Gm%^U*fjiq_pPXZM+8aYioCnJArR|0(o+A>1&gBRb^FG<>xzl!Y2@wf!fUdfZ)Ls5IZXgbWh;d z`9Nlln9%*2(#`d0H^GKixO#r3cltn+F*CD{q$hlLOhv@OW#y#H^9!GO54t7IaA7h8 zY(Mdwb4zI`qeM&dS&Rfxj;GhGttWD>YE8;>G{*VdlCS+0?}iD(M3;1io;PP{Wm3E6 zUVVUc5lGy9E7AR;yO)9H%un3QPcr#44uKsFDn*s(lNS*9*+L})vI#T?2V1CgRPrZ3 zsYFkq6uYG}uYhDmwuvDi=(IVOF|c_fDMNDw?C%vI1x(Tm9J?dt()7}Rv@0==Q!{F) zd|(I&P%-Ll?QR_$ocT)$Ra_(p=NpV{OIXNzjYzYm1(w)h>(?(F!A;eVv65!Z9ZA8Z zUaXpq+_i;xRaKKl(Ne)BLi~J# zUE46&*>hVbXC5@v#EKAu*yGn^bb}*hv;OkQC8^CMRg0Jp)T#>_3-BlH$RaGWzHiyd z+;f$K;hQ}OCiD>&duED?i!gV8QN?E#+EDK@vR+)~J=pt zPtLxO^^ABlO3Vj_&sTyq1L!*}IwZ}Io$NORl%}(Lh^tDHCGN-a%-DC^XIkn&H;G4` zrRx+TkIK=TIwZVA%q<+&pbnUR8a7KEp=U8OQN>- zRjY+Qn7#Wqwy9r)MIHWC_}n)k$(fb7`B>+hW-K9s#d)}n2FZmW7wr%~>mV1A6rS?O zk7UVDF4)%9oISK^Ey1zOP5EHn?_Y+pI`Uu5H|yB`&LWw9$&9s7*Ts6iNW|joa}5Er zPhPyqclC>S)NR+RfEO^3mnk`1fAIyZe2@;FT8e)Ry1|;==VDgKkz%Aor{93#qdk?RM(U6DZTdI2Vdek(Q<`WOX zvFTQ;I>Q%g#}%odJ6q!EqH-Ze@H2wT&(Gpl@Sw)Siv;~TO&DCbjJ3LLNu=AQ7gK8 z>clW&(D15=F(92P(>Maz*09@ML|j{Md5_f?D6Jfczzj`SfqxHYzUdmhN9*;TOhpnc z9jtTU;A?z*b8!6eaSi7gZ`cJ(2Uand?nfzkij1)gbN17`N$`*9%kn-;%CLaMyj=$Z ztccKlcLuERp$+(UAVfwhNk-d$;ZRy)=NaOQzKM+ve?@NMm58X0C%eqPU7^Z%F~?`- zl8{OBeO}rQv3U3GuF|Ixwow5i`0|EgYq-8*E38c9c;|wVIyCDBp%med7!2MCII6HD z-jysd8%q<04}`~AH}N&V(gXP@S?4mIJdu2sPJ~2ZSaRn=#9FInI=6L08?lUW6ZRPP zX6Y#gBF1Iwn!|^$NGak>im4;7H@;>* zAbn)re=c$)neXWtknbxh<6oSdqL0GT#s_z78Z9^tmxRYNOoAFPNx1L)r684Bv*}fF zdX=fJoAZ;PTvl~W(w1i;)EN%n^_pit3 zC|f($Yg^wZw}{UXqfgeL!A11>JTWZh<_Fmn`9}?T!wXBf6knF2rQxzp$YtUwm4m%$ zwocr)P(v|947mr}=2B9X+fqWiKcyM%Hr%hjzi<2G;Zs-@Yj9RT4xjYP%`K|t0v@PE zpUFq0ivGnCwf0|Yp@)^A31$;*!|N@KRAM}%A2GgMQsj(N!&fK)AJLh0rjHt#D>XMFn_Scwka*g(lj@zO5yvTHsS`R9hU9w(wKIj0dZ~ zl(6xIUF*c=g&hi@3smnZlrCZ<=87n0l-f7(ghSJR;1y!Hb=ZQL_p5nHsd&*g8PYgt z9Cso@i!b@F8-)Ul#h6jJ?$%LBgTgT{<2Xwi>ZVNx>5$byR~U(3J_rqYurzAqt#6&HQemU(?X{ar zs+rRi9#d%`dHC>R6;VwDYtfJLqA?^EnJliiafIEb@?8PQbphtoC%|M@_mP;PpIB~k zSX0elHj&h2#lV;w_oi+iqR)^z;cZ*#sEq16PS^I@{@kautMy z)lA4NgTyx&0zX+~UAFiM)i>-dj%k}4w;a;skKz)9egIQKdGtgIsjjCAIcs0kP3F(1BvHhL)6`9~IA*#l~~T_PuZEQv8^mn`f5uwf?#0{@_a&=XL3p zWPjI{QZG+7 zsp94N<;`df%q%;3W2yFipl)1F9RmM%EXsOiaLFTuqy+;-`VpdVv!-7O~C znU9*W(k$gvJr8G`dB{DKG9etDhqhaRIu5-{Pc5V}O62#FzNLQd?ij_lalBjT42QlH z4}Z5G-(7`U?c0-=H`?*_v(&6Q8=S}O-lKwmw2ecntM}F5t?%e{DW>f+qvGyaa?F5I z{CE#o8Eb4jE2YH3;>;|pJ(|)c64%ZxdkDX25G{Ps0`}=UVbw*vnaUS%oRTgspZB*9 zyn~fjk0;NE$?80YDSO7bnJ4ic`*KQlcPD>eFl<1!iG8yA_F(p-wLHb^x&^T)J=c%Q zRNOLVJcfBHC{=@+k}}c+DzEwd`0r*@u3H=|x$GZn(5s>B(Ixmrx;FJKAFPKIEOtJq z36`28MRL;i3`n{?Em;`VZAwZgB586bR=Z5P7Wv;F2K6?-kF}jBP|TgkD?Cu95+;$i zBYG>y?v^&b-XA5T7iBBt`Y=}e+{I0Mu`Bnl?8A1r?E_;e^v2Mh5MPl5&RjrW^pe-e z)liKdSyzRrIH^HYP(W+DDtBegUXYzyJ2iN!mO&WDFPPPMJR(m=6B^s#P)_C&?Sf}4 z*WKryMac4WgjZ4X>34?ItlB(ReT|Ndlhc@{&diDmDN07M0hQw zZY**DN(!ZEf*QZR?v-5DOBrqGDz9ITEz4JD9nl1|9{+or@ajeZ1Fv4OE^F-eoxY3r zg_Hl+q~s5=lBTf}R-8U9FrcI_i|3(mD=u(BudbLi(8uKEZYfKT)3vUFFSZ!ADbnhk z;wzJwU}0J@{><&H(Bq+EqMyrL^j`F?cL|JhF5@lZa4utwuTx(9HRZa1 zf;P0|2rmw!)5u|nj=%CE`q71$a4>I{CpScLa$7*d;-Ch)q^tvqQyZ+Th(VmXMHXEH zEW2(43KVlr=Y+75mYPLhZ;#qeWFjg%C-UNy9g-+hyx zB{IT4?Npye*4QfS;YYJ)G0TmUuxq8Mhu03GT^Mi3Wv{Zbl7-V}3M;%BmbQ-|V)#a> z7x!ssc$u$KpQGdG*U`zsdm~V8xCdA-)u6)p<#WE5Eyrfp=Q}a4quuJWj**V_W$`i= zQr^lG{_p*PZ{4Hgt?z#L(Iw&coU7AkrvX|Y`#unj**Q9F56_bK<|&ic!WIiOYNg&U zM)&$|Tmf;b*e3mkmomMuF^g~Zr-s>We3LGm4#up_%1{bjNawzf;_s6Zbmms7-e*#L`(D@iQa4U zUZNzD=lS`rcdd7y^T%1|pR>cl)Z-Tbh*YH579{IHH(O8ISoG=VA!j6O;2NVO<5@3)aNJ2 zpL5xei%~PsaMFw@axQw|q1QdYjo=-^^yRYAquvz8+8hL!SrY_7)3M!mB}pM6W9 zpQU3;rX~%J{LFz2a}-f&_alOX+aHn(^AcEJspp%I+)nLTZt|_P zfx5gYhZ|R&m=|K>qfhvNMDL-+&ZBo0|5(Srk1}VFwD}1gQuyo}%`oo#s49IW^CCDE zBCyh+W%|jf;>pN*WMboZ4-d}d-NAB1JRYXSSUW6~Z*a08{Au~PnnoZ>PlY*JAyr>V zFv*ok9W@iS{$zFm#&FSft@AU`(MpDWSzc-MMZLwyagD9z7~b!BMMxm2N5jl63bM1a z3aZ4WjQ}HWjAz=%n=)VNv}azQuHs5RGokbZSUyEsUr0)%cck|pt>m?bHd%kQYqJa+ z3%~Ucf3`Ez{y58!{mZzSZFX0PoBc3o*6s;9JICkHl4`V)xx-GwdNdVgy`gk+-9t~& zm1D&7oGjHE0B3Ur6RAOhm=_y_^9sr_0k@n6%&qBsm9@Ngam}*EbH0}BS&8#+&h1`0 zH8$7|1wKhMZHU08%Ge4rEhHL$j?u^x8EA!&y7B8o5r&^|b4$YrYy_g*IS~+NT<+_c z^^lj?Q;tCOK$Dv3D5vO}LkyuZLvv0h4P(vf|KAqQyuO?s9yL+6cW|zV(sJFlceN5g zZaUNX+b!9z28h_bRKUl)e^$EMhP9T6Q-6!t`%>8cF5_1FQq}RI-TsTJZAR}-@Q39{ zF0V&=+iZ^nS>uu6Exqb%zA4!?g_N4lIbX7;6c(KoyWfX!b$%O>wD$M+XHOd33)@$; zIZX-i#zkL>((`T>6~7dCj_mdK?OX$VFbPl0Z<~D{occG2xq0!IUb=D*1^=H?2kC4T zZyP6fk3ofZR> zy^YXeplFQ68{rETTm`i8bp=|*y8a}xFOxY=gwUpsr-gYn)p2z{w}MZ^AM$8yO|*ZE zUX7)?8Bxlwy>?NF&@xmdW8lH1GKoiJ<=+r>8M>aena~LDx%dp2uEU?X)^KEpdbMTs?sEAT+_rs9 z4(7ZvVPb^vfz7(!Vo@?bvuK;MI@S?>nE8R+NE(Pf)6DCm9OSm$m8>QW>x`YD)1%^e?Q(d}uBHX(dPitda;K1J12Y?iPI4VJKpR}7MW7Ge4(eLLK7=gns zRax6^S3^dM^v;MUGd?GyHFE_qGscb~wVljiYuAGyj>xb3|EH${Oj*YKbFxl%8gPnk zG;T?9nEAx5K@dMcYAVog$V>3vhWnK*@-P0sYPa9X_XBn9zNtK45c)5#c<#Kc&)!Rr zg!Hbjo3FN$X>lT1YCQ!4Xib!6yRa9=wJW|FK? zh$=GU%9+gimPKakc9=mET(^LJ}!wc z?Aa0DHAHv*Xz`0xL-1$?dvRo`Ah<2GT@Jt?l^T~~-5*>1q~ zy?y1-oN(Q9y&2~C_^L5^>O92U&xF~7h%*bTTd8F^;o3l>b`f*qGp;`&@*S4Cmco@M zUx75?PAn?DZsGT(=1t`>KkDP4H=RdBrJxgn%%w57KMY>w_Kx#g7AaNjWHT47N>RPt zPJSe%35Qjku3KfrT9yCz!n*mq+C8x1=xWfr+nHb>!7&JcaP+A>Z!;>9@3TGWeijX} zKnvu#NQQD>M{Ri$KXKz4g+7XV-S8lf<2(BJ?V&bIx*R;7yy+|h|0y|>@9U+rV-(!D zp}rNpje5b^(t-)!AEYiwau6jaEDlZ~GBRuW%nf}cGE=bs-53mm>{(1*o~ZvYI`cnj z`N%5g_fZt3+tDCsr+}K$7bw(w|D7@ISv~}acB-sItKdE<`X7EdQ{0!JVC)X<%Tgcv zQ_SVWQQ!8~9?9j_a2!@NvC7J_Zx-y&s$5x{eVD$#>-^#&e=^z}ymS0QM7^Mx!tjc~ zmqM$sbwNbpJ(%*YQHF~&!k_QAUD#*x*th&o-IuCK_W3`$s&sp?c543^W0ZkKSuea0 zzst9aJqL9wFG@rC0X@^;ZrTRlcY4dDTZFv!e=Z+%m-v&rOiFP7e1=oIzo6ynyu&x; zwRIIeCKv`xIk=4PHX84YAl?X3ks)Bx;V0K)wV&#;An4HAC3jatx@Y8QGC($La5_&BoO7_; zIPLfnX)kK@)HDAqU&nHs*sdE3y6^9p@HZGq4*b97Zv_0{h_2%=I3uAjQA`2!dRakR zp!K9E|2Nb+Z1g!ofa$)ONXDHTc^1+Qo&@jv53S4SBN+J84uqhDpE{Fl9B9 z79D4I+wqNNg(YTz-V(=M=M))JG_Ww4$)-;o_1UX(;pkbMUyoW9>G@#G*_vZmJ%Z~T z4^z7NAV|}uIR5P0VL93CBjGL~FXtcvFSabzw=ezb8L#F~J06l^;G|OIFLgF17&)?` z@~vM1JqLLZ2U&z%rp0aD^1BMBhNccx;%r2QI_13ky!^x(MF?13%e&oGiZ^=V1YWso z==H2KxV>QdfnFaxR54UCvMV$52E!2IZ2>O4hW|OT!HLF^{BS zMAj<6ny*3M;ZHV;{)}w6%Df^_gFM(DV!>7s-FKYUcbpu$&e8~>D8nf7nI0W!ZL$#| zC-vH~J;TEmJxRJ`QR5gu(F?W7!EG!J=6$bgcduU_zbP)lPX{?EwE{iAIU*y2JH{|~ z?<kBP@+~LIP*C z6?9!|4{ub6+G|En){R7_{Qinj{;45J6IrZZyKXWZi^)>pYnm&Ud`_B`RPw=y!yeGP z4Wgh)ycLEMJ#4os&=OmJedmyP{p-60LJyQj((*Wtn|?zLOi}EVr9LT=3qsk3pP`5R zn~e;`N!p5*W}A+=$RalUSg8o^h>L#od?b+jBN%+}BERN49S_1bTQS)DPix+3Nx)I0J0C-WD()>_#!=zh$1&rNxBG}KrVk$_8ljGu>t9&l>%XS4QY`f z!EO}cXOuB*bYX;Ykv`eTI-rF%0JxfLy+*9utsCpL&2sq&3-*Zk;hhXZAt}l70qTuh zzoWu8!1Ubfq~974#3(c>ZkSZyF7F{cQ6$|gcg};{ceYn*D)pr@Kbqmq9}#xf`&@Q4 zu8`JtaWQd(b-X7hRQ@4HLtrZQl;DBGp>i(5L9PIeM(D`~ncrr7b#^TqeK3g0|m zS}6u~w6_*QS3X$O6dL&;LW1YHm|H$6S(qGJ{O4WlXhX`X$uBqmpQ}7P&WG=J2tR82 zj?E2q1)jk>>l{1_T*eAAIj-L}{`sOvoZV)y>z3)y6k=AVck1yfu!_f#OeVpC=(6dqMS1Uc6kuyVUWD(t_(yH}j zk7kw@yEgrm6we3pA>oE%jzVc5ynQDIrKX17S+0#AsMm*3dpjd7|UqDw|aSXNlpYuF$9343w7_+edE8tziaut5p`7nr`oZ{qA z#eJfttD$P;WuPaWv!W1z6fq(4E*Gr%h<=@mMMkXBau47g#6(klm<9Vkm_ivKJpbXd zJB+^)FEW)RJXfG2E~*cuBJX=$HIuYTr*+rUG$&>FIJ%l#G?*n<7I#+wrr3a9SlXNJ zj8_exYL7aYxgRTkL+4{t2$5&v?-w$A5hRU%9KQ%WyS7Hud#VRw)&?*XI}shk@c zAn;-6&Aqli@(gR3xw(_C@;@1Q$(d|gBm88VYog_Nicqv||ANLC?R*~*{-?8`4OX=f zaA6{=s?`lKOiMbwa^I_yA8WkwA3Msx&WsQ4yPtiMo>yceIn01g|DrkH5JSlMO=3mA zJ5s2Id|xYDSZjW7sk;m+T^q-b{83?qrW3W}w{H^8UlE@Ru!AAdKfsW?LOF1My`BIo zU7XNlV2L`->x<`|ot|r^miL@=Bm~9!0{IpnavW!*ih5~VBh+t1+&Ah|+sQV-dA(ld z6a=HRdHz|*2E(Ihw6gU(`i;o*NKyf`jJ;7kmDWig!UYZ!$#B5U^!;#-$@@0G}vJ0(Ki?B=J*9;sN;c?90HD0)_#pT=QX;06ZG&?lb^{iDDS+Ehz zALcKLiHEMY-2PxEj~F7X+(W0=Tw6`|v>iPx)wiAc|9IywE4<|MF28`zcje-!;P2VO z73-}WC#b{dLhLE=M%b#6YKNzpq7Dm9^vn8u*9OHX?6=e99e3`GTQd3)ztwfEZ-L)R z;!?z=vubhswn4cYZuvgPe(99pdcB7~4E1r#FBjau_+lw!x@gRtYtB>HXu<^_tg-qt zZJd<|@|?~}`Y+`hxt8VplU=q3ll;Snq>s&ug^nnq#~e=9e6O$;LE#Z&=w%EkD>C05u;AJ)?q@cBFn69&+Ig)sGZNJ?pgO#DRO0Gp7+s<<>5bO zOMn3LCZAab>!yWg#{$w>#5{sYK&1uakNM6!EjbW~5;el=tY#x4L;7Y#mUmq#%gync z7CUBwd!M>C2R9~KgAWwj1tvuv!m;w~wuCNiI{x0Evc`(2|F$j;Gie6(^ejCw{^LJz zz~`YN6Ov_I@y{en*sk>5@8AXj!jk^8Pr^<<&sC~BJm-H97TpKjyK20$@~~QamSI?0 zv}ZX_Xa0%6gp@?Vay`3U-`C~By4q}FgV3qoRJoRg)``r5#Ms(8AB>uV5v~0e6fz94 zB)z_R?6KHd#jioXPkU#zebm9HX#*(^0H~ak62neI=6%jGXh;eCm?$55{6iY<9`43M zyCFyCz84pZAtMm8wj-kpS-4TG({yw>4=H#MVkvUSDNb;ufEyN1IP``#sX`p63B*8cJ=#o4&BTqG~90qD0=731AXg zofM%$LYIBMx$%xXKzw^0B0s~-?W}gHf4_Ep`i;BiLFtzFv(a5#e$9?`DEUo0roRBp z@TqMn<432;eT2-9bDg2NAL4+~Ya z5|6?QNXA0=J2Jb>8ns@?r@Zi zj~MhvHn|DIOyX8n*L)zVUXT`Etw4~cmCk4go&{#tG%8Bv&5~6|8J-~ z=U4u7moR9CoG$7|c7_5!*jeu%`1eTqg<@HO^DKO~d{6RP_Cc?qOJM+To(jr?Gh+7k zEUK@}SIY%aaZ7=Udyc5cdtLtnzb;+F?ZC6EvyR&Kqvn5C_j|YB&kA?`?$s=ni!Z;0moJ5t`(iE&)AzpuF7~j0J9g_JqlTMGV3H-j2ayQH-|Zh6vhWnZ=b&=K z!=U`pQy=Fo7k^pA$3sLwrtXyCubk8N>Tw6V7i`HG2o7&BgTD}BgX%Jt-*5jn(z>wS z5QpzYyx&JSzk(PzZ@Fcs!y%C9{)1OJ(xB<|{{Hf&sW%1Fy6LBZN(ZI>I)#=$wbFj6 zgBy7`U8$VidmImSH^9fb3x)Of1~&$m<;S_sx4QXCel_CneK8pBwH}Pv8nYS$1sUBY z`57MG5nW&wHA#A($=Wge$^Lr(NzOm3)47~qxfKiKgy9QPN?^!83@Kv?3tEBI+E^8E$_~87T~3Neukq-LBJH^KQ;mxiaI=(@<%mIX0IHuxnUq| z0hr&p9ABPO?o&>&W$P@f^H86Uz@+~daxJNg*EodvO)=?i>g$dAWw2n@Efg*hR!yQ%wRI2%^#x*a;d;IgiLBibTyOuLC z1Yq%L;?LrnW82VvB{1+d-vfm18SupZI}6l)IS5X&WH05l6BRLh7aV+gW`eXSPpSb6 z=mQ3(8F)}W|Aw<~oend|-3ZTL6-g0Mwk7^ffG#>kbA^cfSN{HW;o*Nb{^ONF0*!^L zHqhI${yupiY&BasmY`P4X&`}e_mmF*eF0Ngoxoq->(`#95>y{m*ok38V#P?b zd7cPHXKM=U4%^Phwp?LvU<0~n@ zEJJLQkE~AtU&Y~JnVhzEj4R4Da@%`&+XdU6Y>>VviBU7RG41^s`;2-CYUgA}snZF> zN3URCFuF*iTN~{RU}j_5Cf*xz%`g3?4uzw0LH(1xWoa>JCfp!M1&5n{Q>D_>A)%V7 zIskOg!7v)e2my1*K-_|{c)U=*4N_~Cm>HC0I%~{WVT_BhH3s$~>=Z0GeIeXl%!?5%1LN;-WEy?8}jc(|~qFC3Uiqxh_t^j;BnX?aVmFwSOYh$O|Gr| z*^V6GdsD{fh6QdR;S4a4My6LD2F~bSlXOHgf|p>$aHxC1$|f2V<{sy@dsTI0%$8)< z=H!{Kia2HWV@GfUY0^_L$@Gi9io?lj=TY-%=i#lx!<|YbH<|^ZUdHr>f-zAfhYHyO zvo1Blf>dWdx=AX`I9J+1xT-myHrpxl0PDrs7hGJHZc>< zI;|a@k!ENcUo;S3HYe(U5(cQJhsb zG__@fA(EFzjQfK`dZvgtuGiT%5tQ?cbyFNv0*OH*KHFNayq1ZUv8}FRHxBPb4v3_e zsUxh5XQ4*u^mgn1MiD$8B(_SmIesa#J(>1RGV>TeUKK=ySre(}z;)U{3 zJpoZ5Z4sH&>LbK_{Fw;nV$+rpF&m^%q6h@fx&tCv8y7UScFPoY7LQ3{(Q)TvvfyKM zj(V+C?V|o;xW-s=2VW{(ZJ6gY5cL{mSUM>%026e`;fX<`^~Il1W~#2ebi;U_TrVh z;GGLh@{KbnSF)mU)Q$~SCS5bQNcE<4v8eEo*ws1h3dKtJGq)(PQn=uO_;>D2|)+w6=ykTiFb8hBGBWNiIq)j=fH5Zi3 z+<#y@8)%o&*lcevR9ONMNsC8k@>UwLpaq?+N03@**;Ix|V2q%OFHuE?2Gm)wGR-h| z@HIYx23VRp4$}}!5VwHf=AaCMP_cIYK2oY^2U0?M2bNifYHYKWL!Is_-h_!@J7xnZ^#$qV{~AC0OGms2|6h0Mnof>{XHIUc z)T<=j)0r;hk{Ve!c841`RU(crC`}BBL?tPdw^;RL}2V2{X_$LWD z&k_OAELyLP6rzlD`t{$;?+gbwXvMH1F6Fe^UI|DvP%A6A`jOFVyzEg)I1X{_nDgml zTKq#@Bv2QpCbXi(#aGG3O~ucMdL4;c@7TyQ{__Sh6NhgaqLrQwfGvIlJYa(44tM6b zM8SM3J6uW1Vt%7(Bzd#3>P?iqsutFKq%8c6k%l;1K{ujA60O8kt>F@8Rxx!mSupVP zd9Dd7r5Y>y);Nqdx{vg>;de|da+s~TE(w##irqwh=Is>Au4U&xF={TggshI zx})N*wN{)1QgBr2FiGTYZG^V~FoUrUGaHL|Q*vfB- z)DN+rLqM-=6&-dri38iyz|xR2Q%0^I>Z9N%=sdxnkj7f)HzQo3XPm3kHZaUrj>xNs zWh0}x6ppQ{iT?u1!W(H~9>*rS2J6!>lr0V)G@e4 zTt{-f9!Gx@HGevVCu!IhY3i}XZ*ebxXjR0*wgU0RE~xbM1bkkB6Zf);=%(^Tw|hNW z>%Z30G+srX@1KU=_M8PTwGNzcU2VMUy4aE&qW1CHa%0sY_-ghll=Yb8FO_oDr7=bG z*9Y_xBTBh2#_6SLwrC^wvoD}KUK=suP=c?-MFrv8J)T+N)ud4yp*_m~DAYIZzi=ql zkKVnt`lm}jw%$SB*?uu_Rq&0t$f22 z(W^PC5#1z@51{6)4#Zt#%>kQikASB--7Z9aOI+kDG*RIVTcJ=eg}d-V zW)X=$Oxcfj=skxov;6iZ~C*%IDj zQ3^foL&mQgdSRu8^A;)eT30y(SKp-|BoXpUMyZS+tzVN1ms+@_JeM(%>?*j}tNBWh zb)TMT_~ls#)7JzI=X2wkR~~JxDUp`J`8mE za>~9%K3UOiD9mH<@J|Yzg5M0Bu@s7ZiC)`Ymy^8FxU?9N_rh2i?#ecB%*Y7C-?U&d zx3RQ9AFMbCxAMb(bnZkKFyt}PX5cI%2Y%lWf70|oE!&v#(7DBwzt)xBk(Jrs$XCFG zS)l!l;1Vl3o^Xd0FvF_Q+Nzv$EeCCOS>F#Y7D0Dn8U4v_b$(W|#Z+EDCW87<2D_Dd zP=PhLFH}u=Q;CUioAxHkH{^%@2YbC{O+uqo-bgmWBC!-An{{ZXQ*i99==mkw!ow^M zR0i5U)tbS!*$e{vYdP9n&YVN59s?rQ9sQkhX~_98UctwcPq3Euk{Ztav)$_J!s_xo zkSak@-~wFwi6rdXt%cwAC7)J?j!ZvH!Die!mIEsb=Jl3!wvw|$S+oI2_ON2$OmO2^X*?4yW4r7a5*{Efm^1(!w!H+X@xMXDJ-*8AT z>|BIu zL_-iPlVvnAPn4}vIhR2K0s86MYB4<5=u+Uj<%wUy%{U`?8Vdl8cAdTzKPM*cyc4tg zGj)=fzM=SG1Sql3V${4^X=&W8nI2XN8zS$mfef?9Mkjjony7k|HQ^Zcv!8FtSIv?? zo4)V|5AvqFo7ovmxT57)DuEaSNhED)#&2bY695b#PMrZy9qi_aRZE?rzQU2~Rr)c~ zl(>hK{d`f=z%KqhC$LL#CJmFjtm-KyviXy<{AMVm(>2cHA&JauN2~QXeZ&cUWTC;u zFV$bh(yAvASn;Ycl1VV9+e)a>XXTP2)sq2o@7AehkV!bQMK(zaQedi15RIS5k;*g3 zG({;=wv;zYvc#QqyS36vBc6(miwBe%srhZ?vdGX}M^D*sV$XN!e+}TPG94X(sgB@y*^#wb|w!1JZZQ#h--;C#qP9 z8VIK1zw~{d*cs=U#YoHLtj(K^tSv3N#Y^^*NkDMoOnQP67)Wsw0|S6)BoWV3Mn%Ml zvrgL!ErCQ#moV3inht%7M z^Q;K(h?8dV4yWRS3gv(1JzM1+-Sp^QHB6;A6!p$uvf-P&LcDzdoL zC;fHob_2PArVcNPB|P(z0SF)1T~kj>(fJ%tvGpS^EjHC^&PPm!^YNOj)|sEJyPdd5 z*J@xgG*Q;gEmX?2-NGVHWW>9&w@~FDFT2l0yo+S=Lywlu$Thh;IyU;ZyWD-hgIvAT zFFVhS($3(u`ICO+D$#oAod&;u$6a-f9gu5kK4FVpN^mky|AE4@Xi}90F@k>)BOH_z zvHe1+0+~;kZ5|ZXy!aUPuXIE<$ny=Sr^H2H=@?Ifce%@iikz76-ELTZIXaL%u^mc_ z#Kqs{ggRJ&v*>vy+3P7iLw0nx>9Q7b4(w=*WFU#=WAr+@Cem1qDop`I_nOHm&Txly z(lq2g;Bgzn2tY&B9Rf^hB(uVwWzs2j{A6Cyj%7$@wR*NCbnL0;9$pvNfU{ZoBZmcw zO9%kaZF`|fw721J7rC(=+U9u>Gd$b}!;#vNf>v}V!O7$NvSnJ{05Gez+40>vd=$F)C;2^phk z#&w*SqFbZZlWeUgK(X9iRxfdT=t*%=!|PN$p(+$Yr^dkh3gP)Hcvag2IN#sC8R{X6 zKg;%mwe59TIyC)L@XUJ`fcgHG;+afp@Jrwlu0`MRcLu;#am+mnY+ab}46?uw>dAnqsWo9yB;{ z!ZEgVs&MG8eJ~b{UA)5`j>wrXAdNiwyzf`6%7NIlCXh(j;O~LY(@X!5nl+e%%hKVz5H%LLc{cFLmaPm{uJ{`u zzz=tFbWrjgyRZ1sN`A`aM0X|w|I_pBQ%CWq&1uAIwsOLne)+k>$q#N~_M+42RRywC zomFN(AB$=zo|<4YCEOZf{9lK@g8#?Z?gosP%>EmL?qB-b_5#4pw4obfu_Nuu>1>mG z49G6jfl5eiu3g2PE@l+#$^1 z&0LC8cg-h3&lz3mnpHM!xD2tcI62+C8GTVg!yanqN3}Rt=U3`SIA>Es`@lnIP+EK1 zOy%DZKxkV(d=y^%8N*C9TluAV#mir8OlVH~B=qmyDMU%v=Flu*odbkEqrNw7;BEkJ zp$A^QaZcN53_DA{2X69t)+H->)->06D1!XKbe7LVT}!qxZP7Qte+Y34DCV>CcCI~2 zvDibkS%R2B$jk3`Ie0}={Lcvpf*0GnnCyqma000RLoy-#I>?L9StzN-{C)j?UVx#? zh>-WpAI-^L^`#^o=vAMSzcp6KR+}Q>Le$J^9{Ok1w{Z^Q@g|Sivz4%TSP=PIq%iQ& z$7c!X>JRah)baFnMqhw???1{@4b^VaP-6>aF#(gudoT&R__pRc*~}ZMWB6MWUHw-t zn=ifp%Az%EPOfjff!A6U-;`CX_Rl>eyfsD)kl1t8L=^P?lU7c#jC(T*8Fg(i+E}2? zFrs2ihO?PQ*r!%XP9fCT3saW!+R$U_n|D=Qt>kL}7Nf{&$N(lW;ql%lCnv+Ze|bL2 zxnR%WwI?%4G+L;Zhs3#?LMz4#Izol$tr4|gVRo377_g4)QN+kX6nKZvWteVH6qsH_ zY66f~b2iT$Qzz#WTtAZu6(97-9!;3^x_R5(j_{St0ar2*BLm1xA-zJEp?SwO!u~n|Pgn##OqnMphCd3{B3%5E$0LU{ljhiK{BHd&jxhMeWX&^? zxTr7RdA-*_4q$iO%^jxp#ooz1QeHBpP*cKzH+n&>So`M-*a-zrsraj?j}M{-o-Cugol{Y;+wCmA+ujmK7%Wn((x*$m%<4GQMI)4uuD zFc6Zhc2shCHyx3n;Db@B z^1nb05e3UEj-c8U;HDey@q&U1&S!m|{6R<52v)dm^r@^SgKUDVfDzwm4x1qR!6ghg z!u6cl=b2a2ZT`f)g8lB0ajlY!3rY&;^_4GY+{OQ9?L9{|681d|{aLq`-K=-?4wAgK zojs1p>Kjpj*qn>Krz%$NhQ--G2apE~sPOjk$=D=<@_KEg3!30G!?qgroBdCf09cDL z{50MmYUp#pWE0j<6V?d185&{xw&mx<)rC~3KR)_!2{+HhocXr2{61}M)w-5cs1@k` z4KkclOULJzeYri($zg+)tFN|z{+$#z4<&A1MISIV4$+pdj@jR`>ASMLowxljDfP^< z^1nlR)0Tyg%z$lQm3J34W9+Wa>bZw0SK8)X4*$tjUb~~lmcO2xbhaX<3YecSisM&* zjSDPK{^Wl;w!*-x1RRid_Y^=GnG#;+eG(r0?BF}$di zn&NoEPwv4{p1Yfaac`~(;TjS;ltu;kgZZK}zSNqrbTyWi9kVq*;bujXnxcynHF(q1 z8Iz2Skn*leqz*B*-0&K-s!+5Y1Dwf%a-gih%X>~do>#3ydo}fJ+2wmzjlc8u=FxPk zOpZ({EpShx_;xaLdjq{-R9zn-r(D1S%nmOOFXF^iv&K^j2-K76tDo4%SVJoEcYyr~ zv}b|LFO3Is_uv)wA4XpyP4K)a_`jVkkp2T{7`mC@OCt?NeNm`2P{dd$g>%Rs1L^f4 z5Q+$fx$!@O|9w^zDaM}Q90O}=KS1?M zV8zyZ*2&hd&`JhIstT-He^=Jb1Cmv*<>zTy)$0 z^F>S5*e_qc+FJUr#_PV@M^p^%m0TV?F;O0YbYHM0_B?5fG_IX5G04GNDD~Mae-zb3} zGP&fu zXKSueHy?K?MZ94OzbQy!d5zJX*1Dh92D~}UEqQ#M%{%O(w0&Dp{T4!p{7L-Dp%~Kk z?BM8S2OHC|TyON^0VjH*y3om<&-v@SWK7O@^mYT>cCEJjb?N0zfyd8*S+A<}-OM=A z(*7g_OP(3W$fqs8yrdzKrq(==X`vOi8PEaTG1yI^@aL>ZzHRl|*obL(jD1%Ta&fSf zm#uiRS>pXUbQrRVVwz)ZtyW>x@;B}*ah7~A?|Q=cZvPjCP8A?4OtkF3=W^-P=g5xP zeS`7P!Cj}D!v~Tuu@Ep=ecDLB7YcFBV`NR1$#pXO1{Z09T-CCrDfZe7h&A#CAL^vF zujr*+m3QVve2etPQ)|52nJ#;Q>Z5T!4!i%@8<3q3>ByW~N?Ssdst?~3UEA6sv?o1O zay(Df18=o{-5>e>Z2CE?&AylSF^Xt*@&$Y-^|nX76RTE&5*5LsgMS|1gK<~tzn^Bx zfyt&q-!I5ChWz@_uPFPgFm{vEWVGNsZ&I{eCI{K_Y?^0k6pKvT;b6)&N$HcIJ>Yda z>#1IZbe6YGKFEN+P*QIyaR6X1kKk{<%kC^@H*z(E&2aItKnvaqG)f2&^V#@Osp@(a zDxGYO>2scAHkrS83x%f1hMjDG`zvT;i2kbpPllX{pYUvblDX#9E{5?4DOZQom~``%B8Y+bS$rvX9^2{lcdZ*)GY*wRX_SSp^rIt>)AWuHlQL+wc7hD#ak z7>qyx_&(-CcVHFw<-0>2-!@S75pEq{4w-NrpTJ2#npOPUD$9(1)&bSBg#K2QWGT46 zPXe!*=5!C{dyCq_AtzR_5cB5T369Rr-^)Xvf4>z9mUQy>Yp3|g8Wx0G*DvCDfy!%q zw-7{UskV&8&>yel-mSo@QI6nT83Ei!E&TY0Ufc8GQJuK7?`^))SRon1iz7b0M#={0 zBneWA_X(?Y!T6rll}+EG6wPl?ndskP*tkd%r>t%p<$cffsNMHmnEkwEjfsaYNwwKJ*Jq=17VsxmFPhVJ4R!)B^wm4 z&&)3ljjf_O8mr~srPBJL4`G_YpTg8@h^5R%fB$60w`6sZKp#(+ z+p?Zm{e`1yXa<`Cc{3}=(K^IC|IM=b3vQ+0!RxEhFw*l;uG~9~EyMI(W60P9#_PdI z1#k1lr^OiUqAzHDUTf5pA;`>btE1bL!=E~NJ&{{KZw8dzMt(SwlT>5z(J`f#0d20I zC;xTbw&9bx+T*aO3>qM^@Z|lk|Lklloly#9$52Stvyz^QL%B*9LVfD1XZBt9y%HZs zb?Jv1gZM#v{dMlAAwNxz()zM*hV-}Z0_PQjj>5diwS!mv1+uGaKE9?7(NUaiczAzejWCWBsfk+Q(}0E(Dfd0q>~?esY-QFd0#Ww9?%)Homy zo_c;1N%%>;q5*F@-50yAI5w1T=~{^e9<->hq>uaOt@qEf>l&mlISVR`)^W7gnjSpR z?49-}OYpcUvd=hbRx%1QiSrdMioVwpr*E=Ud+=n$;q_ij5Ta@_D*8<32lPEmO4e}O z&n_$Z)Pj$qNSh>9>(D8^A?owN^NGKO1Tv)25VUBF5tXq>f{JN1?*|czLrP#b>uWte zpqOZUV#|PSQB0z>LZZBpjKPjpvU}kS%J#~n9KN8o;MsbjDH};$ za*Hu#PV%Th7BYfk8Y;VF;a@0qdYeLK2(8bpBp0CQHm4_=U)wo;b+qGT-}y=wy4&01 z(K#HRLGe+AicMR&n2e?=oC6*}Fh&%yPW*w_b8O~Tv3sWFsDg>I>`x#n-My!#4Eh)=eGAUm7H-!_ve~W*$Bp5AMHEs)ha#Pv)Sr?oTHh*$T>w`ZV9Yo9bo9 zziYHePB^Gd_LR6Vnyy!*3FGq`HUAcf>BFDbj$C@`fc^`wHa~>p%caH&$(yR3PlLKj z2F_!G!y?Bh_GQpLtZ2!_p6G09wXTuaOdH%v+_b|K0#}Jn>$$D^+4x)W)ObF#OT(wV zfX$QK{`}H9SsM(Gm8=ZmDzA2zgJ|=O9;MBexEObtbjh_lO)sWYQvQ}J!w#>RE&?9bBi8Dwr+v6&pjy3&8!;4ER7P~gE)H1_FW z88ibCnD#V!XHq!IHEeJ~E72W})CQTc(AViEDMF?{Oy#V?ztKHSE`A5idzfFsw?F=Q zznxMCE1&RzoR++8`4ZOn>z+@ab${$@Puc(Ey#li5L4si~DA zICJ41Sx!*UMBJK#N*v|PndROKoCunVAh>d8S?+;3Qq&x|S88Tzrk3^j^ZlLweILf* z{XQJtmwWH)-q(G-o{u{ZD~P~%zEdMV7Z&@g-atE}kHzFWc5Msx#skQd#rcbr)Hmv- zaagypl-nBZBM@A6dROK`tz0J?-{qhjgA8MyQe~$HFH%=V^I?xUfX~I0{rkG(+P_E8 zxkKiAZ1@#!escaWr`4C7#CAu;x}pa$c@i=c`|x8PL-+gKcT=ISdET#_WreHu;Lfo; z4Z&gw09({9*gz0kjJO4J<%ZKsj6t~_e{q$1Ve09t$!@;+ool#_lAOo=Z=Pw{E2VBb zO5~%~O<4rG^Hh*7eh{GA&ydqJQk%4ou7i+)yG9qeAq*=b- zf{Mfr=^Z*q6O;+p>kDmchTPhuBbopupPk4noaiO!Zf~loL>|srDfV>~w{~;;Loky& zlo|GQtoFI3@3YWm8SIC*Q3-a|*~G~XX0mI(idg!e=*^Fh6|4rF4b)s=t1A;p{4NOp zN4%CtR+XF&=WKhFUz=t~jE7N3VHh6(T@O{42wad+Q|b7Yk4tWx(h8c}mnl_veAfiH zRfK5xYCENInvSl>Ho>L1BU0zopnJxyB9I&rlxNVwfCK41c5*B~*{u}FxQ0r98(k?6 z^hPr?vr04K!g>e<{zX?_<<7Gf)dC=kLU!SLp|{?6sV#?@IVs7Ce?rv5_^B2}j|m6# z*S4EG1wmi3^;liM!|B*325_nC_UNw!T$-mQz=F7GiiSq-zh1EFjt;Mb7V&C0wbsA7 zdgUg^8&~f0@bkhsneBE@?VsTY`|Z_g{Wr%a51pQ@CY?BaIvpwTe0D2i4alRu|)mB0{8=#e; zx#bz1u?m#?MV?Y_RX>}vKf1SrbGvMf8g0wjbGxwGmUdQikc?>yfV6T0^gY@Ss@2#X zT=1BC3$^4%9jL0C@DqRAfEsvQ(@|9tcgZQBjA};QkKVz^0qaX8$7;`T0V8sxZ+0f# zTEbLYzRHDC+3GurESU+69WzRvkV7DZTUp_BTf33oRYSQo_75u6>O+PvPo27?QeP)` z`bo`M`>s=`47g>@gT>XvEE$oYbGQ3&dW}D`58!o>LHme~#E5wTRt^onYxX+qN?j~x z?w{e}l}^nYo)-OW&%5-0~w`T**KJ7A-OuMxUYI#=U=R)V=fu7h?bU<=Qv)OhsO~VjJtO zH$a(08W)TAMY34zR~=Q&-5(R@VgQ@fvT~k2>hSjIwId8PUZ` z3MdM_yJ-sZ%gsX?h)IUcexR3xLF?x~53_&4e@{HiIzWiC)W`X~oPU@hgCjiV$~WjVb&y<{D(^0;#4+<70YBZP4u zYVYhl9r8V7WH7C6-NEia5!xTbIj^;kJ++dj>1osEHnFm@*Jx}F$-bj=s-3b>dgRR( z@hJco9QDJ&sMJ`Z%243ek)~Y?aNwZ8EZX4Ds#L zz}CBy*U-dXucqd-`6#cNM%}K_a&o1{;@XVq(0@udx@w_&ea7gU46T@xW52$U(mF2* zAsdZH(1_)f?aP5LchM9LunOwwxoe-|86%Wbl2kpBW~JyCuD&;m8CG0Ea#_0~M*ZP$ z6jM~?Me}#!6#bfj>lFE>Yf_PcJ;!%ZV8LhGk^~_kfsw{(smEOtq=S!FHk#9GQ=CIK zcC{V*x4OR3Q>?C{97Z|V+Q-7>KLweFDZT>rE|2I}Z#IN#923CD|GC z`M7}k&O9~f5<=N0TOf56n!JOHL}Gp0#FIrnzV`W7ti45>e(it5jGIfhi?4UUfV~X3 z!1*`d?1T4b!MySSnt-y1!9@{{LvZse(xzT={!-#IbALTV-0jD`Q%#1C=0(7QX|U}$ zpJfMvckneIw_n$~D**|&Q|tYo0+oXuyuJe$LEziyg2qwOqWa-e_z#@(e6BYRo z)G>6~zC#_-^@&y;3M>KR)zd{-zAkF!^M*YW7{U6Q8`rA(gSo?|eBo}36s<>(f<QqxY*O1?Ij72-Dg((4Zhkxr{Dp5 z{xg_%>_bz-BoGO`KAeUOt%;sndF~93$T%1-3DJnwq;I;7zq{6_ce^Fl9q&7ZCSU?0o=Z(fB%h3tTiQ>SSsoP97Td96i zu&wP(YCaBK{ag_5TWbeOOXzWT3&C%D=yhWJfIGty!D1U<_nY}i+uslCb5r!DmrRUv zhQuo0LAGan)+MIowJmZ9V|5ia*B)pH;7 z|9sYJ+})MMI}C)pm3BKwB08p~c@5tdF5na!85wf?E^J$Z+WxpUNALG901rnmFRB?M ztF7i#wo(Hqh3G$rPyVrv5+csy*?Z5N7d(CY_}`N=P3Z13L+#ESq0LWXQ~mBJHwo$} zJu&Ud-!wQ0T1w$*3*!x~<+jT9xR zhe{|t!njHU%PRDNCY#VAjec;(L!P%HPi2X}jnNaJ2}E}c)Ed*t#G zU%qNfJf(0!JU(9D^1`XtN$9wX5sKW;eub6qcs#a$8|s%DAdFvF=n@Id2Tr9f@cVO4 zde^?D4O;L)ZgeNIL9e76rrv&ZJD~XyCedLgXql6rWP~%aNK)?fq;uU0aN|!D9U79K zooFasc;#oSr%B^ci=G{I0q{GcnvM%uf^JyY2C_E!+Fmky3Co-jaSE#1^&(?80jdxo z;G%YicdoQG^lTTOVuWtfkQ&dfqo8zq^rT)<_Oni}RQ9rI^Snw2sgKWo*yGS&Kr1t1 zSkh~5g@7S3o>xoqZDDY>i(*OO45`kxN0YM5m36d0X8{a!1JfTp`SLnP5we9d4ZvcM zkXThHOna7gCp5p8ZSAYnxWRUfRl~%ox2%4aw0BkKAKHyS=NIYHKUyfAqVV`ufP24N(GLzKCdCZ5T-P&wzcNc*OKZSmY$@w?^j)(KDDisCQe zGi|&benjzj`iWRpHX2ju?|*M~?W;i!wFLK`Iin|vB9L!5&emUKY7#iLzx*W4G{(^# z-lyVTzKZ?1^%VAzQ83;2%C@tz4Wa|5*Dy$$vj|LQhqniYvO# zSscVi&%RAO3(Qva;C9ir3qr>Q@2_rW01kwkB@GLb#$vN|huDaElN!GfL!7QFRe-Jd zOUChsk&VbmDD|pBS4wALL)WWunFarz7r4U#!%wP6zUbOWx<=8%7)qLB z^mbZ?#I#$gw?@tiQ&7mGvLQ$59q2l`4q^=NBmq{~(iPf&bgH!j0lba+ol_Bc@<||J zP_Ohx^x{z1MtgIIkM%F`ll-S)21z2wbp$eZ%>?An=!I_GSiF+YryFzmQ#_2e6Hctx zKF40day{|5S3>(E_{|?x%Qsp+r2G^$jeMLaawvyABNJJS7^JUz_)E}13Aj4Ake5q2 zP#Y{S52hCAp$SSicR0K51gE{Z@1%tYjt-Z$FUY9r~XB%LErGoc63So&1&qY0oq8 z4tI|qYBiKPM=HPBkX1n1M2~AI#$}J?dUhHVDBW14s`!kj4!YXdjw2r)}jCbmtP_*Mrx@`>8A+U|;BR zUvZDCx>Z+_z>Z!`9BzAh8`|nvwPShkrTgO#AvQv#uZ`&563oe6x zyes*(+tM5_QgRvBkhP3#K($by6Aa%+Ae=d7NZUMESk6TfM$lX5YrNm64OMf!fxLkk z2n6NVnyi9!p<}s%`eH%W8%nAe-rX>q(X`d0As0pEX%{b5mB28#E~rSqj??$)2Y#gK zqEk3aF8_$k74G)?vJvgO5H5+BchU9iQFl*n+=p~bnK;*8U#$(?kR}K-hoj1{P-AdD zqJ;zePCKNfIlVLcYO%NX*b}3nkQtQB?1wLn<+vp|ct2K)-v6`U*a~n<-L;6zJlY%|_1zbQdg#U3w90VJulOGE!6;;g4s{GcKC3~m${Waw-qzD|?RST(ZflPbd z;_I`>M#j0(FZb2L4{)^Pw%5hw{E6;X^L)^@f&lJ_W*Jcm-ZOFxa+tFGvzly zlVUeOmohk`Ato1cGy(c!I|1JAqD{q>=GDE=-ZtAby?dHc*C*`8>ST6uau>7U$6oo$ z9R`X?Vq2&}@94P%?En-Gg=REmiy8^gO%re{zdeE)Z?oSdcnvE594@3c*DV9Xk(Eak z;8MM}1;i}y1R0;v?u3zI&qj=>6u$zz)CBAHdv0Rrm|-3~r}gyvVfDLTdWGmO1S?LV ztc3~rD!WvH30lkSY=^+DTc_V0JVq}>G;1EmfFT7&?>_6csovnb-1&0$mr_LIS<24o z|1>XN_kJsX@wN})eTs)+r2Bc_f$F%A&Q5Pa^QZmX8vZ%4Bw=qcRq@v?-m6sngC4%R z;eHBewo~(tN?Jnf2At2W!)J`EQm+Q1mU{a}9mGl&=#C9xweP`DRyLgtc1WLkLo|V4 ztrp}=K*vFFsR95gi?w*~nlIVsw=87&gj%>26mD{ojM&~boL5N&^9Fwo(-gWNRLh+h zeb)bUw@dr%>Et{himPkjLLaX+sxq>#g1=22eM(k*3syIv9>*5{_);$1U*A&=v~xCH z{3B4OsMz+k?Y)ljTk>LPyi*YyT_Us3!Xb0w?HoNjUp;8{p|Wb8t;MpW=5%UV>4of@ zWEyFC*xHd3xaI4aGhK0=)o4-mRIl)bc86DW@kk~&c>HDmM-V{Bxrt2$#p-EJ169hs z&}4s0{*jj#p(w!>0nr18en)W9C2Cdz)n*crzk7Oq{^#H{4h{eCg)k!t2%5ZwVv5AEYTIGK8fK9blsRZ)*vq( z>-!mZliS?Zs+fJ zE!8f77V^xZLL$(G}Ov5;W@+`eI2fCL1mm`i8DtbM#I|h42n6v{I;cP)1HruY9B3 z7@UH|X6|{ag7z&s?1wcj--Ld^Tq`kbfp!+M&nzLZ80Tq91*6#Kvx3W2N0nwkLOYKi zN5johUoUy3An2N}lkRD+31hKXHr=75ak~IbdFZ~K2Hb=<&GfM;;o)*B`F0ce1m~Vh zt=zZCLu&wRp>xG%)$`Z@)jZJfo$w&9U3*-R#vytPZj%028`SjESVBwaOb?S+6?2F4 zJj5s1C3BzgmP6nh0;O}T*WJ_F&!`wr+zKC zX*zC72)eSndUW_9*h=$>-$=>if%Pxfpa+VBI}V1ofe=5i6bRoLy$;0()qG(v{ltrk z6`&cYU8149&Fwy)xreI4!E1r~J3N^y1iZ^HPdat#jDny7Sa@j-I^zfcDv?QsmxG?@ z+WCcqH$g^wzlYw6Qp(c#kf;krRpfS;kfv(^dKew zr<(hpn-W+;I504kt32FwLXzWpq3 zOZO6aw|Lf9E?q7|2q1TApw`aG&N;tc_)`V4Vn0+A(1-K!juCq&fTNa}SUcRae3m_T zRAj>6(^q;XPE96Rr3>q#5oKF2k^~mW_Y*P8xicVb&ZqtD$jNc&Y%Wkv;ry+;Ppikf zU0wT5)4z1MW^Fq0uwAJf0sj-6w-$qBCFGxaLD zeZWi`6Q6y5$?-(hs-_vp8rgHrUlT-W2IfW-`?G(Mr%KXW*3Et13kK%pe$HH3MVveB zsaUiGJyXx4$@B665*rY$5-pH;3MsI0hB(a9$a?0rrZoTgaOuowHlu=UmSBwIY3mR< zj)I(K0pUftY{rh?y~wdh$IT(5(7Ud@JzU`lp|V{rZ+ca>^A_j8E!`h<@9N0j@p3l0 z+h`b*c164pa2qm>(dOesG1V8r-7(`)chhYJU*BZaml0#7KnU$F8!wS(+5#?%w!lwy zfy(flJ?7Gn-HXG*UVSQ0{SEAOoY1C>Ptje$in1~b17J;TR7dv??wo!+jU{yC+)Xd~QQy zY{kWerr3=5i)V_VKYT?DDBIxem4#(>-v-9kF1TkXAMp~h{6t1N}#08WQH{7Zt;(;=NHAn?@Y&h`V` zyW^0$E4>0S_%oMp)_%X5Fg0gJXbV|tE(=@HT(__MxJ(_$`a-NA5I8-WMILQY`r1ou z&Mp^fE(!yy9-FpagHjyrKG(WDpIgaR4f``XH~b#>n@AtoGhTd})LHv@$Yah&A+NK5 zN9|cvj(yD&{KTNlb^McsR?Kj2kB{9_#6KGEC?|KBzPx-id-N4cDQ{q8+uqtbansr!G{^x5Y4q*bUotL3(3>dFDKhj zxZ+D39q7EAa*U*eL~+QjHb|Z79*Q(HI98wMf_5~*zeDO86vmze1q}_7M(kmgBv?O26VYP2ROmeM<3GE+XL(HX}>@=FrlQb1U950y1Lk zq}TF#zwDlJ>PWbw@t^{WS$*s68{~nD$b`;8Ejfn5SM0cH^oY$y zv)f!&Lj*XdSQ?4=(vv~CmPRf*1JWDvv7mxXn1K$RTYc``I;wMG_t{j<)f(*At|EBMO%T}PG%BxYI{BJq{&jo?=E_In2!kn-cnRVNVkI5~mt7>6M z$-PysI_uddik%-^B{-fns7%=RolaA6@V6jbQW_Mkb57P-MlJ33)6%YLY$iWbe3I+b z`C+9^o%G7`;&9tHhwhhi4x*^B=(@eq@btMGHr>Vwx~_`;Z0wtt0J|faSg=-u-Z;tt zM#?=mXsr$B?mDc<hcMRB=*1_=L?@x$2GNO>}NS%3b?VZw$iq>jZ>O2{-HF z0(-5sQ>LbL6#MYy{405S3wBUUe0~Y#;N^pBj|VXn+MnhW+JJF_;RHU!a?ySVT4(T6 zCP#$-x9?JboHFBy_Ht+}gJ1hS+`ncZzmeiF!-z^MDcT5g#HkE)&FjAY@>L?zDdJ^E z#0s=1z>67R0Z7g^Y4hzc5xME+yS?OC@ZN1F8;p3p_!%S^Fx8J?@Ka^k9j}EfcKZnt zBxvFL(MJUZ!3&@9itpu8euikIPN{y<@&kRHk^%0=&G_YM=3!m)0GBV5#-J42^j=(@ z5&&0i%Mtu#Ph&S29J3*T3#N`07;^O2dM>-YOPzMnkm@yw+Ss{0>hLp3W71h;3Jmn? znV0b@K%i$$EQYXe^Fd&M>H?8{Q=jlCf zD&+cYWvy>%f&m9)ec$HQ}L(P~9b_90kM80$D<+`S(;87wXWa1+`hnyEUkb7>* zh5i*Z)1mbZOP5g2ogtmnz)q8j3cv=Zr%eR)oODtzpL!K!y*NC!P4vxbdj2*ot5+=# zXO^v;r-dmeNhF`MwZzW{C}&ANHdPA=>AkwHI^n*lfsnQv_g43>&fU3;!@5qqFSkj4 zQa_f*;3714=4qjQG*>mCr0gehYqx|wyS5kRl;^d+;=dKZoxzT}C@0!2-d)2;JzV?# zvTz6ylFIA8z2EEs)p!D3HyxkdR?6H^HTLuH6R**piN-5e1uwK zBg1Q>5f6Xd(jwC3m2Dc252&-l(FwIRR7lX`?z|t*Z~-_$1PZB=4tpS}0mD*!eZbY1 z)}Mr!W&k(ZCk8{dw=$fF9j4wR#VP-ikAm)eIF+sQ0B|g%B7n8{mERQPwdo^tbKl;e zDHb}upQf_Q+QJX7uxR}2n0dD01&Pc2>Cib*kuzs{0Oj)nk#}F|pDxdhm(LU;2fcji zE;!t(5(=B!!{Xhf)B7`SoYp%NuYG|>!9+j_&m+nX>dVZAiAN4&dMh1kW~HDLQjTi% z)<1ldZr!?dYNBF;O6DlKkO>9VlF)K6Zfu4#DHed9LvX{|&LK|r%X4_gQ(&K!T*ZRa zRWbZJX5TfwtxHO@uOq?hUSCHxXX zKNEl%pYPq|U0X0SZ;;i;MuLB^@k?Ki_)VdAK9s+eQI_!9TE)`kUi)kR!kXcx(o6Y9 z^`n=sg+`KyFDK=Q!Lu?e`eYpJ_gq96x5yN?!o%w~sW%o!aJ{F+ZwOxyW6AS-4)@LI z&x?>%xc}FLD9Wh`S>FZIKASEWw zB(WuDLyK;rSX^TyhTGMhl&5cf70@FKc+dkC^{-MKUcP zJfiC=dU@1AC^hxFN7Zsk9gWG_(>)c$yIK8&i|@0-N%twXNcDnsVVkE?3e{cF9IK({ zPtJ63v>7c#Kj20p#C9SbF`zU24q zeI$LQc3OTpIw5AvB!^`^a0Hmm_o6Xi*|c&ExVFE;zUSzmnlGgH!DG#8Ztq8j`9E+s z*Li|KaZFe(IHJ}e7bTBN(1Q7Hi$UM_q%1DMtKDn;1mWevKf+uThRjR&6x9$y1**O* z&8%pggjo{DH{y@_Tx3G?EXmL)p~S|rid3IiTe02Imp3v1It1VHOFgL1V%$;R|9(PM zG?>|&4Qo7CAb7c^JK)xi`GYr2nw{usw%9{;zh(&HI-oZ>kMro)T+1>6+3@PT=cgb& zcD5^hPBD+paEP^Uc&U$|mV*9(lw+2xJkU1l3*lR_y zQEa^XS$X;c`XL1-v1qKS43Apw#XY`zX4!7bqsbtZh&pUeU!iKNYfJ@7Jt@%e_5HaG zDn3qL&ISpqAJpd)JmTuY^e`jqLDja$6UCm%KQ}&hc4y?btWlti{*px!n5^#U~W!rvcZc1<)L64aj9HJ_( zw7>Q!#B(KBDw+T=U2k zNW|v3!7fW_b@xi$l``A~OV}~5?se|RE{(=vaatpDjsDKl0bq7}XkOKm6-Hoqnns+I z7#7b}@;UV=%tzG(`h%e@e``J&-Do|#y%+*pd>osKu$Alf{kjvng^_xX8-0UOp)T=3 zyX`Q1G@Q&@Roe|wR(oBWiplmwgJ=zakLUS;IuM)E?=WnDrj~;JjUcDGjsaiA_FWF> zYe2`qk2>Xne-Bry-*!hE?ii#;^1AK;e&}r<pj;KxHBXY6}S@=es`aXLU!MoIM)*V>A}njX5z`ODwVYxf8bJgZhRs> zSsn}-rXg4V9)RBPPZZA_edjE*W>m*)m9Kd}-x&^(J02*!o@R#C?b05J;_iS~kB8eM z*6`06@H+x)1v!z&!yVs48Kyl!o~<@yBC?q&>JRP@GgWB)0>>?3KF%YCoDHhs&Q( z5)SYojvBjuzf75GpcW?x05=)Oj)a;mDg%NL^goX!%WKa8Nk$o9tT)UQQ#AIAIK&ia z>{|InGm?H!( zbK19Xw2*z&mq6K2E=*`wH%00_$2|hv2=WW3`SA*+jf{yX+H;<(_81fd+mBWs-_4Jlzc^Y z$u$c1s(f$Q`t&eUuGglrB+!G7ed=o7po}~!9K5KK)OGUqSMCN>AcQz0$aGJ*}#-;moj2&NQVxCMQuX5ocobsE! ze)>s(>N^4x1ph!T>Hw+hQ@%`7t>zz?9I8g@5f+5*RMVE-#nK1-tf)$pzDG(Ziy#a1EPA$fF zlNqk}MjOaQ2@1-V9aAVWcl}sJsSTvx1M14_bzvOI3+c%%C1-Y<4?-|SGBn6IGr|r= zC!>^MjMEG;OoDBVyPzb7Cg=j`W`Z8|El*dvW#_qPmDP{o-AijA6S+1>qiGW3{FFIE zzZOQf&GIDY!XYKR?mP@wgMNAgE&tk$Xki8UDDt;gzR;E7&H3tC$P%{tGVo<+_VOP-vRq1L+fH437= zEc42`dN}0DEqcZVvQyv*mZDj-a=2KDxqAcihV`9E`I0WL8xkw2w#hN2F4_3(ky_+^ znwP%2Tb?^8QqX`5%Ei07J43mXB+cp0Mm1b+C?vE*A6jC}J#Os*88OL|oVM(@aW5Xn z*rCc2JRarASnBn-H=M;tXDhfrq?UE+dcdWCs7gp<@#|4YgKc)Xt+I@awX;?2?bT2# zUS;W8^0@8zwyM3ix%nnOK=S}WnbqFdhO97$DhcMWu)d*D07jY)1rdmF$QT0-zjOU# zf#wD!F;JaA9K3>$CLOKcRJ?h45&Oy5hFkdqSI+`EcS0}Upw^$qz(8=M&fJDo(7qnk zDYV$xZ=W0xl+y~XKiCSF+jPfcWUm8UW`<^GZD)lU1IMP2z1#g``=7yDZ?{76e%?f@ zn+kflfIj$I!yyQu*YPycSrr_;s0P=Yc7*=rHuu#{Sa;ZhZd#WWaa*fT+VD>fZmpPK=f)N> zRd&4~`C{-=Pv-I!+Ac4?sKlG~i&p7qdn*g?!zGFif)Kh-BQazyG~Ub@2}# z#VDizx^TPAcO=$ldHOw`h3vF+ZEGFLEt|z6a$0b8{3G98`wy0$fBf8ZO?f>gl(-j+ zK!$!;>y>zp0B*uL<^D+|jE0#k9nDOK4nmf8XP2r0OW}ZyFcHQ;Z{C+<`aYyPY@Mm6 z;#iG6Ls?540oNler6lSmeW#e~gs2ZJ`UpA{kj(6SB5kV3#W7v@v;7XG*z-0CNl zxMs}D34kKU#^7gT*oc?TIUrpO?5(Q2*cv_uPZ(4t$MHt8o~^}5nw#ZQ>+hidg4y@0 zkoU~PcO^J+V++jK^gC~P8}Vn3qnx;I_p%MGqtuT!`2D*RCP7EHGzC~EG_F2;#4TK_OzZ6n6V?QdMI#>3{>6CV5iNbMu z_~nFMtM=Uo3q@;n*UwBkJiFnXzj!f-bfRR^*Ai3dHXc+O`AL}EkvVi6Gg-KG3DoL!0<`?=Y7qr;b*(T{J;&OW7k&KbW|%3p z!vphFeEm1h`zR-~t8eEP)VGv0;_@utB&8cpv&EZqK?tp8AW(X3X<~M1nFFkU_2Rpv zxU{di4ATbzMWk&d(q9Iqek5%&ZV9^jAkzYCdXKq-Wx+scQMXNNkBLGp<~0!fLgt*9 zMdxJN)EHdFy|Qt}qxc0nuOrp z|00{mMjgRmQQz>oRgG=W*0sz+p2I@5Kj1&yA0BFvr7UEmE}EQmcmCa0{%hRfZSKw8 z%hRof@At}=rXGt8U3(-UeXpCTNN9P1RuM^~m0XGJVsY2EhIO2O1#BMl>AmtX^C8(z z#%5DSDP!KL694ASpX zY^mu|t|@?Yc{Kdyn^^H0iG~JP<4rHoO41a{v$(QYhUQ7~vdD+s(Hog)XfX{whK(^Y zb8;Pq(M5>!O!zO)OOjdA&1jF?CRzQzj=heCk#m?Y#|Y$?gTmvD;ph1tGTAM$_`_e{ zV**xoD>23%0hO(B{Ri3`M{uo#wb1_GaLA~GZBXHbpaP0)x2EvC*wT|As*HUl<(n8n z#GrKxg!{FsOr+N@s(uSlF9<3BQSb;K+%iYWTZ_fV;z7&@b-yq@8g@7S{9AZ+x32CA&YJs;p!80r3dyRy;)6R2B*qLaqW8R87{`cWx3^wx%; zFhh`u3U*xz+C?`wv+SUJsllzK(#A2*cU^U7jCq`A{$ATn00| z{KNH>l|#zJ^L4#lr2-0TcDcng6ppQY*ud9sCsxm4R)4(*RKrKBitit&ajTa!J1dSN z@w_fKI-UKBc2_^r?DPd?QCcyL_P@6Gzk)d{O#?<+C&5iD#>OR-a86*&q}5SX1f>W3rVE6hJ*=jZ{|?Oo}`ilG_7uHBhjTER`%q zp)xMQN@=C9-5cs2-m9cd*!o#9t!8$|%X@=KMrM+)`A*eJR;G~08q2L4v7Y#edQnl) zyIfb2Sa?t0;_p$AKFh;(HWJ8lqfAs<&+PvW>qN;6BbunVeq{80XFf?>g{Bis4KFN#(q)=I~B-@kib@4mjiQ;mMcJ)`*7q8TocU3x|vwT=0fgAHy>4&8M2 z7%B1e%UWrJ{}H~;%rA=e70dCQNq9h(` z60hay40N=I4E2)}SR3I%upj zS}T|*%agjs`|X29Ay3tR$-jqr4vD`h+mx;_(>o-^R|Q#LW}X5`%oVFB;^q}mojsO2 zFJe&c2f`1~88>eu&PgOBEC~WSoV6dW>HURfDZrK1htB-4_7B#1$&cijO|REW|Ml10%np}QbChn}4_wEKbi<|lNVib?&BHtF zzjn2XxsOFoOKdVx5%tGmjtP8N*+)S(|k@L*QA6QV_P{Getvwg_Q z81hHf_MPO-Lh~0g-;N@*$RD>0SzZCDEZw{osF_DoR$Rt#V<_Ng%x%-{q}6jB^^5wm z;OEJs2g&*m=;l{PQ^d!q+gg-CeLAgz#4xvY6C#`b@onaWTO63aiTk`h;6l2032~n8 z;;q-icd@ts`1+km8rt13@1T(Mdl0h1EDShgRZR+q!&$71tHGH+iGjm5Yx^N6NCcdj z-L3{KKh77|*}*G`R!DGv3+=7e zS_P>;=h<#jzvc zYDng%0cvV+HFXLS$E@gFJPZzE5;I0!oU$Of%zwc5{|bg)%6w&Bs7?WcCH^;cw4{KT zCj~JSFo^jl5t!G7WL7Ieu?!0gc8rc8)%R5@38L%AFj$5G-q<8Nk9X5;73yS;(zlOc zWd}D4uwO1p4yv6VMI=iR2mNV*luf^xjZ{j@KBdIO50@Pasr19ek{jgBS8`#bqN9s( zh`*a4y*ova{nfCl3Qmf|SQSkjpN%cY31*d;xLZR0B^DD=Jb$P^{~GlF9z*>!#cU(D zWIHwkn1fulk_pCoY*0aR+%yD-Gw;hH8#6~mW0T9pj%oF+=$tQ1+Q^dCq8j2eZrVR| zQ2Ti77}4LX#KUC5%S%Y2eGG7e{-$LXD{&G>VmNXoib=goho#)@=^amnWx3f^tJ-1izwi}ij_wy&>x%rLRYti>5 zpzh`gsEg*t)CNU3d5j^0I+Xk{wk;mF_mbQDX}q*{@B{Rp=#FOwrk@Ih|7m`^?%wNn z+7=9`KLmBvww;}!`Y*4A85$}2t4xuqy;&Tk}zm`H9TV`_` zZM~McnT0&0W2v6DS>`nB-+3ozo|#hr;tUG?nH??TKk3q+*XJe6QQ8vM-7^2=EStuN zh4vp69FFEZ6#d#7L)m5e?x?cZlczO4;GwLt>u;a`Ec@Wwd?zFfyl5IE^@cZmx^VB| zHJ;Yx1dDh705s#{@#pKKp%41m54*z;&fyCWC+${{YH_rTA^G~*Ze49BfQEmP!RlF;O z{a*Oy_ITf5R8pmKcdiC_kY~$5u=i`nGTUX%JHHjWw&@7 zcBoTy($z3*;IgP~+3&1tk!D4!%> zaiXm`N$Nr!}U7_ zQxwp2a*A0!hL$T??=HjpP*BOb=ZNnM4?9v?Q;jxtHQId1V}nO4?U?_y6nYO2d*&|L#o7OxiN8 z?Tu-I0h&wTxTKalAdoDgXj*Ow=1hZGS}v2LC8nt$E{Ku~ASjv!PCBKNX$dZ+fTgyY zyJ_W;yS)70=lk>JzV7?CoO7;o!dOw@;NRUCUm32R4JiXwKXqPxrNufLYEhI{LvuCBa@ii(KTd8yr{*EMk9>dZ(ukcG*XSQ-TMD+j?yA~e;90x3VJOVSd;$d- z?-l1)f}r0p?cgA$BR$9{kUZmfc0>G#&}KfaqL*Bh;;R}fnv6!yIwVl$ zKU^XqE^gM6KKljN35K!l@rR3_4hC>iK2kA}cj^K!g65rklb!5tyr}N47VSInpeSm+ zQ6+tEk*%Pgb}kAJ9yxYC9DB?vRr`ESGX7i`{b>7zT+MauvlURo{V$Vu+%5Djyny|= zF7;-rvD4`@Q%_xZ+wA@2o^ynwqvo?4Jy|G;2{K7RXQo=o;m48m{$<7otSBV!Yx(>-8d3NYj@uZ~quih)3Ytq=SbG ztP6??I5rq;&xPw>{;m)%R{hg3f1~H>=aH-*j~@L`J0-2v(6wqyB{;Wiz%|4aTDE`mR0ypJ8j;Mzu(SmfbrXf^O9E-`71 zEg?MOnWTKt7*0UT$uhFdUEPXFaAZJOEA^IkAHMG)9S=T)00IykU9GN$SrNk}^gc)% z07xkn9ejxL%&8z-q-lV3j2|z*d#Im!YI3QZu5qG{~T5F!J&k5^h zFmVa9jP=U2Z(wgn-j-AJW9}cIwYvD3P<%`8@shc7@Go6SRh~&Vf*2Ic0=W;-6#~MtN4k@s$!!fKKYmy zH0g|k?!@uUfvm3_S;@tI&=@{7xfafiD@Jf^;y9^+d{&r~4RJ1)^ExKB`FT%6cv~$+ zgb&}6+OQMsok{~gb6v~V^V;c;gZ86H&upvv8wv?ITB&CccQo90o!QYw`^mk(CgQ>E zt(1nlrowTX(T03$GYHG)WEC3G9!0VRFn67<>}cKj^CIH|tNSyj@w3K%?D?K!rfgm+ z=4kUbM znKc;Qux%I{TuR%ci&kgKwWALr$}Cv@jI=6yK-#b+XiI5j*?BrPT)^C*60VnMPEk13 z&IQsjX8H1q2|^rTm`+q_?0YFkA%vXeB!WHXiep`18GnXg>lShdh55{8TP`xCZBvOS z=TA>4HqGkrdqLj2J`^B-plOu_i_8!sN_wk;BBtI#V(asGU)x<>-@eX6u1$xbXJZLf;TOF6>U1=XBemo zWs~b<{XgfY++KG8m`cn-@E^FvqWzn0%UdF!(sFdchr5 zy?bH*d}1Xri8B$`>?B)aKW_fRzW4LmdymK8o&05+9LBTptLp~slQB2WmCQeQySe$w zzGFt!(y2NX_$py=W~~-eJgNH9`2A5J#^vjJ(#gn?@c8$@I75p9cnV!tBZb`E4X+j` z_?vkurK%AcN!UanH@ADNPN|xGo^Fn><2zlbNl)#H@k$s9hSAL({xu#uQX8jAJeswE z-1w)^d{NdX7D3)IRhW%cG8Tow||0>^W!M6~2Z{>GTdNf}wF6=hIcM z#dIzln1eYm!wImULQ zeu~N>nrYTJ${!|Mb%vg>tWm{8I3^s4b^a^L30r1RC1%ZELe3RosG{5q7>s0zE$HY#7%9Q!b zRGLfw-C)n)EuOK3hjj80NfQ`cW6;t?88yF8b52N{zUDMVpema5_Z4nRJ{Z|?7J1C1 zCjbY%MHPZdHN7GK3T|$bK;?M#e*0GVxC^CCRcjaVD~QDdAn+3B>x(985;*=v4|!PkJNg8FJ$n(dit=}> z9dM-3ReH6o+tc6(ULkgE+yol3$mF5{CT|05En}c7B$mAG8KcQ2ADAu&@^}SuKa|HF zbm+5!YM&~U&7T3nR_@PRlf84+cnsr=ZTW0BRn4km)jI*mRrwOma}Z4aY)g`UY_(|2 zV90H`r>Axfxz||iM;f|RU;j+*F3I&3`S~?;>PM;_gMkujA71F|20|t?k{o3%f{?c9 z`x${NE*wohn!M}B!=fnCg#|&?0_!15K>ZVP^|He_Wh$W;L3|5E!Hn}CvEsPI^q^J> zCsk_x?bUltgKM+0`XN8E>WCwy>N5$v&NZ-Vz6@U8$yma)uF4ttGfjmtzr9C6YhSx@ z6Ia$I#I;Wh0B%u{XVpiJBlVM{i7+l9aW3f5rtWG%n^*#sky&+?6>`Eql*-4WVEORb zSf&y>(nmVT7E;JdZ3JmD=&e(E;{vSQLvKTzMMkdf2Jp(1rx1jtvyU)jss6eT zV^tOAc(I3fuv+N@U1pEGQ?&E)L3i=J)CeWat_Tg};dJPk8fk(QOVeP3o~uk8qmfU{ zRrXb_?8zEi@xCEVd!*ThQ*25FVmU$?_$(mPlKCZ6a(BO!(tK;$tLzB@@5kHTKygRv zXzV*cV0Si@x_eM zV`2F^&Z~gO+FL3pBa_JUxFyg4z+6}1aKI6Gkl6Ndi4M&>V%#RpW?O3OAC1rjALcJ` zy|ytlZ{5vKK=;u(y#d28HDn!?nw7cwE)ToERE=;Kg&qZzXm*qW8BRf z>@6cJb;~4s76CFA5{3WrKy8~iF={_5BU2*rXl_JtL^0ovPq4Fz;bWWZs~VY%6PVAQ ztjkV%GbhkyLCM#dwVxtamF8m-{r2TPKfA)fzS?i;@omcm#XSC>`Zop(yfYyvs0b?8 z=f}kH?<`~*jFtT7IhcUr567~c(Zkw5YqZ80flP087>X+~Gyg50_PTN#)Wh;bVv+C& zXId2c6RQPxm=J}Dd-G{f&AW^m9e9KnY|+duJUeRRrNdLlfxeBMjbpRftT?_2=2Y=b z$b$z<%k#th>-!a*f+^y@!T^t@IW&DCts1}vculj=M)>lsS)yl!Nwo6RPP|;97#X5c z$y`bxBX?FYAq!!k?_N{P`k>{EBj01{iP$JGFc`0_0PoL36m*JTzKJf0UoQO!`^Ant z99M(UmFR8EF_<>YPf>+a#KI@PYg4)7t03`9IYI;#euEi}o}!~YbATg%p;XI4VHp?< zZs;Fm$Jn%J5^*CzyBfL!fnGN~cOmc+Qvo6`_`sG&phfOAC{!{1FHCZZ5@id6{>$u` zt>Iq3y>h3Qhs}W&8=oHCF=@d%w!r2wtafCjWF;qPJKbk$X?PzN>0d7iyQU+E_1N4> z>5ude^WO49is7;`<+z$x64tyP1TDXv7fFy+I25=(!Gx*f`1f$5dF*b5P=p-3hQ@GV zkgi_0u{&kvIePNYp{82`X7Wl>K5`OL@-XvJVH%|6lp#>CbKT(pYcfB+EpM*tXSw1WZMHf5EY#$aN zs}VJ&H5iu%3K5{shm$++3T1xcS{G08q&)ubpw0eE9YomL?c-LC(2-dokES>7TTha zQT{<6QFgb=7g_mpIh%2+c9r!|lJ}d>oH>r|8HFImYHfUxi><=BjI}iNrCPMKvRhK7 zl2X>zpC&geRA<&|-^P!xUD;SrUHlT1Qv3blN0yxACzO-g8y@&Y9`e_mN=q=o)`}g6 z;YruIpM%1FO&9Gg<;0Jacg=56Z&m@1ZqKWq`nKt1>~(cLqkXijJ-w_u zPb~5sK)eKygRY2R|9f5t88u*+90oxkbQs$<`sh4hjuUIYt{%y!6k6@$hp8YM^Cf}3 zVDTE}WZ>d3;&6%H?K}Pl36zv((8hxS%z}G+Vr8Pohn6pAH&4!aFXn%Qto7WPcDn{x zps@1vVFDOfj%py(@dm89qNv@7PLf0@mSeucJeHF-<&Ea#;bP2oYDA3fDYDYTB=rPN z4b({>ZWIc|Pu-(XyCLpO5wOq<;$CnLhgPGsRbY71b{VqK$C69VATv zTpt$BSPrjzM#~5>C|&UiT}PM2qnX$$mA_7F;&BtxH)#-DZBu;Z?SXk_+P^JL34JXS zFUI)#F<#Fgk}Gk49nUx*+-e8}or#R+}qJSZ>0r?0O#ehRK@Y)I6~Z znL2h`T>GfD!kO*B|8ujyMLDS#M3oOGr6pZ zixojG{U0AFWRXb}mKyFpfqa*~l*>URu}yZ)Ry5=DX(xDngAFJgXy)KSu-v&mO@>0HG07oYBtp{2{en*`{m;`J3TA@w-SBu6gg-<_s+vqrz^cv3EucMQCdW@ zyL_Pyn&YUeyONY@q(S`NeVo6CU;)DudlSF_$0q|{0FpR7RYl+fi>o~rKPL+uvnM<^ zbk90zY4TSD=AR(l=3n^(P@xY>-Qj`Bj|EEol@}TtbU2Z!Gt3xA)LMX5WbdGvCuBcg z5f0^TZ61R^*MlSP*!14!QL$dRH$@Ea_D2cBX&Qa{$avgatF+GHv_u(yi3NieTD~cd z7S7HNU3`NOt_jwR5}W^EtpFT*36=}|34!@XDDE?r$CTam+A;6k@-l*Zs^ltb9;Weu zX!vyVI{A~35?uGxWDf~UshM1NJf2rS*ihDxJ^;%J&kUy}n9TDqd%nsKp(K%%0m{Gw zH6>HdevmzSLPKK8Dl%@w{W7+R`%=*e9`1Hx=M9IEHrWp)(*Yd2eLL?!cN3VYCI|0g zdADTgelTqxufKByy-&BM*G?kK35VfvQ#O~MGo)E2cQb9`Y+}owJOxN?%+1hoCD%o^ z&>6*}ZjFVXlt5;*8 zORP91Ke}sV>PpD%znhNJ6yMM&`;v>?wnayt91dTf6tA*B|7rNqid0DZl^ zz3Ru?F^V*1nR>Qj&*NLebv{}YT(BtAYQ1n$!wX=+#A3N94HQp@9(n-;ugCg9;T0?( z?H2uYMs_#ABHshld+xGQ7?vrJ*apaN??%)3@K>56BmK-6WQ6o7;aqPqz~7x)&S0n` zxv}1GpP#a^p}EXpGoF}rU(HfbD2*`LWt2%YPCs{b9RWy&J;Gf`xy{2b~sjE}nu z;6_M0`bMbKv0IrZc-2IsSzFuvHC_y?93qsXEMNk*2qq$pT09$uxYlE_G%OZN7hXv2 zhmly%?uUht@=SknC0nrQ^e)72?m4F7C=>}EfCi7kEJ$@EaTwE&Ns?9f@@T9AwYQ<@ z0Eyd0?Rel`C-SQLsXY=$Vl~>LeOaTIYsPp;eWf7m@4XO;A0-?n5TWY@>9V|GQXVp5 zRKHxm3z@-V6*Bhbkts@^h|*YN0-cJ^DO-dm{36vgv|FSl)ht^$Qg|C7c|9WV0^R*XvrwML}e@qc|o6=Xe-E~{R9u~2GX{dLdX!*;@RvEP(O)QK5(kGf*BOv2S;@C(Q5RprxjwfVw7WN{v^>%leKD&Q$U z+&jCbZKTb*l4;d@16_>Ks?LHcKM5X+**YK_mz%8=o3y;aGXg-lVtN#I4xNQF!6_a8 z93%t{IZP$~h73}!yl-0dl7O4PZA*wTQ3yC~z_4ry6aWmqV8sKnshocVN(K7WTU*By zY9-+Y0Xmhk`twWK-^*{yrkE48G{UU@LUGSFk8~n{a!rpMpT)$FCIvtctEitVDdtNf z9#e<3R8O`}&;apHE?7?jBr_;(Lg*)eBJ z&D)<{ubGTQe#vT89bV?odK>tC!~B=CbZ6}Njn0pDNQYV+qnm%$a*VwEqD~>Q#eA-4 zL`?m?)-+ZKUO8y~uYu_Ai!r2X<)z4FYDMaWqn8U9`_Dgh(9`U2LF$E$;Ua40rZr*} zWA*Q10OG*OIlgXF?P%LKh%2EVEcJPitH#EQFd9=4B|u;lIwQ*iG?q9ZQ>zzSYaQk9 z`Hk;hJ$h3UsCB;dYIVGmOVV#r=F;iY+kb%XH&!#wC8fhuv@ZF{DYWjk=YqEALs=oW z{~_03F6IHdP$m_J+I5nHFINb%h4(!>~xEP>s& zp_0#`p#417pU{ugGx-7R@_Z8=NG0Tz9_PT$+^NcV zoz3WJN26a~J%W=ze5Wttu__HD>g*Jy5rQ@zgξXXFVZ5!S+R9<&39naBk4a)yo? zC*CvO^*RPbEPVrB?eZq#=E}Ri@-Rb-wM|v<*(3y8y@5P1vqjk;swS<3Cyqx+tj(Ad zrNn=)EJG@Z+%3uT?H?Shs|qiKz;N)edI?RaKOlXhv{SE%;y1Tgtg9?45u~oiZ*9?P z{a%pHeO#{M#F|Y}WTa_zF&aB;7!%RyzRpL)aj)hBVvU(sj>s@s1N(4j(s>ulUV~XIb09(2wZ*yrPenjcMB`ltk z2}c6$P%z*6*X@umOu~wrQ_Zn)M<(FAtq(`x<`lO{=2+<#0vFxAX7ZWoh6qg6+OHLg*i+sJ>DeJTOw)~?3n8&eca)Qe9pF! z;q}pIfTHS4HW8<&UDT=-cZK;B2pC`B=0lj34&kLt9e0iOd%ndclh%e06~MBp*R=yH zh+5q8^F@|TXyg8o%g@Ta>C%vc^o_b3U0j3lk~d}ftFbq{!kL3pNXBz~e{yWTjJ~P! zcq-nlVjXyLEZi)K;u)KzwhAyh6KdtmK~S3nD=2#&Qwg otYm?&1jS)>ZNj=}|7 zd$LQ8oaN)PS5TJC{&{8p`9}z_{3YCv;^_)A=hh^Och8AOBbl55E~^cH(0+ zdxa6riVT{pRjs5eCAA=C`(8T61^C>&u)p5oC(Zkz80il0qvcGowR*M=Zr-q|ro2Lm zp};<#b;X+uFZYlGY(v~S{KYU4(tV;9_nai+`O4&Gbp`IH1@KTY0qH4#^Z4<>kXUbn%g2UPb2pymU{sU9Do#WHKxx#aNQlMj TAsSrO{w4>lXKZ(mN<003Hcb<% diff --git a/tests/superinstructions/expected-results.tar.bz2 b/tests/superinstructions/expected-results.tar.bz2 index 64d807ab68f7b6510958fe344055fa618410f3b1..e0536a2abff5af5f70b6a2a4b101bb3688ed9095 100644 GIT binary patch delta 10165 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 T(ChK$^d{y?ood)RU;h6AdpZ;1 delta 10189 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