From fd0d06ee396a8c9c53674740dd5139b2875c072b Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Wed, 11 Mar 2020 21:04:40 +0100 Subject: [PATCH] Replace reflection usage with MethodHandles when performance matters (#10097) Motivation: As we have java8 as a minimum target we can use MethodHandles. We should do so when we expect to have a method called multiple times. Modifications: - Replace usage of reflection with MethodHandles where it makes sense - Remove some code which was there to support java < 8 Result: Faster code --- .../codec/compression/ByteBufChecksum.java | 57 +++---- .../io/netty/util/internal/CleanerJava6.java | 36 +++-- .../io/netty/util/internal/CleanerJava9.java | 42 +++-- .../util/internal/PlatformDependent0.java | 80 +++++----- .../java/io/netty/handler/ssl/Conscrypt.java | 32 ++-- .../io/netty/handler/ssl/Java9SslUtils.java | 83 +++++----- pom.xml | 5 + .../dns/DnsServerAddressStreamProviders.java | 24 +-- ...libbarchart-udt-core-2.3.0-SNAPSHOT.jnilib | Bin 0 -> 308200 bytes .../socket/nio/NioDatagramChannelConfig.java | 146 +++++------------- 10 files changed, 232 insertions(+), 273 deletions(-) create mode 100644 transport-udt/lib/bin/lib/x86_64-MacOSX-gpp/jni/libbarchart-udt-core-2.3.0-SNAPSHOT.jnilib diff --git a/codec/src/main/java/io/netty/handler/codec/compression/ByteBufChecksum.java b/codec/src/main/java/io/netty/handler/codec/compression/ByteBufChecksum.java index 1ba8eb1381..ff0dc2686a 100644 --- a/codec/src/main/java/io/netty/handler/codec/compression/ByteBufChecksum.java +++ b/codec/src/main/java/io/netty/handler/codec/compression/ByteBufChecksum.java @@ -20,7 +20,6 @@ import static java.util.Objects.requireNonNull; import io.netty.buffer.ByteBuf; import io.netty.util.ByteProcessor; -import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.util.zip.Adler32; import java.util.zip.CRC32; @@ -33,43 +32,34 @@ import java.util.zip.Checksum; * byte array ({@link ByteBuf#hasArray()} is {@code true}) or not. */ abstract class ByteBufChecksum implements Checksum { - private static final Method ADLER32_UPDATE_METHOD; - private static final Method CRC32_UPDATE_METHOD; - - static { - // See if we can use fast-path when using ByteBuf that is not heap based as Adler32 and CRC32 added support - // for update(ByteBuffer) in JDK8. - ADLER32_UPDATE_METHOD = updateByteBuffer(new Adler32()); - CRC32_UPDATE_METHOD = updateByteBuffer(new CRC32()); - } private final ByteProcessor updateProcessor = value -> { update(value); return true; }; - private static Method updateByteBuffer(Checksum checksum) { - try { - Method method = checksum.getClass().getDeclaredMethod("update", ByteBuffer.class); - method.invoke(checksum, ByteBuffer.allocate(1)); - return method; - } catch (Throwable ignore) { - return null; - } - } - static ByteBufChecksum wrapChecksum(Checksum checksum) { requireNonNull(checksum, "checksum"); if (checksum instanceof ByteBufChecksum) { return (ByteBufChecksum) checksum; } - if (checksum instanceof Adler32 && ADLER32_UPDATE_METHOD != null) { - return new ReflectiveByteBufChecksum(checksum, ADLER32_UPDATE_METHOD); + if (checksum instanceof Adler32) { + return new OptimizedByteBufChecksum((Adler32) checksum) { + @Override + public void update(ByteBuffer b) { + checksum.update(b); + } + }; } - if (checksum instanceof CRC32 && CRC32_UPDATE_METHOD != null) { - return new ReflectiveByteBufChecksum(checksum, CRC32_UPDATE_METHOD); + if (checksum instanceof CRC32) { + return new OptimizedByteBufChecksum((CRC32) checksum) { + @Override + public void update(ByteBuffer b) { + checksum.update(b); + } + }; } - return new SlowByteBufChecksum(checksum); + return new SlowByteBufChecksum<>(checksum); } /** @@ -83,12 +73,9 @@ abstract class ByteBufChecksum implements Checksum { } } - private static final class ReflectiveByteBufChecksum extends SlowByteBufChecksum { - private final Method method; - - ReflectiveByteBufChecksum(Checksum checksum, Method method) { + private abstract static class OptimizedByteBufChecksum extends SlowByteBufChecksum { + OptimizedByteBufChecksum(T checksum) { super(checksum); - this.method = method; } @Override @@ -97,19 +84,21 @@ abstract class ByteBufChecksum implements Checksum { update(b.array(), b.arrayOffset() + off, len); } else { try { - method.invoke(checksum, CompressionUtil.safeNioBuffer(b, off, len)); + update(CompressionUtil.safeNioBuffer(b, off, len)); } catch (Throwable cause) { throw new Error(); } } } + + public abstract void update(ByteBuffer b); } - private static class SlowByteBufChecksum extends ByteBufChecksum { + private static class SlowByteBufChecksum extends ByteBufChecksum { - protected final Checksum checksum; + protected final T checksum; - SlowByteBufChecksum(Checksum checksum) { + SlowByteBufChecksum(T checksum) { this.checksum = checksum; } diff --git a/common/src/main/java/io/netty/util/internal/CleanerJava6.java b/common/src/main/java/io/netty/util/internal/CleanerJava6.java index 41bf58a99e..f40cb9e0de 100644 --- a/common/src/main/java/io/netty/util/internal/CleanerJava6.java +++ b/common/src/main/java/io/netty/util/internal/CleanerJava6.java @@ -18,8 +18,10 @@ package io.netty.util.internal; import io.netty.util.internal.logging.InternalLogger; import io.netty.util.internal.logging.InternalLoggerFactory; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.security.AccessController; import java.security.PrivilegedAction; @@ -33,15 +35,15 @@ import java.security.PrivilegedAction; */ final class CleanerJava6 implements Cleaner { private static final long CLEANER_FIELD_OFFSET; - private static final Method CLEAN_METHOD; - private static final Field CLEANER_FIELD; + private static final MethodHandle CLEAN_HANDLE; + private static final MethodHandle CLEANER_FIELD_HANDLE; private static final InternalLogger logger = InternalLoggerFactory.getInstance(CleanerJava6.class); static { long fieldOffset; - Method clean; - Field cleanerField; + MethodHandle cleanHandle = null; + MethodHandle cleanerFieldHandle = null; Throwable error = null; final ByteBuffer direct = ByteBuffer.allocateDirect(1); try { @@ -62,7 +64,8 @@ final class CleanerJava6 implements Cleaner { throw (Throwable) mayBeCleanerField; } - cleanerField = (Field) mayBeCleanerField; + Field cleanerField = (Field) mayBeCleanerField; + MethodHandles.Lookup lookup = MethodHandles.lookup(); final Object cleaner; @@ -74,15 +77,16 @@ final class CleanerJava6 implements Cleaner { } else { fieldOffset = -1; cleaner = cleanerField.get(direct); + cleanerFieldHandle = lookup.unreflectGetter(cleanerField); } - clean = cleaner.getClass().getDeclaredMethod("clean"); - clean.invoke(cleaner); + cleanHandle = lookup.findVirtual(cleaner.getClass(), "clean", MethodType.methodType(void.class)); + cleanHandle.invoke(cleaner); } catch (Throwable t) { // We don't have ByteBuffer.cleaner(). fieldOffset = -1; - clean = null; + cleanerFieldHandle = null; + cleanHandle = null; error = t; - cleanerField = null; } if (error == null) { @@ -90,13 +94,13 @@ final class CleanerJava6 implements Cleaner { } else { logger.debug("java.nio.ByteBuffer.cleaner(): unavailable", error); } - CLEANER_FIELD = cleanerField; + CLEANER_FIELD_HANDLE = cleanerFieldHandle; CLEANER_FIELD_OFFSET = fieldOffset; - CLEAN_METHOD = clean; + CLEAN_HANDLE = cleanHandle; } static boolean isSupported() { - return CLEANER_FIELD_OFFSET != -1 || CLEANER_FIELD != null; + return CLEANER_FIELD_OFFSET != -1 || CLEANER_FIELD_HANDLE != null; } @Override @@ -129,17 +133,17 @@ final class CleanerJava6 implements Cleaner { } } - private static void freeDirectBuffer0(ByteBuffer buffer) throws Exception { + private static void freeDirectBuffer0(ByteBuffer buffer) throws Throwable { final Object cleaner; // If CLEANER_FIELD_OFFSET == -1 we need to use reflection to access the cleaner, otherwise we can use // sun.misc.Unsafe. if (CLEANER_FIELD_OFFSET == -1) { - cleaner = CLEANER_FIELD.get(buffer); + cleaner = CLEANER_FIELD_HANDLE.invoke(buffer); } else { cleaner = PlatformDependent0.getObject(buffer, CLEANER_FIELD_OFFSET); } if (cleaner != null) { - CLEAN_METHOD.invoke(cleaner); + CLEAN_HANDLE.invoke(cleaner); } } } diff --git a/common/src/main/java/io/netty/util/internal/CleanerJava9.java b/common/src/main/java/io/netty/util/internal/CleanerJava9.java index 3c4b5cd8b3..96e04cf2d9 100644 --- a/common/src/main/java/io/netty/util/internal/CleanerJava9.java +++ b/common/src/main/java/io/netty/util/internal/CleanerJava9.java @@ -18,8 +18,10 @@ package io.netty.util.internal; import io.netty.util.internal.logging.InternalLogger; import io.netty.util.internal.logging.InternalLoggerFactory; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.security.AccessController; import java.security.PrivilegedAction; @@ -30,34 +32,40 @@ import java.security.PrivilegedAction; final class CleanerJava9 implements Cleaner { private static final InternalLogger logger = InternalLoggerFactory.getInstance(CleanerJava9.class); - private static final Method INVOKE_CLEANER; + private static final MethodHandle INVOKE_CLEANER_HANDLE; static { - final Method method; + final MethodHandle invokeCleanerHandle; final Throwable error; if (PlatformDependent0.hasUnsafe()) { final ByteBuffer buffer = ByteBuffer.allocateDirect(1); - Object maybeInvokeMethod = AccessController.doPrivileged((PrivilegedAction) () -> { + Object maybeInvokeMethodHandle = AccessController.doPrivileged((PrivilegedAction) () -> { try { + MethodHandles.Lookup lookup = MethodHandles.lookup(); // See https://bugs.openjdk.java.net/browse/JDK-8171377 - Method m = PlatformDependent0.UNSAFE.getClass().getDeclaredMethod( - "invokeCleaner", ByteBuffer.class); - m.invoke(PlatformDependent0.UNSAFE, buffer); + MethodHandle m = lookup.findVirtual( + PlatformDependent0.UNSAFE.getClass(), + "invokeCleaner", + MethodType.methodType(void.class, ByteBuffer.class)).bindTo(PlatformDependent0.UNSAFE); + m.invokeExact(buffer); return m; } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { return e; + } catch (Throwable cause) { + PlatformDependent0.throwException(cause); + return cause; } }); - if (maybeInvokeMethod instanceof Throwable) { - method = null; - error = (Throwable) maybeInvokeMethod; + if (maybeInvokeMethodHandle instanceof Throwable) { + invokeCleanerHandle = null; + error = (Throwable) maybeInvokeMethodHandle; } else { - method = (Method) maybeInvokeMethod; + invokeCleanerHandle = (MethodHandle) maybeInvokeMethodHandle; error = null; } } else { - method = null; + invokeCleanerHandle = null; error = new UnsupportedOperationException("sun.misc.Unsafe unavailable"); } if (error == null) { @@ -65,11 +73,11 @@ final class CleanerJava9 implements Cleaner { } else { logger.debug("java.nio.ByteBuffer.cleaner(): unavailable", error); } - INVOKE_CLEANER = method; + INVOKE_CLEANER_HANDLE = invokeCleanerHandle; } static boolean isSupported() { - return INVOKE_CLEANER != null; + return INVOKE_CLEANER_HANDLE != null; } @Override @@ -78,7 +86,7 @@ final class CleanerJava9 implements Cleaner { // See https://bugs.openjdk.java.net/browse/JDK-8191053. if (System.getSecurityManager() == null) { try { - INVOKE_CLEANER.invoke(PlatformDependent0.UNSAFE, buffer); + INVOKE_CLEANER_HANDLE.invokeExact(buffer); } catch (Throwable cause) { PlatformDependent0.throwException(cause); } @@ -90,9 +98,11 @@ final class CleanerJava9 implements Cleaner { private static void freeDirectBufferPrivileged(final ByteBuffer buffer) { Exception error = AccessController.doPrivileged((PrivilegedAction) () -> { try { - INVOKE_CLEANER.invoke(PlatformDependent0.UNSAFE, buffer); + INVOKE_CLEANER_HANDLE.invokeExact(PlatformDependent0.UNSAFE, buffer); } catch (InvocationTargetException | IllegalAccessException e) { return e; + } catch (Throwable cause) { + PlatformDependent.throwException(cause); } return null; }); diff --git a/common/src/main/java/io/netty/util/internal/PlatformDependent0.java b/common/src/main/java/io/netty/util/internal/PlatformDependent0.java index 4122eca8cd..3f57759c04 100644 --- a/common/src/main/java/io/netty/util/internal/PlatformDependent0.java +++ b/common/src/main/java/io/netty/util/internal/PlatformDependent0.java @@ -19,6 +19,9 @@ import io.netty.util.internal.logging.InternalLogger; import io.netty.util.internal.logging.InternalLoggerFactory; import sun.misc.Unsafe; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -38,14 +41,13 @@ final class PlatformDependent0 { private static final InternalLogger logger = InternalLoggerFactory.getInstance(PlatformDependent0.class); private static final long ADDRESS_FIELD_OFFSET; private static final long BYTE_ARRAY_BASE_OFFSET; - private static final Constructor DIRECT_BUFFER_CONSTRUCTOR; + private static final MethodHandle DIRECT_BUFFER_CONSTRUCTOR_HANDLE; private static final Throwable EXPLICIT_NO_UNSAFE_CAUSE = explicitNoUnsafeCause0(); - private static final Method ALLOCATE_ARRAY_METHOD; + private static final MethodHandle ALLOCATE_ARRAY_HANDLE; private static final int JAVA_VERSION = javaVersion0(); private static final boolean IS_ANDROID = isAndroid0(); private static final Throwable UNSAFE_UNAVAILABILITY_CAUSE; - private static final Object INTERNAL_UNSAFE; private static final boolean IS_EXPLICIT_TRY_REFLECTION_SET_ACCESSIBLE = explicitTryReflectionSetAccessible0(); static final Unsafe UNSAFE; @@ -66,16 +68,14 @@ final class PlatformDependent0 { static { final ByteBuffer direct; Field addressField = null; - Method allocateArrayMethod = null; - Throwable unsafeUnavailabilityCause = null; + MethodHandle allocateArrayHandle = null; + Throwable unsafeUnavailabilityCause; Unsafe unsafe; - Object internalUnsafe = null; if ((unsafeUnavailabilityCause = EXPLICIT_NO_UNSAFE_CAUSE) != null) { direct = null; addressField = null; unsafe = null; - internalUnsafe = null; } else { direct = ByteBuffer.allocateDirect(1); @@ -189,13 +189,13 @@ final class PlatformDependent0 { ADDRESS_FIELD_OFFSET = -1; BYTE_ARRAY_BASE_OFFSET = -1; UNALIGNED = false; - DIRECT_BUFFER_CONSTRUCTOR = null; - ALLOCATE_ARRAY_METHOD = null; + DIRECT_BUFFER_CONSTRUCTOR_HANDLE = null; + ALLOCATE_ARRAY_HANDLE = null; } else { - Constructor directBufferConstructor; + MethodHandle directBufferConstructorHandle; long address = -1; try { - final Object maybeDirectBufferConstructor = + final Object maybeDirectBufferConstructorHandle = AccessController.doPrivileged((PrivilegedAction) () -> { try { final Constructor constructor = @@ -204,34 +204,34 @@ final class PlatformDependent0 { if (cause != null) { return cause; } - return constructor; - } catch (NoSuchMethodException | SecurityException e) { + return MethodHandles.lookup().unreflectConstructor(constructor); + } catch (NoSuchMethodException | SecurityException | IllegalAccessException e) { return e; } }); - if (maybeDirectBufferConstructor instanceof Constructor) { + if (maybeDirectBufferConstructorHandle instanceof MethodHandle) { address = UNSAFE.allocateMemory(1); // try to use the constructor now try { - ((Constructor) maybeDirectBufferConstructor).newInstance(address, 1); - directBufferConstructor = (Constructor) maybeDirectBufferConstructor; + directBufferConstructorHandle = (MethodHandle) maybeDirectBufferConstructorHandle; + directBufferConstructorHandle.invoke(address, 1); logger.debug("direct buffer constructor: available"); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { - directBufferConstructor = null; + } catch (Throwable ignore) { + directBufferConstructorHandle = null; } } else { logger.debug( "direct buffer constructor: unavailable", - (Throwable) maybeDirectBufferConstructor); - directBufferConstructor = null; + (Throwable) maybeDirectBufferConstructorHandle); + directBufferConstructorHandle = null; } } finally { if (address != -1) { UNSAFE.freeMemory(address); } } - DIRECT_BUFFER_CONSTRUCTOR = directBufferConstructor; + DIRECT_BUFFER_CONSTRUCTOR_HANDLE = directBufferConstructorHandle; ADDRESS_FIELD_OFFSET = objectFieldOffset(addressField); BYTE_ARRAY_BASE_OFFSET = UNSAFE.arrayBaseOffset(byte[].class); final boolean unaligned; @@ -300,24 +300,25 @@ final class PlatformDependent0 { } }); if (!(maybeException instanceof Throwable)) { - internalUnsafe = maybeException; - final Object finalInternalUnsafe = internalUnsafe; + final Object finalInternalUnsafe = maybeException; maybeException = AccessController.doPrivileged((PrivilegedAction) () -> { try { - return finalInternalUnsafe.getClass().getDeclaredMethod( - "allocateUninitializedArray", Class.class, int.class); - } catch (NoSuchMethodException | SecurityException e) { + return MethodHandles.lookup().findVirtual(finalInternalUnsafe.getClass(), + "allocateUninitializedArray", + MethodType.methodType(byte[].class, Class.class, int.class)) + .bindTo(finalInternalUnsafe); + } catch (NoSuchMethodException | SecurityException | IllegalAccessException e) { return e; } }); - if (maybeException instanceof Method) { + if (maybeException instanceof MethodHandle) { try { - Method m = (Method) maybeException; + MethodHandle m = (MethodHandle) maybeException; byte[] bytes = (byte[]) m.invoke(finalInternalUnsafe, byte.class, 8); assert bytes.length == 8; - allocateArrayMethod = m; - } catch (IllegalAccessException | InvocationTargetException e) { + allocateArrayHandle = m; + } catch (Throwable e) { maybeException = e; } } @@ -332,13 +333,11 @@ final class PlatformDependent0 { } else { logger.debug("jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable prior to Java9"); } - ALLOCATE_ARRAY_METHOD = allocateArrayMethod; + ALLOCATE_ARRAY_HANDLE = allocateArrayHandle; } - INTERNAL_UNSAFE = internalUnsafe; - logger.debug("java.nio.DirectByteBuffer.(long, int): {}", - DIRECT_BUFFER_CONSTRUCTOR != null ? "available" : "unavailable"); + DIRECT_BUFFER_CONSTRUCTOR_HANDLE != null ? "available" : "unavailable"); } static boolean isExplicitNoUnsafe() { @@ -387,7 +386,7 @@ final class PlatformDependent0 { } static boolean hasDirectBufferNoCleanerConstructor() { - return DIRECT_BUFFER_CONSTRUCTOR != null; + return DIRECT_BUFFER_CONSTRUCTOR_HANDLE != null; } static ByteBuffer reallocateDirectNoCleaner(ByteBuffer buffer, int capacity) { @@ -402,13 +401,16 @@ final class PlatformDependent0 { } static boolean hasAllocateArrayMethod() { - return ALLOCATE_ARRAY_METHOD != null; + return ALLOCATE_ARRAY_HANDLE != null; } static byte[] allocateUninitializedArray(int size) { try { - return (byte[]) ALLOCATE_ARRAY_METHOD.invoke(INTERNAL_UNSAFE, byte.class, size); - } catch (IllegalAccessException | InvocationTargetException e) { + return (byte[]) ALLOCATE_ARRAY_HANDLE.invoke(byte.class, size); + } catch (Throwable e) { + if (e instanceof Error) { + throw (Error) e; + } throw new Error(e); } } @@ -417,7 +419,7 @@ final class PlatformDependent0 { ObjectUtil.checkPositiveOrZero(capacity, "capacity"); try { - return (ByteBuffer) DIRECT_BUFFER_CONSTRUCTOR.newInstance(address, capacity); + return (ByteBuffer) DIRECT_BUFFER_CONSTRUCTOR_HANDLE.invoke(address, capacity); } catch (Throwable cause) { // Not expected to ever throw! if (cause instanceof Error) { diff --git a/handler/src/main/java/io/netty/handler/ssl/Conscrypt.java b/handler/src/main/java/io/netty/handler/ssl/Conscrypt.java index 2ab51a9dcf..fe56e6a792 100644 --- a/handler/src/main/java/io/netty/handler/ssl/Conscrypt.java +++ b/handler/src/main/java/io/netty/handler/ssl/Conscrypt.java @@ -16,8 +16,9 @@ package io.netty.handler.ssl; import javax.net.ssl.SSLEngine; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; /** * Contains methods that can be used to detect if conscrypt is usable. @@ -25,14 +26,17 @@ import java.lang.reflect.Method; final class Conscrypt { // This class exists to avoid loading other conscrypt related classes using features only available in JDK8+, // because we need to maintain JDK6+ runtime compatibility. - private static final Method IS_CONSCRYPT_SSLENGINE = loadIsConscryptEngine(); + private static final MethodHandle IS_CONSCRYPT_SSLENGINE = loadIsConscryptEngine(); private static final boolean CAN_INSTANCE_PROVIDER = canInstanceProvider(); - private static Method loadIsConscryptEngine() { + private static MethodHandle loadIsConscryptEngine() { try { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + Class conscryptClass = Class.forName("org.conscrypt.Conscrypt", true, ConscryptAlpnSslEngine.class.getClassLoader()); - return conscryptClass.getMethod("isConscrypt", SSLEngine.class); + return lookup.findStatic(conscryptClass, "isConscrypt", + MethodType.methodType(boolean.class, SSLEngine.class)); } catch (Throwable ignore) { // Conscrypt was not loaded. return null; @@ -43,7 +47,8 @@ final class Conscrypt { try { Class providerClass = Class.forName("org.conscrypt.OpenSSLProvider", true, ConscryptAlpnSslEngine.class.getClassLoader()); - providerClass.newInstance(); + MethodHandles.Lookup lookup = MethodHandles.lookup(); + lookup.findConstructor(providerClass, MethodType.methodType(void.class)).invoke(); return true; } catch (Throwable ignore) { return false; @@ -62,13 +67,16 @@ final class Conscrypt { } private static boolean isConscryptEngine(SSLEngine engine) { - try { - return (Boolean) IS_CONSCRYPT_SSLENGINE.invoke(null, engine); - } catch (IllegalAccessException ignore) { - return false; - } catch (InvocationTargetException ex) { - throw new RuntimeException(ex); + if (IS_CONSCRYPT_SSLENGINE != null) { + try { + return (boolean) IS_CONSCRYPT_SSLENGINE.invokeExact(engine); + } catch (IllegalAccessException ignore) { + return false; + } catch (Throwable cause) { + throw new RuntimeException(cause); + } } + return false; } private Conscrypt() { } diff --git a/handler/src/main/java/io/netty/handler/ssl/Java9SslUtils.java b/handler/src/main/java/io/netty/handler/ssl/Java9SslUtils.java index 288dd7adfd..10bdbb6c8c 100644 --- a/handler/src/main/java/io/netty/handler/ssl/Java9SslUtils.java +++ b/handler/src/main/java/io/netty/handler/ssl/Java9SslUtils.java @@ -19,7 +19,9 @@ package io.netty.handler.ssl; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLParameters; -import java.lang.reflect.Method; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.security.AccessController; import java.security.PrivilegedExceptionAction; import java.util.List; @@ -32,44 +34,52 @@ import io.netty.util.internal.logging.InternalLoggerFactory; final class Java9SslUtils { private static final InternalLogger logger = InternalLoggerFactory.getInstance(Java9SslUtils.class); - private static final Method SET_APPLICATION_PROTOCOLS; - private static final Method GET_APPLICATION_PROTOCOL; - private static final Method GET_HANDSHAKE_APPLICATION_PROTOCOL; - private static final Method SET_HANDSHAKE_APPLICATION_PROTOCOL_SELECTOR; - private static final Method GET_HANDSHAKE_APPLICATION_PROTOCOL_SELECTOR; + private static final MethodHandle SET_APPLICATION_PROTOCOLS; + private static final MethodHandle GET_APPLICATION_PROTOCOL; + private static final MethodHandle GET_HANDSHAKE_APPLICATION_PROTOCOL; + private static final MethodHandle SET_HANDSHAKE_APPLICATION_PROTOCOL_SELECTOR; + private static final MethodHandle GET_HANDSHAKE_APPLICATION_PROTOCOL_SELECTOR; static { - Method getHandshakeApplicationProtocol = null; - Method getApplicationProtocol = null; - Method setApplicationProtocols = null; - Method setHandshakeApplicationProtocolSelector = null; - Method getHandshakeApplicationProtocolSelector = null; + MethodHandle getHandshakeApplicationProtocol; + MethodHandle getApplicationProtocol; + MethodHandle setApplicationProtocols; + MethodHandle setHandshakeApplicationProtocolSelector; + MethodHandle getHandshakeApplicationProtocolSelector; try { SSLContext context = SSLContext.getInstance(JdkSslContext.PROTOCOL); context.init(null, null, null); SSLEngine engine = context.createSSLEngine(); - getHandshakeApplicationProtocol = AccessController.doPrivileged((PrivilegedExceptionAction) () -> - SSLEngine.class.getMethod("getHandshakeApplicationProtocol")); - getHandshakeApplicationProtocol.invoke(engine); - getApplicationProtocol = AccessController.doPrivileged((PrivilegedExceptionAction) () -> - SSLEngine.class.getMethod("getApplicationProtocol")); - getApplicationProtocol.invoke(engine); + MethodHandles.Lookup lookup = MethodHandles.lookup(); + getHandshakeApplicationProtocol = + AccessController.doPrivileged((PrivilegedExceptionAction) () -> + lookup.findVirtual(SSLEngine.class, "getHandshakeApplicationProtocol", + MethodType.methodType(String.class))); + getHandshakeApplicationProtocol.invokeExact(engine); - setApplicationProtocols = AccessController.doPrivileged((PrivilegedExceptionAction) () -> - SSLParameters.class.getMethod("setApplicationProtocols", String[].class)); - setApplicationProtocols.invoke(engine.getSSLParameters(), new Object[]{EmptyArrays.EMPTY_STRINGS}); + getApplicationProtocol = AccessController.doPrivileged((PrivilegedExceptionAction) () -> + lookup.findVirtual(SSLEngine.class, "getApplicationProtocol", + MethodType.methodType(String.class))); + getApplicationProtocol.invokeExact(engine); + + setApplicationProtocols = AccessController.doPrivileged((PrivilegedExceptionAction) () -> + lookup.findVirtual(SSLParameters.class, "setApplicationProtocols", + MethodType.methodType(void.class, String[].class))); + setApplicationProtocols.invokeExact(engine.getSSLParameters(), EmptyArrays.EMPTY_STRINGS); setHandshakeApplicationProtocolSelector = - AccessController.doPrivileged((PrivilegedExceptionAction) () -> - SSLEngine.class.getMethod("setHandshakeApplicationProtocolSelector", BiFunction.class)); - setHandshakeApplicationProtocolSelector.invoke(engine, + AccessController.doPrivileged((PrivilegedExceptionAction) () -> + lookup.findVirtual(SSLEngine.class, "setHandshakeApplicationProtocolSelector", + MethodType.methodType(void.class, BiFunction.class))); + setHandshakeApplicationProtocolSelector.invokeExact(engine, (BiFunction, String>) (sslEngine, strings) -> null); getHandshakeApplicationProtocolSelector = - AccessController.doPrivileged((PrivilegedExceptionAction) () -> - SSLEngine.class.getMethod("getHandshakeApplicationProtocolSelector")); - getHandshakeApplicationProtocolSelector.invoke(engine); + AccessController.doPrivileged((PrivilegedExceptionAction) () -> + lookup.findVirtual(SSLEngine.class, "getHandshakeApplicationProtocolSelector", + MethodType.methodType(BiFunction.class))); + getHandshakeApplicationProtocolSelector.invokeExact(engine); } catch (Throwable t) { logger.error("Unable to initialize Java9SslUtils, but the detected javaVersion was: {}", PlatformDependent.javaVersion(), t); @@ -95,20 +105,20 @@ final class Java9SslUtils { static String getApplicationProtocol(SSLEngine sslEngine) { try { - return (String) GET_APPLICATION_PROTOCOL.invoke(sslEngine); + return (String) GET_APPLICATION_PROTOCOL.invokeExact(sslEngine); } catch (UnsupportedOperationException ex) { throw ex; - } catch (Exception ex) { + } catch (Throwable ex) { throw new IllegalStateException(ex); } } static String getHandshakeApplicationProtocol(SSLEngine sslEngine) { try { - return (String) GET_HANDSHAKE_APPLICATION_PROTOCOL.invoke(sslEngine); + return (String) GET_HANDSHAKE_APPLICATION_PROTOCOL.invokeExact(sslEngine); } catch (UnsupportedOperationException ex) { throw ex; - } catch (Exception ex) { + } catch (Throwable ex) { throw new IllegalStateException(ex); } } @@ -118,10 +128,10 @@ final class Java9SslUtils { String[] protocolArray = supportedProtocols.toArray(EmptyArrays.EMPTY_STRINGS); try { - SET_APPLICATION_PROTOCOLS.invoke(parameters, new Object[]{protocolArray}); + SET_APPLICATION_PROTOCOLS.invokeExact(parameters, protocolArray); } catch (UnsupportedOperationException ex) { throw ex; - } catch (Exception ex) { + } catch (Throwable ex) { throw new IllegalStateException(ex); } engine.setSSLParameters(parameters); @@ -130,21 +140,22 @@ final class Java9SslUtils { static void setHandshakeApplicationProtocolSelector( SSLEngine engine, BiFunction, String> selector) { try { - SET_HANDSHAKE_APPLICATION_PROTOCOL_SELECTOR.invoke(engine, selector); + SET_HANDSHAKE_APPLICATION_PROTOCOL_SELECTOR.invokeExact(engine, selector); } catch (UnsupportedOperationException ex) { throw ex; - } catch (Exception ex) { + } catch (Throwable ex) { throw new IllegalStateException(ex); } } + @SuppressWarnings("unchecked") static BiFunction, String> getHandshakeApplicationProtocolSelector(SSLEngine engine) { try { return (BiFunction, String>) - GET_HANDSHAKE_APPLICATION_PROTOCOL_SELECTOR.invoke(engine); + GET_HANDSHAKE_APPLICATION_PROTOCOL_SELECTOR.invokeExact(engine); } catch (UnsupportedOperationException ex) { throw ex; - } catch (Exception ex) { + } catch (Throwable ex) { throw new IllegalStateException(ex); } } diff --git a/pom.xml b/pom.xml index 7d87e301a7..b64453c241 100644 --- a/pom.xml +++ b/pom.xml @@ -810,6 +810,11 @@ 1.0 + + java.lang.invoke.MethodHandle sun.misc.Unsafe sun.misc.Cleaner sun.nio.ch.DirectBuffer diff --git a/resolver-dns/src/main/java/io/netty/resolver/dns/DnsServerAddressStreamProviders.java b/resolver-dns/src/main/java/io/netty/resolver/dns/DnsServerAddressStreamProviders.java index c31fca1373..4769923e04 100644 --- a/resolver-dns/src/main/java/io/netty/resolver/dns/DnsServerAddressStreamProviders.java +++ b/resolver-dns/src/main/java/io/netty/resolver/dns/DnsServerAddressStreamProviders.java @@ -19,7 +19,9 @@ import io.netty.util.internal.PlatformDependent; import io.netty.util.internal.logging.InternalLogger; import io.netty.util.internal.logging.InternalLoggerFactory; -import java.lang.reflect.Constructor; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.AccessController; @@ -34,10 +36,10 @@ public final class DnsServerAddressStreamProviders { private static final InternalLogger LOGGER = InternalLoggerFactory.getInstance(DnsServerAddressStreamProviders.class); - private static final Constructor STREAM_PROVIDER_CONSTRUCTOR; + private static final MethodHandle STREAM_PROVIDER_CONSTRUCTOR_HANDLE; static { - Constructor constructor = null; + MethodHandle constructorHandle = null; if (PlatformDependent.isOsx()) { try { // As MacOSDnsServerAddressStreamProvider is contained in another jar which depends on this jar @@ -56,20 +58,22 @@ public final class DnsServerAddressStreamProviders { @SuppressWarnings("unchecked") Class providerClass = (Class) maybeProvider; + + MethodHandles.Lookup lookup = MethodHandles.lookup(); Method method = providerClass.getMethod("ensureAvailability"); method.invoke(null); - constructor = providerClass.getConstructor(); - constructor.newInstance(); + constructorHandle = lookup.findConstructor(providerClass, MethodType.methodType(void.class)); + constructorHandle.invoke(); } else if (!(maybeProvider instanceof ClassNotFoundException)) { throw (Throwable) maybeProvider; } } catch (Throwable cause) { LOGGER.debug( "Unable to use MacOSDnsServerAddressStreamProvider, fallback to system defaults", cause); - constructor = null; + constructorHandle = null; } } - STREAM_PROVIDER_CONSTRUCTOR = constructor; + STREAM_PROVIDER_CONSTRUCTOR_HANDLE = constructorHandle; } private DnsServerAddressStreamProviders() { @@ -83,11 +87,13 @@ public final class DnsServerAddressStreamProviders { * configuration. */ public static DnsServerAddressStreamProvider platformDefault() { - if (STREAM_PROVIDER_CONSTRUCTOR != null) { + if (STREAM_PROVIDER_CONSTRUCTOR_HANDLE != null) { try { - return STREAM_PROVIDER_CONSTRUCTOR.newInstance(); + return (DnsServerAddressStreamProvider) STREAM_PROVIDER_CONSTRUCTOR_HANDLE.invoke(); } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) { // ignore + } catch (Throwable cause) { + PlatformDependent.throwException(cause); } } return unixDefault(); diff --git a/transport-udt/lib/bin/lib/x86_64-MacOSX-gpp/jni/libbarchart-udt-core-2.3.0-SNAPSHOT.jnilib b/transport-udt/lib/bin/lib/x86_64-MacOSX-gpp/jni/libbarchart-udt-core-2.3.0-SNAPSHOT.jnilib new file mode 100644 index 0000000000000000000000000000000000000000..932f10bbaf02bed597ddbbf9816c8a8b282b24ca GIT binary patch literal 308200 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%0A!y zyi2iz`@NU%gve9n-zvTPftfUJAhhXSlY!npp??QG8W&Qvt^z#_IDad>2NgXth2C{7 z=wafvTa4jkx`I3WbikNSuP=noSMr;S`Dp6>_GBWv>Zv*j@eM*4Fp_9g`7)l=)bk^` z2eL`Wwasw~B#G(7K!?2hZ|sYw>|A&HKRh#uvkm zEyIZ<4W|s6ZSDT~DKAQU8Hdoem;QK4x6fHg<+-a1iP#h9J=TMu)gXwVY!Icb(>qSl z>ykn*wyY(+_6~Z-Gd*tO6|v4}?$rM6``%P*SD#)~A8N#x7}cT*4mRoNzx2T#q)le` z6&*Z5g=1AXQiYldOI28+!eSZzr{7%!2QwAMsT8Js({VGU;LrXzBR=#<4U_&fGtxkT z9$7Dg4HQHp0s;LYS^&GIzi4Eyj8G!k1O1^qrJ{TuQV`@*5RHtr@}rTFc2u*YrFOK$ zjuzX|B0K7_qZ3rr8ZqIMm3HPLJG#)0*4fcoJ6dH&XWG%Jc65UsU2jL5>}Z1>t+%5~ z>}Ub}IQ>B!`F0f78(OI@JG$2{w$qLZJGxm#qdbQo4AvAN8liz9{gK>NG#a7dluD$w z#8Hz|p(W~{5sXBDk=FzY&_CVQ2VLj9#gsO?7|VR;pg9R@Q$M&*YWTr@Y3}}B*@$1H z!c!U&4LW~4lm>(e5k-5$0B>CbPmvVh>+~8OCi$mEZBJT1svr zxB3tRrNJnGGn_F}fheR0<#NYKN2t2B*8J}-#t;9G(Bc2_ z)WZM2;PC(Ce-C3~N&h?lxB1^UnBZ3NDigH)?_Zf<3;%nY#RvQ^yTt#w|BXE>{qIJE zw*Os@r*!|j?|D^ei`f4w|NDrdw;+YylnnHA2R-S3+26zXCZ38}_HD`=Ps3HL8ND%1 z)`@c9!1|3x3_t{$FQJ~02UzbPMfKhzjw6WZ;1V)=0F)BI6zbDyG%yx6BKNB@u2)m} zJ!r)=-iaY(`QZaN--w|p^^xnGc_$5(EF&?n5&8dDp7u2H?;}Hx&cZ_`2okuqji(SLWoRXN?*Lx z^j9ZSV9qC3qUrnvD$Tr$ya`^tr&s9Xho!VPjjz>Fw>>n)+k2;aD&zQOQGsUAx)6OP zTW0oWTzJPHYm5NGyPy2Vs(S=(pO6sVCU^A($i?IY^OAX`F5{s!;4Dlp2gNSLLOa)Z z$|I!Tr4zskHYth%#!Z;X4B<~OVN=mvjf;+efvXWPU!-9~K$q`+VpBPQ5Ba5ze?fdC zPzB5h9zGC_J5w9u$2sp4XjAC5KG&CFy4Xz9#X`QCCuN2x#fT(*m6-4}%)BGPU@AH1 zV@=bKIX$BeWA60+*6nRL#2mDu@IW_p+>Z{1Duz`<{>XSYdp z{}XzPL2pSay~RYYss+7(F}X1E9FVwM_rUc4<9-`JcZb&N| z#lAJ$7Bt!QSL=tj`3X3zXx4&eouWx^3}gMdRy_2iQ=mkXJ%m-QLdW}MzeCr) z%rcV41;W_adsEfOCz^DIDnv7s1)m6f6kF1CpxW zTv<<4ah@hjfQh>{;}My%v14I@mU;?z(JW+M5&3oAKaAq5r!+!1mN4mil=j6gk`6{R z9au8buO;rH!4mue4`9vtE(|7uC<05NPgG-m!|y+6CViUoo%E%lFN5Aa?rJP5xqSV{ z)0a69a>61?Fos@`X!7YpFTgkLYUrhRK2^Nyj}#e?&%135Va*G7mft~4HH$EqLq>5j zrJF;2wQX1JtoaU7?)Di_fz=ZJrj;4LRWpLl}(&~;_M>c86(RJ=X?W>{P# zQNisriK4}%&K8S{ELp$)*>753^m{*}Q&IcWa$<>E8VtAtab$(Qjt@@l5C60E#Wx=$ z`KGTg-u^flJEuC<7ekz?))y;KkVao;K&BX;`@NgoHMA>+Wxy)Un9p+;v!XWkDU2-5 zUdSz!mS~ZBcH5zG*qNecP1ia6L9{=e%pug3KL-i0fU$_cgh`Bg*WA?G%Fv=!TppQL z(z?>=Sr{%Bi3tR({H)ME2qpi{gjXu>i2mRrDBaA+oxS z*1uwLcpJ_O*2WK~{b1t^f)KrMkGRUN3*)R8PEeu#xuO%95FO{@rvzwm)82bOn2oGS zIZ|bPfY2_yp1_lZS6PLZQ(#%i&(+ z2kV{y7NkK2xY5x*F^Rsk3Oc~5VKoJ=Upqg!P@SI)F2woCMs#=f`AParQoZN|I)a7Ge%;t3K7wZaaYwqjx`NX1b;%5U(j|}e}&>W$(;v&#QDUx zjzdrKs3RHeM}*XvjZa12fL?8fc;Fu-x7ixS??jwn<^aZsGysD}ryjk&B6nmvhN>&` zV5?#pvIlkBtU*w1{bj0f%@mfc`O2vJ^+2Dw;K^&Hku52rf zQ?QCKndE{21ntFnIQ~ju6QJ-I#3Q~-x^e?_BTj#m8xJ<{OQ#SVBh( z+%-o)umqov;v$>jA<{`v>WY%-+n_CK=^o7(T^BIU#??JAPz^gsXyWkt=Dewd|LZ@K z8Y>qW^GPJweBd?kHu}?6Yq#Bp)l;Ph1D_+GW6H;SUOlm2Q1bZwhI`1qCoSSO-} z^kXT#h|}S4T(Pbyy*-kk0e8*W&|<6{KStG9RF14u_vK-DT4D@7Licr)v14>!e$+>& z#S<9q7U{l%J`J%`@kD&B1upan{O)lj;*|C(LKagj4^S<}n+5vlHQYg%gK%p>_B3@S z@;WF16aMrQ`P2Rc#>{@b>-i|sgu7_Cut!|YicLr-+M7#8;iySN{^(GWJ{rqVYV!14 zphAxdi&a>p!V(phs!&tmOchR5;bav~P~lh=j+Ej2dJ6I9kFsA-(Z!s`sf+CBLOWV# zM{Dh9m5TbJ^Be4_?J8kV>?#LR?ag`QDR;y2F_&rrIGzfTA-!ZrN~hJ-t-@SI9`Xh_ z$g4`|+}@GWFK&B?AciUz5I)nI^&Zhz z6+BOZ6XHF8C2D&_J0!*ET}7ZFE}J=hXZ%#S9LnE^=lI!T83J-bU(sW+cw9abzy?a` zK~Cls#Mqg9h*5iNGk&PVb4VqEZzJSUBF?@2=%W|$b0aW~s(L=r6vmWl;B-8T#hd8M z8D&_VG6!Bx2~q3JzT;fnC?JEIltL)s2kTtiy?2n=<(^1prw*u59cf&ie)Ut14MWGs zjwCR%doO%i6gNKo4DIo`xUUg$oNIlZwc6rb>xYu;lBG7;I^rt>**k0)BKr`)taEYK zDdgl~>EL8DUR|6mF^{oJi8EWle7X%on9Bj?JQtS(?DAaP)(6>cXb8UpQA#Wn@7al; zsKl<~Rm31^5l1M`#eG3B42f2Yk2$Yd{D{!8{zY1@h~>kk>iCbIG5H8*<7|@At|EbJ z)~yD|?T+(}q4@l*oYwvJXNlkXrE=ESnlafLgT)Md6N|q0oq0e0P1SMzypV)pod+0; z1%mYbpw}N@%jWX{)N1+gr`?-faK2`Yrz7gPd?YjigT~n{_W!A+ECd~D3AamnNTS6r zfhUU|O7arX#gZPMPiJSPV|6<^B%iz#&hmQ@FQRxVFPgrmBGwZ{Q#gYpE|HS3{99}C zz-_JEk*~YYDUS#6WbsEk8&s2*Sw`}FL@E!K{C|r)t^{V1#~4XZ$>SskJxdDp4$E~PsZ)3?Ghu4IfgE>EkEXIMz?_X$8fXX=;8N% zjwKYmndTFk(NmO=&3NJSo5MSU`k6r;9}K{2B5_;-jr{%~6e_UnJz$(G^2pY_`(bY3 zotoZF)5qmutt8*y|I&i+JHF_UVrouu%ZwYh#kuvR3h<&@ICf1c*9XjbdEs0vipK}y zouYVt%6gQhzi$llc$+HQ2Fxq+<8AO;;5Uva)N0-fe~HC-^8?Vr+5zA&y;vXUe^o*F zTzC&4^llCF8Bw^iqA_(th6LExX9;Th69W^Aio8R zhvI1h1iM;dXc0~$L0Wv`)Oj`vb&6O2X33pFl50!)`Zam^XdIU+uNnVVUK79`=3FF> zRa#_~$6bvZHZT;tv_#V{#(enFVuZyAix3te^dN*ZFU7&0i=ivLZ=_$G53`eR!cT)Z zj*iU-3KH}Dd(*_+uFrch^wH?+Ta)wz`G)x@^UJg~t1}}$@ic^$x7~%d^<-~@eMc3J$!1hb@@kqa(SV_H# z5chC<$4Lup;(9`umk;;odC(ROylE9m_Cv|#D2%qz_-5b&W8RNPAF@R(1SOjA(xxoB zj4$I?+WV=J%B@TVPEE9+QjTd;xgt_t0G1&4Yp@$rktE|rL#Fk2I;e(qdqpK4G|t4H zfB0|Ay3+-&76Uk*yBsO;JH=cC+#>Ln0MB$aBgc<# znJA9~&!g%&gzJeLn^Dg(9{exjS5Y9+v3_%Io*2PQ48by`yk@!sOq(F%g>{&pB=48z zq{GtutK)uYj2?h^a4|x8bt6gQ3@|CJg1KBdmaJe4>WNHD=fTao5biv|o2EF5O+&w^ zaG?lBjq1&VsAvE*jSLnc6z_7;X0ee&y#Is{Z^KMO@SDBESwZ83I0lMkR96IOwcpp+(18esaG$p^$ zRTPtJ?UBN$=?zZwJr!sV;oN}tOY}l7X5s96f5?n# zuRi(vHuT>b2{{=Nh-xdeR|MQsmgcawX}c;miL3@7qYOS)_;U&&QImVU&->vq?U&Z zvxNeV4=~3+$LM{3>X{#f9Vvl$NFYa(Eb<_W*nUiBSR8KiTSVh=s!c7_f!g%fJZ|$M znnOqCp&ng{n>=t6qkVj0$ZcMOSbRGi1K5?E-AZ=E>RJ;zjGZfOnX|rd{C*|m1%Z8o zx6??ReF!)y&du>0Y&xbbA+&5+Ny~y~R~yo7Tv&*1i=`460kjM2qJ;(;!YwplTpwG; z^)adrJ*-_h0i1{rOfaA~;yeL&USrUCjY8)|Uql&&&I{g3ABE0qj0Yh)uQBMnMxpbf zkEe`6=XIp)NNHm@_Q7>*r zu|I%H%OODvUyS=kEMJTk6CR1y3|D*@x(8}4+<)NHZOP`c5jGr~4Wp$4Hh*bAb8+9> znAeCeILB0jdI}I=qD=oT_CCbt*LTsu17JE7c-$t9NiBmfOEY+Xe`W9r)#VbEZK~uI zy4`N;=?5Sq>Bn@WfdD+LMlN;)>YlXS<25o~uo|~m{X*f-wpiU7e<;oJ{8lIMt%Ch% zK35C8D4U7h03wh=<#jDBWB}1eW!xs+10^kFl;V;7=F{vqxdS*{_B=561x&Qki2opM zLs7m&Qf95jBP~^$?gJ;&p(%ZzW?l&0&Vw)d$dCJ}ta-OJKh%s8Kkg-&)6s9vgfCo2 zFxZ}I!1feIdJSQ$_kM&8dD1ivG^#hitYdJ|@_I-f>xLCe=zdfDZ^C&(KEDwyUqo5f z=`QQIjEVC#I_~<>D{uqN0*1twFYdXG?0z*aM?sIaJB0NCe#4CByREJd3`H5zxfday zMuU}qBkseKeSTEF57Zv&g<9!lnP)+wo=8l=8`g{eE&i=F68|R%ZTx3t!2eGu#=;-R zWZtFWP>cJHcc5DgdwHhVfCHT=rwtsny+qYkj=x*2?}dsVe+oa3<0-wqT^;;b^~Lus zex<&9s%3p+2<`d~&4B+UmVuNfO%cAwa|VB+ifB+Qm*eN5(w)1gA&YdtFOJ9?R;AZvPZAcAFD$; zHmUXSdRpNsqv_-!(8^v-#|_Sx!UhK8xCqu&%=7ocAlCD=-q!ZwpBK0jeB!6zS;o(6Dw#<*v5cUI(#|&5xs0_4!q}U%(-%?DvkTI zwaAwTHSg-_9ku0vr@x-~5*2SdQyf|D`Pi6)!x}&|T;k^l8GF=koEb1CuJ`xa#lCin zr~^Xwu$%Y#8xQ0Jvi62Lz@)%vdri+9X3p7~7c{QV!>I%m`iUmvm!gEf@mtjQ9C_C0 z9-tm(mK~qvH`_#m`Z**3M4J)jr;T34@qo=>Q7Jw0XxSsTHh#VB7IerjLM%KvN{(N7 zP2&ilw}utDKI2F=45hPV=$4(sP=O??S00qsEBmZoSuSC$Bs)`sVu>_$G^qm>HMS9e zvnM^np@(FTd~)h&l6jrn0xhO*AIBd_>z9+0vu`CgeOeT2F|gYP30VU>I-p7eyNIlB z+Q6&-?*XnMRZXql=J{t$%mYsP9 zYtZ+L7v}^^<^cmS{pQ)}jH3_2bkxLTQtNKgr|W3W0}Ct@9h_`n?G! z{nJD($_KsQ1@!NTeiZZ%5Pf-t66hzyq<=&IT%j?2xqeODR^izi?WlVi&eimJXpTKJ z?~fs`T+fsJ=}KB!5}gS@)^lj$*pMH>0VH|_AEXZoV;)tV*V^BgmE$#VbkM3Q-6bL= z7LrFjia>@^9_V6r;@Rr2EWVO!=Y6m+hLP7EzkUE`R^xq=;+6fI-yDGNNG3v^$pL;h z$68|gD{)0@^og~QT=4`5ibnl1RJAxy9RI6Z{!8g;-q+W1M1{Z8Wj@L^`(zT)&G z^P7Q<>I^r@?oj{}U<`7BvAI;2?$$s)gzoXFpn_H>pgAwVU6vL~v~ zv+)mMfWn8Y_`gIO1k__$wNX~`z2?QC_WhxW0pkqXKrs#rrQa`rc|+)M%@~B0$RW56 z_Dlxr92Q6q51@^hUP%R3!Lr~j&!IXDtCV&5D?-1wnKnzmPVNyXgKDN##GRNl#lN=r zvaDpRJTXcu(b!?BgC^b8Gib~WgT)C=9PrJjF-YUyHn<_vee2bfW#Y&u&gf&zEMB}B z62zSe0b>?cybc6=?Lx2Bh7J+mb~kv$bV+Oc0;jiwwaE4Ndh_=3^|fsZ;SbON=nA0Y z!4$?hwS+^<^5rQ6@VRpfA>f_lvG;t&T8FAnqZWG}NOD%Y8-uUQ*Aj1px5uv!^!oDl@+RL69nNJR5~g103C?m_$gS?~D0?@aILUkR^H ze{RS4!|nG*-ScUs$KSZM4GD2J%N;T|;Ir1;9;~nJ2(7>bR*Ac*0{Yt9%a?HNad8^V z73UwTkWNzaXMKihq2x`F&|*tM+r-6`k6T{@#&z(;6|m3i@-XEM4NLli^!>rJgn(3S z{|={vGxHzEJ45}{J8TtA$QS!aJxsADIU4AuSv;fC0{V$;J~$Q}%z{zP%a7I5lE_i< zF7d8CQ4>TWhH7QB?Y0y#0<}?x>+)6#}o`vAD_lNU9EF0J6-ggJY}UurUq(&<|(u?%u+1NJ&q+>iI;Nz-|yc0 znHgZL&inp8zyJI4`7nDw`?A*BYp=cb+IJL|b;27~Jh=bk!3celZ(brs5-j8>U-cOW z0@ovJf$^;vfe6gO*k|1a)?#5L>U!rDA{oh=l?M;YBTHZ_FpIMo&5@%-Gw9BpC|xDk zCZ5Mn^Ol+HHdNnIt+vs*^)@=VDG>J(cA zmzc8XJw>t*f^#CIpSeCe0eG$TS*&+th~Qlis-~NyV5Nd(GHYIw_GMluddvLZ$o@T$ zsx5%7DwWj#h_}{@DR$ZXrqw$J8g6_tCLW5?t@hJ${rD15GnMpV(ii==?36OU^nNZE z3Lyv>%kLJiA_WezMrd3I_J!a)jXsbHS8=C0hxQN;s-|dHF8$zJE(O7jSK-{$#bnvq zb!&I1cDYQ$_;GY`839^Vj4|mRlvP-AkgPW=*Wf!;R*fYcNJ`q8REPkofZ%Kfd z-r|P!jzsSWRy#AN-Gh|HUvf$c7f}LK%nURXpfYh+v8o?-F-9AA;f)jBwpw(WDZ$Fj z!S@skB+CYVbPPE|@$aSt?Y8z7_=loclvLa{Gt`}xH?k;&(++@R4jGCK)uyMTf$_?a zp>ETY;x>j19lgQ2*UHQ*8ofdGi^f(nuZOMX*~a4d%pob$V~rsx?!xtM)9x-ESQ&#S zyNv;r)w$zXUZ6<~X7?ftIhfKA%pu7DfvK<9*u41EnowxGIU?ET>=ZPo^spVm^ijb_ zj3m7>M@np74~cba(Lje$Yiy2`XWSB9SmQRkxy_E7u^d%ocbnJ8XI|=UTkRM}nFv-e zt21-G_cM(zay$yHR8Wg0b@ZcVUUF7m56)$dz(w;ZF~vjsSI7ZU)Bf9IcJmbGVI13W zy}LRNyFwvNj&XFbc``BR#?jWiA>6*Jqot*oD=lz_sD^--5yeNPew3a6gmJVsd-gU!a@BeJV@Qc{*N< zmI1LvogKlAuBSzN9sn0ZHr?qGs)%ppkDWya#lgjmVE_-fg# z73;jP!V7AvY&J*m16Ss^_W2LU5}j6h4A15cMfbss&pIfco9$0>w`(&aSV}Q2AWOtu z*1y1zIEp^JQTQ?IKC41)k3|M-tP5FzmbKN}981A9T%SVvTx&3IQQ?+5Vhd`ZvK>aX z|5frv%@-AZ<1yQyzUsxE3!pU$C-+KiaAqEL7$3OoLk@ZhKau~T;kGr3S_I9i@Q!h19xU!*L3|7lvB98MY7HP3wRYN$1+b0;Y#r;bt&Xb) z5n*A>r7#9Jq-}C!jfuBAcQ}medbv^$W{v)|sGSSD*dM!r>@&tBo31s^R4$P9rn(s2 ze7~OF_ki8!=%@H%7`VqZkT~K&Xl}?B^&$r=v?D}l`3)QZ&z4m7-vuAzmu)8*v zRm`{mX7dnp;6a>Y#frccIKcqzMoYBQB%D-8{UzUag4hZQar%SoI7*b+vx44a@a1R| zzFe0W^z;f)Jz()ps$FCHr=-|{$-pkE03<&1xV>yFSQO}3?cyFJ9Eb=8>It)hQA4eQ zioXfWt8u2*2U^Mdvm!Ssx3CK=8QPe+!5CfvJ{HB5Z7XgEvMc<{03K3>ZQY+6qd#>Q zj{X$IKpU$Qi+VMYp^cECeNrVLI<784hB&7b2bsyY-CN_z+*f?I1>sge2+K@7WX2r* zsT3RNusZ0lIuRazVmfp0tGvb0Sh^=jGIaW&ird|Gw(I1(ni5_c~*y160fcH0*3;)EV| z#~Rh6{Uax;e(iq>Uc82<$A7R#qyjQ-L`N|x5#~dRq^UYbs&seZad+juSh4GV_WiM? z)8b=hoSU{Oa9V_XyUkeexJG7UR~=vcy;Mt0Z;kw8cqT{S=?*+?q&@pv@SF8@CumHV z+40b17@#YQ=RyF5aVM=E7i8}!#-gI53~XzQGA2My56yDYCW@#$<(Qd%07BrK`Wj9 zsjYZ0k_7G}*0~5x!~NHA6w(J&vgSx9E2L=(>FpZneMpP~IdSG6lM+qsv2!ILSBfLJ z1%oJ_7acrO*+T9V@N6U=cu4^+Xf!+g&^bM~74~q_ZehA>vJbLfAHlB{F2U*Z^1cNb2rXt%Il6a{}n;u{f@~b4FK> znTr8~+V7d2;xTeDN$>s1kvgVGr2dIDfLm4vAT2w%CKsTd%|ICBqk%=7yeGD;_|_>Z?1$T@@|NvvCZi<2jWMj9$Nb~xR=d5>Rb}ecvC-(zu`)^yv zxRAmrVWae9=Jy(!{f@0DHhb>p(C)1DqP89bq2^`5D&sN>O!nO4-cpK&{$zS_}`PHgEO(pMA$7}#Iz1N-m=#b6A}Eh4#p|F z$l!-`a0!BeY@$)=u)pyib9im)=FD1qKFsKC9&XDJnFnp!g4(rpq>^h<+1(&^1BY&J*0egs*qoVzO-5I#Hb`M{8(T5Z~s#O{9kF z?Zm^GM!}~zD97H^s3qrpBf)sPvkv^V)k(IWe7I-0{jybV!%a#KGZ*oWtlWF1A240z zupTSx&oXdd>l2`>Y$vvTkF?L9fwE(=q}-Q->RAEnn)kuvDpqbWhi}xZ%rD&UEnjQ1qV5G~qAF`Y~p@VC=Q7O4tLMz8rW7H%7ESPx53cCv;oQIP)u5z3zON63v z7(Hkd>v+DdMf)CnkEtB%W}4`pP4@=9%Tqtlpc+H z_=n{-2!k~$Af+eX=j4L;;ZE7(;rLX>^j7HmprR&W#cqbCemeN^KT18e%e6A|;)~kF z=5>tCON`CyqHKuLldZfkwBn3b)z`?Wgz9VLoJjRGaUe5>=ZNxPIq}I69?pj8BHnmj<=x%YUJi?eTk;SEY8O0 zlUCqp|8S&`@gbYd*Sf7t2SquJ>2R$>eg$-bHhyCK*-jl~Usw6aaCK>4Wlhu`$i3u5>^LooMHOzEfVjvsw1D&>` zh^`6j!`KoZ$M8X*eXfJ@9h1;T=D4{As1jPy&z#9LR_alFN69+L(xL=lls-SL3M5L* zO@z?8>PgXT@)MdoVbgYn9%xe(Nub|t?^iSV%+;CmzsYFaZ`4+bv$r0%t>=U!=NGwl zUbbn*b)G_;Ua`ONA(DeU+{#%7Sfch%_<0OJ=CZ*9>pSs!DUU~9t-@r@L z8dEFL)TV>ntPFepX58j9pRF8a$RUrVw6eHQ0IPW9Hlpstm_8=u7BLAkB|Uv)Yh%iX zA=n1Zx8U!y$?c{0@-^u*yy3{S7O0FaH zvCo^vIrszW6+43gwYo)5v)pgD)FFgDMskRi!|JOe2mR5yay;4MEn30X>i9Z|@F$z+eOdplP-EO)gUV=34!krvlEQJ?V zE>vN)T*LfAI8hLXG1eWm{h;BP)AGf@>tP;nehAjqIQd+TD8OMewQF*mu2@bM+zRmG zPxyh6C)lIvzTii*IA0tYDxqLXS?OP_Aou zzu-^Vq?Y`7ZFEaZWwcBeVX4eUqOhehgISvVu_Wr5?drTZ&dTU(JF4?w``Pe?Fd7#B zO*-R>s6b#?%6Ep|?Ey4)XN@r=PQm?e(?@d4n9?z1kyvx>teFfR@Wh~vhAc+SK0F<7 zxaz81^_-=}K4Jj}yMr5)^AjBtJ9vEFnzU`=Z(x&ARd%G9r(W05f)w}JahVEzegjES zBj0Sb#q{k@!MhPr7)aP_j2w<6=yE7QmtzUK1DI|n(m~Rk^e4g3(ZCf(W#zH6EB!rf za9d&LXRxyLXxnlqg&5wag$MD>8&lk7XLGzI!5LLm81Q^n=KtGZNU_1y=vEinB!6KJIYCxcoUGo(;lENOdHl_ z4(Ry55|gAof(9MuZJw9(MdTfhc(gsM{u3{hWGFOkRMI+!)DfbO0(F%*A0;r8)%@&M z7%`j_X7iA*jzKYFU&D5c4lpVF*ZZL(eMuX0)uix8NDO|YSo4#dR9MO|2+KOStTST@ zc=Xjt>vkl`qijsEVeY_TUL~(_f<(Ry5-=kWUsmx@mUs$TEqWaATlC1j1H^a~F>#8R zD>N}o$!#mJb#IE}M!;QSB!X~R>8x+a^{XSG21bOTMwGH44_l638E-#WVNZ3{rpqx(9BIzW&3a5XCxEr|xmq5ndnAP+pl&}uW zPJkO+&>IUcTfjzUP?-1pLrdmXB*4-EgT5i~gaG`b0%3dnG)7 z8KOs;)|~A~3-PmmOMFFxU>my{z!h1x(f%&LgIc;{g)GAURk8?;(n*L>MfhMi0u^3K z(ILi$CR4INS498wTl6fxw?+9|&@;8Gr027@B|Wz&dhS&8OoRiLrZ=PKwkGtvmK2>H zWB5;;GonaNRlt9h)t1y=0Y6;vb#*Ci7Foqq)XRE7UnS?5XZ z75>u|{<<5RmjCWkmY=y<{wDZ;#C>;KR>JeU;03N4nFUQ3BioPL#K55>g)Q7n+5jOP z9juRxH@2!26I6;9Rf;e_Bj^0l=BYjM&Gbho?PxEcE8jP$R*{F11@7YrE@*(BbsMe6 z%N7A$lk`^9`0GOPFGP*MJQV+^M05UA5y|$1&~ytWn-VoXC>sLFxHD?}zEJ##sPP|% z;`5@$zY~hTB5M2#q4*1<#?J}GcZ-M*v+@2=eEX>JBSP_q+0^8vH<8tFbtwLei1;x7 zE)2zg5H;Q&ieDZzzEQRs^7n61<9CPRXGe{%4#htZHU5oI{HUn$&xGRh5TEb6s30Pl zKO`noL&+|Q8b2-+-yT8EoHwmvj@r%6H0S{fPG1+Oyf(qP$dna z{Vs%dqe^#YtJ{+9Ze`*ksHJ&AorFqvQ=2N#TN&3U^S7hp#m*G47OP_)zd zI=Em0QgC-7Zj1QN+MKF8NbG=4{i!kytEUJ#mrN1O*e0jZb4F*#6o`DHOh_8QEo?+fZ>TQ<#xgFi{Ht4%I(2*qzIOcS36;>m6HF4p7Rtv zN3R7vRc#%Psyy2@_-U1cpI9e;;#~M?or|9~dH87?IStv=eu>mAzJ%_7qUuOPBj5A7 zY;V%x7$zR$5H$KsCO~_`Xr>Psb9^aNrQ82WCuxn!vl$M!bqlDI#pS9k6l=oIw^_hv zY2ZtcA_DjpCQ!h80{9{Y{4MDuja7N(!U?>n06rN4c$tcvNhbo}-C=+@DKjWv0lZBC zJWb`f0gk@_Lrw*ALI`HQiXYkxW)OQVHIamQlx6Ux%e(e5Uivq`63!#cV{!z_f_DkQ z?4w}zw_whtRp?6yG==%Hg88m=lEy2T-3arQ5X@R;ku`ONia*1G8Lw(;NmH0Z70f#n z%+4xLEMZ zI(lbp6MimLFxN^a>CX!0CxrRW5X`;IBFp}jg1NgH%ukxa9HwC2rC@edFxM02@DR)e zA(-zgm}{EBoYNF$jDne@V6J~nmi>9cw1r>}48eR_!JN!;}%U+TEtdvgDeG2C7 zg!ymms#5%H7-N7mf^9y3zUz#zKdX!c{NJQhz9&q^T-H457Vq z!ZHHhQqb~M46tt64YbD(JQd4MS6f}F; z)y&`<)Kx+3t02~?O#ddtZb+ayboI;rp6lN1%5mX*TX}`_7x_k|QlH#bgEF7ZBZm6-2IA@Q|v0$Z_quxJ!T2+t24k%=!?i3h91F)H!-O#HGmUa}|3jugF{v}b&S zQV=HuaN0Yx>|aHm6Vd-#{f#)7VxoTC z6sKC@z4!u(OLMrc7hxD+GbM~b*m!tyF1Uakq1doqO$8=Vfmy4Bdo!HCI}W4HX&i#h zFZGm}G#9D`AUsATP>e+>0*jj28zAjsz`R1i%$H8mUlq)45C-IX<{FS4HpF0}U>;dg zVpF-gs$93KTt%b=JKi_RB)b;NGXE%@qzskhW+r(BoIxSorVZQlfAIHFqKIe_3FhyGd~-SJG2e5wjl8Qc@KJ~E`yh&i4+?_jG=aAS%L zJ2KP6ojq}!63@dZIO4kg?2(f`05TYoG?~2L`P^psjHdV| zDtzZf;`@&M6-(DPdg&T2Ql)D{R7>y@e(lQ!m#%{<0xqh8R*Zm}*CD%u4y6yu>!j7LN@|}TJI}YeF z6OB*2S!Df;ra13VI9q4AG3 zpDxYgor`1>Xpm0Q&(cmxn7mlFtt?P1rIwm|tJP@!sdB7SIX0*qJ>Udz|IdllUZ@)Cl5@HBrK6}#=kShDHaQoo$inyzL6G0q`dW9koL(iu`Ch$GoEL%~M8vDY$ zmte7`^%kcmC@7!wIdvO-2XU;d{|p3I@57I@4|M;Kp?1dcL6!*ZQ`=YJuk9uAk8OrO z&%%GHh5yFiz<-6tUqJjnfLBfNQy<}s)-EwTm4!*TTq1);9Nv_sfuIRhxEt19sG+=d z%qo8>B3ri2H4H}4w*jk|gr89R2=kx#vB`ZeUM}5BI(YK`O56(wQeMNPmQ>E0vGX46 zS+14yn=FwpsVI_^3l%BLg*zH4%SD(B(UgY% znuc7`urITj{+1?QQu~`)#VCc%lW4itnKiS7(@+p6Oq>}T zaA=`;k~$Vwof9W4S##|xTTKKOtk_altS_pO`?Xd!y#jZR$k)%iW<6xfE1Vr07F!L@KvJ_PYvm8JNS z*Z&>#Zs&zcY-inp3hUzXy$GNwCmLM;=f!o0PO?4v`y59HDERx~hT*%Tz+ZiN7`_wN zq_=okHPAKCMZT6|Ny}T*!bAzk_<=i>7!hUg&D?$ z_=8VC1NzeAo}`oXrnF@eb|`~q2pAT??eKWc6)Grc*-%Bb+Z@Z2I;ys1)JzGk z&WZ>#VWN!qGBU#dCk)fjn5@P+ zLYIjC%Cgt3yF22YI1mbxxz_j)N>)!3nRg^g=6n}ipjOyEK#R9R>xE^>~`Qn;2*eo!pQ@lCC8|paWQscPCEy3_s0|Kzrkj@xqE=CdpR-;~Z(?wPTHgdm zJJ!x42ISX3}$M%l&Znt)T>_a#M<|BRxOLu8j$z~ zV+TrFt4g{aC0!o^c5y$vXNQXvPXVlKC)luaYMZp3cx(<;NXZemSoI+X>)~_Z(d8i- z<*$J}Y%~hCaK|~`=wbiDg0qlL)0+$vZ)$62X2Wz=&g0KOit(5L#(dWw)Jz7V$YaR3 z!UG4QgUoYuItTt!kSDO&m3dN1K{3D9xKbNEg+X!a#Q=xikI6DA9xti8%`7UM#$hKP zAFmHC$i`}M>GUnFiYDXN<{gE}nQ9o7PP4x&?fXE2u4kuB@M@XNU#CCdG>$t{_j?L| z&bNJ+wh8THIqon+IlMc?s`h9~a)Ox?$G$=Sg&@PI!hC?Z2t-^CR*HG>fvRbU@*{cB zEZB%@s)-Ot+9clriOx7 zsC`QN=l_v@`6osv7;&!VJgTK%K5NIYkbYTnrqnMTQ5Gd7)GulKnFjjhhVH+uUoK@l z_~-5i{o?QYd-{bM5=thlB!N+k({S2ibSjLtv34?r+IH8`4_K; zF_ex=kure$a{^L`uH;u0pz3C+6c+|)Zd;Wj^()*>(W0D!u<>=hV2&I@xqaz^v2y zsVm+=l>l2bojXwQy=*%5vgr&&p1@`tcbBDh@@tJF^-E9TFCqmMVKtq}Pa^_N=L1>r zezM@5EzOFZCZY^|P~cqLKqubrBgMK0a`^9qSSzi{G&Av{3P!oWKLfWY$;AT`w+7%j zOFE(?je-sC;imMf!UJG~V~cWQbngYA)}V{>6P7 zQFSjj&@@xM)}9)vd2?E5-WOpE2Qr%|OHR6l6>smbussFY4~z)u+1b5V^ePT!yAuF6 zsGwU9=f-)8z(uD5jcgB{t=g4*;nu3z$mh*)>gxN*@eW5jYCQp)MPScwadJS=Xw7(6 zgEXkv)BYrzHs4j1bKWOg%Vu4!&4zEW2^;eKk`$~)Z8qHUoov?SVj6ZLL%y2NJKxS= zwC2C`Mr%G3KdNImMg3%i?mMyiMl&fz(z?&0Rd$U~K<8xBYV2gS_6iJqa1b}IfVXJ) zTF1&*EMz6cf?Op3e!gt_7y`v(5?JwDt*QNRK3B%>m_h2~hyMbQ!0JU!Jf})0HI^>JbrQUpUW_Qf9-?4RIVJ3K z02@am9%J^<+?2dD%l{67BqHoPi&~U{x+o{EVnJCH|KpNh2jGB9QTSEf3kgt`z-V2B zeK`~+rF3->&QZ4;c~DTAy*vf*9Zva)OAnufvhvmju#BGcm_p%%HCD6_jkr|N&pCSD zx>6nwkE1jg>xIPPeSkQe&8ST~f+tGY3ATcYL0e{YB0D?oy>E-_o*luP;xR9ICagL~ zR!=P4WX56$zeeF0Ror>DCDe;h!F8raAY=~e#aEzwOKxVPn)JdtP-RD6ymEcG3ZY)%@*S5^cLnwdVhj#5~jB* zqL|U>{o&AW(VG~ecSZQLNaDIZ$k3^>#x|Zjfr5osAfZM(Te= zvVD4;cm&u=j|QbFzZQuCxD0w1N5d$$C<9}y$afjJhH|-@b%vf!OvVflDytDjiR|aP z22VzsufHN4Q2#rGn(gbs-Licx6;Ie@UAa+LjbuSA(0!=$`cSP}CMLk%>`vU0#+nW^c!fR#m zlC9!hak5GAdaB~>4k2Lip4g>}x8k&@#aqN+6z}a66mJ-QnvL(Iz8k9AOtotZIj!2j zpV0CnMG+MXVrx-TTUZrYm~i7-hp+V=FqfQJDc<2?&aaZ*g<9R+r#X8cG$>Xveno$t z6=r3F=PEeQC^#G7 z1Xd|ISty2qHZtR)@DtS@lJ=TDPlp*>?8L^w$|0rX6}S7M9PP6#zGB3Rt=&)w zU}6fG3Gm?F~pUBf!>Cf%z^BMhFtv;9Q&vNzorvCh=`uvyv zd`^A7q(4pd`FH*Ku=;EbW)Sba>a(Z*9HTz-^yd)uS;r0piL=#bI~|**KFL?co~u50 zUa3A$SD(WaUg&C^G4r4FpR@+n5&Q_R&l1iT7<|JXF=20rt8PUFVx2TiynGyXP~tAARfm?V&|@lXkq-Tb3hkiM-m60&RiUj_=sh}gvI=cf5FXH><5Z}>DcoyS z=uQ=CK^UMy2dTdOE)Ail3LTy@!qyAY@UvE+Fm0P7eOoN3Y zE*@ja!;@IUiI9hB?X^5O6h7Lhhw8LEbZ!?#9)6{A1e(*&1l$$fc`TT+fJLcVs1Fz! z7uZwFxJF@5^>M+$o;tk5o;rGgJ@t;o_SAcq+f%(bD2?}M4ZX}!hCUL6%e7&wQ}>r& zE?nB|!m_2S0mtI|12AreNQT2nJYN9@?U)UY!Q3epqKH;EzZf|U~DLHK2r(7gPq-iXh{(fB||^hvV-0Wf~=z4H%{sM&kxmvhHu_+8>=@5A>- z29cIbH7DOYFS-HmG#Tv!xMy~s_`Dm#aeratv+y^b`mu5eY_H6u9xKPwR;NXIb9@n# zaFF=h55mt=(qgtQ>yJ~h>fXD%^5O;hR^0lhq&f1g7RbN4npdYSJ>JUxPA>k3wDKm7 z=gNzj8<&|E$LkGK`JD=z{S4fH*u&!Qy!!ju(drd2etU*>h3Jr~zE&dZ-|gWC>nE4c09 z#=`A@LgF3aIBy;9a%yAb;X)f(Mr()FNM-S0Eq(#VreoLYRWj6`u^u6qBoXtf7|6k_ z7+Vbim5;wjOWYa@%{-78hX}LvoLZ0%A5#84v*G8Pzkq)e{kJLqBlHhf{@3aEC_kUY^bdkxbL%I3 zvoJ?G%fgV;oxo{tI^Z2)+DE}U z1pN?41TPW+_5%4<3T%;G9Rt}F_o9k0q_FEiCi@GL;WZaZ<Lm>h~q7Kam6C9OeN7{dikG5iOK zB!-R3qcFUK533BXNif7fyrN44h6OUJQQTr-uufx;Q@+;kT}ZaY;+kAs6l&&nG;%uP z3Sc8Aky1ptxR&|BNGi;$;0FsOgD<5&@*sq~YUNy+q7H-*uQ2h0!?c7G4=-VCgUgbR zmdiD=%-kPh36HEpMbE+czF~GzdOyUsXm%kzAsV4M<>jyNBemfoU)7} zLxaeq>tE>np*k=wv)-wKoNq=fnv&v%yooG&x_`7t_dW(?F}VNA!o&@Pn6_&GqZ<<- zf_D`(WM5-PCx=mztp*76O=pCkjMiK-===-N%NCuDOahtK%Sx) zGb-GbU#H-ODYSgRNxoIvNrco}=bnY!rmJDlC1(PqSs;pmqM+`s3L2}eOP*c`I%*J7 zA2@^O;Ul89{JPOySOKG`9+PPY&ZBz4ybfvc4LXY!6XsB9UER$fM7=_nSC}jNm$sUv z4KSm5g)CV9`7BrukXDX@`8$#uu5w+l3KT5R0i~)`rP}Jw>|me$8kh+khP9e$8Tr0D z__|!p_ywEuW#;sHZ3nL1L4Xd(Lp|DV?7E?=ni~LY(*u$BRmF5@a zS5WMPTQX=d${160W*ScH928d}2&C3%Qfs4;I_FL(6mS4DzM(}SwjedngV8XLWt0qZ zOSt4gJ$UeK2MM@d0mg%rwkpYkD#e5CZW~s68^yoSM^aK`KP}}KweZZj7=8E&L4`mk zjrMQHr`2wiG<}Y`Q%t8c6)A*~($tjc92QAcAWSAzVr4b<21g;L?&R5{-6#b*? z-L?%9+y+JeC)nX$qco1IHfGPytx@b6Wb24*C4&ZqK#{U9+DlfPnzGa#?wQA~M$?&c zdR1#1^4hEg5nk5lUY!^J*yZy_nz)p)>9ZC1tQ3iX&m(R?V|fG(8r(KiK{jrPh=iB% zZd@bF0RrXGpWjFJa?8i4x19Q zaa%9$Ahsta%|T+^Wn71hU+`w+A3fy?W=x4E4d*{EUeC}5k3FZsZM=h_FZVQN<1*n+ zbNbUN=Bsd6znyO&mpP?NzPjeNz^L?qJ`bq!XsWsbkrTsa+h!884aC#}GH>$jvkO-f zZvfb{+E16)7=xIbcL4PllP^bT>%9mCiMUmHR1Jx#w2Br};!dkXx;ln#aNBdBE95P^ zJc6XoLqH_f-4kYmkwOVKrQ7Nyz>9$sh!~*$eQ}a%eyPytWL(Q1gWMEi@8L zgoheE?G4kroR8iD;dCIxd!47)4?jX8+$TH|A@*tk;&);RzMAicKSLr6?^nMb-%?IP z`UU(wfGOlU$TM|DS9yHsJW~5{p-pZS1h2QWv!)IWr@(G1y&|V0@yU2o8v&$h{r&#+S z_v=kcL8cf2D*!MD_F*E|pp{IHN{dlxkx7FRbC4^f@You|{mIM&@!0aC)T!HSy{QYt zLyq3DS8>Lqn4+HL`?<(rp7n-|In$jry4F7H8H9;+R3sieW)1I0+r#L7$~3vK*|z)u z;scxWeXmTw=!%wO5*j=cRwALt#4Czs8iKKv@^M5|$Ms?_zm9kABG1Rj^R5jA$@i7L z0l(wj6huHM*{$pc-^GuO+}Qg;LEqOGkT`6{NA0XjMk;YQ4#N8G^{*Gqd9Z3&&wN9; z8~1opKl5z;-eda=kI!Rc>)Lq8I0YjfurRW_=pi^*O+Ln~zLiAD&;9Z<-L7MI@{?Bk z4aNSRtBBU$O%hvCKMMzf4bjIvqy}6`xP*7Zt0O;zn zqbNtIWI~*`Bd*4e%PhMGd5W&DE+bE+r21MP0@Zlet zoUMS9J97s8d{&e8%Z-n|r>P1=^?j((MJyr;BIT_UnQXT1-bpprEL^l&b~m=W;{?&n zjcn0PH7K%4`CEv2A&%P46Kx29tLUm`igiSL@jZM($WO*fY%j^r-J<g|sA3BEFph zYl!O6FDw1M2I{02;b+($y1us)(M0)KrGq!C;98yY4Sc$N?=8lsxKk%t!mybehO%+P z7=DzWdXj?v<{E4vDh%7ZseVeoWhcV0R(c}N>(VH3$F9%E6gVz~%NE2wQh+zT(1|T@7(D@rE!JbMlsB#Wo|0sq{0ee+ z7+o@e@YssT{1GV3MI}ICN_<9T>JDRbg zQfrhkhw(|}iL-5Aq3cSeNn%TlIdr}6m|4K zAXpV&qI+Sj^+1%z_mu9DZa7o-NYDnlN9ubI%O@!fWMyu!m-R(4^39bjMnT_|b3qSy zIu~SA*0*xRmd%0>Z&?=D-&jk75U-QlA2|vS5|N?Cj?~IC2!PxE*U1pTKvr*=eq2yjlbjGr!;UV|MF(Gc;HNr%LRA+o2V{kDxx_Ejy& zCb#0*fd2UlNo~;p8qfe%$_8Mp%$9sm0+x;1GdAFT!z&7K##TkhqBlOpc5@=Xu-Wg(%sQ)h z5$Vx)FGOKl^xd+LC}9HhhOZt6^Yietpc*{@*8-fdFYZIk&Vs!u<#6+Jvvor;*=D{SlnKRCG4=dYbJ~0jfGsb0Z zEgrRwJx3Z_5$Xl4=ynWCFy3wu(`5FXaqdDlCK)!(Xpi@pOg7U1j$N4<@VH|!^=Oy` zUR_Fv{Hrd#9X@a%CUCK7(qFl!4G^895h*>Za2>_10YRCbq?Jq^iP<&4b|aJ9e1f># zh1sKk7ZVpXfot4_IS(UxB*X1*)R<4m4*Ba=u}{nbI;3jNhYmPJsWUTUW~JMnSLu!| zRZu}O-V2)@0D+~`9`5vTH+Nr!@2>UPgY#n;Ip;I#13flf4l8YhFpdnTFa>^Gd%f)9dd3 zU73FS&(UPshm8NFOq-?bYw?I`JeRehMs|s}skpkV<7b2jzxWfxilV~%@>RXd6^sp4 zIg@NvIbK_J&QzR41*i~20Fyw)ZPaE^P&;9}h9@!3#t`LQY`-K@Z89Fc4b@$?A7;=$ z)M$b;Tf?ZO^t`U4I`?5oC->)GEM!}(!}D*HLytLwRS#&vq1le$Y&ISY;-(_KxI&P! zSTm-y-p+wqXIS(&>!Tu1?n8lL$*Zro@Z|~4u7@zeSq#Tv&Zhl@yO7Lwp;yIhhtm$H z;(^kS9WxtI25m_@?fJ*}p8Q;90K{=b-fIR=9v-#NNA*~NppwTX-kdI5!rbc-12k+9 zcv)SIFecg@b|)^(1=Xh;Rdg?}i}r8^b>}2{W5t8_|HDlBaMT z!3z1lG{-Up*qzoW3>>!A2qc3tYgp$cQhe+~4wqJ*Os%vXa@gi`<_FF)Hd4sK)>rYF zm7Bg0))&ked$D?Ntv z<(pYRAr()~W1!z?3pF;k3kdP}R;i6FxU=Upz?0R6R|s))QjGCYYL#&qBQ)FgwC$-i z#`>8s{Kfkl=jF}>xY z28F@F-SV^whvagx%U5i}`^-mCAK5HHr8D(dc<=?uwMLmz0v~GYGS)F2*jXWV@L&MU z-WZp;t~Ubll3_pju%RQfdU`t@7-)CcW$!0nKGZmxbOGR82C`;WHW8-O8e0PzQt{Xj zr|=X#I3+Ir3!70<9yk>hnjuT!FjtXC>It#Ulyw9=vU~s&dnCs0z0R@17RdKhOJP6} zV&F|d9{#yaNKG|+b|rR^bJ0*Y4V3TT?B$eivVkXnT>bavn|CLQQDBLq@9YIkf>}IF zPyylKWL&ap?B-dDk6uz_S?VhTnx_tl;c$fJII_`Jlz`cF9E_&qb`RX(F`p-0o~-AS z;XHV5M5GnfS4MdZnJ|z731?DwEFKg~ty6$nH7}mo9qHK+uZ5dCzBjd(FQaFuXu6~i&IdC zcSwhlmotyiIGWOtR~2N=cO%H#2OBunVde)yF#J~^51LZSj=oy?AR zoH3|-GaFBn%jZo|VDhHGw~p$IbF8`bid3z;Hm9zauV~8tuEwZp zI&ai~XXX-^>x-kcv##cHecm`^9tm%0_&lwlroehs7>Q7Vid z=*yW%@rue5?U|13iq=ul*;kGmV%+CHj08H-QmlxnAVj%r4qyg;$;^zd!43Z)FV6EPY%({cCgN0GEG-_t|B z`TWo+@{J$erGXMNy9>I%_IGz^Ypba|8f(N7EEF44inf5Rzf1W2&207UHqSP_p9XJC zfof1TaUGUwQ>;ZtuC>bbR5_x`z75vrPU|h-{#a|>z~xP>RgT09?qg^Z^JP@E)_Nuq zN7}@nxYq$O|6mhuw`}5C*u*#;|1|XvvnTTfT-hZ6AdKRjYOxisi*@mstE85~O97P! zQ{1+XiMyI3y`|$o*C7ZCL$+FrtypC3^M$q8x@c@Pt9S}BMq0%?tg?~DI%~0YCuoG4 zk~$M={3v7*PB|QZXY`-c0x_sGh#qIw(70=jDscghYH}dcfCdj`!)gvGB{rC-VsWUg zt*V(=Okgi>&Rzh>usuSOrSw{jrPtOIRT)tk^O@BD5d0L6d@}%7-&k;m22v8ZTU_*aaB%~s z%qs&uZE#!Rsy_d9AkEq@?kU`eE6V1eUX0BoKDg0SxW!?1dF*^@Dp>7X4QK$oK%AD= z$nM9gNzThZb`|E{E&F48>PJl!{nn78{|KGgW2dX689;4RHA`9 zo-)%`n9?CiQfn1t2f)f7$_CDB#z-}fROa5$z2cBgErQvcJf>Hjph%j9%aD!17 z^iTt_O0*K$N{^nj&sqkL+qY;UB!^jleGUaSXOCo+%WElNGfIvbSstD1NN&?jemT;Zz)0QK^*4vci4UgB@-0NT&ux5m&D`u&|j51ImUlAe1n2CLdyogOYLac-tIr5AkVzzzfh1zZvJ0WkflIn z{PuL{REQKh%w{{1ZcsG-ksV2vf}FXr1oagfd&m763}RFnya5wMQ}n#^mk8ShixZQRN>>e~I$bbQLnM+@G`@ zHHu9wJQ6w<3FJsc&2)#bVjtYKDsKZ4<10pe5i`CnR$s)8uf5+$3W*(GomCw1<10>m zkpg@jVagBPrMWyqeQ7Q)Q(v0P&#N!Z?}39%eQN_k*vu!?=zQUBklZ~%zGsg)BFC*o;ZO~&wJqC;xbJ|F14Kq6#_uU$~BR$o* z8kidma7NrIyH6ms%2wKucoXJ{gMXV@fO>N-W|niG|ma zSa>aoh1Zf;crA&A*OFLxEs13Uz~mo8!(K~b5o$>+yq3hOCaWd((t2c8`Uuh`cFQj< zv0YW1me?&SPD|`@^`#~DfcnxByGwm(iLJ#~bxxNru^pl+CmECHXJGQYN6hUEO^HdN z(@QzM*%GUB`mK--)RgY1XZ@y=V>g{gd-zch0&tpfGS4!PG*h@fp{U=<=D}uNUukDvD<@F(Kh_U3A z_Q#v}*77|Ho4CR6#18pO^My4eHW@Xv^h{PaeN=(reDtEcg4Y)B8x!0=PQ&sNQbncZ%%y+TQ>U9G)vvnw~ z?14F74e0(zKqvzC!jOz21?Un5=uaBZJtV`(>*6qn^v|rBfwMzHx)?S18jx9IpMMUD z%MgDuJo925bMwydCors}_yN4H1LwgQZwHTAJd!WeWCpTTQNBn0krB;`a`;2Zh<_iJ zjHutF7_py;rT&b^W$Gvt6e((+x-@U3{{<94VY4f2@n$ThJ~9IjC{&L`qGBUZg`J~N zU87KWHL7AHR@nweW+RW@WfLKr3RKQ`l`~7{bRm7|(Q_Vd2VV8?wlD7l+yo1j{DNzI3!E|b&V?h0VHOLigo3^6`46)dGDyq530U_42qyNoA$2_E; z|3yYc^7e@xQF*(N)#OXRQ4ut|TJd%P5}TMn%j-`j0hLcKuo*-8``yg}Ul|?n)e7+O zgR-O-X~0)lfCpHBkFq?*kO6+oi8pHpBKa~cI?NIUGfTm|Ps5yw#F8p^AP1A_9%Jm#z?F)&%Oc=lb{0bGhUor~1bC2@Wi8^}1R}Z3Npo-uBIo9L`2Mz@e2EGpj z0{+0hz_)>K0(%0x178Jp26hM^5{S9{Da8+SQA3*mhRYY_SB;pCFP=W#qXNpsJvv~Q z#xe_8*)2Q=cl?59F>i7+ns**H$liee3jFi#=LY;QLvOJT|J^Vy;dBlEC&FKW{}1uM z9sfNL*4zS0ma0!T+Fwz*mg1MqYc(~IXhm`HrLX;7GOl5xs?p;z@dc@hHG@ z_~zEmb$yPb0yIAN>M849=zhspz1q0Z12ul_PTlU_`h(lH z-Cg-ZJCAX>+bpd^GMJp%@XD2IBNsk7%>qN!ER~C|M(!}Pv;hfW$&NHjUis15GHYO6vy5N^VB$x^EdJa^F0{xCboVYa{$Ue<_pe3 zkC}*cx5{)ck#UIo2LJUKA%D&I@l!!oGIR#7^RD~>Gt%2h!FEm)VTM%An*;L5FPILD z`mJ<4ue2GEcM$UPb3wIPN)r!LNHnSr+xy9#BKVXozU9ssY!O28W~-u&TWwrn#~g=* z(Z`%6-7yKXSyo`0zZd~#PNMyd(h?cf2ZY>=|1k-7LmkQ_OA(RpdylNj_q{~>i00U( zpUIs!SbUR*O4!x+<$cRq`h%aaye-V0ILN#IS2QuFd3TD~I0`0I>IY8y8+Uhc8Luw~ zB7mczPjH-lY$sZc#;W!k9K_A0sY}#rKZUyJ%Aqd;_y;fJ_*XLh^OzzROi@ZE|IoYi zrt7KBOVMt!b`!N5uUt&!6F=UBF-oO~HNCw$AoUKk)j$-DdgKPUO*O#G1MEVutK4n) z)C%cSy`d)1cxhsm7RR;nYWCD`WAms|#t;_gbO-$HdZ`>1`=xUDq=Fi)QGA8O%Fa1Y zDdd0X+*BwLs$~gs2P%*fMr~U-IEjM^^Y_V5@ye}oH_0p?*!QFR6^{=yo1fPrv=GcMOF@Lk_W}oF z1->O5p}Ea6RU`6#BtICeJKmeNs+u4#BP{G&DREU#evt8Ikj|*1H27=;s6hzF% z(yy0?gTjenhQhrJ*(fu_ZCR$P`5|71paAz>3isdFDcr9jJ)6rTpaJ(>sBx1EA4)=c zN|7q+CI!WtXbH;0=oGPE0vmX6XSqrYb6$&WswSbC;9acn`@fTA@1gNufW!)w7RC^c zWQD^LPR!-=!tK`~qL%uoz_KdK+N@SS09#Se5{2mPwW^?Nk(ldW&!W2W3x$^6d|RLV z)PMH}FWsh3IZ`gLeaB<`C*OXZz%EPsW49xdRrV4H7_9D|T>sr~Q^)AAQ4@<}9^W$@ zvWf?@SVO9%bYzWdvFaj%IG85@@;|m#w%ps0?(IMoy~$b)yAmBe@5?(h3O> z%(Oc`LfW3z;BhD=5(}kNDYcP20%Wo1^Y=l3-XZ$fO{^p@4-8}=gUBKK%rg3+xZS8F ze8~dyNaFuL)R)^_%eoQvEoid7w=rU2kIPvnccHFIrM}EERiiS{j~fqB#A>k+*%XWC z!pClxYC&ol<04Q&*E)yTv0+Z>l@v@a%#45RSiBi-$jy3QC**10rBr z;FR9ET){l_wS?JA!@M{u%yT77yF7D)1}WuJHy$>~EohMSoOJvYxdRE~ajld*`1=$- zrN~`KVJkXE3f`Ht9xQn%#*rOI<_E=XN~TSY@$zLD@pmiJX)<}d%$gavPx0t>P(mIx z(=B(sCmGaB6=noVN(SAA#46iG5!oU--Ah%r@ApU^r08sYkXX`_#hEb$-~g5@iI;Xp z+BS=m;t<*9OJAk{>@HV${Y@sDe<}LlNjA5!7UF3dj z)#7cf+^I@@!aHv{fZHYZF9Z0}wX6kfw&MLkkq3nP0U-_uOGWr3RDe7nEO)GjP6yw0 zIRI!y7)vqGlG#_{(~6L~C_)kHao8`LP{Scb$UqI}J+PA6?-&y3w6#o|B7EVHbqtY; zFz~(bs&MfV1It^iqhuJvSGWzl-Y0b)?&nq&QHa#62ssngjV9Kh(==ThiOUiH`DUQ8Lrk#P+-RFTA zZJjm>+B$8ND%TQh@!jj+gBaAkw1Z9WQgiqU@$_)i2rl2%$H8xf%&U&dI`;iN+V#6& zw{<*!(*StO_S(zt0AN+@dumj%NqK~&^8h8zm)>u;EcVz{s@QiiaZ?&Pg9cazxJ78A z-yVY6RYPqoJp;8yP(uPB*vM&E|@N=sMOYmP#H@=Hl|nns_+#GE8QidKUs zKxF%GdL@Hy(7_MTQai(rfej>^J~C}UCboMUpy*_EO!l=kBP4wIY|*;iPQ$g-D0tZz zz6_0gp}T1#pMfk<8hPnT$@Qxg{SUmYxIPVuPi5GoYd|5{R`WPl0+40cbdE?8(XzTR z$>XKdmq91o0v5_~c1}u`YuWS*R2}cw7(rym5R-R-t^S*6(5REplC__Z^SVbc3s|ST zeH{C5uc4+g`JAb=ej*ilA<{Wgt1!Txl<3UzF0=b~LPwNLOAcA|BQyoFnyEijHIHJ& z!u~^YEKgkf7QWCK4nyLI^V_K?cImY2n1{wffzf6OB!%CI+ozIYkoVAx>)(t*h zdI2*KKF)7#fX`_bhWhfi^GWYU&|3(4?^yQmyZ*&UBCcTB3kPTC-*t?w-D9hEziX+5 zd|ZRwxJPS-RA*v2&SRYjf{7lCB(wFa$Z2o4sV)OS%tmNa} zh-?u$V4ceLkjl19XIq8Dk(EDwaMQ}4?va(%vD$^sA8Qnx8dGR)&}f>q^$`k9XNAV4 z(F|c?Er+o{0Xgg_o|cM0S|(<}%Wf0RQ6<5PcS~K^hGY(3CcGn1zUG$5xR;w!z5H5G zt!eS( z!FNm1{4*j+gra$!NwlK55A7pTZTy{;sHpze#VHu@nQ>cIY3ax0P>))uK6 ze=}`yF-60d?%yuU+T(Rq)(en0LR*}`rxZZUdnj#jj+z-!zqFR^v#{`pISZ*d{)Y5Q zb5tWxX^yqhN6qmze36>tAva0hXn*WELI%WxU zDPpDm=_-|z9vPvDDuI_{EP1&5usC`H5Hwdl-@HI<(?b2vWwIRAa^Ul~x~R%$Vk+Ag zlurVhG++PXoKI9!rwfXL2b;O76`^{zgQ1iH#%k3QSQAz~fq+nef zuaP;{B$*VJ)Z9Y`Hsv1juYJU}yOzSbTIu{5dBJQFE1h4GTI|$ks?>GVvgC@#S$%!> zQVKaF>K0#+0Iahf*(hOde@wyrF%pA^aCJnaJr9s6q~3B9cnDWcu`?Bo)!T)#yp&P1 z6oq!;g_$__6C_vhNhDAnc@{|(S9x6e$WF29lt7%d zNlyu+5fX@6>)qH8JC^WJ{=h4A;t9Ym#-V(0i0LOv#OF!Ia+G8&*$zM-mrH=~xM7!g z5qV@^+R}PG&cR3s34E%)T*|Ju&KkQxA~mu?A=N_Sl>SXrus~IiYgdR_T&_JYCu=oY zoUPfDQ>scq^=YcA&)Q^Fxpq}2GOBUx+*lIprYi z<3&=4byir_x8hONw0|)%N9RrG`NNLR8Ay5H=qyDx;+L`Z=nOKUBN$}jBQZ8F;qA71 zk_=3S&Yp?sD**gQW*5R|k!WgA8cLz+cWgB7kHXFk5(Lt}!7YB~>x8K&XFUww#Grs@ z=k!ZB<%Zr$IYe0@ZFhiL;^GoOAUh8-DmKIlf!#EWFfmIbbSV+rd zvZr<0a+w%nqf6 zbL4hU%B}Sn%7dEb3Xga%yQ1T4SI>7~ZAQ@IW^U#ekk*3!xN69241 zT%;DQhpxRDsga&q6gCBiQp_kOg1b;hE-8sMiX$Y&I?QsV=!I|U)S;Ct#cB>13#+;3 zl&4MngPsLzNfZf1YHs#E{v3MyU-;>44>ZBdwONjxp+zguZOT`Z@YO3{ycO}wq#stLD_xq|*C>ZYLuTVnAs#T%j5~Q@ z0s*DU87ZAR%hVSSR>bLm%x^3j3qLd^fo${+FUpNB^c#29qn8l57>;I+FV!vFl?J6v zdQi0{()cNA&Vr`ikEf-lot}=5?A5b?1K~%9!Q3P=Wv|Ld0FS@I0bF`89_8>_4U)xe z{Y0VyzxlkRzeo!V_G}kBF5&D%QBgMBgePB6bwGZQs`52^2>%%N(DTF`!^E%EH#=T_pNDUi_<1=WpOgG%RYFUCvqF(!f2Y(MG#{lFM$q^S zCLQygJ3Pg{K)SFsM<({Z5&*#9n;*g%{}q=9(?6p@nKz)G(FzsS$k7fz9BHGvX=%Y&^9?F_if1-d*JEkWjNZ-KnxDDBBYC7`rdIBPZg zPDFvfSpU^|^uGi@$e27wrqN!O-OD&XEHHo#aBt;2EP}L_%4z9n*>War@fPI6YS3y@ zCJrsd5jT=&y~4vVk$sKq<$eI#Up=zGcqNaa0a+0qbz90$?D0^ycGI<#itA*E%B^k! zeI%+-2)F{was8td>3Lxt)lsh+C9oQTb?u!%GPXwLz}WUw5`=HBrXQ2@#)l?>*i^=t8v4C#nX0!Jg+-NiCtkT4kgDz*b}cBs%t?9gk(Rq!FJ z)ABi}Hh?|J{-OdALUUpPh#!Ek#6>c1R8+xL<8qWrB`sQ{Y-@WTfW`x_}wBxcmrcV6iVoyuLbCjbuw%Ylv`Mn}Sfw8*O0fey%^f5I=L z>X3|4&+?;I<_SMW|G%n{K;AVjv2TT718Y8ehIQa#*!w6UbPn>mYs2iN$SS$v6UxL= zsSLU@{33X`Td)US{%Zhrrgcuo-T|vTE+rAl`xJ4u`c3RLT;EdUwOfobNev6%meCc^ z7GBaWy-PTXC9ACU{6nUri>Gan?_ zifxZT4&0G5J|x$Ui{D>Lwjr-7D(X1SDRBl~GsVksekOl#3iHc}V(&jCSdwcq!KO!L zf+W{|&rTqRbr~ARR1d3ENv{1&N-88!TpJtwtc+Y6s^0Icp~SKV63e9J5V63u8_+{a zSQ)oMWMU&ia_-=(l5^MGFGsn!9VPqCdF0&7#bY1{#ktuBwSdO-z0Tf&4~cM*K^+1D$P(-y+ji_tGyLEm`&=Bur)5 zKRD%)W$$rV_V-}fd(hvKWp}%ijw?Cpt`4~DgJiiat5%JJ+&*yLCWpVyQu4%YA6ra+#RYaEN+4xXjt>u4HSNX18l~BSHzqCU4QG%5t+Q4&OLF|? zK1Gg9DP?>U#?tY=M<>zVI3pH!jr3c*Jb^i1wyx^BcM5?8XIU1KzKE#`90ke+y69Auj#GlgH)1!F zm~~XJj-oO)7q^rDicf6x5CxDgrhY(43ZOsfb|b1m+uR6FUMU+bcyQ;%;^#s{k*%NYC3H^W*M*ryOH8o zlbq&JIC&kwuxmqZC~y-MrbRp%By!naMQ}899;-v~{gZ7qr$e0oTHMa&*i?qw=3j`X zAT40C;CS#F+9n^_B{%k#Jjl|c5-|AEMB{$}&=GZMY{SA47~*JbE}T_p1-1<3?vE&0 zhQ+W{xH9T;k|2RqVrDKD83mA^a1&`AOu#48OCmbQo<28 z-Aky)BG_rcCDN~2FhTmew_q~D#2tT2ZNU@<-J*i*7I5c4T&sduspy3kbp8M+7QFO6 zerb9$#|BLoB>Y)s^DU(xcg-}RkV<0 zZBj+c5}ri>N-JYu-#0-vT5=mp`CV-A_2^mbp>Wpfw$PBbP6#J1jC7i4vAlJnKv3|F zXX!?JCpO6JU`c~z2##$PKZ5^CcqK83(-``y*q#WL*v?_-lVXDt3Jjz(=zg&ZLE;7e zJj0(S`SW-FJc1upt_1(@=ma7|B!XoNA0N+D?Xh=MQi*|k?XY$^W6O8uArmHN=(!!@ z4=62ldY-6C?KVAMExYKf6JC-y=j#%zpDDS&79K2T*a32?9@$w3+^GH=oKjTEe0`KE zZ37qu4y`in(grbca{KN{Felg=v1k71!x94$s22xFTI8nJ>p&c6VUa57#k&+-Ympe6 zf!HoY^X8IboCkVrdFU=A;GLj;l#)cHDqE(mQuHM(gvpa$uHA6OFa={mOhzKyAIDM# z`(Ieev_c|0Jso>p(egQDfze0}ewFVI_$UWNBlj=>|G-HX+g>q4Ru`$yU;^H1u@msp zi|t*R^sY#HmnXf;Y_BL%g<;}g9j(a}u1r-L?oHc1a`R;T&ZL)W6n4cONiXks$WYwn zK?&Hh4i8?Pix5%t7xs$^HE=?pe9oaz7RK@Ban&G#;yTC`wY^6x>s|3t29Jwn8mE&`o@mC zGYRZiSzlxV9aF^_%8;%RDPthXCX+O3`Z|zaPf1AKGihlTmTYBOBT|Uy=t1o60>@Jj z#eeYT+g*;GUDBlxpONg<8&101tQBITJrc5k7xC2cR9yp{DM*W^ulbG5n$hJq_W7-6 z3Ra>}6xJr*L{8Xw%yBR3kD~*=0B;Sv7QV!#W6ksy>gcnzY4zqIf?8;tejV z$e?3lF|B4!0i<+$#EnD!08Fs~Dnh>48%f3G^#I#C>&WNj*ww+V$q9ai#N5T395hae z&1GeIo$s<_R?8*7`$_CUb++^j!aYs|MMm^>uC#8$$*WUqih9|nn6y#rpP!SpZnRXb z?;|m5DAdeA0W37&Lh_i*Xod?#O03*QejtawZS0eYi(}<A;ve@Z# zys-j?>z(f+oJ|_bCjDJAhZkVUc0N{W!arj_wzz;m_HJw`(H2gF{-eA!AM^RmmkTDd zV_<$^u<#bj^B2St-LVYVYGnd)2PQb$hbr>L##4DL^?hVrCX^L$lKs8UIA4|Dc?O0~ zN)CDbX@PhM8RRpuDYb?BmNa%&bAEe^v6sQ8*zoNT;2fk-I0Bv|}a z`FWfwCMth6IG4CX`Nz^h>Uk2st*@qT@%U&=Lk9A@EaUQCvO$Hs-ppZw(0VOVFoV(%z3aM z5)YNw`nrB|CZ@-2qVT^6UtAmumz%6yLF^Z^@MW7`*o>SKt6%(yVK^4qFW={Kb(g?W z3_?`f^(sXhyS_u(gLsr@mRJ_u2RCUCq6=R=?U!6H0Z{f!*i8@NTh8^9Iv0X^5Axoe zb)N4T4E(j*<-W~hV77eb@W_>Tc^I#(GJE15=@yUayz&^vl{_)*t6p71*kdVSou2|T zc3LAPT)t8)vZam!72Y>s(C%0fySFP6RiQy=b?qH zR4(p!iG@hOaQR$sJsXiNOT%NSb6fqMeW4u+bLux>juIpCJilo8WdyqI(a-jy#R9d$?81yZwM3wx8F+wU4wzck;gapjl7=*wC%+ z+P`ulhJ_A4re}2Y&Fsy18+!RYKW18l%)%dyAtB;J*zhnX7NFm6U^4OBdx_C);$^rT z)|cDv6L9_J@e1va%R~vZX9NroY#d;Q=EEN*de6FjP->9$YoT z&|=`8Pc33sghS3H1F#KFkJ!6Zp*u*p<70~Dh-(#Pi<2WRF$So%Mxx@8-3ds*{F9JR z>_;JzvM#+i+82$5+*>)7ZnSc&{W(Fp7T(LmSug&ka9WQ)Be2c!S~3)=+nE|~#L~ZSOV?ltXp-ft*A3rt{J~hcuR|qiq=U~^=~}!-04v~zuidZ~qXAL5 zvnS)Q8xx7@*rQ>%`0F27qV#imGVp0Wz!>bw$OJdb1n8?z>m+S0Sj$f2GqEHol_tnE z*vaTG9*1Zn{)Qh#a6iBifcxIUx~Ui&#!h;FmWl0YE_2{|O(!DD*FgA`X0s zd)gulzaI}HL%T6iP)TY*Ywu*QZxgozYWDt!Ni}%JfRuzcV`E1r=Igo3$Z-G2)R8rr zNY)Vk0u$m&%DlbB9Ofnogd>pJc&0WbMc`D7ERnd%NvtC=>t2WeaVmbKoMgY}>P(d+ ztqyT9l49N*>$fUE9eBs3DV8sH_SJmtxy+Y)k@Q3Z2weJx% zjunW3K$$#4;Bb1sh6CxWdmojnw)OMW8su%Hm-v)}WOkt#2xP=SqfzlHqSz3L?f96f z66D|BW}`yAT8&&37w5>N?XlkCY*oKZdp^=SvCeq2WkOm?^BZWq9AxdnkEDLEb~R2g zE3c0oUGMcwlL)vlTQ{~a2;|=k@;^ea+Zg^>_e4Vjy`GuGz#e=!7-*M$Z(qgihJp9y zOAIXio5VotT-8q-nSMc(%!7=G|-3k2GCxPbGygI5(0j( z_I`mrMvp)8h-_~=#y7k3W2EP(W@GQi79;${^w-0W@dZ?%3neP%Aw;$>4APPG-vbqO zD2nU*-eQyjLZ+@Hp`jwi{uDMYLRtqKQWRPrI|0OB3kWd!|FiyQ2Obn3@3F_NvzGo< z_5W-I=0>JZ_CNRTRsVxp4%X;;q>s5o5DqDVq%sakW&a~A(c;8QLaF<1p#qNlHgOqp z_$_Y%2tH6SK`wgN$4>6S|Gl1DZTj~cP|)f@|9;Qf&>){@P5}v`178k7Y+<(@6anv& z1gx{}c~~MKdaFXf2BwE_*L!yc-u>`fa|$HK@3=h?oT-Ar$9Ic$$zWIL2rz$}U>Nrg z#<6)`P@cqH%40cd^!!Rv8A&Effhp7HkWxW1jCDALqaUys^FRQXb`2?q>4vppKNByd zoMn8g8?R6j)BA1E`{DGvj&ee{T#wAnP793;CJzCc*{u#zu$g0DN{o^Stg~+Wi^RyY zw2a!HL35<}LLOB{IA-q=0 zf^5zN2}D(L1}aheh!>DF9Q+Ri{uA?(7i8Eu3%UJ~)r&do!$bX%`4iG$jw2#Py0lxc zs$aAdG1PaLYVc0yxNECG9mvS7jkNF}_-g2L*Pg?0OKKGZ9THz7B(mMLudyUk_O4jE zh<+8%9R(iYKc0+--4{Y8Zk5R_*;$5$6_}2s>%!;bo@dPGG}Z@NQjHzQ-gX*GVoNl3 zJSeQw{E-LvWk|AKH!-=Pr0;M7uS<H`d>gPeApip4&ZMBeG?C%(6n=&xiXGf^e&hNKE1xT%0Iv7phvTi1D3;_%*C%g>^qLhWYS)e!L=0b1A)IuOv(zv_! z2qH1EI-e*_MeYyyMqWyJN#rt*yB0hj9F|0b&`2UIh4i+#a0uE z;zATq^9qMG$nSB4TWj-YeB~=A zTRCaU*-0E1$<-p9HhlTb)g3@N$!c>~puB|r*d8(wq#K0dIhy_Cw3x-ix&xJqI zJqs`=~=qm9A_4!X@JXr$iBwC2*M_$ zt&tpDcqbkCu$=IlX9vt{+WbY|$))ngVw&tqjQWm!{-%AspyC?BCStG^Z%evHTXP=G z44S`30NPsgZ>n)!fb_V_fERquSBv18D0sBxJvrTPWiARD=d;g|gzG_O6FefhZPTSE%jF20}7Mna_@()Q4ti&%;llnryq8t5HpwtOj{ln{*CY-@T}Z^%>pj+m5fE z^p=t z|AK6jLl4tIUb{n=Vz0-g%0Kvd8;p3)&_!W&M?4OG+?ugVp(s@%gbL z#Sc^EBN;xpJH64=kt09iepDe25Q^az`>m@=S^ly)vQnLuUV%!>7shp%q}-|phQEYvrJMHj02X0g5y>YK{I6I6Y(ocfNH_1z1)NQ*fK#dfp0 z*RPTcO4%>#-rhxAO!)E4869I09oz$1MhABW83=2ha0tYb*-ZKzhZBLDN!yHe)Oj0x2AMy4C-uOW3_J`xJCO^J@Iav^l_itgOd|{Pfgn^b) zJL(Na8H+f@I7D@%LW_=|*s!F0oU;Bxf63Uxz%v%P0nY?FhFmz&P7q)IQTv14sjKss zkP;mZkTUyy3l;jlINT}*nsK<5O$VR3(v<^$e7$37 zM!-@keyd+ymgxX-iipl+L`8zHz{nezr%Zov{;8r4-Twt z!IUzuL(WI3wlH(-=Sllm-TPmb9Xm{W8j)Q$Bdu^yJ{{GbH)bIqd5;fGXh$6XA+$q! z;I;n9P&7d(XD1vqp@R+vKD{vatgD)|f{1^nb}{D)9-HR-kFE5iU>M+h8pC&15m;ve&?eC}GT4oUcB zcz5`j@o@N;@rS{`s!?kD1Aeka#S9aN{ak<6p!=}{+9qbwgL7cqa#J|o>aH#51(C{< z&yZ6d3z*f1kpIyJDgRGrTN3g=LLGS$S*6Id4!s2-Ens{SeyS7q^-)3J8) z<9fXSZkN@qMG*DT1il>k4>@IZm&@v~8rkcvJqm@#V9kq7 zyb`=}YiLmryfTG84%xm_Wrf?tF|tCZeKTc+YJKChuT!>}?Q_?j%nBd3D+K4;8d``7 zrzH8oA?tg7n!@K}aFh7#dyx8WIYfOADps{MREz#w4uU*v|5e)cdAikiFTQ&AU%!<4 zPDyFsgB_@YO=NxKD~GLb%gw5N>)_Hz z4Wfr6a=i72G$impJ83npa-nN&?1g|I8;AYN;34!K-$cVmU+oe+XMNFtFNeO66B}0Z z3I(1&0x5QhZwR}wAIq2UW85o}2a>ElAJt1K1Luv#x2qR}ybSjexoIn&qrM< z@^Qe2<9{sNQRc}gQ*oM4kPzp0az}=RJuJVwL^1&@ z(v69|le(>Fzi!NJ3t01A;oeX~ij}|~eJm5}hfTO+jt8Xr1gz@pSSEg<-<4Cq=~RnfhxZkZI0$zTz)sx!9laO=Y$bn8la2)@xXRl*f;XvQ5ZZs9S@Je@kL=;2v^hl1kLO6sbHS(X_|xm3H17I zvH2!wT!he1Xz~4x0naDydzxHLUiWjIc7n%{0A1%bzV3WWBIG;OXl!paxveOIg62)w zMBNegV)%r62Rtz#=b7|aKW#)Xf6l*s#h_$9H~- z!idF*2*WLGb8Nn6z1zAN^oe2PkIaRcz5>q%31-Xz^CP?PUJjVsV}AkN5{^$)CjsAR zvc$L3=HJUE5#17yk2|NK4p74H(3E^OCe}}VndJabb6BdV6B*pFnD!)TM<0~ zc`9~d3jan2T$nhJ-OSijg@lj%o|bSX2tCW}qm8Hlq<3-t`APLLb%N&{YpPSApHv^S zT7d-|`L!#jgU(N?k6C+EYNbA=4Eg`0`j~p>z_8dYsPMm`K4wi;NvA63ut%b1>zrxqEI@(khx#^8Ib?drB$X1k@fTWq_9bOY79FSJHJ zORxBV?ZduOHB1gRZSN)Ckl*F5M8L}`Ae+Zlr{Tn*WL;vtXby>HLR%LAnHRepZ@dYc z)8S9#OcyOI+0EIZ6H3VTj7Z*QYzSX%zkP#;)(8f4agAcnH=zMKk8RBHE+gwU+nXKD zgmMq+P%*jor_oxp)AOcTRX9I0-WVGQmH3N3!aC{*%bVRRy%oDvRO>^QfY}#MoY!c^ z2Ce8DpRr!UGxNUm4Ze~M0qe+Pk;ONn|6JI6`bI0-5X)DtXBUd=C5uB;d>x~D`>ep= zbZ>g=eO>d1q2PjmS>^JXISaJN5Ao2kK5DK0?9C2poec3=ze@MHy_+=8u22x#wVE-! z291NdvE8uo$XyAmRhjjs^uqX5P7Pw6wi=ZMiT1hg%xCi(J1JjiM%IGZr-_|G$P2`$ zyY?9F1>%rSwRW-5Rv z^Mcixi@kW<&mY+n51o&bm)r}YnKcAHR?NJ*S(STXb=G}oH*^*&aSUFWTUDL8jOi=P ztYx7-6-HJ~EYpie_Rx^>Xy!6z?p#X(u?F6}4N&$g+3jhvCZxN)A8J;4Iw6w?&Z|KV z0##||Ec1FcunW9y@8%24tp76J^cHP4zHQojg4Y^;yjJp|R2fO%Ce@KRH5 zWJcmug$+PmTIY@UEw{Ww;<3T0`yCem^Kqv|k&!j=(3g63E3o7;a~6Zj+_h&Qqw#GK zwBJ6|n)aViVU0Y~SJI{7US82|pXV*K=vxd^_nrNb&a*2#%4cRR4p_a<`H)?o4NG&L z^*+l_#H`mm--NTGnTsWce}iAIH6~uS8)UoQYh*3%ggv>qRe}40M}GeS@P4f4TWu9! zPxHEcJH1AGywL{K2in%nqlq=InRA=Z%vn@wdp?3cAvXyyUbQYoH*-2mH#T0-{;vE z{<3cCtUO%1Q@w1LKPshsNe|tjlOsCpDsF^{YVt6vcL?>H7y(uJv6-p#LgGEyhhbi{ z!DqatfxgSFykop2TQy^ouV{^D4bc6ruWswS`AB)oaCVW;%v`K-c%CBjISjGV${Xw} z0hV|9ikdZ(ldb4>VA6Udr;stAPWo@mh;~!!Cf~V8CIru{t^!7JF~LT zJ~@>_ZkFQeZZmViq&4z*(vFRS`M?6xy1I4qrb0uRAWwmjN7a01Kfk&$V7fu$3xd^+ zU>ytDLQM{wp@HgN7t{n6X4H7iURu1-YxGk5I*~RJu7M#AL?q~$ z?eeH0dPvCu5ED<>EL8&7dNtZ5C4ga40(eb+O9?;)yr=>| z1hZAZV=5q*BEhM)NZ=)M4kHi9MI!O=zXtb75(-K#3aTLrDoQRYpqC0r!u?G(TUsvR z{-uPwJ3alk;m3XG$oxFayL*9SDfCY-)Txo(G%g;G%+AAO!`dn$zVme^s4ma-loy2i zI^vr-fC5uw$)y>B61-dE;g`m;7UNiH>gAGb=5$wGl`3n@|8*!}W4t#@d>+dx(Z^Ql-OQ_xw z&BS$O0x%i@Nl{LHW}8{JgUteO@zHs*m5*GaEZO#!BNlY7l)0VWmAA#Q5Sm_yt7aYC ze)u~wm{-7@WS6)eUb!qz$&+%vpX+G26Q8Z(W~A04^N8vR5OMtGAei_9bKh@fzF;&L zy{8#%TGJi~InCaZX3TW{Eu86qu4c+~?`lQRh*z$s9h~$Rh&Iz~nXXC7bm{3ASeb)- z=B4@G^fu0EK0Luz_Y%+_Z#HBA?@dKUHpIjI;LA318e%go+Jo)gu^F>$uJ!`ba$0;7 zeS)cTfxmhTwk2k8I$Yv4HhGI)GqzzO^jdi%w359(Fl)~m%+#-;qIp?fBWIyzstkJd zx@acuMq_=dipWNfqKHhSn1Lb(>D4VZsW3qE%)rEla}7DRHRIA;+@8woEC%Of8nLGXSb6@3m!%p>;e5M)i z`-*m0#A3>E@fkkW&(+4)-hF9S|cH}Z_|veTG1MxCyMOv zajv`xQYDmWGT%Ypp0JuYaQpTU1tS6f`GnmZxv0X-F<4H~UV@~goDq<6yhU4lp0yZa zd+Xx!T!=DXZW!r2U+w^BWscL8ku(zJu%n~n3rq(fQ7l2rse)A|hMDvVE zp%;`)X$nM?8~&plYi~gV4`UfR`ibo-IigcWXCd0`T)a>Nv<;bXg(%PPt%Wwy)p*)e z&O3gyuh%H{;*RS8=+uDj|uJho_U%nf8L*hI0b zxYD|McrPveeV=h%Ugv9>pq1(>6nKu;EWp_4@D}Yfnz5!!Z!2kou&N`Id9G*AT$j(- z=_~4pov2)&=Q|Yn3t41789*x|dskZCd@_J^A9mWj=^bDI`+U&)zErP<7(9FlTYww2 zGXeb)AHan-8>GBMGsXk-@c_Nuhox2$^hSa{uw^4bFG1lwb#UH7P@&GE1VSp{Vd*di-uNhto z&na=@h*!0Yyr(*=WIjmZpJS#2kJPN;eM+z^*iqE(*$)zJ!E0T37U9#*nP9A%=Y1C4 zLg>$O$)ZoGv_hx!@|xG6=+JN!Ju@%%FnX{6Tf_0tFhIG`XLO+ToN~YhDy2kvRJdozU)zd@g&TMH^M_X58~?UD$s;n^jdjrY7o zyFB}$BZyVB@n2YgfIhHG0i|S+;N!Be;tQ-x&H!@5YkgMeD2ZHf36%74=e?2|stRQ1 zPvnxOx|y&8;n-^cSrjI~RMapCT{aG-nrHhsR8VFGX(4u@@u9cqbIsVv8M4C4>f^cVJ7|Yf}8^JO+Hb zoBZUpE=borZ>tH>hug0~xlmZ?Gn#!^aVx%yCCaf_qF}+oB?|kCY}b8fCz_4P1(eT) z?wu07*s?j;%4U6w&C>=e+LE<^Syozsp@_xei<*6&HVpGT*;~EQM<@2uirP4QV{RXIwfb-xgVphPRi58;M>C(2lQlXg z>BWTll;rzdG(j!{>keU}t->090h?CGm)gN?^1P>C1AD-bamJ6PG{vpu!W7n3l)55l}ze%U+(O>*&1Yta<)!LE$0pOWtT%E-rdWI zqGSorq)t7Sv{J#@AzBHJjCDp|`CI8qKgoApv@*+h{Ee@noU;G@7nemVb7ov}29$7< zYj5gumhEoIfH8N&R}bc3`0l~d&G6k}!V^T++4UT;by~Kp+i8zbP46#<@j6%JF?5n;5|c|jOMP5CylG`w?1Rs9k3K@abMY- zmubwcvF;c=>#x7v($v&9y~$WV6#I0oT34I*B;P$+zczDRy_IvWX5Ev0>GM(1)SQ*R z-qwNv1yk-TYy}A%;udp)HDy`b|uiktGth4bbEqxD}=unv6Y1Xf^?vRS&6*kb{YeON{{UA$TuM+3^(pv#+uk@uAKPG@})`tGT zVb--t8@kEYZ1)}kqcPOkSys33<)`sra`h93# zIox=F=Md@d0lcH`zIoY?iULp}x7)g~y%qHh?b7;fGp{U7-v;PLEh)d{Z#HysZ73*U zpVsxZX1w7W`kAlakLHY#TKY~PviDHeGyVi@QKlTa-`8({Mz98W8}yr#kKf(Y)LZuR zn~WK{*4OX5jHT=^fRa=8bXj9lb3b&mvDr7Y1z>1hDB&$%zpji|hyj9f(dAd3(i9y; zGTg5XeN!{ul8Lq;kvBu$9swYI{~mp=6M*DM@@vtC!n)TMnJ&)4Bsl>h_oVD!Zcc?r z!^81iTYN*KEKPRb(HG}PW|g>C2qUeTRXG1VWg4cYgBNp_Q!@z)RB*c8nsv1~>rW|j5z$twMfBmQX6 zN3uRerQR=A{k3Oh<7!#cV{d&px_eEkedkXe{nGC4)%eoe(5yaFUtYcHfNJC+AjdC1IiY7|zQwHRnoFNpo2W@Lj(+T&3^@(4f!-5~zH4ggBM1C` zGN69!A;rg!x;K7Wc~f)$bVyH4oJsm^&`Q=xcH?>UqtxjTTFC}9k+T3Q zPWLRo8|&o8BW3SxKnl!3TFLideWYK_|L}U&od;B` z*sy2rcVB}IA5gQehShGER9knDYBMa3Db`#yZ^caq)||cz{W-Yf^I`jCtzM(0YjeNN zAYo~V)_UgrobvRCn_ArIn~k@+w)E>N*@C8W{9RzZ-1niut}#u~BheLVa_+ZBE7_S5 z1U=s2x^3RYU8pYodkVssxcjwgC3`ZKDo%M%_F22meMQ#D37gSvT1jhq@Q#3KQ3~;z zYo7r8RR7{$*NzqE17X%dL^on0IHeN(a_Lt4GC?(p2TX<@9X=}6Ab{;Z7fJ(_WI zcE-4R&A2EhMX0kku5G91>e}VJdShkc$OVfs(~TvQ*0du70`ihSA;fsE>4%?b8RIh{ zyJoU3x2I`(pExF01Vug_#pi#oXedKUZ&8P4W#vV_FLRGs6Q~xrt8*&sZcvFsEUSWu zpS}Z&iLyC5?zJI2F0R@Qn}g|Jd5dDPV-n{XQVGI`7-+qfMbvPCe|+O)+Q;Pwv?! zsCYmS?TZ7MVY-1OyHy4G6ym;BH5_g(TpezHv=V|e5M%3V!zceWdSGUuQ zrEA-3`#&yU)uMjQ%CWX&j?G1Y=6qqxpd))AK&rt}`hxxYaZzRdS&{v&nZJVm18g@U z1_nMC>ghY<9nh8v^@f$0N}@yeS2wD1WJv6Y1^eU396ojc5)|?-@_WGF1SHYXdfG!p ztFNtZ!C>2gznAgn`1!pFe@(V)gfSX-37c zXs==bS<;v|N@H6hKNQco5Lbu#niZKwWhOSW@z534B6xI)o354FW<`#HSG6i~jmliJ zA`gpQvmzg7+h#=pHaN_RLiC$iF$~??qhxiGvwAY>6!%{!)m{8n1>U^sKh|>|4 zhd(o~rbKfg?PAu<%1;YjBK7ypu{dR17se|uM^jC)zeAg`llABY zl3HWO>A2>eOuRAN2Lsa;%hU~63y4bWf|Sd0iTdu4*mUlU0ts`sFk>h5UvR`mi*Xrx zM&H;GNqu2YaR^sB@l+kSJT`-Ol3Zx*&1uOZf%) z#?!Rv=VIpZJlKZs@Bk>U)5Cuku0~-HxSXc|5Vj4g*iJz}#Ur>=Pu4%+89#5boAkf89Jz{=Wh<03z!VsT4kQacoc8 zN@(=jo95Uj#Qw6x9(IocW^u2DL%cJTq?cP^CkS`HuOxl4h zln%f3+!So^p=oU*Rto%C^6r4&T0*^kX!}a-#%}Ys=ki0FTY|l*sAF$RT3b2|7YukW z0rT|^G0Z1D9Vk}%5w`+y;&@;t=7R=|4!w>E`sr1Z^``G(K@eB}P9Hy3w{qTT#1O*; z>P9_%y?#0-)}}ofdU_jVh3uIFA)(-qBHSU~_1X>DagL;!d|P9gb_CnR76w95`AA?& zJO@Z*-#N5|-hXm#p{{wg3-tMo5&FcC?U~N zK2Lsijy`0q=crmKPad?sqyMA&wgMsDTglg*AlXiZP?|V@Q<@)V1#XzXX9_QRoaj$i zFQ+K7hY7i56rKMG0U0~1eos8S12nfs%q6-LyR0iL>#*b~OG~jA^acZ= z9i6aN_({<7S!l54nUo)NSM9)uyY8=`Zm|-DLf2e>Ve9bcw%qpNapicYPw)CjZ~Ed0 z{rYD4)GU?=#<&K5(W}AhzoZ$YfN^6Z)bv;A)@m{t43Gwb*T6;_p8=-WajJhk6Tr^` z*3@iy2V^JVX~eWDCpQVtz!Z4GxvMzcqu`a|AK%5}a`NvSfC~Jk4}u9YBE~?BrYu>_ zqu0|iH#?axjG$PHZjM{2TepIBQK_W&=g$Gg>TL0`1{cIrfkZM1Oi}2j2O<%i61}=j zG}JNQxi!=WjdjIv z=X-9Mcv{7S;p#5G5rlYE2G>`nTZ_|rA*&IDREO*y--IyU^OdM2Z|6fkqer1aHhl>y zvn{t?1HJ?V4X{7biq{cZ^y)og^ZC>o**)*ffHi$GPKB97i}qnL(6L6U*Re3y z({Yr0DUj43`vFt@@wEZZHLc-x*dJ~58z43M3D+^|H`)yr*$B;EajD4b#DItrTV_V>wTv^ zqpi$SWZFSo+m|9Oz*rU&l5c|T_CXuO>G+Xj53DrxJdL{exC&GY$Qs1^=TY$EP(N0z zg&)WiyQI5K3}Puy%8#hnKo`vuE9t>DOx;x&j(*rChNB*o4mqGaS2Cz&atd+ex)j}w zQX}{>7-6dshAqIkD?m=hhpY3^zoKI#G2m+qRL^~z!7ct9;)>83Wef>zWxyCgD)V=3 zk%abP?1*|rUm?&}#n(1{edmuyNnhhy-A|5t8`?*pu|{zViiym9J8j+tIPrcP=07IG z$V{uh>C=2(Ccp%4k1yP(Z~7tsLMv;ip5CmfwKg;^&`{XRih|(Y3~yzDeh57V7Rg~8 zufS$C7*4>LiThDAAv}Z5Fz{%I2jaPLRjxr>PiXb{LNoZXQH3>ZH~I@&!}I)+{Wkr5 z`c+T*+ve}u=FndiRGIyeeak|U{u+?BJN+#j0c1XoABX-@*&A(j+Vr}%(uqA zBtLNMcmKj~hWK#FB{2Pna_65EkHbdpM`lJ{qegS-p-dcgZ#1AWF|i;w)=RFC+QiCX z@RW%T@$cVIX zo|6-9HrX0DXCm{VN{@ZuNH|IY!&)#B%@)t2g?Jix9$?w1f#S}y%3?Z=ZZ-7FvdgNh!(nKtTPS4)Z5by)q(=V0j_fnkR$&a47;rLGn0% zUI~=s>mlFAyRRp%%NFM#y}XdOo$HCH&oj@33|vo8?|KMJ16l^lQlD-|eJmKfpi5}j z{H6PEY!<_o6R(>Gtd}T$cGe&r-z&(cC42A(8@5-G5_K{AcG3O?vu_vAArO=Z;b_c( z!qL1k@kbSJ3rAzdD&eRiDI9Uj3)wvt6T%kZ8Nm!j3!kDmk_E>;b>;)Ce(Mpbn@>|Z z297C2iP2{>NG&>LqYIcub};Bh-R12phIHjviR+#{3)y2uTv-oCKJgAdMH`D$C5YX- z6q=4wV5QXbfq0R5H!FG*m}z>9hEckK-HhZOb{Wvhy;5|Bbc=1b+g2LlbM0_B4l$jO zR6$tRvRwxo3`eQ?f#abN5CuHR@h}6q-Kf#X+&ElFpF#E@bi|dgTw@v-g%mU&=i+T%O^aPFT%7Q6^?g*JKvw-4Ru^wd- zJi)#{J#-SbiCzGOIQLKFUFc}$dM41-HM|{Aam)4@p#m_^t3Zd9V^!T>4rd23AvXeL zwTLWTJr)6?jgbca!>nwyOt%x2*{h#U*uYtICn11K;;!1@Ru9JO6=lYCLG z8W!wWh6*C{heIUW8}2JH8|$rJ^}Pehb^Emh3wJ3DX`WNJq`47%L2WkPSBm5`qeOAWdi5vWY}L^|NOYrp4*iq}nPJ5%^%GQ}qnn^U0|fz@vN zQp*XM9iO@{rRrJ_ERloWiM@)_p!qjW-8AX!62C|B{>Z4b@X>xys_bQYo<;X8O|$&`8miD}`VC?b(0DpsS0PP_n0CXQlB951udWO)H& zm)Q39{y1+@-pz!NbxfBLTnjPhQZU#yb{<%Hj$J>~|NL~6DqnRlUm~?9KpVGK4CV$7 z3ajNKdNs3-Nefq?sXTc-vIe<|5lV&sLbxzuRA%6g>b&G0eV^DM#Xmi+P*LjseC!^= ze#Ylmsf5>ZIxw2WSDh$u8|n|3vs~B%a@YP22=bfH*MJb9M2Ve@SBNsaKgOfQ!|f`_^xAPseE`K>UqxH5-Y($ zjgHkYH|C46N;9Tqi>rPKCX=rUw)vpP9l}a}CS>0qbZI^_{G~tT_~$CDAc6j|kcFoL z4I6m`gpzmj2uO1QhBO`lDdCn!K+~`cauV<65zs~Q2%=46GTSY+U3<1u7w8b5Z-+}hh;PXT;f}S#C)n;}x~tP_0K;^^ zpks}rM03n$6e=clP6d2YV!&=YL?HubO~%E!tEV8Js6ZBQ8Nb?y!KtZ)7On&rD;Wtc z+%lx*DXIh)t^^lup&g!YyAoW4OK{;zaN$aD;Z9~c1@78ma@=z62LFV376mX|G3i!$ zK6-O3`i=g{@MD;Ao4-64{>gHlo`G^COL%Z6gP2o}Px%(Xv(8k4=-dQWEoY zC=VTBo%PFdIZyxQSS6kQ4(Xj!85Lxx$lJJoil*zRQIO2c=yw~;RXp{xew zqjzP}yCUgbp7btDdh3(kwxqW`>Fr2*Mbf)7>7^9Ff2f#(fbGpsdUKOrT2QkSxRTzq zq<4>sXJM1=&}f89XFHefcr6*qmyHnuX9AsQWVsU`jVw!g>yzHaNpDTkJ1gm(n)FUd zdRHX9E0f-aq_;8YZB2UH9Ix8805kic5O7*Au{?aORA1}_e0|6-aOnk6q5%PKAi!om zQSsHO7&mwF=XU()*b@~`f1Ea)}4a!IF%A|Ki(z`tAUFLYP z^$UDzM4X%k^ApqH^$3%^yT=R-$X(10H`{h|ZFhq0jdRZWmmcYv)nm z`w?F6w9nsp+}1AMWiY0LqmfTEAhEN1ky^94svS7yD^FKrf=Q}|w2L-m_jgkb;rbq? zt!PhwK#IL992*>9?<(r9CFy8pRla9{{rsG}mTL!y>ZP6Y;YpRhvN18co#)(^0bJFZM+`Kw)*KU59=r~E{wRi3C$eujXtSn0$X+n_^8zO#B<%IAe zTUCXp#B)xx(fQDk-Ow2Wb`(MvGXjvbpayXreiD7@oRSv?aEmE`+cO3pP{ql#{ib>d z&yqqa5pz)h_IG;u%u(SiwOw;Qii!1CI}2wJa^qE|XyAx=F%Lhw+uMc%KK9Uyh+kcb zFyVp^=Vd!Xd0vCE!?*_B7>m0Y$$MM8&X9dv&%AB_~+PK;Hcv2dk1i1KFcpwdaYBb2}J<2W-387X93P# zV&~Nfi+nr!5*dxd5e#fJ-ZsHfKme@S+2Sll+ax9VS*M#(q%g(a)a*)3(s!{A z%k4y8wX}rqUi|koevF6UeU5JC;Mg|j&3F}z(IDD98X@bUDG6)0vFWM&#|wK%xJrr? z^I>1+%`s-y`e1eA7&Egu2<{Q|XfDltZzHq;8ohW%x4H=lngi9F$C!B={pJ-ezvnX7 zjGvD&valC$^o3^5Mz8TJRyW4TgPsCIno+CqjTP#bZjR6L?3%j-TN`LWJTgBkEtElH zK<50(STdI6*dwin=A@h-I>gAql77ex;;O4V#4Z#B^eCenst-HF2Mk0X9(Mvd_vPc& zcvgLA-bQ>yW@V?{auWumIXWxeWQ+!epkX*fH!|1j##9$VV5b5LfT5cV z@$t{(IEF0&fAx5m-t;kEP~I+X1s=2w*Wr|DlsaR263MW^2~LLf9j8{_;Klf96A!o@ zq^4L@eGtjTBlwAJjrA7S!lTgLCVtQ4K=%^}bKsVy+B9p)-K4A=qVcrGt1e*H0Ej7=tmq7XwzXTjW5JT*WB)y-O4;DBDHXAPHs9iNAxv zfaZ9@%c&(XiWM&N^&VigiBFJ412M+KKa_+*~9`VI-XjIBS;vBl9xQgsxA1$TA1I(^=(a!8i zi35om;1T;Em}x{aO5y$%v{i5oWlhlY-L%gWEfsGfmRM|;Zd5FXi#Nz;d=5>?(dNi5 zF_YQjEjSOJ^L4BZa0&wo#Gefg;atf74e`qp!%o1nyeRX-Rii?$HhG z2{aHk{L6<*?X=$F?PC!~az4hci95q1uwmy47JaAl0Wba=6&TtPw1zG6Z`ct`|8BIE zvmH=#%i+(*kYa9tq8D~5sCuGwx^!c7{%9+(9aWCjN1Mu1s#|vvC)l7WLs|@6KpXjd zlx}5ygYRO+e-qY2xE)_l=*$sfD&6jD8}SE*0eAOHca2OF`%0WCKck`!uA)iqj8Ou{ z4r@MU-D3T8Y?7Iyb^Y|wh5G5`xH2FWm9T$BL~$QXE*0SB+TZ!MTWGt*wp(huWwxu+ zl}f}`)*Fq$8{Q9tZgG>|v>$rKZ*t-ap-crtxl%WV#U_Xn`MR-LFM3lZv_|#`;I={l zAO?$?#@I#qQB)xPEijdNWBt&iO8*A?*-&tpkx#_|dEP%bVBpNY$wgf?x8H=e9hC4K zq|@u!8OCN4^sJx;rdune_Fa5k_|?SfbS%14QkBHn>RD)xNJALNr~^yWgV}R#IvVtd z6RM~fB57e~qOeV9Dx3T?T=6N}jo$i7x@$x;T=Z5QoCN2v=MG%Xpeo(Bp>wb=h<(D@ zQ~BC54!oyjp_*8pJ9FD4*6v}k1H*Wm4if_;X16fJS7(m5O<2aXiJb8sJfOAZ(A z-yOS|G?h$V@EPu4|~_OEDMT$|F`z8&qdXTwRb%b2|(Ka3-+$pEqe(ygV8!Pu7i;Runs z3o0Er#Yo+J04Ii6fIV9ZhinY03)Ax*e!+Qf7BI?3x)3o9{7vQ+)eJNrU`1Tt;P6o{ zZJ`von5@OoVkUnqWsgYy_&M@}{hliGPO4|dQ=viFfL!e|R~FN|dZzCJ*z%nrX|tML zmJnWSaKQ91wB5CL0cU_jwdfVqBFVL0 zE+MYfvN&0ut7my#gTX#{hTW6@Vpk2)3+GZOIKy(NjvX1j=rz4*Z$`ihota)`Wt|=H zv@Ra^mfE11QC+gJX6{>Q0k`*uK+#TpgTP~mL34OP&>GpodD>sp8t{BS19xwLPlyW5 z;w%8u`7c1G)39DTc4%;I?u!h)sLhW&{EB=G0qaeX#e@bEVxA0m_UIPO-nh%((#?JW z>vyhRNtw^@c@;8WM|N5oEO>v(R*Ru%p;QoWw87hhI}iy7shkZ6@vS%2{m#3e-(sBL&@{@w)<7(3r#IeW}oqtM`_I2E6&u*WSi3-ES&SX)>}5 zb2e5Pi5c(zarZ9ZRTXF3@T|Ra0wSOyBBZ$GpnwsAMkRodkOUG85FsEU8bT5X5R#aL z^T7xaL5?a~DpZjoMWjfTDz&JfR8f#3qEc#=TB;yuDdkl}YX19vX4Ycw>@3(j@ArQH z^?q|*b9m;Nd*+#Ej%(Jez1bnQBV$|hW_Qpp0UAeI`OW~VcV!#C)5qs@xH!$1h}cGA zr{ioV^=T!qd*UyovT)J=`bP2*SjS!1)8JQKdsSR6k3D?V{`t|PcvHrNdhZ^E((y`C z=ZZq`fQQq<)C_*ez>O_W{ZJD2weleYqLPn4=S)PGgr`mdp?19`A>txXYk*i zUjDZyT7f^b)Br7kUkvyvrq;iE7BHtB-=Mzc-#vc;b=&{$`OX06-#yVqg8$v~dZazC zTdW{>+bvh4zQ-Mjqg}zp=@z$O+^61vEg5!UW3UV3UhAuhE5|J3e9-~P^kx$Cg>1i? zBZd=4V`fluyPR7}pOLb3pF>H3&mQ*Mgas8X%&+U)FG%u#k{`i+`x4|PKZ@Hz=$D1Y zMK1i#syuByt0S=W_r9Yrz3_Aeuk-b@#9yG8SiJ7qP$cHlEETeNcIG#^SVx&Sfl4T$(ZWtktA?6O_l#ERxZEc6c&AILqis z|K@S?e;Q!_!y5Q!m;Ww*ru4lXXT6IP->2sBJCV_HB!0XXjus%k5O_XGUl@~;^g&9K zr}4v!|4LsR+aRUMs<+a8AL2)2-%VSbVWn691;HIy8zcB#)INOvv>o4IJOEeLDZ z2Ut1p5N-6z$lsokw6F4(ti@?dsf~xUHeM2K=>8d?53bkW#6Tal^2^`8u-QWkKF0Gu z&IccS_x`A^+wln72R{{u$NLx(PX9??hz}G`K_73WB<)XM+{^=Yr1_|WH`5m1X^A$@ zX3pIaky(T9D?a!k>4#aZ(c_>JQO9BoEK$d1Gz-;%PcQsbg5N%?b>AOnLD+>x9&L>D zRD!0IrhJ+@g(|UqLDl|Y@=w4DoFko2R<~)C$#IjWOpdGFb9^v3M{{sLL4%CI_h^dQ z*A}V|Sb^if{>*rsL_Dk`d``qP9ns;a=d4Wi$@m~;cH6GoYwcfgq=g@nd_aG+ zx;@Ez|F`@p@!75HpS=g)2R^@H<;0pAcmFqL#86}R9E+;mL&9A1_Tv=If6aSSXumb@ zw>lzt%{%{l8eB6v{)At>jA^oHFO-V&Fi*zfzR=uJ922HR{e&yNI8*y65u z98Uvpz=F5!=LvB8ER1`)Pg2}ca5I|>_%nWD_G$bxz$;mcvs!tw7RR+hHnXoKHB zSX3jkh%!JHAD`RCcY&z)WRM&11uDkFzoe|w*dt@OX01Lym(S2*4!V{t`@_VRQVe$)Lp%ebW|RJ?oP6q(9HRDn04Y0O$+Ep;`C?xs%7E5smu= z@8GB5GZ%a?0Dp6_u;p=FNgolBIrq&7{A~Hmf6IC{?Hs1(bNDsz`~N)v?J{=+1W8}e zJ$=Ddk`AB`Giu(>NZQ-v!BWcjGdKhI`e5IHjwkUqHcjq7oSF1-lj@&CS{&X-U;8))o<$_jpgrkHooBbimkt>nci?$( z2_7E!HvKSEnZBU&@wRvrYn`4{-1^+?D|CNam~n1FOj=SA7Qy6m_x~$xK?i)Ii*KfI z{t$tOyL}nfLHqXxoM$w@*CWfi-kO@4I&55d<)pmgzIpkTrRCEC-k)?$0N*e&Z%G}R zmXn&Au4>v>UTVReEbdfsr;9sN+}Yw*i91K!YH{a@J73&~#a$%s5^43f#eG8D z72-ZA?kaJg5_h$@Ys6hE?mBVTi@QPGjpA++ceA)Jin~SJm&M&G?yKT%6Zds-w~PCx zxI4vtTijjZz9;S;arcV5Pu%_D9uW6qaSw`nNZe1w{Y>1$;(j6S5plm1_o%pEi+e)c zZ^b<+?kRCki~F6pXT&`#?m2OP5?5WuHu8uYA#RkoG2%89H&)!n;x-lcGI5)U+g#ih z;EO7^ln=S5OadX5SChl-?M~FL8+W49~O6!xJ$%cChnu+E*JL+aaV}@q`0fZ zeM;Qb;;s>Qt+?yNT`%qiaW{&)N!-oiz9{Y%abFg9tGKUVo|7(O+rDdH37u}>N5!q9$(${E_l&^m@* zXXp?^TNrAB9FJ{a=vszWGjs<-PcSr-p+yWm&d?l&e$CKShWLTpu@Z)MGsGJqMV~Xo zxxMH#L)i?)V7Wckm!Uok^<-!vLpL(CgCV?=t|>ak5FZAMF2zKA3^y@qijo;>$j~x| zcpOlKn@8%{cRwNYFNRJq)CqI{u`d`J%@F^5v1lbjdl~wWp`8rDjGeh$k zTF208hWKAsTBnaXA^z8uj+^a-Dj7OV#CV1*?BI@#VyG2E!x&0pD2t&x80y1N2}9i& zTEb9ghSoCFj-jm#wPff|3^irwUkpVtWMQ{^>>OUp7d2<-6hqfC#4kvTdNcGHLs<+R zVCXJ}-eYJiL)#guWawpv7BIAtp0i zhCB@Y$j}))v=?20$FXDIG8E6y5r#4tI>gXD4DDlRDnoBG^cX|i82T+kFEX@;q4f-X z#n4j>MdI=I*m8#2F!V4(y%?%u=yrxCGc=r`Vup$s8qLs5hK4h=h@pWDJUqPIkq9O5Egn+D`72eadBj(&Hds9 z;;R@(JYLdhGZ!B5gj&q(e*}+wm7K2Gf!>%CroyTja9I9A_|{xFLFIS!UPsh8Iy4O6 z7*ah*VhZdv4A9i9T&27%QxTd7`v#*n!?tIDre@_qJ z5~mTskXCsh)DN%|V8s+5hMWoTt^4`5#~59HGAQ&P^-IQP!j5Es=6v~Wb%at3Ft1Lq zUOLo8cM|>KkaH)jNJTNljDRbW!LOryRvE84)Nd%*o3L`12R_PA_ogr~iw+F~%<3r; zb6|1XOPgolu@-!@Vr_sE)Gll0R4MNxn5mW8M~8+1=C{I23Ia5Q_e&DZK(KCqCD9fH zUgT>|Kf_rAP9%O7R^h#`+RSA5L{J*%2N2eB5SQB=EcEgle1KL<&0_3_h>r989d zM?xxNYF3&)+`*1v0I!AAa7HA--pBw=&B{XW-OM-^mOApXNtiiDxWWfd0-Q(Ub`v3- zDInT0mWDCZ!V|F8uM7bXKQJ56Upcohb~_!K?Xb9;r@B)5L^u>B9lmuN9KSju8nV9g zfbza19Gk-F&UPX5zZO}SkN$Xo`?Mzte9PJnf-m_ zd<4sKQb=%oG6Ufd$olq#Z!t@jb1Mn5$+?5XG(&*an()jz%#m-5T_1J~ZlE|0BRO9% zx0{*4XarcF3W7L~lGB~U0$7S8oZlh9`ivvzby%l9e*wYzRFiWQmi5UY5e0&HX&97=dSg<_wkj->L1hJ$D3_cq zu#S#C06`t`-_q1)u+$MNul@r|9SMg(YC?J^v!n#c@GY{*89`!>Awb(YI>8Cv7`r}A zKr@4Ou#w#iaWyl@0>S#=r?r*3%W&F}sDPz7!g(42)@KMg>tUVx{1F7}!+ZB?KP>Ch zi^RWRnSpQ!q|{09EoMn^I0P-S$r(suvLQg*^@*#aKAbAqJ~zQe_JhORIx~a25nz3a zL8u~Fa&96q2bSUpXA=Uf&uDU9fpzM000iqZi=4l~vOfHMHDsk)9pwGn!#>l#1dFs5R*AZtwq3Tq#YpGe7}da-h`!F`6vL9kxmV4DjfWM^iwIDlG35LK))Dm} z2==E3$oU5>`xEDD6#<7C2!}xSnk@Jhvt&8_NRUlV9*G5p0B!fDbN>-S9J@X&-3Qwr zHu7FLPHyEOSRZywnX<@Xq3Rc~6h}B5)vOOUuxc;t)v#i|fy??lLC#rN)<>#+6=Ily zaO|D0NX;x+4);G6*{lzTy7iPHK-=|+52%mX()?+{eF|$EXRrK!M6d72K8eGNdkbb6nE{8wcA-doM4(b8 zf{+Isaya*kim4Rgynq0;norJFShkZGZjGp}+2niyOLcL*kcSy&ARGdzhfMeuvt&7G zB*-S`UJ~;R0ovBkR(51#YF7I9lWP#m2_ZTk4)fd0ET$m98hN2?RSiqd@4%5~4GJWj z_Yh!>ejtZ4I(x2|@8B|nX3W3~Hv7q+n5;bd74;Torwz21v|IKat=^48=To>%N^{-KM z7E(}Uzo249A;6|N0YV1lYE6BK1!~EH3FTuB1GR4_M!k!&=kziUT`zwhib+zpQ%uNS5 zKN(}UZ41yma7lrU914d8$fL$M1XvN-kaB7yCj|wlWw5M>a9DY2LKZ?U9L~7?0tBnb z;}7*uSXS|F61FCULm*`z24A+fEJq$`$R=k3Igc3vwB2KsOMNIoAK1uYaG2X|%wRkM ztdA^e9Kz)E0Y^Oo%lZiCH3V26K3u7{VV(N?9R%yMh@6wKtPdA8#q(umARGcIHD`H? zS+bnLB*-SGn8b2JfVS(CzytyybFfZ*SUJ|GlpM}aET=b#Q?SfHI0RDa?(i*U$#Ue0k!*4Xku${*pzZpM z`Y$2Gsad(+V@_1Kbrr(^M+cwPR1esDV8yI}%VL^?V{Jr$6&=T9zlSBK6$uI*4=bD+ z1X$5ra$+EjGbFDE!3?I8(+va*y_p1`qL_hj=7XR$K20P3SZi7h6Xa884u1XZxn zEQ~7PpJrPWgPiM0FiUdMNf1b41c^n40Bvi^J1g-tM1!?W&B|{c(EAm}JdZNPFt8k< zcUhm|$cR<>ghVlj=I}ovu?a*g_>$~;ug2^qhi5v(+(SW6fN(IKBQ!>mJr9EAyf5WM zYRqV2ia|J-O(0l~Bx{5H_9zfM=~cY@!RO}>NF+q-2KbP~Y!G8n4H5Jo(8?T0A?8AT zi%uz~Lz6Z9>4AcXor|IIAS)AS}ljH)=AUGXvoeNPTcdvRD|!kx7Vba&pL- zX$a7^rjBxQHs-vJy4g_-u=1S4R2J-$uwuT1OU|w2#K9qvL?Qvs0Qh45U(nG`F385z ztb7Q2_&KbnVzY^1fYtw+(VTTT_{5xsOSN5wKB~AZC&K@p$=-p(HW$u55bQl-IDE|c>{2@0Uj zZ{h;S*@m3&$>D}S-R4k2a(*C(PYMp^FNX6YIsf$MG(`+6@*nt-9pF%VQcg06SP+d- zs8wW$ek7)V;Iw`@#d#P+B>ax#{2YXn!80Hxfg`3l*c`X*n2h-|>&_&4!(m&9;hPuF ztg_=aUHe&!sE)AFDR4+EL1ipHZm`(Dfl#Ai$>D^eX2Qn93THh6l;IO{ehb?cR?Gpo z%-|F`e}knOe?!6xhZzW`D+r1z-MtqGcAGbu>>iU$ILx0qT@T-4$rR^TB$x|1uaRI{ z68lL+Kv^WjXf1eW6@86u60B`%R(_9RGN~tM3dmiT%7$GJD~7|CoNvi#i+o9(Br(Jg zr$}(u)C5+{WR%Qgr^#7ri0?@J3WOZVFntbyz+ zMj$}731=Pxm%)lz0hc=DL6$5M)L}GedK~^IC8?FeEn)N#-_`m`mWWoarRm!pVX!rW6Ew=vesHEI7cuqB{sNOiNYDao0%@ z6jzMBuQ2P?|3f-I_YYK%`&MI|v)z7n3zyiejYSa#rd zNmRli=N%Fcz+owpYz2txLHv;%#<1=G2H*NKoa;b{vCHTE8FoBwR(?%R8`z&1pwV}U z$nOO!rwg16nPmmWu)5mhFAw_HgWy6f#y|fKh-nWyiktzksSME6tlW(?AcYlXuVlQJ z4v7j9W8ko!9KmuQ$ANM`M9%MEYu$-)@+3bQ)=P(Z@_@@b9u7HwfR$JJ95-TKhfB^M zVQb~NL-wEC9NGQA1gM-E)Lh=kv5c=td=1O-bd&^_T~2o=NL&wsBS0|Omm~^7 zY=$r93dAs3f*1IXAeg~P_}&4A^Is(F*Y?wpOwEKt@y~)|Jpke=5Ml!FfZ%QltIX`# zK~)tj`_EBWxz_L!12odt&mlWjERuOgAls?%Cy}@x1bg%v_-YZHW2k}{ve`?1he&9W zre@^{`JET_w54N!i^EHh(#wO0jv#uHm zs1%Mh77qKan83DPihX*ur!zS0sP{nzSwNhgaW^8UibLRdhe9u$A-J{h&NNCA&H@k= zWEDA2f$-TFu2|&A#*9l5%h||s{sn?N1L5#I>T?ic*xlK>S24F!Ai5Zax&|@q>GBKK zw}5D4bB2Rp*6+iYZOBlYvjZ_y1-ps$Z$tc^#2Gl0O-!I(zQVITpT+&of^GmosW{a| zb00cX#_CLm@9lkJA3yo*VE151o>S|NsgY&SU_;BX+W zA<+*GlL?3Uv(WkQEdojWk_6c#UL^6MAwZwsbDaAOgrjbby~Q#P=2+K&!S2P*Crghb z;{wF6xqgcb)yuG~%3fIS*KnBZX>xvoWwJkzXa;9Bd@)-?d(<MjU zyb>v0Je;7s^j(Q2NYeuLW>||OgQ^q5EU8y>&u^cQa2TMjIOnS)us6brG0!^;^O;8s z18n_rrXB#B4lCwSxXh=LoOQ6QzL>Lc$>CiAd1usBqT%pNkR0izd`9YKa~wH+b_@fJ zVcFRgrw0j;aP;V)8DPGnU}byHU8k6QxYT1MtW^vrNROs{IX{YFfO!oe#m06<&oB_o zYb>l>F$p=Zfj~%Jj$G_L%xg5PH3E)XUevi52H4dmlOoK?YZ?gV^)Re82aa1_PCGEb zIx-t+Q6B>|?7Pg1rC23!-0}+0R|h1dR^&j+(bsrHFs~V~7B@@(H}YbOiDAI0BOAcc zSIBjA`Z@#5Ya*=Nw{!9;Lj>#i0IbD^aI0e?cw!h}UTk!^Bkar{oHCdf)ozV}?dEHB@A8bnoX!2m0S2?V_LJi7`dmXk=0jwNu?L~mX$$1u^G^r=yJOm;V1UGc* z1rW(LCkip-{F@wZ!(!oofhzsiASl-oSZf}f zAh|xTQeN(V)R$1Y7zP?6^fDEG8pIqOj}eO)mcwHtwGd7#o3joC%lR#Q>jgMYFR9fo z<7@;2%oYiR zd946X3J9uIk zU|#o;%7u0EsszEj9)z{n5rgv5_dJPaIuY+@hTuXd4-_pJpy>t6WLdBl*&Ms<`POJS zF|cCn{uY?GOlNl91DWtz*rtMja|Fy?R zFDy9|U@fv6!E(K@s^A34Z9jW*FC&Hlrh1qZD^KE=B&b-?xkkt1a0LV_;E6_FXF<5-^@@#PfP(g<0(nG#6;vgLuXHF^Hhe1s zPEcN^osSs+K2=rfJJ_3<1&>|#*c@jc{tr8b0jB2_Rk_ppiOs47cd6f0LwrJF7A(8i48^(_7(Uk%vzDAl$n9YG%8hHrI&ymZbE-iQvz{CtQ976%hO>d3kNi28LD$4=BKj)0$yi86k90!vO;!-9j z=MI0)L=X)SDNQoj5YkxpgXj;A7{;)N?u2hKEr~Zs9EZaUUL|oFj1ZM(+6&1vhP8#*|SMBHccp>7$t&04HTyh#e++pJFz8XCL(4u3BGovYK5~J z1g99mYyc4t;$|k}i)DxN9SByTl$?gBq?5tTASkG0kPCvz?vp}6JODzt?^%bE*99;13fnF%1CXEMHyp)!T@OAwS` zKRJ9Va56YxI0wk#s{zU;S@ZQPF&~q|7p4w|FHRlByatRr{i_6;GSx;$NRj~lSBu7ki=2d6c8+j(}CPMBEekc z1x8!=Vm^RN?F=NRC92J2GOh9DKD8qp9?DU+EGF9qg4z)dXUr53{mIDzLG1{K_Z^v= z%yInin%WW07Q>NgZI?fXrwGJwCQ}WJ-UKtq=xq`?Ts2>@b8Cs1TS17q0|fOp1->-` zP8-9J(L}w~8iRKutGdTv5jpIcsdg4`BEX7sT2WuXQdGWfkPQ=+C7fHKA9BW%GZ+LL zrG&&XqdA=ch+7aTw-R`Fl$z5SfM5oX5OX_-44bpYa2_Lv&-rOK$KG!|PL93bkleT_ zbo9d)pVZIK;afA|_&|uU$KW=s&P9k}b+*G=Ps3>f`!%fWZ>a)~Dq#<0EDa;5U-M3w z8!j;n5Rn3DU4+(yqc|;cOV4*_>Ml4`m2gIb=nO*4GQ;5&GK*|V z#IqHPJ)6xaCUEYr_Il;?OucFI8DK4=S?|jsM??6nKzQ4MV8vFU1ADvqbFx9Ow2kD9 z_vcJ8m`&s?^yjPsL7}*!d7t;^Y&Dp@X|U0fObsB!?R$hm!Yq){V1G`o;Z%|HI0zZd zAS`Y@ss8s#yb5A23YN-oQRI3cW(x@FXbzJxEoFO@L|}jY^W3T`<(0)=W*Gse!R3>~ zM^SJ%^jTm9o>S!{kl7w3=TX=`u)_H}0_1#6&iAlBSm9g=0pmf4Nd*xFD;$pOO^D{t zX37PHZt$NXk%Qht&I#tm-opnBJ~6A?L2x)lGFdf`5c?<-5hY0$#A*2e=8$v4g3J9K- zh~aM}5tGZ@V&IVAk0e>G4G~Ww(GYz|^oPS{A4-B*Qk)VJbKtN&#js>@#*ssrNEDE; z=lX}7JK|k61e!pAEzG8nHe?H5O=2c2+p#%`Ww7mGh4VH7C)M;G8+lv2$a9ViF^F z5hx~ykU9fP&LR@ADA3`w0pS$Nx8dx2f?*e>qLvVIFB}I$ajrq67^Y>Vxn?+ex9=@w zAjAKHm3=8!05LTyU$4T@OS}mb>zD%T%`gNfOYa?U9OW^FL>_FdG5m&n$J-AK=JOJo zUcQ|n!BxegL+Bjze0e2H&fmzPL(VC3II*)1@{)iKIr-?gino}_;nfU_4mlr^!~H!u zd=$6nkdsOY_!vdbPvp=crwPl6g7Z7%C7Y%92iEC>+W(8djc*8!G4foKOp43`CRu7Gc~fx{ZNB*7Jy95MDdk#ZQb5SfT!pbbI?81WJu zX25k@y#a@Fq?k_(=O}!+0?lOKkoXBsP&wy+&%tc(kQ(W}hL;ApR0JI6(1%1*I8>dO zp&-}_W8hmH9YN#sR27s}#KaYXFo7%K|Ai3`!}1`6Q;1xvW_B;Zdg)M9;rsysHk=s7 zP@dzk);TzSHG`W=bvHR=S($*Y|oMri& z((>A=m|4;A<`oM%Kn~wre#}^!_t167`Iwx)f#BhRnBOCYxg8{j=jWU*#prR)y%cLq zeR!D#iT<#%12>^8iq0v;qC;_hhCU~gLR0wdN&E%& za@bN5-@Mj14tl-f&H*qRKXC4 z@H2^q!!tFiO*m6Qw6r;of?$&hCjr2#ZO$MNEPoVyi*Njb>Y~?*Um#5f*tSUG{RRPc zExyn3Hi1JzI4p=FG+=hT$wz|6RO)RIx5F26DPo9e&1B8tbTkZ{`5>J!H7j-5*MPnb z_K#qBCm=v5&sV+F8VTVfAcn;~58oPTh|TcjH(>_B7sCabnC(oq6%MN5yZLeVD0AVC8Mb3x5Hsu$iU48;mAH01Q!l=8+nP? z8@?Du_>Hj_HLdToQnY87;g^V&o4`!V*NxNzU%6R)zZcX#Z&fL83X?9OL&HET*z1}7 zbFkU4VmKdAvTo!wh0{Z#;W*=dj~&B+5B3VCJpmgJE2afvViDquYuQIm!m-!w-IOUC zV}tp>1mDZY7&al_f?8|fusiXcf%QBb&TC>`1Hr7B+#A@Qrcd8yQaWpH9wX9Woq2(i z6tkZMTlbxo^LwpVkwy#y6z~>Smyc9U;ESI4D0dYIF+D&q?=1LM8l0f^_#Ab=n`wIr zzyzAZ-@%B%us#N8%3*JX6%Jdf6|9(@a9Peruyx-(vhQ|qbr!=wE-arTtOrG^`#zoh+oGA09u5PP_YaJC9hUe%!CLRYsilWo z`VY*+KOv}bCF3ephmONkesO6>yz=~_yzvmpAhtlQ*uou)tSY>dPxGF3m?4J|y?$7w1(}_$H6b^P%+4cIll_dgnSy zM?UQE$Qw90ocUCl1heEYR2uk1BYhi4o=UZmCiLhw{Ll2VJeFmTsWq% zys#v{kn*Up#igV3iV-K28lIa8P1Z^$(hba;SP1O~WH6yPZ@TJKE7HIC^udFrc;uT} zS~9t?yfU+-urj5fpuDi6BBzup9a~tgN=J|Pi&uG?&*+r$^1NwkQc1<6va-_hN~q2- zeHG)T7b-eBiGQhmvxewW@kTi}vtmeT{sf}Z@57&IRInh%IAW*@P!x&f1#*b@lRJQ! zQ%aKg+TsVWwK{mm?WTXdvnd$DAx!Q?{z zRY>>lxdU>?l~h38xp|YOD!WKe2)Xe@JEC#4MllPa>Ir;-Awc3f!z^XOY#I_1uBB?YBZ zNMU4*Ev%r}=i~Yoj~iQ5IfP?#V#VN`9Lc{A+IPyhg32N_dRk>+%4E!e$hOau}I52(Xw6a1KJe}ttTBh)c zx}VgM^kW@?9#~QdxiO*o^7G2_^2b$9yRChJub}~S_p!otCg{l( ztC#990!tJO1d@?Fps=#2v;fm_N^!9oUoaszzqrCo4;Z%Ns2VYbWo8na)uBIfGb~Oz zc05KSrw7crSg`KygB%>Z!^u6L2!(*?GtI%=-KS%q@(rhlOFj-1Id!NT$<;Vej)2Cq zCC7Rk(CSXXqJ@BZ1mbJgCL5~c2c173JUBh7w46X?J{Wec+AN?I*zba#q>yor1_;Km3f%y{5f_U*hP620}H28 zXa{Q-o@;nWRicw<3H?j7b9FFG34k^o+{Xo51{)9dJgpk`P2KmpVoR0jSJaToa?Gwh z&I8h?<`y=9qb z!ln&trF4c~CFUkyetBL+k#GFui9XeH;Glu&+*i|346Mvf{-Bk~S650WlXN1Ff6CnS z^77JhuAOK@*>|ZzC#KL=fuaDJC6n`t#}%Y>-r)ORo@{mD?1)(4k>$pQMn;J29=LH?Q=T!;-6HEctL)LKlHox063`*ulp zXWqC8F%q9ykxUlVoj#Ze+8*By=yst_8~w z4#=^z<)Sm?+I#<84#D%|FAzt~nmk0ceeqC{(4G3l{;rUZf&L2jb@xre;4i~Gg#9zS zS79X=L8`u1y8OHn*@ig}C+L!SzC784Gbx`h8nOWku@%&%vLWqK@kH*|wihb5R=Nw7 zTRg6!valqfyY|&+y;;^h49l+$;4yBj4t40*ANBHoVkngv$vk6?EAb7oXDHOZQWI2O zB{hSzT>I=;1npRA3#Y>D2tivD-)*<~u=CAQc0Fos%kkFMC^n?$2`mC7Xel8=VR=Ln)5O8*dwI9XTt!NO-Mkb7AAjM`%EVys}j#Zoah5%%L}~+fHD=D1ft1RN=ToE9yGiQyK4S9v){N$_9dD~e+ z9eE}CL9=iI1upQ}s~R#hsj#aT7GnHU%lz(=TzF~_=5u+D)6cT@nT6CNRhL^(3gNlj zI!VzkdA>e_h7L@#l^a6()IkFWrl;nlJDBdiKCDY#IgV+tMWt%Y-oxbTlf7Se-v#9; z@eLgqAWCP;JnRo`xXy$$2OwUl7hnNrIUDCB@>*} zTiNf7TzHBrw)sA&CQu&TGR$VOTRu5~+BI?q2*RCF?vR|p=_vzz6Zv?@@{&jSruNdPSa4aCq1M>?89Fpi>F2`UUk)7Sxvaw-X4=gRYVKk3+*ixcZdkpCI zDk-(Iz}912u?%`Wno9}*VIr9BXmy|71O%jF4VfwjB9#@g`r`@;eRwQEU~CE6kSBE| zKG_zlp(PVaN~hRVcOTBryWYhAtaWD1^DoqNv2eHJPwhTW(d0hytExL2Iw6_ypm%7# zPiWlhNzOUa^uCHtzwb4p*`|Jfn_k^p^G_LnyYWwmf7FZnuduurdmQ!z?7nDRPKDhM zyA?LxGT298ABBAkb~)_h zuw^(MzYn$?wgPr|E4)8~(Xuv$myoW*hf~E*UYZPcZ`k{dg%@C&fVw&YiJM-hZ@E_!SKjCEM;AqXL;|qv{A$zh`SVV zq%Q?cs0F@-c=}9lfoFkdC5-Z_lb7NA9T!UGBjM(MqAl?D;V@ogeKHUZ40+@6hGZY^ zI5%vLy58wgYv5k<>w_eRgJC60JuLt8@8LnYInS*-Zi>;A3H8}x)&Io)DGTx&)-2)nzG9MiW zT@`~ahF(fMYQ;q42ftG(UfSZu#Cp6@nGe5vIr>|fM~%W9bQJ#Ac*(c*K9BltGOkI% zZ#)fpEQdUJl~aiif3Ka5JMXwy*}n?uCV5m&HS(Jbc^<^q0`PBKfO=1X9v?=VP4%c# ziy-$j$iD=maXS2Es1N+2M<6f!N0;N$CB6oz!VB|}vpj10v$$jif9G?k-)zY90{r{o zzl3tCJgV$9(72m$7%zfm!k_mBZs)`AzYBVY-(ny1iTt{KfOz=(;BSM!Y(MmX3#Z?G z2tB}G_6gb#<#hT2ay@|fzat&|QAhBSYmP^qJcTRH@Q-|ta^T0{RquNEO@BoCxk!h% zz1i>&!(RnI`%+6Ch0p(@POJufnT7cX^5V+P9{4BWw|EdVUjG)rKM8*`{Ho@bItQP3 zyE5h>KlsbxH;uDY%tI*0XQ>?c+wop_HT=yTEOi2Yc1KHfo9|IRyfj`7Ke-Fy;U^>@ zegW`ZEmaMF)Qy(f2j7=ysW^Ng>BIZjBKQdy!CT-z3BTz=^lSLV@b68w)GqiZ;kR4l zQJzdo?SwxNujh}zZ<>vI;NI|*SDDPLO-iD(BFf0c^2it-vYnk`^a}4`v1q48j1YB#Z@}rGZ??0St=R+3i!qF z_x}z30sa#WF?Xy7Kh~p$!{6T+a~1qWxDM0qIgcu7hB*uVz~&wmx51;fT!}FQe?tq8 znh*cYmT1f8fo+Ahhkq3QDEM#w%%ir!Z`lrgb|d6$kG=x`#_K$475w;kv@QH~@O%CS z`n&eD&7K}r4S#lT^kw*54`T7tQ)@k3A(R)>AHQLZYJ=|mq@|)T1z0V;%EC8^7C!Tc zJQRs_FiLqZi&0TqVpK#{1LfV^Kt;@JsFbgfYP7nMid`0~8YeeVP0O09hGmzkSl{KU z;mOODxA_$+YJPJSk$k1{^lGK74Ve2ci&IfqamwP&sD?jNo}AWr=h|9XC$ENFK76c! z#pf{A$k+}DV{O>bQ8g&(1pf7yXX5eF`v$D{H>k)1os~5z0qaeIva-9XODA_#R@0ks zt?DKfxjj*NM%@hF%_?&Bt;&dx<0!>BG&1PCb>i9c#vWw;^w=8E1Q| zh}BptHl(PCY^)WMI%2-xP_8_ECPOE9 z@!xPNE)P$KY%?I+3}uzg#9n5m^1e4qT{3mH@=SdIdz=T9XCCJFWe+M(vxT@Tuuw%$ z$Gl#>NJT&VsPY_mLV3=vf?bVr*I+&Qm1>Z)78iupss;s^&&!`x4URsmq9?CY4ZdEd zV%GjzMOST5o|Dfj>xqrHAiPmUkNBPP9DGGZcX&;CGG12^nBP6C-%y^C?J6c}2f{ni zPJdJl`oE*pz+Eaj>piST@2Tib?<4=c%G>=<$`kbggoEzDV@BC>1j~8h1RRmG{~htWh!O#|@x^256Ip$~&r&irCjk zd3pUMyNQY}yIjR=Zl=_}W~xB~_Ac31sFNYlDhNZm%M?!zN#g@~%ajU#F~n=+`H&Q&9;W zl&5LDYA`BZMQ%<|k!4*~bW`-zeK)IUe2){cIthKKr;1GIrJ|OhUsffnh*2p>+XsHC z@|LBcE@|-lqOCB1V=`4V`{$b5Rm_RoRaDg=Wql2sm94Bz*(&0eJ0SlZ%JVJ!7K4?y zXfWCe{?;M5rZz-*Gq885%E3j?p(=X#Fcq~4dzih$l=tMFxXyEz@@yTUqMo{2c|OZk zQKLpF&!Vx)8(*v%OfFHLJ@?`I$86<2hrYQUee*^1&EeJPYt<@Z%frg^@)G6g_L%ad ztx%pe=#!7GR-VSsqED<>kz<}$o^6{|#1rUi8L#29%h%N%@(g=dc{cCHrNlkzlDNIfGk>457JZ;1Chu1f)gQt?pdw%X2xWe%teC$l zYXt1}zoK7!rlPC9z&7Gb%tPO*OU8ezB9DHntWp0|(QQsar>9kH_J65HPkyJGmY-FP zvVT+!&;AJdoQf@|QH^KESdAJtuo`AJuo@>{ZpAihW;Kkv(u(EYpx`Pi>fBY9w`WVM z!4oYl^<_)TI@8LE8jnBoJR4`lw7J^y%)iEp`t%yh6W7l2zTVFAJaw%V+4DLpDx!lG zu>$*tH61MP*$!4@3@)@?cD)s`9=2P&6?s`_%d_t$%R4^NvR=N~@*KUz^3J){vhMAU zJwtcPJF}-1@f~bNFU!*g`-Q~bmUl#N%hM^virJQ8skc)s?^As&>r@}hyEfH|9GPZC zoJ_MK_oZ9vP`VX4y07J_?q^wBGc2o9rWLa&(~7=qfEBrSkmbp^!-_d`hZUVO#A>j8 zh}Gzp9IN4o9IMgU9IHv$Fsspq5mv)3BdkUVcU!T(kyaDmJyzqB_ga@KW3as!V@=P_ z8mz3TO`})dgDI+M)7a=3Y%%1bVmqXW>5adDhej4l*%P?_^}u1P zr&`nlhb^4?^0x5xiTPM((eMt4co06_#89d!;yO%a8(9}Ewz}K-7`Zj_Z;xe`{?!wwZBkaJaUFT zKQ%M*S<__~VA<<`JmT30I~X}COgd>4mvui2X{MU=-@2yfv~+%c6Fnm)AywD62z3_| zG%s*vpBud>YO#zg;qA!dor{<4_qWY^>xB8|99Qe*IIvw!_kOJ z?x)N7+!Yttu2O&YM}tds!2A1a5VhIL@!!k5(C6i0isD9*Exp{APp4F^3rU_K^A6 z!BfAdfj?*Pq3+vRE{@{VeuJB&i*;{L-JhLui7y5|#P7K^>nZU^fZuE8-G?uV4_?pP zVISAR%#UBy1786Ar$&A}qKk3wufh6T3;f3i^|)SL5Bw3}yB*T_G8_M4rOUn`xcqk5 z!WI2RHd{>GWCcXgp?SIqw{kHyfHhQxeu&)W0e=YEX|E}?P6(%O;-xVRZ z-x1)K{X^sbY03?&{umO;U)CSbpU~NE_F1pkfPVQ?=BB%Tv6_x5OzzL{ep5=0=LBA9UcdR2{L@M=cuX^LC9!FoJ|i-o}68f;W8Xt6dZPZi^}R5nEsHxZw12k8_U9{!svY#_;g#y9&6L2Di>G z_iDFwJGh-b1-|MoUG8$bzAw1pgXf(%L>)HxQ0H0dD+jn24Gz~d#Kg>XD>qo~<-o7M zyO!L8Cb_Ij!Ezr!RLscm^&N{v;gBhJiLLLpZsi8|>nz|C?g_u#YT!Hu*V)$B47YLv z^~L_R6ZkXthF|VE;NCMhr@l=lyXZN%zCCfM;~N!zxs|}3%GEer7t;M>Z0O}~0sdfK z_~o7eZiB(CwA=Sbw{o#L@_U~{J;z^;gR%VZ%Pj!zi_sdl$}V@v6c;@Qm%A4DjDqmW zrM#a4*V5q7)M8xMQ^V)@ZPpBHgsJEKw!9T?@&@;d9N@bZh9@t}T?AZ1gToa&F|P8~ z@tnH{_|ao^xyx<*!qDZ8#XXnpyct&UYO=0ci_B3xqIRcbIdf2ueR}Tx#5H5o(X*R z^zh~00$dw|n`M{VYI?|Wp9X%^j9PMcal;48op>eIrhtox?E>}`-vMqSndr;_KU)iY^En#-x?TQ5ZusEm>m$Igm>Yh*&t3lQR&KD|BY~ehPnR2O zxA$?k_mP2mON8E50iQiTe7O$*_r*sVcZppt@)J}0y;dFbXfqtTeDRRRH^A8`O-%1u zF6|xMPji6ZxKQJ9ja%bqxZ#7_YdP@i7ioMr`_4VUO*c6HUja?b^KRt^%N>h*xcist za&hfi-Pd0)ObyT5?}`ze{@s%N-Gi zd!Wn1m%Ar$oeb_-tu7Ta*R9;({yh`;Wd@I>Ta4>^Z}=P+TY#Hd58Mghattn<_n7T) z&$Z9vT0fhN95G+HwGR&4aUZWI+>yX-H8^GW#~q zC~qw8@oxQ4m*=zl;qK7nB|Z!IQ$N@EzuWbFJ~TY#UIhFTD>XixalaEd-vNzVhJ0vZ zD%{Eq9zPLRL(c~Ps)nnWA#V7_r`<1}I_^d8h{ssxam_N;O znXiNOy#@Gf&uM&nyL@kG`euJU4g8uHG+x>3`&*&o6Wic9>m`l0d_v(jze4_xn+6bM7awKNP?oI;iEkkzg2C zyk^V&=~W0HFgT7*now{DkZzs9r3flC9QWXx4GxcRVnQh|4Y(x+XX`T*+)Uug4Q@z? z<*_|@PsJ|pKM2#fmRD;Z%J$$rl`Qk#{yITl0B`s#m-ke98l3)2<^s4{ zV&z5XeG%o{1DxltTEC-0#8Iyin5#M&+-|#FE_ZvL3Z6I9fPeWjUG8|h+zD>@!2K%A zuLl0G!6(_}PjSNsm%kJEL!ayN%Wb@oBY2$;##4o{<{rhZ^}weAAMu4Qzr?P;Yx!uT zTJK$}fxpqwW_3kpS6T`U9hng+x z>PUnaeI3|dq2QJSH=-W6J-~IS2ac-z?pXM8a<9F!9=J;29<2v%BXBPt)^g&JK};z6 zJObQP26xeYk>5Pe@0nH@TsZB{@0pGooINf=k#iAnI}I+JeHg!Idcxp1>(Yc$9=~TQ zu19(No~c(oaK*qitp{!`a9@~pCmg+e3fvZh!>eR5q3ER<*11LXC@%}RdkyZy#me*R zXIz)(oBMg;^y_WFl^I+({rWU;YmA&5LzJ^8((!wy=BEArj4?&ys!v`@tM&eo-!pAC z^XRIJ;*r>V7rGX~W@g>XV4*OsD_xX%nO-NqR|XgxOlu8wu@aqPK+zMIH4_wzbjEMLRt zddYP!xgI#KdkF@YVDfX-pW(ASS@-IJGJe_}u8y4Tw1B^PW><^|J-|S4};`DVN{z z+V{utb3kHZt`4o-I_8OqS#``4yUaQ?L1%w~{&K#bah_0L>HS=>jq|$66}+CT0w%%W z=h=AUyUlyl;{n+D2KQhXIG$S_t_Lm+xNb*vJ*S6J9-m{X>Vew=+^#Tjb+q$?{p)Dw zlP2GA<~_EvEsy>D<~pAk{m6WP@McpUUX6;m7_KK$aXnaJaPs4Ppj~lwoS(6sr=HO5 zbu+>=?)cz-nMM3J8qc@tG_H8fmikjk3F0e(x9fZHc_UEI#BTw<>c3I`Y2a5I{Kfarm_+@~lcfHL zvhho#_7`a9y6O-7NmKshF!APVO-nItb3H3>p{l9HSTsnT?iLgZ5NN@P<#^Y2ez#X?erJ#ba_R4im?E@;kbH zr*yx2`eJg{F<$r`U4m)Puj+y4cXWphewvMcV~orGD|o(Xhb@`!w3gr5uj~#TUjTfz z!8`5zN$B{sz*iakQd|DNhmJo2{62%9VdMW98lL@y-_bSwFJ1q2Hs1Ib+HdhYy7>mz z_hLB1XL&zQH?so)9{I z5%9YVex5D=l+f{efN$}=u78D%pX-K4r>M2A#o{H$aD$&>wEoWO;xADDVEt7C-_+9h1@$O@C-9>@8t>GW(9flL3vB;j{HEBzl`YO}$= zi@h;T%tLN?6jp2eqye8Cqsw>hIlthB5AJ`}z;AD$@tdXe3yr_vd21)|2@UIykHAZU z)dqjuF29GH{K5K513tTvF8`2??-x408u*h2pKAA?A#V6!{p|!EzqBds{hVEXt{Xm3 ze$Lwwm=enjUjK~nh4hcjqq!&A6S$1Vx?Jac<0iLq1KW+|&IEqG!C(Ad!TEBx0JpD+ zF85)(zR{tT8)wq{z4v`Qsjl-5pUyv==arGj`^;q;$5BG#x{heJJpV68c(1{sYGOjc z?Lo?Q28XNEA>+8DK5TG9!oczT+b%EEeHq)C=if1xYrSNKSRUsko`1JAxc(Qz)$!bL z0{C_Y-`d_6n0$ivBN5m{)Y=clV=kQ9T+2P)F8_F*%e)%+yiECvfnQ_rqiuZj=#cRn zf!|ph-!^po3E;mp`1yAEz1{G^^FlnT)cHzXe`<&3V*Qf!E}$w5?l%O%#JI{GxSp`T ztOdR#%yNn2-Y>ZxIKKD2%;2z<5OcA5vOK=`we=gSeu(3H->s%yuG7W2>(%dkg71CT z*8|7*zAFqaoci&-Z?VCx2}8~T;6APgZWVC#X}<%&+3gq3z0z2m3!F4^hJ#B3Zm+?G z)9y2YTWxS1!qDdy;Fi?`cLKO7gX0!~CX{~7^N!)6mZ!7T_nv^uFu04(^M3t$IdCHk zuG-}1DyPA5p4kK3I)iJ7xt_)y7dX!lAB)6gX50@I^o8&!%x`^=@elkwgAeCBmulcf z8638*VqE1me3rKjiEc5t!6x1n=cnJ(NR(}Ge+&^9XVUrYlO`tAu}>O4Pp=QxUMye3 zXFW#3W*c0yFmTI}Hs0XEd7s36QfxiS<38!=gSvj9mdAd@ebO$2bKXn;{O*v}ed=c> z@Y@X@p9qO@ZD+$Lj_?2MaT|{?O(;0-lkENxPCw@Fe0DQ(hPvOSet1vdlo_{$ww%8j z;i8}5ak~n5`@H5$spSRg84);cS^lTMzi!TZdSh**iAi-UpF8rv^P)KHGlo~|ezBck zn3$*C@PYd(sXy?u%{lrU4R>#+I?lUR0l(egqgg$en1|fT50sz%g!`n8ZMFPQ+x3@R z-~^qwVR1Fjd)y~A>!5L&&>@X$|ElA6j&gu+-AUtzLI%ONa+5o_-IoKOc!S0_H5(cC z@;S4fKPO|o4*=gGN#iF;=@*h;*PA%L7aC)54~B?iJEsA+#o+LlL1JR2+!azkXSvnD z`+915L)~YvT)r1N)kEX(*GanE>q9U19Pq=Nh_M)ZhsOWa z?%)3&=~DmT{#^xl7^(j&xgq26 z-#plGYWx-Uy#Di1A>%87|IFZ>-}?*$zXkYHxw`yqcEA6`t^C0GLE0bqlF=GJ%x?cK zZqNI5v_HCZ^;nHRWb1!MXwTa$zY_S?#Tx%2+JYt~H{V5n!R2oOep!XaJLk||w{vh7 z5cs?5rzwA>#y?=|Z-^V73ew+;$76EZJ6YrKmu_NW#=7Bx&o7ICpFd6G@t27j|CSp* zaNKa7+z9;E85$qzJQ=5p3Hbh_z2E+p?a>Z)z3Go*O!}DH-Q?nc3Djo+Vx~SCo?NWY zD%cSQmyR$EhnASy>$8cbya!;53~s1B{tQ2OT@TbF@y&o)^q7|S2fH1@z~=y;@r1@Z z^S3J=ovqe;h~>aHd{X28VE6yFZs)pz@>6dIfS>n_#$RvBjrp}3{(S$9MO~*G+-w`S z)D0)&#`*r1ddmWStHIxA<6Yms1oji+7Xg3L;Lq5262dw^fRM%Vj2=zzwxztnZ_ z4IOBkiFK20dl#Ney!&5RnZ&U-f<$jHuVB;#>aDnYj zz3l}4@BaDYO%t=*t^DBrng;y9xf*|ot@p1&$MYO8 z&OAr_OBb(VT<7cH@^=Ei*WjJ+eXn+#pMvLI9ue#{&u_{eZ#~@b!Rrn8w@Vi3`a9T;5p9ZgXB!1;#bZ5wRjdX4)fF*Fy!QNGi#Pa523 z#LxucDEM42)3-w~<2hXpd!Lxv=}olMAL-ke^!OoAlXk z>Dj4`{6~;}PKfEL*JhZ5)|m8LUGooYcj7qzx7ncev^@-5HE zfm`;xE{}AmINp0*WN=Tp_P4-!mihBN(5X$jyctw4O^}>{IQEAE;BMKXas32T7w&v} z@w@ziVWj8$KgOiD_kBTfnR1&MzxH^ioN=%TCZ8@Qom)QC$N$IP*#}frza|8v1UfD85tRwYi4G@_h;sPE^q>XJDE)Hpo=kmfedI#=wa_0z{XVTIPno|Rc?tS5zKx=OTr0w#4gI;) zpKuX&-3HZ}Gl>ao3Uy09?JsZ1zVUcY((i(O3eR(hW#8hu0utMx zztZ`KecW-Ae$PBfi}5$LKLz_Gw4W@A$EW4Uuy34yIqxpm z&w0(H|DyGV;Y+^P!|pueJ$s4qihV8Y%RV>p{+Rh4d2VO$7sg($t@3IA_1!JZD>t1N zPl5gRFOB^y>%3pt(z;ILa?|;T{h2yrztKd0fpTwp-ee!kxUI&%lNJAKEu~-Ad(Svn z;=dV(dhxt@>K)V3WL)9Z-o-uz_BBlZrM|CG=O6an82=(G|97@N{k5>4O8bkiTQ)7f zo6$&$X`g1r-(voo+NZ$2lJ={Ag#CKh2eaQR{t@=Iu;0n@pLS7u6jp~lD-iMeR}P5Z6&u+OLc9hVrt^gFd;UvBFE(-(~&odxGtd*EVx zns(JzySb+I`A&rW@*O5#Yo4inbW8S4=NH$&{uJ#m-tL-~+fmr}e8a>)?xOi_YTpA% z8bJGHmiz1*Gkw;rrk|cZ_$qPRbsavcH=J5 zPU?3D+=LCMT}P{aUDHxN8@CUMcO>k){>_wgYx61b%5yu%cN)9pVEMG~+fuxZ%UA5> zxt)QGw?JFNzQuGmwU?=q0@{1tOY}`l3+K0Sz9s%}*x&e;N&oB8Z18D+bxY}QJpV1_ zHV^hCyN!L3wuU|Zrq`AFb}4`V%I|GsH^OR{pSG0lruF(9?7QqS_Cc2Ymo3>hP4@s? z;@iJ->FJige>IhMhpc+`MoaNFPPdfTX4tpgYvOHfJrg_m`&U)(8oSG^{9dG-#jeMd zm|talt+kVSF%fpN_nG)+F`o9nYbl>i>!tktt1Yy@%S!L6X8L)!}_(e<}4U9Cn8p@B0^xS2AYSEoZ}S4&#fl?3PAf zsNeC7M_#P=+B1!QR+urL|^A0`e&(s4Sws7clmlfZ>94O-GeOWNiD|HIR9cN^HrrR zx1BA<*SMdPa*+9|3dVP3i+1(pChKh_od2-yBQI3XHbXy;^Bs4!n4kLak3xU_CFpm? zC2|k-2e%^paOhWGg1!s-C#hf8ityJ!e-q~^tbVjf`7j(Q|NYR&^;AK z_{1d}-yFp_&}rE1b=;DB`_8Ac*g+a&*2U9nSq8w`WnAvknxlI8UG;t^ZgB2-`qKw}*+W7wTyV37K|5p0_=ntkplKwdQarCFschR3iKbQUz`YY+LrC&;aEB&4H z_t3ARe}sN5{nPYyXNhw4lTH(#&h&ptzZd;r`UB_>p&vweP z`s?U#roWwj1^vDB579qHzmEP{`u4FVA06p;rT=UCH`5QLKal=#`Z4q;(NCtIL4P*= z`Sc6u7tvose*^t8`a9_FrhkBbHT~oCPtiY5zx_CqpHB3<)9*AUIY(O*V?75x(Wo9J(&|0ez7J59R{++uuPiJEZ+CYgTRuZs~*{h9I4b~b(< z{r&8}57J+KwUG~}A4z{4eYtCpPsK)4PVOmehqyqy!cWR zUTG_@JN}G!_;C~C1p1XVhWmYH{8{u*(+{Vfl};;u`%5N%>$sJ#)70k1wRZjD8V)E556|;(HzYF8H^680} zKdf;<(H*RB^jF?)_yqre#d-Rcy_G-r-x`;vCAWO*JjbyfyIQEvR(QpuO?c1!d0ns- z#*gt|d$Ck*q5k7fI>$-*Om{K;GWvD&t@M{O{Z_vJ;{^OKfd7@i|4QJ0CGfuz_+JTJ zLJ3^;D-}H`Dm<>#7IyETsKI0Ld;H+^_V*4-?OVO?F*ZIWB`rbSHKS{RK0I!8P+)9qLQYQnWM_6zP+$B`iOFhX=M^HK+yEh{&{*lyFC8 zLRfG_)QIRClN7;@|b-EmhL4h$NqmczyM%v5>sTd_EJ!elU=jfomI4R@IdFQz?@fKXg z6g8vJY_z=*P*Cr*)W~VBC`W?Bne9l7h#b*3EE3hj;Zkn?X~Q3WuodT+ptVJ4dPZ7; zBQrBBE7O%WeN^U@Mn-N=?i(6~IFUIyY1}S=FzZ8<8l?-hp+%px)Inh*BAhTeXB9wk znQ1YjB^{w@sUy=eGZDE{l+5cXC9MsW`s>_9J5pVZ64}0COwfsOPIshb=>&2gh$n%e zVPWwJ$&O)Y3!bwmZNL$qA^CB8otqy_>qlZPLX2%Bg4nrq7EY&s2;Yv-){1>Zw5xZf!!^tq?FvajJ00eXh>nL75t4+?9eo=r&OnpRXjf2BY`9}a zmLqmD`n6$^R^x|3bWm(WL{OjDQL&~Yk4;TWbfCFKLJ-{t^|;kx^hFrb{++la&2q#} zk57-_1#L8v3LNG{>+VxcL zHOz~vPoiXTSafi#uI+-{N!*b-rdP*n<YOy#Y!h$67(0U72nx;)csxyW*GGs(gZL0HRT&I1lxLUI8pPrSO zjE0slO`;0AcvPl9deAy|OjhuhbaJJNONOPLq8g8i zO>(9nQ@WyFJjbE2(fwdJ-JIzQWZ8*0&|?N&VqTpnQz=jxknma%?doUsA-YFqZ`QEG zla3}ZHX38g1XqwWP@EMh6i?r+Pm|7VgRWT4TZ5|cQ^g`3KKgkXe(D|{BM}#h!RiL( zBA^rKX<0v2#G&=IH!IbN{`$X^!KU%F(9h#6{8x&&Z)|jIiX#alQbg=2Jzd!PD*RKI zY(EsNxuE^HQyCmKDl5h1Oiyv-I5JvUS6f|++__D!RIstXT7e%ds&s?SGiFWh8)+B7xWYEd#5tl9tVB(%_;Q8Z}J z|6ddLpEa7Fw45&7oLZJI}Y)cxL??joL37 zOLMghw*Xa5rYIV8c0VFe+=tf>#Jz6Cov1sAlDkiTTs|(;?_VsrR@aV1G}E>&W-YhW z32Et=@W$ko_uYmQ17*x-{HS0reWZP{q+YO|qAE2_CgvPCht=}zgLg0A7rlIMYk~*R zY!BaTq5L$lwWi(Rr2O}?+gy`sz83s68EzV13%xWljb8e{SM)!kOa4hp;DYtK{#5Jc z8Jp~gPmj&i6BffFoe|lX`NL!qX0+TTX2fCCoT->b@TjHK>&0LlL^l+4X(6$(xZn3o z4=3u5Kqjz;;db>BW)Nk#B~? zxZ1b4&MdISM7I!@wJyqqIOsJOW|?_v#JZlujB6pZ>JwJnCWYgg3r&m6YIi|911+p^ zD>b9Ejb5T3JtEo}Iwc`33oCe7tW`70JjXNpBw)>2R^f2C+;bRnDp<>KYMC>23N#$? z(}yMCOavt)$7f(RKi=ue9F`!{hzSu9y*)ux)CYl00TO~U4SG!tBYI=cfQh!U^)`;Q zBx6(6YMYRxcqdwo`#m43`n zyU|{75$EU=nCOBe~(lX3sZVQvgQKnLrcmnC~ znYuTNB(d?SiCDg3c#~TQ29<~*m0BV7#{%edXDT`reY(o5<0+ZLkY%sF6^pc<_L^q3 z*BA_H`@}Mv)!JU~Wb!PfIdT#l=`Lqls+`uEdWFf3DbCbbthOa2i=?hzk^ox_9~?R9 zSUYiGE0daWre5kmRy|hk_EJrBgh{fX+bFW!df^m@t6mnH?!sm$HKU+jo`J0nsJ(Ku zu>Pp$Sg|>lI1{_Ja0y9>&vc1uNqgCPH8%BrEWyV{IWn`RJ7RGvqv``I)f%yrXE`#` z#G=fwZ1qB!=QwpR<>sKSFQQaoxPC{MTrosYDFWHdB~T@R4L({@twDC&h^R(L%0r;e zg80P54B6)<2hYes6iUNm?#s+Ej%!;vA!#kPRQGOLZw1jzm$D?z%q@F=?Uptx12aVEnCN1A)FeYnwFX3aHNYt zr5s5&r>#o=Mh0C;BC6Ji6Nu|72A?=TlQYud6Rk5>(?rY(XtAwpB9xJ=NX|5oWICr{ zQ=Z7&ev+7mF-p!8@5jJI#JNqxmZYGO1PONO>=rgWj8m0~*5FKXnhR}1+0-dt;#;mf1`jB3Kmr#l|T5*(U!oX9y^;q43l=2Wde9`1l6sy3=!>;yGr zygJrlczkv|>f&@w>Wa-ubj7M4qOj^8t4d;~Ct`2IJDF1xr^TwGvk{4Li6TQydwQ*2ba+`?#EHX~$@nIy^8& z?aQ+%-=IM*Y!pq7NgFf0+79PM@%$@tMi$&`jlHqEs*YgsDIGQ|*G(2R@EXJq@eOuo1xZZxj-Hk8W`=O$l{gKhBiII*BC-%Z6 zsx9^)^_o2dGVEEDBF@N;PcbucZG6=hJUi@Dzgsa%Mrc3yLOCjCj8^&%5Bu*FCG5oX z-mCbWy?%3I9s=9dQ~9b&aSn)cNX!tF+Gj^5k)R~mrHEXfwkw~oyHgXRvE>RW{K}4$ zNk|zw#)lD7jo66Pu5GO74n8*6{&dRQ&#CAv4jIeUXrzOrd| zR~s4nztcvx)9#1L@f$_uW(nyQgcOV|YurUxU)$89Z86|(=6FF{U$ymC*zO8~EzX#F zrY$PHdi!UpT_5%LwxQ~1+b}hMM7Sy%5v0mTSm*oe(NYI~7%e4jHjaMO)=KxcqkZlB zCAj*N;8bVZO0mrw)jZ_;HteM*JibS?s--_{bW~CglEXO zD^|LLzg`}$&Rkx<_k4K=*Y;m-eF#Q`Ve-sFlmoYw4%~UDeOC-qRaZ2)rWkY2 zl|@j-h-yzqY*tnKI{K;tJd)@mI!4;|47EWokSJ0-%Q5HLsT*()1Iv`#FCO4!5U6pTcX?jMOaU5!wJP_ASC0*)NlIA=0THy9M2@s=W$3K^>_P*sA|0 z9FUEZ5$cDl^sacPTJ}rj<5Z7#iX7pwgyPw2eAWC&oJL&OWDj*#CX)JIC$m9*6gD_E zTC|TGp$>LRby$@e_NQ*eS-MMV5U#ghb@Bv_2L{yXPQL0)l$^^LC?J9e8LFY!7F~_| zqUR9vhKUf!g{SoDQQ>|1Vl0-95wFYBOO%& zx8~*%6O_u&1J$QL?`IvBdmD`Ty7w^$(9~kpYu5&;2X6?Gknb5?ALcHE*#?_?ettJ+p}O zQFjf>NGfoORH-8T8T6w2lyt!4hkv30| zv1(hFV0Exdll-svd64>~Tc9fXg;yEWHY$U|*D4?6Apxab*(Cu}Z20kB7o6GqaC$3| z7^y#M-Zfq&k=L_vJ{O?Od_0Ll7^|;on9qNsO4K1RAJ&veJP^_7^7HvMvVAiG+taax zX>D!gHquDhd9K?F=1hB{Q=f#SZ4;+17S7pN^di00yIlj-s-O2$3mRpw@LCkk^+A${ zw|a%*_B0jI$gKhPTVdO$(g{77rKv76#AHS%m-#W)sE{?DosV%=ymp7k2Wz5&%sGX)y^e0Uv;i=Ht_sR zq&!n#{^xjpNoVo+FQmA?zXAP+6ZPj(lRU3`i%G6%Im!F4M|H((jy&hhH26*3@$^x` zw80r^(;TVMC#Gh*C?4Ub^}>Y^o@*qWcdf^ADTDU! zNPbt&7x$oc%Q5&} zi@DcX7S6~7r#b+ug*_6~zhLFgM?7srj5R=9pLSn|YeC7c!otRyXR^?JPC>V;FWqQ( z1yj;-Ya1T#ijRo0o|}o9sSZrR#jL^f=Y^IlqH=Pa>dyg}qFt73S9y|9A1k3!lW|p& zpgs)9#86sN-{9bTzqYH=MGY+?E-8Jhe}!WB0D)8%NFbO-dH+|f>+6>HR6eFC>wXpH z%1A*%1^tK1&^u}c!((8AJK-@{|L z@K$7N6+*R31&B}wddNACP;0K|Xl~n0X;{2M6pNfDQBHNNhpy`gy+|y5wWXxjsa9RD z%}qpV8v|)@X>h9dZ$cKIHd&Met1Z_{dR3+5636YT`dM+0Yq#Ke`CX*la{1E~?9e=8 zkn`7LO$UP+)0v?m9YKzELDQ}dX}5Z#4o$mrUzXp+Tg6=mSJ^Yw(dI{*OK*|KjgWKo z>@DcOag~U$t`^x*7+yNjlVg@cccJJtF~GbvUaq2ema)D=*_4b?fLuf`c$I5B@_qNW zjUtmv(|Q!ml6_LtnabU(*@5v2E4fI?Zj6aB?z^;T|JtiQEAHQ+kgBAxt)T$dkJ2-5d|xjdcgR`4d&cfeO%rYef7~3M{?OInZk#E)rKjVvA7nSyO0R= zk0K18T8R6b8(N6_b;Mox!39$N;*Bj>z5&Z(ywVM6*KWzj^1Jk?xLe`k7DM0VsG~PV zL`98>ick;9_|BjsrKGtSEs*dB6=61Du@=I6x+&w>(r<(Z^Dq7ZU3Cy6X|gnPDaB}m)ZKxIW}QNE2WKfJj?Ktc;c)>oaJsGqdjl~E0*WFrVOk{yt^Ulhqa`QsB> zazINCL9!6Xa00iBdrG@!cggRa`}FaTwEL;Jm7l}4SHo3pJu9!n)XCq4sN&o7v!!a! z?bg6vtsZc(Cuh~-dA63G1XTOy>DpKx_>=72Qu}+OZeL_CtU4L!*@%eywjgE4Cbnm= zW`2REgRr0RSf4(swoi~MxC1xR7k+N(c+kanaTeWXx4Y#JYWX(0dzU>2jUIu+ZZ6sV zRsRT_Z0}Ov2M4L=LVnVH$Lcj1Z(elQ-Jae-Dlhbcg(Z*Qs=c9oR8^?mUZC@M(O{nr z2~vOSd*NVZo8`0p?Dk>_(&tA!r=ynkY4CV;lcH|+X+!n!bme=|5H{`d(xfyub5Hm>TVv zF*+?sRV=m*N|=UUGHo;}J_n#B5$c=8HoVP4bRNgW((c&~UfN%8;+Z=T&m%k4_k%-K z;Z(c*;MY=oNHv~7I?^BQx4CEKah8n6He_MhziENTR+rt@f`#X)%N?-T^NnP>?yT6g z`T_3qw_Vy}=PGv~`u*=ErujcGh3Fc$+}=V8Jv)FakiuG6z& zZ(-i_V$bat3~;Jf((LwK1rl1tyD?X+yQgc_{o4Qh7N@k4nwYae-+kGJrds6n%8lv zmDp>IIUlp2GbAHz`Vg5KYUN~vQ0@Ptd6|>k%h$h` zseX9=#pwD?6_4E2Qr}enf|#o5){K_=(538H!mU9JXt|!%!k}Q>W9wCuFf-@AGd5V3 zzT}-u@~#lIcZSy@Zjjn1OIn_#vY-%z5SEpZfx^|h6tdOhLp+OTL2BNec2z6+v-edm z3<*+i-HA1>p<(LCP-Tx-9}P*&NK2QuPdU|VcV;Hw^*s2ElEKc!$?C6nN;%3AnfTZ; z6iWmw)jnZz%j#6;hj8u=^T+Pj4QbuBRiZws-I{Ik zyW}t8uKKIwLGG3g43&kzL(tuUW4LqLVI+FYZ7nA{Ro*b{&5$0s{!jrb)e&gp7Vr&m z*X9PT1v}S$6&s2KMd_V;hHi!J6ykTZUnBhT5?cJBuC3eNRGCS zu&Wbt%vWf`2+`g=LgXKeMv1&9$yk0s+zPm|;O`SMh1)b!YJ&sccHdR6*nU+ zr`kU%5C>5|qGScssSb{6c`wq2F&Es6w0R6BT=a$`J>WxN2S%dY8f*dj6zQydU-FAp zWzXs$s{Tj}`#gJtoLDACZPI#CF>2|kQPI%|?730OXAJzON5#NB29*;~v8!`haWGc= z?sq1-k|EnOYAoJ46B(ZoKV5fm>SM$^zeVwH29`Q}D`YIVtZUqU}1^bq6K710RT6`jNQ1kBGbMU*fty z5w}>ob=uu>3`gwev^)1xDWdv#R*z|B8&=5}yFC|*cKbr@F4Jz2Hr4fijMR@k&??rF za*^0E93K;|)?l$vZI2Am)3WNHQIZ99W=v3o%8gV$SggZ>RbeEOStAL_R!hLEz$IXu zLG8Lf6PaXvQ>4UK26-ut+0_;;ks7x<66aq%jb&}q$LcN&Q-6`BQzbrl*Vyn#8Gy+I zDRv7)p|R?K-jsms{q(W|E_9d{mH9kezB1~sBOlxqDwh~nTEo^>FaG$hAiYxg>0R7q zkgeWE_?0I7&m{|y*d8ohL4)Ac<57|x@1sw`a_tGp;+t@B?bG`z*f0MzszDyJ)mzX# zrgc|+DHaE`dlarr`h5}Apl?uLL-*`gqLq76+~R+W7IvCp;V;^ZOmU%$Rfor7z6(90 z+3Tpvq8qd>wLMx&d}lQ3_-P5m{S5-KTa8M68SS-6Q2jd^yZzL6(P)b5!5EmG(Q$t( zZs}P`fz?9Q@)&aqw-Rcl-)V(&+Wj7C?e9dVg3`hZ-ojPh*ysjSFm@P{tCo+I{Wl-q zqxblDuGczC^Cn=!c~(ZMT6=F89=BEQi48aU3`$8+PfWrTAmTx9FR}R!aXL~G)$3zD zyK_Y8oAK609-(KjbqtGfPP~{(?H!8^JaVvVEXw4(gi|~pe^$4H)XcZWx$t5k^~1OX zwdfwbsH#dPNC~SG6S%9x1QUqe7ny4FL{vq2E2Wx$pPAVYRGaThj?Wy4-Pw*r_2zvt zX&a~>o@D0N1J$EgQjb<2jnl&twe=pu6zyf4n7j^CY%-7(HYZ2QP`1gg~&&>Ndz&fSe51Jwtx za4)b+iEG!LC)U(?X1p0V1ghu9LjfYRrbk5qwZ(|kyWdD<3JQ zK=sLZ>)7WAp)_AYsMD@{q5O6)(qXO;x41~$(kCVS6!oWj%*=D3`T^x9lPIzS1n1x$ zos*ggNQzeF#<4*4&OI^~3{>w)AwYzxv{Kw^xXPztRaEEi8HtDU92uyVsu(As@+qw% zF~|m1wQ_>B9c>w;b*pqR#n5SsRefg?PRgMPW?42+9YL*D@7#<2BT&`c8-@{+3yC;& z@7>s~fD)gG1UxPFm8*4idFJ$$e;w&@TVG zXt@6&ZryIJ{f>6u6}NJ)xW!eHqLFwhUW)0Tq(4VxRA1j0h4nrc*ZZua-%27r5W|8G z#VtQ9ZfUhXazxzfqx$zTaf@rT`>GDO{aQ z2vbWE`(WcqU;N>Y5WIzR8m@RJldwfgwlihv3*ea~)kennVUc6e8RETTsR=Uj+#VaO zwj}AXyO-pAQqXif)0T5Dh|Vy_%Kx+-&d{6 zxAl)uFFa=Jhnc^Hw$KQ56btg6smTR#5krQJ#Qe6q070FXKz#Z*(-WrSm9h1MTHNzF z)rPnbwK)!>aQS29KB+kQ4OJqiVl_1`-Gyxu^;hr65ja`{n-j3XMGrf}?P@PvOz|P# zy85!QA>W(h10&QM`L^JQv7-l%89O@MYy&$~V8aU%!^iPpggPNfUHJ_{(R;x6#LK8; zf4q!P4#wj|o|jmPeh~K@Ts`Kgg_3%3vYs`JRo}(SBJA?Xc6Hd@1`7H}*TGl`0gO?bCyaByr|dOS{|*W)$n zSVAyw2S&+*E70uit!bWUajDt_xeM3r_9B5+Cz!Y|8f1PVMsvsm?vAv(UGk&v)ZAEg z%vSRuuh5b@?H10n4C=-n;#H23H_#RTkz{QBPPVJ{ zABtEXD#D?)I8=2+?2c$Rw?=+1(eBYx^8461acdrK3-{C_arZtU?v7${w?8lL!P2$} zwDBgtZ<5tRPTaz75rx`vao^k}?wNmzyZ(^48$K38sTR*WrGamRMaickDXbNV9DBnl zw?2P&ViFz4?DkV4@x?v6vwj=?{HdPX`+UreirHCh=Ee+V{ug3atlcv0)@irkghbKs z-Pv2FnsFkwC1ac34%n7J$8N9rQr!6`q2De{t(jIIaoMyWwY~nu?U-;&kr}yIwJ{~6 z^}88AN(on=r11W0nxy`R6!iJ05vzLh8%bqvldxEaRK!eqZU%FN&94Ap3h=vW=#9+& zzDE$y?(Za^GB^H&w6$+fW`>_h;pRMn=b^W4Zae6$o!3}Tm&LvYy86IBp}%>)*3T99 zSe{r((!WlT^Z700#|lMKwnE&zBFHbk;oy1ybK6gfTL~AH zLSlX})tdf!B-KoI}Z41)MBSP zla6_3_4iElY842>9;%+1p{I1kR*ya-A~Da5?fMzv>e&oDg_nVQs8o5mu*_F)o56iT zm_40gSMFUX5VdP}I~(>gf#>a$beZX7X#ZRum>dAJnfdiHTCzU45>x0LcZ>Ok)MSt5~q3_5~tb+$*wAq%snU) zdHSzD-18Yt;-807*ztiFRDUQ2o~%8SS)b$Qp|tFu-jlh%oVQQaP`kbQcba7 zGkq3b8zmcjxoNUED@d))GM&&XE@{cHyD;hchy=4H7s2R$`duw~ACh?sM3M(r+54jm z)H#=IyjKSh&gm>qf4mnDl`u|BeP&_e+MIyuY@|^KQKa1x3CKszl$qKXhg)C$$V6pU zZ>%I^&TMF6hMt{K2W0D1d7kJGNr|6=lpfELr=swqE(<3I5=_yE+*iU=YqDk5$g>cQ zd9-YqiAPcfK*ABp<1;0mCm~sbV`yh0 z@ny4!9HG}+)q$DTwU`HTA7E>-G!{O9F^`y{4?2a27tRV-U;dHVQqMC}b7x6pxwCMF z7E5I7;VNHV^|2H_%W8v>Cf;ZM=xLwN{}I(p)bSAU_p|z`jeo=n(F2}x!wyL6N#e-R zFf*ri?t#$z(=w)EfGAH%xNTwTQS3Tz6X;CBq*(;sS0z>LrX#htp4?lr}sN zrgGi5dEGqM7OMU=*Va27cal-{H;wgU*_R(eQr9n)Q&X$mH<#%IBi{}*dUQ|qONBT! z*gP+j$Ikiyo|%JD=Hp^t@`SiWg<>x!{rf*kZF>mvbt^ASrlKB%4-> zyZ0$^%T|k<|BSf1pA+{)3GCWn<{E>448R)R5um{(-7sNfhL6RbgSp9$`wFGr}^G1fr~GD)(DBYB!a-nF{?6 zH%{QYQjwo~&=#%=B_l-@5>S0T|G{m$(5!vF*c{s>Nho~VO6Zd)DJ0=(Ny4T*B3roM zO5Q6E>g2sHvO*limHmLo*f6CvoO;m4b_;5*1-K>B^;KfL_MhUO`9R#gABuZayLpGL z#FWg{iP<1F2R{~#+9UN5#(J9PhjSTgY($RLWS^1xds@`Jd$6Y-veM{Le*Pg_<6dpD z+9>vWj!LAfKM{BTF>&*2#4Y|z!oBD|xku;Og4FVdZ5JLl%S%pwco@Sv_vey18U331 z1-(J6!Jl5Km}hJDZ>sE>2je^#+wDtgC1GZGjd5+k!#3>CYVPk=d^6wH(Bj@$fSEiQcfJjMc;7ETeW{Z$ z^x$TcQ~tgduFIIPM|)bDYm*%U_3Nj&&MvUYXa`!jhDT$=yS!WOX$j@nBa#v;Z5^XZM9`I8;$BSfGLFo<``TPUzETc@y|zegDL^pFIR zmy4XM3hf@%?z#nXWXGf87Uzpwx=^B#PT`dWru~cMjslS_TWrbp8QDK|`f(J!{t}Vt z-7a4(kRo!bZ$x?=$I+aZiF;IBd-da@+2YG3-^xRKy}%nK-_FBXt$ad4s$7APuoiSQ z&o)jSSz;TemMoQ5ny52*=q`6ZYLo3Usu0gn`8ItsfqL>$8+N=r4J}pkD8ej$O48NL zbKGw}YLnFp{m0?dl6s`$tc!5A4I30L{~TE(+AqSlD! z$JKr)lzGR*U98>Z+I2sAIYNjYi}#pdkzT!?Z^Lsxi(uf+hoD{9n9-x7BVxuzMyTf= zvo)B#-C1CZ3LiIm3}y_+MW~trTXalR#Gp~bMvjb7rwVN0VcoO(Iv{Ewn{NM2{I8 z6&4YpsuoFDYCa;kGm5dDEwGIo6m@6BsOUQ*)O-eyk)Lb~lEmRjjTH-RR%(vOBy+CB z*j9p%iWnZDK0~|_Owqp=N(^R(`app#X4t5RF=JyQ)Rx7z$OwcLh2XX=wv8P>CSBj#2^cYD7c6l$d#SBFW zqKFPJLeWM>M2(72>kDjmN12~xVp*&$*J!sy?0rU$89a6fX8v@+jKOKzE_&;=MyY7{ zMum?V0*$p2l>W7;z!o_Or57QO-(d`*b<4E7O}pjV-KpIQ?e5lYrFQpgw@SN*v|Fv+ zquQ;}Zmo9fw0lasXS90`E>6p6Dop|_TVe&K525tr zUTe2juhi~-?N({`kamj~N?O;zRlcF>G(u22mYUYT3C{+yHLCojR!iOfIKr&{#}!(C z?NaD3T4wai8t8BH=wF*zb~iO72=Ghs)NgIdhs2Lv|q~+%rJZ| zho<259E;?DwFbEWVd$+C)`3@^fK*;~r=GyCEe&;Fe8M((rlnUZ@s>&A@IsXxP~9P_ zVz=)JT%)j~VVfL?Ov`YonkQ_Q*@-8ln03x7jIq{z2)YX-#7ZryY9Lw#(Hap|Yf+7M z>$H1DyYBr`PPy7GfQyH`WN%3Q_2fvQ4ausJFbcI+@qQGSIxh!G^v@UZz^SkG=k3&= zR@mYb6VzFHoSll+mA%8LMv2i1y*wm zd^|7MQ4bfP{)NRR;qT32KL$2;n0H5DFUzB{j9R75tF<{^el|AKG0K^cfpu^s236)S zMYhb?tdx{SE3)cuVp*dt>$K~B4+UX9b=ME+*cP7-9sD|U=#ZY1o?dJ##J>VxzqW1X z+H!3}QxaE$6A#$@3T$p$ovqHN+^5thGBU2xR&5KLU%#EUxxV^Gkx#y_-!WUyB459?zQs1bEp|A|ec_9{){dj{ zztcQlzrr@F+W6IUUD(F&gio%o-+6J?+TFf>`96jA9ln0M+ZNgV^4f3n@hfb%-PiAo zFPycufX-`uHrU*4yLLL-&Tro3eusSg=6BfDer*SL`(wWT0sj8}UDNYz9kb=T(B|4| z+v>C0x6Ws+Ey?Y3(7vhdUf=WfI@@X6A)kfzVxK}=xor-{3CYW6t~b znuiiNZR-&knH;y&Lf`cC0-OAE>wo?M0mbdh zef<670^-u+2Fl?|zsLexKtN;w&Ql#&4BWO-TV%1eaMLzmV0F95%J${90w1?efp0l< z%kit&R@tW9w-owyIC+&mr6RYvee-SeY;*B%o~^{Eqks39BHQrc%i2wyJUQ3qx54J; z*TJt>uMVqit8IQ=y5OgOui^7-c|PMhb&RUC1(f=9I_7iCR^EQDZGFe$%XZlhwB6h_ zd%kUb8^5(}{PuR3+kWn4`F@An)wMs@er3CDZ4USyylm5zn|itns2YQ&+|EMTj+CAlH4&WDyiF$qdw=_%x%Bz%A4opoU!fl-Hvm#%V%rb zRkp)6zhBO^MMjq4Os(<>S=H{G-_W6*0t-4-+xFYy;!waH3vGTKIw1@G9YaIoChWA` zdTWO+UD~!y?%esdZbKsnPKaFMlTl#HPG4;+wjHy_l-pO^s(n}4GR7^l`Q3c;Lexx@ z=|SJ^mlxS~`)u+lvK?yUm*+_uYpS`b;YDS>h8FHF$8H&2Ki&piiZ50GcA6t5F^C3~KS6 zaPYZ>TsPEkC^>M8;d{vHTf?)3u`*gYPC`;@5!wH4!>h@WPF z$Y+!5$cxAW5{!H`d1#{Hm&wb>734&Rk$*r=Pckfz_DTE$rx>4bLYhlI4*hi9aOG$k&r|$>rqn=|(Oa%SFG2 zEL(qt%VrokHhgM6O7_PV8j%-d7s*0!*S%0Y{OU|(%~H<=aP5d zZ{)ILPvR@hFIMeV>a*tVtW%HNlr;}^R+sFzskq`KT(eF&2NbW^mNghDnMvf%= zOU1$`k(@}*AqW1^$g!zI$2XB&OfDgBCU>7>^eZfWz_4u6ko1P&L3sJpk$XI7*cXfb zBHu>tLT*3T$ZsIWkOz=wlgE%t$dk!E9y0bWawPc?@=9_MxrY1#Ib@!($9@i-J~w$E zc{lkOx$DD5|66h*xdYZPC4Z&l>&WNG!Q`RyjeP`p8F@Up{Ub&`jT}RsLoOySCfAa& z3qZ%;53eAQ&nuQb84J!@UQ3pRTS;%f1x6n$v6|caqD=N6Guh?#GNh=A5;D4H#KrU~&~Xf?QW%?8lRDUTk<8IS21^kk1@)?NY-s-zV{Pz&jq~ zvxeMnx#3sH=}#EmMJ^~b{2{rLTt|+?+al!Si>WdRzlPj}?0VA3Zy*=0G(3PjdzIla z6iR2f^0Z$uwIe8#?A324L={lYM-Q;h{A*+pj2TVvv z{#KH&BcCA$lU>gk{Rna;c|7^%HAX&-oJ*cVK1yCpj(OJTuOV+Hze2|Sg)aYHJejOywT4k7n7ePcVB1Z z8_3Dzzmjvw`^f=+Hu|5E2a?Z{0}O42uAqtQQ1&Lw{(j6S}u)X2MZG~D$?!?%;u$#cjx zbpcneZ#f*OM#BgUD6n`^eSgndBPsi{vxp zO0r5d`8i5%Pd-ETCtrEBNnclTPjUeH|H!?_G2}qPQHztLyjT4$w}l~vYT8$UP&$_mywIfyU8WwT5>7*@}HUXm65xX z%gKS{3i4obC3y_FitHp;lilPR@>AqG@{8m%HbbvZ`HPoVSnlFOyx~7u`sWO5vGXgHi)d4=H_AF+`TLF*TwJ%ays>Ak|P=ZbL47&qyL`84A1s+6W&0X^uQ;OT*vfI zCI{SX7Z&2|v9p!y^Zhi!C|Jw~`#!#^|eG8v9Ce5LuBE$Z_FP5F)2nehF)oA@S>%YR`wm0Zm8J=fCjZRAf_`selOP$iZ=%jb2n`oYNe zkpp~o@;XnhWO}a-VE$#I3!m%Bb)60WA32>IMXqLg5-hoN68Ov`SF*l6Lk{5i z+er@mHI(r=9>DTJx#`cZ3>T2QkSjZw@PAA8?`hQglIsEtPb9mUpA@p{VdS&OapZh* z;PpnnhFtm^!<#I9^6TU}TnFXzKDqd;;U6q}md`cFr|v&d?(!K!UKj48c?Nk$gyBcY ziNg&SlheZtzf3+h)bK8HuVIEi((G1sTWmUf8`6EH&8^DFJ;=r6!Q^~$969)avCkog zykqz=a^POW&uUgGqpgX*LKx$t9&Z^wPI)KF{ZQ^w9*5c(`E}&AHoe?gu=mU^DN$-bz!lK)lJM*d53_Cdn~$;Zj}l9LY`c@Fva9~fRip8T=l*T}ob zACh-e8~I6cC(7IX)}*KC6C;lypZ=HOH1dr{3_nV~jp_R{Iqs;DzeDcuso}54+gN_> zdYSkttBm|w@+QiI$>HQX$;%cQ{fXpi9)$W#Ahcs{w~D#K4|cB|@_4ZlYD@nFN> zlW$Bje8UYUeK)2U9!nlR&Tux_#rU2ehX)z?tK^-}8~&P{yx8zHH=6K||K9K&J>=nT!w-;)9yVNL z+5gUPIk_#$O+E+76T%FiBHwtQ;n15+dbTb!d>8rPEW(8m4$g~wULxCBUni>oJ~GSUb4){+aaCO zo_Aku`m>wKshtfEA=kDu97oQ-%J6LRcFGr%3&?9NzQX9gMh@<1xRTsUUR8_FH)QpR z;m#;0N#F2eh6Bm-J~KSZlGhqeB>Q|}_z&cD41WpvEctoz4(jhBSD!HUC&-&l8ooTx zq^I+jhJQ=me#Y?c$^J(Tk0swqIbPGC^OH?}NVpx=>v%uDhCGz~H?p04jGRu!6XV)G zhun)CM;=B_CQl_NlJm*q$s2`{^p(6`9iTjr@~r^Ig*?}4k6Da48#_`$+lxpRhmH z*PXtav&kjom#M!7_hs^Vm+V76LC(f~k$k%LHQ^WIK1)7>$-&(WPav-%XOIU_KaZTq z@$E+PQ1W|ZKk|3vI*xC<_cQTN;P^L`JeA|yNb+Egf1TuIp^}E%Y^8A8a zchYbhT-T+3Reo;xT5?IatPy}O8bQjKbM?Kev0}-X}^w~dfdeS z3b_mAJISXhf0yiLc^xKKB46_9igA;a_rP(6ZzmVT7@lM?`UUwcBnM^~-b4;aGkic8 z{rOJz7bhsMzT3##{hx`i4%cb<1XzsgqJ6 zLzX|uCZ8|K)f|6b318Q@Sw?;nxir%79pvgL!!g3hUj_4*Xz4FB@@z{#%kU%Q0*)u2 zCD(C0T1E~?G5TMVD_=I;?hcba_aejH$OGMm`;*lW!*`P_M;e|^_8((-KH0s@@CtI| zP{UQ^fcp$zHqgW$IKuEyGX89w{v?tMh8uR1qj>!RAG z?>Nglm^|QaR8o9KkW11vs&sPUbiCh zZA{N~!cZ-pZuI+;C$hanlLv;I_@|SLSpOa&4`BU%n!Ip~3GX%XIE;(rb3hp7QN{Sb zqPzpni+nnv-b;FR4l>-Ee2(oohCB)NTs~RC2=5TXTTXe$nMVE+`DDJ~zmad=VA6Mh zynUJB&&b_apU#s97Z`abl!K&iE89;mVZ>j~`1?~H=Q8n)AWx8uU-;Zdj+tlVv&kDu zjeG@p^a#V-$-xVZ{$BE#^+x^)IdPU@p9qt_B~GLNdvYh2k>5)`{*sZWljGR_=8=ay zYxGx>yF6+5ZE{Mn;p60Nl2G`ZXlm}#OU8azK!i|9C`1fMxI7K$o9Q} zoXqz86uJCPqrb_L4>$Z4x#uLq$H+-@3}1hzNuQ)sJ`VES35K5_`$sZ-a?M=BUy&!U zKM8^_`R$o%{pCyK+RJ=& z2Hqx@w>SJTd5E9kf0Nf!ZXagSUr4^1ysm@M|1~*)_oqR^?XaJX^?kIKyVb#0P5Gsh zd%a@Pihj%TIF!8mb;If8q`w(n zOMde;!>^J1l^cGS9P)?;w|v$B;Mie&IoK z*TF{rWpWASHRSE&YfZ_1BQkled!RP=7DE2hZOT@|)z7 z6b=+7kT7YhMnYPYcmlP8j&BcJVT;+N~DgqKI& zL+(UAN)D&}59B%IE_WIG;pD#L)#NecUA$kJLB8!86aP~3)SnrChV0kH@Jr;?4*sp-PsnAQuQ)?q$N7rO?>6yI;(WyoCPI4{h zLmcFel;@DoaDMtx@{N?QBKIJ_Nbc6dq_2v6l;z<&-lQk#dL!>n?#lfAj{NJJjC?RT zCCKnt^1(pE$>jAsA9>{B5F_72j_GaqUGnH)!(Wm+P`~3nCVi_Zzm=TL_(zf5zcKc4 zN#CpFz&j0pOg_f>IKO*Me4$^P^xZ-jm$(8<^A;cB?#&?=HhU zfb^GneN1|XkvoMNo=4vMu_^DrlI<+N-jj^|jsZp=ud3GJ4X-fqSCVTu9=<)+$osu( z4UZs)^fjD8-mu%)?<1ECGV)vEjs0oHx0zhY z^6;H(TZVn^g^P1tg zx;G4lETMm}Ylk)OHEFy6nd>xY~5?NRao>i=xIk^8g0q>{^c zecnR$+hfw(J=N%!F}>r+6}yal2|4|B!=I8B_4}t8`=R7K^8CNBJjhin@2qsAUrYJF z$T@Es{b@6dJb>YSOip^$$j4_GdF2RG9>8xR+RT552Sq`VIPdYN1OCS z3b)0>?cCoyne6_Xk>5{_=YH*c+85LQS<0`X{YG*Z@-}h>_kaIg82KN_{2vuY{>z!Z z)8qiA|MDy&kE1+581`<;`%@mk{D+Z?$&uu0hbh1Ng#9sp$oQv{>&UaoiuZ4ik;^E5 zo_vP<7TKTrhshO`t85crIr%zrd+Og#uAzJ=xtctI+>82n6|YYJQ1TpdBzZBpiuO;E zE6MA~0n~qq+>cyN9!TCx4kRBXcO`!-jIPw*$JCcL_ZzMwUq!Cu`uHz|QT}nX?@Jy} zjszn(6BwG*G{dH|2G925d@ru>;(vSbuXA+xp70{QIL?dbd2xvsZ}sB8d2yu|f8fP6 zUVPe%eP=dKZ>SgNc=2;yT;au^dGS@V8izl@i2Vcs;!MJ}*x5;^kgkuG#H5{}oBaAR@nOyN_48B1p73mc)amuq-zyD!0FCOp3iC&!H#WTJ5K`&n5#Y?>SDKB2_#p}FyhZk3Q@#kKw9%x*iUA_1wFTUN2 zBfWT%7iW0!d@p{=i(mBOzj^T?FFxtT?c9y?bA=aQ?Zw@__y#Wy_Tt}r@enT_<;C}S zal98hz4#1T%D4D_hi@^y&)~ZT-@7oJh{iVt-?8}KgYUigCg7WhuM9V2$RfiK8LG(T zS1xhW@J+#29&eIIT<*s=2j7|a&cgQ(_|C@nkND2P_W^v}_&$j5TzntKcRs$Sk%n*Z zJ&W%-e6w*(9`TgNHly%63tw4corv#!_>KUN#&;sV_u)GU-&lO(@QufJGQK169fj{0 zd?WE4hwt6^j>mTbzVZl8I=(aT&A?aQMd12>?Oo?@E4y+xl9%3lPhNuj0a|r^i;ukL zTs=2MvVBk9mxU~??LAhzTFJ-0p8_O6@+ag&{*pAL_m1=eq*tW(hU7OKl1nbR(%RSe z0Ri5{<*{~VI2;biAvtUa-+}O*2;YV9{RlsR@Pi0Hgn$PD_kI}RM-YA#;l~hu9N{Mr zeiGrQ5PllrXApiC;pY&39^n@dei7l95PliqR}g*`fnM7CHH2SB_zi^LMEEU)-$wWy zgx^K@J%m3%_(Oz0Lil5ZKSlU+gug)eON75d_-ll}LHJvQzeD&wgg-&}GlaiK_(z0) zM)((me?|B=gnvi)4}||j_%DS2M))5DJTbNRzX*FDL48N~6ogMj_z1$MA$&T*XCQng z!e=3THp1s1d@jQ0A$&f<7a)8g!WSWYF~XN1d?~`0A$&Q)S0H>P!dD@DHNw{*d@aJ) zA$&c;Hz0fz;TsXYn|mD8=DlzKeaQ7a2;YnF4+#H+@J*n>f8X-S`u)lJ{r|Cke{?U3 zULBpj*guM*UKD-&L|&{Nv^>{!MNzaKUqzLC9C4L(5Tp?<$E54dapNgSK7JGgvq>Yu zJ*M=CS)ae~OxHS&(*EJi-YZ-j7T=HK3Ib2MfvbQZ@T41f(hWT6dW=R;_2{7L zNu%mX!_%~bnp?Dir@aTB1|N7@d{A?1Pf+vZt?nsbk8KF*p1jpPd8>QU^?+PSJW8&4 zbnFqsW$(uGu<~fvqg;<}Ypx6)E&6P(TQ5DT_GsFpXrEHrK=6 zE$otJ*iF%E0$j`ERsf%!aLtojvOc@vX3=9cs&0e!b^I1OE317)8%b}MhjZp1a?|>j>feF6y_VH;c(k0jb_3 z$>D3k>({R%@$NjUSYJb~-WRqt9CRpAdeBPD>hWYXz8#)K69JUzLm&pWi1Ij^rS#|*p1GPW8Qy02k{^^g zTdYUZJOa;}-(`qukj3D4CcQZM>ZBiscezIM)Qh8MZT7o|UK|Nhgrj&T`^E8W9IGhW zqjH=Pac>&YG*=Z5Kti+@Z-%WUlrh;PfrOqX$m6BM;0KROEwN;(;cU5n=#HkiL}_RBrYxdRrs7TbN6>SIN=A5v z=`KbDtJSECH71dIbBr63Nq1VV^Al0TqhRr)QsF3&tz<@yN4KRDuqTdtv=|QG$nrr5 z2(LtpnTUen<7^=i3^Tnk`%?^{h>*0XXNClzxw>-4Xet7}OycQ8P8m6_hQf1Wk(%xR zCe6*)HBgT)88V2`>C6Xg^hA$n!iQ+<1`zqPMRzCgf|^I4lsA_^_Mm&w4krW%Odk}d zt36TlNsc9=GPTU^EP|R^wV_&9ij0^MXYswuXT?MpRILXiOrGc)x>m2>@t5H`l6c4W zrQ!VI9mf-I=3&Sm1pDjtXnb?FfQ5rw2+oa*W8uIn<20h#M9_L2_3@hh8eWC*?b&KH zj>Yu2`UKY=@jD4BUCae|mgqjXo2STL-_2vX^!ly?q?dW~zyo^3)&bIs+Y;zLk=Phd z7xQ=AH?aHUvL%$M2gbz14CL39N`Jo!=Waor}c(6ut-5L ziBpVqQMKNu*U`sXB^gN_&vatWj_2;hq&!rr&=ehm!+79wfcmxmbR>wcfxW(LWc4|E zWb={s{u|9MBU-K(^DujmzJKT;Y9!0?%wjdHMj0>l>Sez0$cl(Jdz%=2AI1-cj0)4j zgM;LyHpNW(ZS;aP1DiY5N0CLdeszUWwkCdsCeF6T2Bo%^_Kw+lYow#yI<3I zWI!LK$x~CBWdb1YDGVxSM?=_9ycqrv_O%%@@WR0my+zdylm2jBOXGDf8LsP74B&f7 zI2_@haM+0M5%9m#R>mPfGsA=JtNCb#2jLB4r8Q*JrWg;Dp{=rH`5q->RwaMsUCheM z+D=ALV-CtXdE}|h9nq5Sbor*hZRg=9BMw8UpY?8|wdNRs2Yq$=T zM}X;Kal2XiL`%`;!#tg8i#(ijFn3!eb-Yy2I~3Z2J7=}_ za%iJbiphe9ds~WrPaW&Jd544+E3|ph()+N8+|uuzLPkW%v>(*E$cT2oJER??kFhaa zXdc~l(CWBq`pT>$=Y*Sk?wXW&G|JG|ii)G5Z*=6#*;+Q1=0HssQ_j{hrDbbX?;6lZ zie7^j>oG)VC|?oP6M`p3EmW9hdV?9ottXDB!z1pZOSdwjfo7+nfL2B{P*YaB=-rPN zX?g@-UO;0f`ViCYu#cWnHV%udiI=fyeCS8Ac~<3bM^rc;SL$84z^phZ9UnN$mPMVF zP_>J0S7)rk8H20kJ*8=zpeA#E6wj~MH(nYy+eQi)RFX-}WHoSR&P=e8GXreq%mnKq zv)f=$3HOKJcG7*h-#d~s7l+`*>G{dQ@U(kaM9@7wIT?m$=lvprgY*7TZ+I4-6cO}J zF8ZfON4ZzAZkXno2XtrUjuRJ35yMto%(f;67cszVn!2INNOS|r%W{M{3FU<}LdU$$1==$4A2gvSW zp;BQLGmnj}P%@aRbID<<#gS+pCc6qdQs#}w!L{2a2hU6`?;(@B1S|)lwgEOtl{$KW zXv;$y>dj}e+E}!;y4X%No~Dw&*b{ICry@onk(>beBGxNgBa*jHa#V$GrE9x{Y8Ec% z$+M9t7M-DNm!eNXblN2;jk2)>$$CLshOC3Hcd~CN03(+K!){eNd7>Il z*j>g!DXQvrs*Xqx&U_4nSO>YpL@oAXGM7OvPL}OFLf6S=cYp}+}CAnZU0kYNQy*e35ozqkMhD^?cIv(At zO+Y590Tc$2-OXx+q3_AU#5Lt<)9wb##53V-bkpUD3zrv(Dktp*U@?ap48G09oQB=V zgtW#Ktw|zcxWP3@L9oNfft(o-qltM`0xW5Nu~8E)Vyi2c_)rytK6FhGA7;^On^J?} z4Jz#Vc${mDW1^~%BWJOsxe;xz#X^1mt}in!m_rXP$>E(r5@hMaO!Ude%m3f&UutSA zQr+Q*(=?Q9fdfv^R58xj#{fRc1~Lq1c`SzNYOzvHgEC38NJrMX;PBi$R4BEP-BP6D4+sBJ=Go*;FjUvzJ|9Nmnyk4pEC90!rFqC@IV! zx4mFQi*9IqcSQ?2Ny!zR!To*K@*d?N6X}s`PfxF-#HD6_IPROWV8xMH=WzAz@j(NA z!r5{o{F~$cji`uxt-zB^myEjAc1aqnlVaasNRF z22$B)Ca{gDvhhX|Hi2T25mYNAUOc_RzNhi6N5~>OEYi0YAsDh)#&g*XFhJO9WqS-z zX1*CH?6=-YV89HUE}*7SXMkzLO$ZOC1fluDrRb~VO~BdaWWCB?wHD|)(fXq>IW9*v``F3qY{*f){u=$KgbbYf({9i5Hf`ek9Pl^{Xg?sj=6xLLQ`Sd0`~ zWlYP`UaH*-x|R%h4#5%nL`ga&28|8$qUG~(E z9T;SspVrZf_#JWzIkp&673}~MWP0wxUxuqo0gU#k=feW0r!WnyUZ*#5xk)q#hNzjp zocEg;Yq3*OTdNri)6&ULHMinVEsp$D*k*Tse0#D8sB^&_6(2kg6#_K7UF^q;dsuVV z8-GH}#qOoR@~&8(?W=i^pNhRASgMr^fnF-TyyV5|Ts3+7Ss*tbsFic&63L@w_mxN2 zSfmJ^lKDDC=~L72Z@rKsUCFrqxY?+TWjpgEQ19B}<{_c9`NhbTp)+AN1Uk!99<8f} z$A02@lpJ98{~(VmW$m6GzMS4Q=efd~QC8#NkBTxy3O8 zj&Y1(Fc!3{wS1HrA@XtLsOS;NpuEMAoyVlpLgB`%E*$5j#A+ddySOwtS&dSBQ3&M- zjnWaiHA)9gA+%i@d5K?V@9?<4*=0n)jaqytjA-5>iujd9VT6og838dZz?ElFNbN$D zjx-N821jjfRWgjJ!tHpC!}B7d?C{jBY*lJAFUd1OE?Tyn3P=OTk!r1-;4|4(r7cCS`5q#)z=9!VoB6kP1f*A$o^N#(MYFptTu|+Fz%-%jGP~& z51VC6#9l8#ixyoGIczoMijK~*VbMsk5Ukq^ zu~AA^9)+*d*x4FqDhxa~Yq^Ppdsv0gRapa66H)*zvIb}hDw ztx`l<_DaTfvaRUNnC@f2yst-@c3rqLjOnhZ0-8Cab1YFKT}X~E8eX18 zRZ7iV*V_!DXgajLj8`cu$raQc&eto|-5N+T##^w|ro>rO+Vn3bJR*B01CVG2eiAt2 zX^U3I=+Mil!DJYQ&|XZ8AC#3dQo|tnn&eqoR7FdwSwuN6gBu-g6Ako$+W32nu45Ule09i$QPTEv+%YI&= zj8%SBKUU4syjWXG!OoUafNUullu3yuB`P56zEJOq41L>tf>D#vl=5oUr1>IJ2t#ZQ zas@KPR#du^>d@{*krO_fhV7+&+zo7u@-m9r5=V*#MLxfbP8HL=T}~Ag%=DQ&Pd_Mzs;>bUp_tAlKF z4|Dsi#mcJKzeqPM$S&Xz{d;aF3{uLrAh7*#sYpkN2c-?M05d7%Msgn~w6_Lo!O%ky z(lUAg=LPL9P#XyBmZBZ10hxF0`jG-D!z6T!DddaAWR8KCu&%qvTLYKSd65k#m~IKp^=`$e*7f+{5cyNGZW4YjavJXB%xdLkp1`VpD4BCpDX_&*_lKa|Ry2&J@s&6Y7--E2HH%L1 zd3D-`O1Z;%N)cAO$D8Ro!HWJpCY9yt=d;wErzGr_>+aHfo^(D){ds}}AE*XBA-xY& zhphg`sY0;YwuvJ%E(U=+%?~KIHI=8N>#ae02&mhtX~3T+nSu(0ETRfOy8zZ&`EdPQ z`H}Tfi_$y99cCZQaFjYqjb1AL$ESFHpSRL2Sm~Pbkl@2>p*`w& zp0rAtV@Tzg5s0b&yxGCbs2dTMJyU)bQ6!35pR3# z;q8w*_|D)kWp@!%VDrvup($|6Rgs+W9!D6edK6*Ct^KC7d2abYuAv^LjgRo5(b$H> z17{@CA+HK#sN&rdJUSBVTi=mlGoPaH*UX=o=8XJ4$QRNb9G)Tn-b6by-0de6mT8LG z${Fn?b+0hgDDBXc5c}Y_0`d+Ld4f~|-Q%N-pk)yLCAT2S59T30hQ%@w%9d%ETl0|| z>{HMZSRm6-%QQ4)8p^#iBJxGCOoXy!y70*apsS~gpg^VzEz^Z5(}kAl&Ez)H_k9{4 z^2UCGSQmii0CYz`EuP@|vc1TId-334*^#;(>}6|36psTeR@j}YQnk_46ctY1O3H-d z!_1vrIgrHiE5cpjbh%ItI@ch+-IQ3;FN5EZF3}}8eng`QHioGWj9}Iy_){~8TD6c6 z;bAszd7=kdMoXNR0h8=;7XHooqgNTw5TdK;B*K;Jxa*rwGSNdVgp+Lv%ZE7j$2T0H z8lKPJVzo0G#OY=hM~fAHVaG2&sBv;QOq$nYEDGus$6?wSM>tufR@q=0+I(vxfXVzC z{}x=`2zN5>Z>(8yI~+Ax;BH57%3t<~`yln2D2B8okkrEjyHb!) ze=OdjITXAOw*7r_Zp^p zy?vPKMfG8dB@>X7c{mXt=!;QD#MkmDLt)^^+SqnirnOWF^_GYNp^!Y$M!iKEoua_?Aqj;Y(uYeaE2hL?p#rPx3%qqSdP3ftF=nBR}%#+Aho)Ku_2V4&j zyQ9}a+rBRH&VCwM#n1_t?l_p-w$%wa;O{V-8_W=-t z`CIxEUA`Z$@W2fvIO2MQJjrLrapqTJaI%8>G^V@6PPlo5>lVj!5?MqYqYh#a8s9Im zfi9*U$pVb-!=}5U1@lo;W$4HC{e6T(d+B118==<^(H(BLhq~xK?`V8;i_vXDme_z?(+QQm=n_5E zUW8{XfELF%_ac&?|3&wT4v1a{g7nr0-MFAJ>Y%eAOVP^`R)65y2=RMOms(s+M%cGM zU0ma(SS&Krax?zMv+)vO{H5Jgd+2KC3$e|AFIrN!xr7vJyar_*oVi@#c?4F31($yL z95wgn7GX-ys36-GkffZ@5sMr=2SPokhqzQ!s3%3ONUjoOM*-g~5>zhrbsIm(eIqt( zg5^|`6`$~NGQnUw7Yw6w!x>A4VKb@^yqVijY%Vp#-mK9r;#oJ;2YHlpPfpvu8E=K7 xyyQtv`k`+7z;7|C!e5R_CV=c%g!+x&Fl`tqaam3tFp5gon@dsY;?*Ai_kY0q8qxp& literal 0 HcmV?d00001 diff --git a/transport/src/main/java/io/netty/channel/socket/nio/NioDatagramChannelConfig.java b/transport/src/main/java/io/netty/channel/socket/nio/NioDatagramChannelConfig.java index da75491e42..f5a17b8417 100644 --- a/transport/src/main/java/io/netty/channel/socket/nio/NioDatagramChannelConfig.java +++ b/transport/src/main/java/io/netty/channel/socket/nio/NioDatagramChannelConfig.java @@ -19,13 +19,13 @@ import io.netty.channel.ChannelException; import io.netty.channel.ChannelOption; import io.netty.channel.socket.DatagramChannelConfig; import io.netty.channel.socket.DefaultDatagramChannelConfig; -import io.netty.util.internal.PlatformDependent; import io.netty.util.internal.SocketUtils; -import java.lang.reflect.Method; +import java.io.IOException; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; +import java.net.StandardSocketOptions; import java.nio.channels.DatagramChannel; import java.util.Enumeration; import java.util.Map; @@ -35,82 +35,6 @@ import java.util.Map; */ class NioDatagramChannelConfig extends DefaultDatagramChannelConfig { - private static final Object IP_MULTICAST_TTL; - private static final Object IP_MULTICAST_IF; - private static final Object IP_MULTICAST_LOOP; - private static final Method GET_OPTION; - private static final Method SET_OPTION; - - static { - ClassLoader classLoader = PlatformDependent.getClassLoader(DatagramChannel.class); - Class socketOptionType = null; - try { - socketOptionType = Class.forName("java.net.SocketOption", true, classLoader); - } catch (Exception e) { - // Not Java 7+ - } - Class stdSocketOptionType = null; - try { - stdSocketOptionType = Class.forName("java.net.StandardSocketOptions", true, classLoader); - } catch (Exception e) { - // Not Java 7+ - } - - Object ipMulticastTtl = null; - Object ipMulticastIf = null; - Object ipMulticastLoop = null; - Method getOption = null; - Method setOption = null; - if (socketOptionType != null) { - try { - ipMulticastTtl = stdSocketOptionType.getDeclaredField("IP_MULTICAST_TTL").get(null); - } catch (Exception e) { - throw new Error("cannot locate the IP_MULTICAST_TTL field", e); - } - - try { - ipMulticastIf = stdSocketOptionType.getDeclaredField("IP_MULTICAST_IF").get(null); - } catch (Exception e) { - throw new Error("cannot locate the IP_MULTICAST_IF field", e); - } - - try { - ipMulticastLoop = stdSocketOptionType.getDeclaredField("IP_MULTICAST_LOOP").get(null); - } catch (Exception e) { - throw new Error("cannot locate the IP_MULTICAST_LOOP field", e); - } - - Class networkChannelClass = null; - try { - networkChannelClass = Class.forName("java.nio.channels.NetworkChannel", true, classLoader); - } catch (Throwable ignore) { - // Not Java 7+ - } - - if (networkChannelClass == null) { - getOption = null; - setOption = null; - } else { - try { - getOption = networkChannelClass.getDeclaredMethod("getOption", socketOptionType); - } catch (Exception e) { - throw new Error("cannot locate the getOption() method", e); - } - - try { - setOption = networkChannelClass.getDeclaredMethod("setOption", socketOptionType, Object.class); - } catch (Exception e) { - throw new Error("cannot locate the setOption() method", e); - } - } - } - IP_MULTICAST_TTL = ipMulticastTtl; - IP_MULTICAST_IF = ipMulticastIf; - IP_MULTICAST_LOOP = ipMulticastLoop; - GET_OPTION = getOption; - SET_OPTION = setOption; - } - private final DatagramChannel javaChannel; NioDatagramChannelConfig(NioDatagramChannel channel, DatagramChannel javaChannel) { @@ -120,13 +44,21 @@ class NioDatagramChannelConfig extends DefaultDatagramChannelConfig { @Override public int getTimeToLive() { - return (Integer) getOption0(IP_MULTICAST_TTL); + try { + return javaChannel.getOption(StandardSocketOptions.IP_MULTICAST_TTL); + } catch (IOException e) { + throw new ChannelException(e); + } } @Override public DatagramChannelConfig setTimeToLive(int ttl) { - setOption0(IP_MULTICAST_TTL, ttl); - return this; + try { + javaChannel.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl); + return this; + } catch (IOException e) { + throw new ChannelException(e); + } } @Override @@ -153,24 +85,40 @@ class NioDatagramChannelConfig extends DefaultDatagramChannelConfig { @Override public NetworkInterface getNetworkInterface() { - return (NetworkInterface) getOption0(IP_MULTICAST_IF); + try { + return javaChannel.getOption(StandardSocketOptions.IP_MULTICAST_IF); + } catch (IOException e) { + throw new ChannelException(e); + } } @Override public DatagramChannelConfig setNetworkInterface(NetworkInterface networkInterface) { - setOption0(IP_MULTICAST_IF, networkInterface); - return this; + try { + javaChannel.setOption(StandardSocketOptions.IP_MULTICAST_IF, networkInterface); + return this; + } catch (IOException e) { + throw new ChannelException(e); + } } @Override public boolean isLoopbackModeDisabled() { - return (Boolean) getOption0(IP_MULTICAST_LOOP); + try { + return javaChannel.getOption(StandardSocketOptions.IP_MULTICAST_LOOP); + } catch (IOException e) { + throw new ChannelException(e); + } } @Override public DatagramChannelConfig setLoopbackModeDisabled(boolean loopbackModeDisabled) { - setOption0(IP_MULTICAST_LOOP, loopbackModeDisabled); - return this; + try { + javaChannel.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, loopbackModeDisabled); + return this; + } catch (IOException e) { + throw new ChannelException(e); + } } @Override @@ -184,30 +132,6 @@ class NioDatagramChannelConfig extends DefaultDatagramChannelConfig { ((NioDatagramChannel) channel).clearReadPending0(); } - private Object getOption0(Object option) { - if (GET_OPTION == null) { - throw new UnsupportedOperationException(); - } else { - try { - return GET_OPTION.invoke(javaChannel, option); - } catch (Exception e) { - throw new ChannelException(e); - } - } - } - - private void setOption0(Object option, Object value) { - if (SET_OPTION == null) { - throw new UnsupportedOperationException(); - } else { - try { - SET_OPTION.invoke(javaChannel, option, value); - } catch (Exception e) { - throw new ChannelException(e); - } - } - } - @Override public boolean setOption(ChannelOption option, T value) { if (option instanceof NioChannelOption) {