From fc38a8c6b6120aa8926e6b7c019a5de941037255 Mon Sep 17 00:00:00 2001 From: CC Date: Wed, 10 Jun 2026 14:14:28 +0200 Subject: [PATCH] refactor --- .env | 1 + .../gradle-8.13-bin.zip.lck | 0 .../gradle-8.13-bin.zip.part | 0 .../favorites/FavoritesPersistenceService.kt | 19 +- .../identity/SecureIdentityStateManager.kt | 7 +- .../mesh/BluetoothGattClientManager.kt | 5 +- .../mesh/BluetoothGattServerManager.kt | 5 +- .../android/mesh/BluetoothMeshService.kt | 66 ++---- .../mesh/BluetoothPacketBroadcaster.kt | 12 +- .../bitchat/android/mesh/MessageHandler.kt | 30 +-- .../android/mesh/PacketRelayManager.kt | 15 +- .../android/mesh/PeerFingerprintManager.kt | 6 +- .../android/model/BitchatFilePacket.kt | 115 ++++------- .../bitchat/android/model/FragmentPayload.kt | 3 +- .../android/model/IdentityAnnouncement.kt | 82 +++----- .../bitchat/android/model/NoiseEncrypted.kt | 62 +++--- .../android/model/RequestSyncPacket.kt | 71 ++++--- .../android/noise/NoiseChannelEncryption.kt | 6 +- .../android/noise/NoiseEncryptionService.kt | 10 +- .../com/bitchat/android/nostr/NostrClient.kt | 2 + .../com/bitchat/android/nostr/NostrCrypto.kt | 2 + .../android/nostr/NostrEmbeddedBitChat.kt | 45 ++--- .../com/bitchat/android/nostr/NostrEvent.kt | 21 +- .../bitchat/android/nostr/NostrIdentity.kt | 28 +-- .../bitchat/android/nostr/NostrProofOfWork.kt | 1 - .../bitchat/android/nostr/NostrTestManager.kt | 2 + .../bitchat/android/nostr/NostrTransport.kt | 20 +- .../bitchat/android/nostr/RelayDirectory.kt | 18 +- .../android/protocol/BinaryProtocol.kt | 24 +-- .../java/com/bitchat/android/protocol/Tlv.kt | 110 ++++++++++ .../services/ConversationAliasResolver.kt | 6 +- .../bitchat/android/services/MessageRouter.kt | 15 +- .../android/services/meshgraph/GossipTLV.kt | 58 ++---- .../bitchat/android/sync/GossipSyncManager.kt | 44 +--- .../com/bitchat/android/sync/PacketIdUtil.kt | 24 ++- .../com/bitchat/android/ui/ChannelManager.kt | 1 - .../com/bitchat/android/ui/ChatViewModel.kt | 1 - .../bitchat/android/ui/MediaSendingManager.kt | 17 +- .../bitchat/android/ui/MeshDelegateHandler.kt | 9 +- .../bitchat/android/ui/MeshPeerListSheet.kt | 9 +- .../bitchat/android/ui/PrivateChatManager.kt | 14 +- .../bitchat/android/ui/VerificationHandler.kt | 5 +- .../android/util/BinaryEncodingUtils.kt | 21 +- .../android/util/ByteArrayExtensions.kt | 8 - .../bitchat/android/util/ByteArrayWrapper.kt | 2 +- .../java/com/bitchat/android/util/Hashing.kt | 31 +++ .../main/java/com/bitchat/android/util/Hex.kt | 49 +++++ .../java/com/bitchat/android/util/PeerId.kt | 38 ++++ .../android/mesh/PacketRelayManagerTest.kt | 26 +-- .../android/model/TlvPacketRegressionTest.kt | 110 ++++++++++ .../com/bitchat/android/protocol/TlvTest.kt | 74 +++++++ .../ui/debug/DebugSettingsManagerTest.kt | 94 +++++++++ .../android/util/HexPeerHashingTest.kt | 58 ++++++ docs/BCH-01-report.pdf | Bin 0 -> 512409 bytes docs/CODEX_MESH_CORE_REFACTOR_PLAN.md | 69 +++++++ docs/CODEX_WIFI_FIX_PLAN.md | 18 ++ docs/REVIEW_FOREGROUND_SERVICE.md | 189 ++++++++++++++++++ 57 files changed, 1157 insertions(+), 621 deletions(-) create mode 100644 .env create mode 100644 .gradle-local/wrapper/dists/gradle-8.13-bin/5xuhj0ry160q40clulazy9h7d/gradle-8.13-bin.zip.lck create mode 100644 .gradle-local/wrapper/dists/gradle-8.13-bin/5xuhj0ry160q40clulazy9h7d/gradle-8.13-bin.zip.part create mode 100644 app/src/main/java/com/bitchat/android/protocol/Tlv.kt delete mode 100644 app/src/main/java/com/bitchat/android/util/ByteArrayExtensions.kt create mode 100644 app/src/main/java/com/bitchat/android/util/Hashing.kt create mode 100644 app/src/main/java/com/bitchat/android/util/Hex.kt create mode 100644 app/src/main/java/com/bitchat/android/util/PeerId.kt create mode 100644 app/src/test/kotlin/com/bitchat/android/model/TlvPacketRegressionTest.kt create mode 100644 app/src/test/kotlin/com/bitchat/android/protocol/TlvTest.kt create mode 100644 app/src/test/kotlin/com/bitchat/android/ui/debug/DebugSettingsManagerTest.kt create mode 100644 app/src/test/kotlin/com/bitchat/android/util/HexPeerHashingTest.kt create mode 100644 docs/BCH-01-report.pdf create mode 100644 docs/CODEX_MESH_CORE_REFACTOR_PLAN.md create mode 100644 docs/CODEX_WIFI_FIX_PLAN.md create mode 100644 docs/REVIEW_FOREGROUND_SERVICE.md diff --git a/.env b/.env new file mode 100644 index 00000000..9fad86dd --- /dev/null +++ b/.env @@ -0,0 +1 @@ +JAVA_HOME=/Users/cc/Library/Java/JavaVirtualMachines/openjdk-22.0.1/Contents/Home diff --git a/.gradle-local/wrapper/dists/gradle-8.13-bin/5xuhj0ry160q40clulazy9h7d/gradle-8.13-bin.zip.lck b/.gradle-local/wrapper/dists/gradle-8.13-bin/5xuhj0ry160q40clulazy9h7d/gradle-8.13-bin.zip.lck new file mode 100644 index 00000000..e69de29b diff --git a/.gradle-local/wrapper/dists/gradle-8.13-bin/5xuhj0ry160q40clulazy9h7d/gradle-8.13-bin.zip.part b/.gradle-local/wrapper/dists/gradle-8.13-bin/5xuhj0ry160q40clulazy9h7d/gradle-8.13-bin.zip.part new file mode 100644 index 00000000..e69de29b diff --git a/app/src/main/java/com/bitchat/android/favorites/FavoritesPersistenceService.kt b/app/src/main/java/com/bitchat/android/favorites/FavoritesPersistenceService.kt index 12cd3e9f..d4fcd1f7 100644 --- a/app/src/main/java/com/bitchat/android/favorites/FavoritesPersistenceService.kt +++ b/app/src/main/java/com/bitchat/android/favorites/FavoritesPersistenceService.kt @@ -3,6 +3,7 @@ package com.bitchat.android.favorites import android.content.Context import android.util.Log import com.bitchat.android.identity.SecureIdentityStateManager +import com.bitchat.android.util.toHexString import com.google.gson.Gson import com.google.gson.reflect.TypeToken import java.util.* @@ -95,7 +96,7 @@ class FavoritesPersistenceService private constructor(private val context: Conte /** Get favorite status for Noise public key */ fun getFavoriteStatus(noisePublicKey: ByteArray): FavoriteRelationship? { - val keyHex = noisePublicKey.joinToString("") { "%02x".format(it) } + val keyHex = noisePublicKey.toHexString() return favorites[keyHex] } @@ -103,7 +104,7 @@ class FavoritesPersistenceService private constructor(private val context: Conte fun getFavoriteStatus(peerID: String): FavoriteRelationship? { val pid = peerID.lowercase() for ((_, relationship) in favorites) { - val noiseKeyHex = relationship.peerNoisePublicKey.joinToString("") { "%02x".format(it) } + val noiseKeyHex = relationship.peerNoisePublicKey.toHexString() if (noiseKeyHex.startsWith(pid)) return relationship } return null @@ -111,7 +112,7 @@ class FavoritesPersistenceService private constructor(private val context: Conte /** Update Nostr public key for a peer (indexed by Noise key) */ fun updateNostrPublicKey(noisePublicKey: ByteArray, nostrPubkey: String) { - val keyHex = noisePublicKey.joinToString("") { "%02x".format(it) } + val keyHex = noisePublicKey.toHexString() val existing = favorites[keyHex] if (existing != null) { @@ -168,7 +169,7 @@ class FavoritesPersistenceService private constructor(private val context: Conte // Find relationship with matching nostr pubkey (normalized to hex) and then try to map to current peerID via noise key prefix val rel = favorites.values.firstOrNull { it.peerNostrPublicKey?.let { stored -> normalizeNostrKeyToHex(stored) } == targetHex } if (rel != null) { - val noiseHex = rel.peerNoisePublicKey.joinToString("") { "%02x".format(it) } + val noiseHex = rel.peerNoisePublicKey.toHexString() // Return 16-hex prefix as best-effort if no explicit mapping exists return noiseHex.take(16) } @@ -178,7 +179,7 @@ class FavoritesPersistenceService private constructor(private val context: Conte /** Update favorite status */ fun updateFavoriteStatus(noisePublicKey: ByteArray, nickname: String, isFavorite: Boolean) { - val keyHex = noisePublicKey.joinToString("") { "%02x".format(it) } + val keyHex = noisePublicKey.toHexString() val existing = favorites[keyHex] @@ -210,7 +211,7 @@ class FavoritesPersistenceService private constructor(private val context: Conte /** Update peer favorited-us flag */ fun updatePeerFavoritedUs(noisePublicKey: ByteArray, theyFavoritedUs: Boolean) { - val keyHex = noisePublicKey.joinToString("") { "%02x".format(it) } + val keyHex = noisePublicKey.toHexString() val existing = favorites[keyHex] if (existing != null) { @@ -248,7 +249,7 @@ class FavoritesPersistenceService private constructor(private val context: Conte /** Find Nostr pubkey by Noise key */ fun findNostrPubkey(forNoiseKey: ByteArray): String? { - val keyHex = forNoiseKey.joinToString("") { "%02x".format(it) } + val keyHex = forNoiseKey.toHexString() return favorites[keyHex]?.peerNostrPublicKey } @@ -330,7 +331,7 @@ class FavoritesPersistenceService private constructor(private val context: Conte private fun normalizeNostrKeyToHex(value: String): String? = try { if (value.startsWith("npub1")) { val (hrp, data) = com.bitchat.android.nostr.Bech32.decode(value) - if (hrp != "npub") null else data.joinToString("") { "%02x".format(it) } + if (hrp != "npub") null else data.toHexString() } else value.lowercase() } catch (_: Exception) { null } } @@ -348,7 +349,7 @@ private data class FavoriteRelationshipData( companion object { fun fromFavoriteRelationship(relationship: FavoriteRelationship): FavoriteRelationshipData { return FavoriteRelationshipData( - peerNoisePublicKeyHex = relationship.peerNoisePublicKey.joinToString("") { "%02x".format(it) }, + peerNoisePublicKeyHex = relationship.peerNoisePublicKey.toHexString(), peerNostrPublicKey = relationship.peerNostrPublicKey, peerNickname = relationship.peerNickname, isFavorite = relationship.isFavorite, diff --git a/app/src/main/java/com/bitchat/android/identity/SecureIdentityStateManager.kt b/app/src/main/java/com/bitchat/android/identity/SecureIdentityStateManager.kt index 012ea3c4..7da60534 100644 --- a/app/src/main/java/com/bitchat/android/identity/SecureIdentityStateManager.kt +++ b/app/src/main/java/com/bitchat/android/identity/SecureIdentityStateManager.kt @@ -4,10 +4,9 @@ import android.content.Context import android.content.SharedPreferences import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey -import java.security.MessageDigest import android.util.Base64 import android.util.Log -import com.bitchat.android.util.hexEncodedString +import com.bitchat.android.util.Hashing import androidx.core.content.edit /** @@ -175,9 +174,7 @@ class SecureIdentityStateManager(private val context: Context) { * Generate fingerprint from public key (SHA-256 hash) */ fun generateFingerprint(publicKeyData: ByteArray): String { - val digest = MessageDigest.getInstance("SHA-256") - val hash = digest.digest(publicKeyData) - return hash.hexEncodedString() + return Hashing.sha256Hex(publicKeyData) } /** diff --git a/app/src/main/java/com/bitchat/android/mesh/BluetoothGattClientManager.kt b/app/src/main/java/com/bitchat/android/mesh/BluetoothGattClientManager.kt index 2bb22fce..806fec30 100644 --- a/app/src/main/java/com/bitchat/android/mesh/BluetoothGattClientManager.kt +++ b/app/src/main/java/com/bitchat/android/mesh/BluetoothGattClientManager.kt @@ -10,6 +10,7 @@ import android.os.ParcelUuid import android.util.Log import com.bitchat.android.protocol.BitchatPacket import com.bitchat.android.util.AppConstants +import com.bitchat.android.util.PeerId import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -323,7 +324,7 @@ class BluetoothGattClientManager( // Try to extract peerID from Service Data (if available) for stable identity val serviceData = scanRecord?.getServiceData(ParcelUuid(AppConstants.Mesh.Gatt.SERVICE_UUID)) val peerID = if (serviceData != null && serviceData.size >= 8) { - serviceData.joinToString("") { "%02x".format(it) } + PeerId.fromBytes(serviceData) } else { null } @@ -515,7 +516,7 @@ class BluetoothGattClientManager( Log.i(TAG, "Client: Received packet from ${gatt.device.address}, size: ${value.size} bytes") val packet = BitchatPacket.fromBinaryData(value) if (packet != null) { - val peerID = packet.senderID.take(8).toByteArray().joinToString("") { "%02x".format(it) } + val peerID = PeerId.fromBytes(packet.senderID) Log.d(TAG, "Client: Parsed packet type ${packet.type} from $peerID") delegate?.onPacketReceived(packet, peerID, gatt.device) } else { diff --git a/app/src/main/java/com/bitchat/android/mesh/BluetoothGattServerManager.kt b/app/src/main/java/com/bitchat/android/mesh/BluetoothGattServerManager.kt index ad7c9cf1..9fe8c584 100644 --- a/app/src/main/java/com/bitchat/android/mesh/BluetoothGattServerManager.kt +++ b/app/src/main/java/com/bitchat/android/mesh/BluetoothGattServerManager.kt @@ -10,6 +10,7 @@ import android.os.ParcelUuid import android.util.Log import com.bitchat.android.protocol.BitchatPacket import com.bitchat.android.util.AppConstants +import com.bitchat.android.util.PeerId import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -223,7 +224,7 @@ class BluetoothGattServerManager( Log.i(TAG, "Server: Received packet from ${device.address}, size: ${value.size} bytes") val packet = BitchatPacket.fromBinaryData(value) if (packet != null) { - val peerID = packet.senderID.take(8).toByteArray().joinToString("") { "%02x".format(it) } + val peerID = PeerId.fromBytes(packet.senderID) Log.d(TAG, "Server: Parsed packet type ${packet.type} from $peerID") delegate?.onPacketReceived(packet, peerID, device) } else { @@ -377,7 +378,7 @@ class BluetoothGattServerManager( val mode = try { powerManager.getPowerInfo().split("Current Mode: ")[1].split("\n")[0] } catch (_: Exception) { "unknown" } - Log.i(TAG, "Advertising started (power mode: $mode) with stable ID: ${peerIDBytes.joinToString("") { "%02x".format(it) }}") + Log.i(TAG, "Advertising started (power mode: $mode) with stable ID: ${PeerId.fromBytes(peerIDBytes)}") } override fun onStartFailure(errorCode: Int) { diff --git a/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt b/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt index 629af1c3..4c02a0cd 100644 --- a/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt +++ b/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt @@ -14,6 +14,8 @@ import com.bitchat.android.protocol.MessageType import com.bitchat.android.protocol.SpecialRecipients import com.bitchat.android.model.RequestSyncPacket import com.bitchat.android.sync.GossipSyncManager +import com.bitchat.android.util.Hashing +import com.bitchat.android.util.PeerId import com.bitchat.android.util.toHexString import com.bitchat.android.services.VerificationService import kotlinx.coroutines.* @@ -184,8 +186,8 @@ class BluetoothMeshService(private val context: Context) { val responsePacket = BitchatPacket( version = 1u, type = MessageType.NOISE_HANDSHAKE.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(peerID), + senderID = PeerId.toBytes(myPeerID), + recipientID = PeerId.toBytes(peerID), timestamp = System.currentTimeMillis().toULong(), payload = response, ttl = MAX_TTL @@ -296,8 +298,8 @@ class BluetoothMeshService(private val context: Context) { val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_HANDSHAKE.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(peerID), + senderID = PeerId.toBytes(myPeerID), + recipientID = PeerId.toBytes(peerID), timestamp = System.currentTimeMillis().toULong(), payload = handshakeData, ttl = MAX_TTL @@ -662,7 +664,7 @@ class BluetoothMeshService(private val context: Context) { val packet = BitchatPacket( version = 1u, type = MessageType.MESSAGE.value, - senderID = hexStringToByteArray(myPeerID), + senderID = PeerId.toBytes(myPeerID), recipientID = SpecialRecipients.BROADCAST, timestamp = System.currentTimeMillis().toULong(), payload = content.toByteArray(Charsets.UTF_8), @@ -692,7 +694,7 @@ class BluetoothMeshService(private val context: Context) { val packet = BitchatPacket( version = 2u, // FILE_TRANSFER uses v2 for 4-byte payload length to support large files type = MessageType.FILE_TRANSFER.value, - senderID = hexStringToByteArray(myPeerID), + senderID = PeerId.toBytes(myPeerID), recipientID = SpecialRecipients.BROADCAST, timestamp = System.currentTimeMillis().toULong(), payload = payload, @@ -701,7 +703,7 @@ class BluetoothMeshService(private val context: Context) { ) val signed = signPacketBeforeBroadcast(packet) // Use a stable transferId based on the file TLV payload for progress tracking - val transferId = sha256Hex(payload) + val transferId = Hashing.sha256Hex(payload) connectionManager.broadcastPacket(RoutedPacket(signed, transferId = transferId)) try { gossipSyncManager.onPublicPacketSeen(signed) } catch (_: Exception) { } } @@ -744,8 +746,8 @@ class BluetoothMeshService(private val context: Context) { val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_ENCRYPTED.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(recipientPeerID), + senderID = PeerId.toBytes(myPeerID), + recipientID = PeerId.toBytes(recipientPeerID), timestamp = System.currentTimeMillis().toULong(), payload = encrypted, signature = null, @@ -755,7 +757,7 @@ class BluetoothMeshService(private val context: Context) { // Sign and send the encrypted packet val signed = signPacketBeforeBroadcast(packet) // Use a stable transferId based on the unencrypted file TLV payload for progress tracking - val transferId = sha256Hex(filePayload) + val transferId = Hashing.sha256Hex(filePayload) connectionManager.broadcastPacket(RoutedPacket(signed, transferId = transferId)) } catch (e: Exception) { @@ -777,13 +779,6 @@ class BluetoothMeshService(private val context: Context) { return connectionManager.cancelTransfer(transferId) } - // Local helper to hash payloads to a stable hex ID for progress mapping - private fun sha256Hex(bytes: ByteArray): String = try { - val md = java.security.MessageDigest.getInstance("SHA-256") - md.update(bytes) - md.digest().joinToString("") { "%02x".format(it) } - } catch (_: Exception) { bytes.size.toString(16) } - /** * Send private message - SIMPLIFIED iOS-compatible version * Uses NoisePayloadType system exactly like iOS SimplifiedBluetoothService @@ -823,8 +818,8 @@ class BluetoothMeshService(private val context: Context) { val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_ENCRYPTED.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(recipientPeerID), + senderID = PeerId.toBytes(myPeerID), + recipientID = PeerId.toBytes(recipientPeerID), timestamp = System.currentTimeMillis().toULong(), payload = encrypted, signature = null, @@ -889,8 +884,8 @@ class BluetoothMeshService(private val context: Context) { val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_ENCRYPTED.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(recipientPeerID), + senderID = PeerId.toBytes(myPeerID), + recipientID = PeerId.toBytes(recipientPeerID), timestamp = System.currentTimeMillis().toULong(), payload = encrypted, signature = null, @@ -937,8 +932,8 @@ class BluetoothMeshService(private val context: Context) { val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_ENCRYPTED.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(recipientPeerID), + senderID = PeerId.toBytes(myPeerID), + recipientID = PeerId.toBytes(recipientPeerID), timestamp = System.currentTimeMillis().toULong(), payload = encrypted, signature = null, @@ -1247,27 +1242,6 @@ class BluetoothMeshService(private val context: Context) { } } - /** - * Convert hex string peer ID to binary data (8 bytes) - exactly same as iOS - */ - private fun hexStringToByteArray(hexString: String): ByteArray { - val result = ByteArray(8) { 0 } // Initialize with zeros, exactly 8 bytes - var tempID = hexString - var index = 0 - - while (tempID.length >= 2 && index < 8) { - val hexByte = tempID.substring(0, 2) - val byte = hexByte.toIntOrNull(16)?.toByte() - if (byte != null) { - result[index] = byte - } - tempID = tempID.substring(2) - index++ - } - - return result - } - /** * Sign packet before broadcasting using our signing private key */ @@ -1277,12 +1251,12 @@ class BluetoothMeshService(private val context: Context) { val withRoute = try { val rec = packet.recipientID if (rec != null && !rec.contentEquals(SpecialRecipients.BROADCAST)) { - val dest = rec.joinToString("") { b -> "%02x".format(b) } + val dest = rec.toHexString() val path = com.bitchat.android.services.meshgraph.RoutePlanner.shortestPath(myPeerID, dest) if (path != null && path.size >= 3) { // Exclude first (sender) and last (recipient); only intermediates val intermediates = path.subList(1, path.size - 1) - val hopsBytes = intermediates.map { hexStringToByteArray(it) } + val hopsBytes = intermediates.map { PeerId.toBytes(it) } // Attach route and upgrade to v2 (required for HAS_ROUTE flag) packet.copy(route = hopsBytes, version = 2u) } else packet.copy(route = null) diff --git a/app/src/main/java/com/bitchat/android/mesh/BluetoothPacketBroadcaster.kt b/app/src/main/java/com/bitchat/android/mesh/BluetoothPacketBroadcaster.kt index 59b6ef45..ba4ac058 100644 --- a/app/src/main/java/com/bitchat/android/mesh/BluetoothPacketBroadcaster.kt +++ b/app/src/main/java/com/bitchat/android/mesh/BluetoothPacketBroadcaster.kt @@ -9,6 +9,7 @@ import android.util.Log import com.bitchat.android.protocol.SpecialRecipients import com.bitchat.android.model.RoutedPacket import com.bitchat.android.protocol.MessageType +import com.bitchat.android.util.Hashing import com.bitchat.android.util.toHexString import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -122,7 +123,7 @@ class BluetoothPacketBroadcaster( val packet = routed.packet val isFile = packet.type == MessageType.FILE_TRANSFER.value // Prefer caller-provided transferId (e.g., for encrypted media), else derive for FILE_TRANSFER - val transferId = routed.transferId ?: (if (isFile) sha256Hex(packet.payload) else null) + val transferId = routed.transferId ?: (if (isFile) Hashing.sha256Hex(packet.payload) else null) // Check if we need to fragment if (fragmentManager != null) { val fragments = try { @@ -193,7 +194,7 @@ class BluetoothPacketBroadcaster( val data = packet.toBinaryData() ?: return false val isFile = packet.type == MessageType.FILE_TRANSFER.value // Prefer caller-provided transferId (e.g., for encrypted media), else derive for FILE_TRANSFER - val transferId = routed.transferId ?: (if (isFile) sha256Hex(packet.payload) else null) + val transferId = routed.transferId ?: (if (isFile) Hashing.sha256Hex(packet.payload) else null) if (transferId != null) { TransferProgressManager.start(transferId, 1) } @@ -236,13 +237,6 @@ class BluetoothPacketBroadcaster( return false } - private fun sha256Hex(bytes: ByteArray): String = try { - val md = java.security.MessageDigest.getInstance("SHA-256") - md.update(bytes) - md.digest().joinToString("") { "%02x".format(it) } - } catch (_: Exception) { bytes.size.toString(16) } - - /** * Public entry point for broadcasting - submits request to actor for serialization */ diff --git a/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt b/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt index d46cba7a..d3e122c0 100644 --- a/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt +++ b/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt @@ -8,6 +8,7 @@ import com.bitchat.android.model.RoutedPacket import com.bitchat.android.protocol.BitchatPacket import com.bitchat.android.protocol.MessageType import com.bitchat.android.sync.PacketIdUtil +import com.bitchat.android.util.PeerId import com.bitchat.android.util.toHexString import kotlinx.coroutines.* import java.util.* @@ -181,8 +182,8 @@ class MessageHandler(private val myPeerID: String, private val appContext: andro val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_ENCRYPTED.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(senderPeerID), + senderID = PeerId.toBytes(myPeerID), + recipientID = PeerId.toBytes(senderPeerID), timestamp = System.currentTimeMillis().toULong(), payload = encryptedPayload, signature = null, @@ -302,8 +303,8 @@ class MessageHandler(private val myPeerID: String, private val appContext: andro val responsePacket = BitchatPacket( version = 1u, type = MessageType.NOISE_HANDSHAKE.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(peerID), + senderID = PeerId.toBytes(myPeerID), + recipientID = PeerId.toBytes(peerID), timestamp = System.currentTimeMillis().toULong(), payload = response, signature = null, @@ -468,27 +469,6 @@ class MessageHandler(private val myPeerID: String, private val appContext: andro } } - /** - * Convert hex string peer ID to binary data (8 bytes) - same as iOS implementation - */ - private fun hexStringToByteArray(hexString: String): ByteArray { - val result = ByteArray(8) { 0 } // Initialize with zeros, exactly 8 bytes - var tempID = hexString - var index = 0 - - while (tempID.length >= 2 && index < 8) { - val hexByte = tempID.substring(0, 2) - val byte = hexByte.toIntOrNull(16)?.toByte() - if (byte != null) { - result[index] = byte - } - tempID = tempID.substring(2) - index++ - } - - return result - } - /** * Shutdown the handler */ diff --git a/app/src/main/java/com/bitchat/android/mesh/PacketRelayManager.kt b/app/src/main/java/com/bitchat/android/mesh/PacketRelayManager.kt index cee60a53..6c7f655a 100644 --- a/app/src/main/java/com/bitchat/android/mesh/PacketRelayManager.kt +++ b/app/src/main/java/com/bitchat/android/mesh/PacketRelayManager.kt @@ -4,6 +4,7 @@ import com.bitchat.android.protocol.MessageType import android.util.Log import com.bitchat.android.model.RoutedPacket import com.bitchat.android.protocol.BitchatPacket +import com.bitchat.android.util.PeerId import com.bitchat.android.util.toHexString import kotlinx.coroutines.* import kotlin.random.Random @@ -66,7 +67,7 @@ class PacketRelayManager(private val myPeerID: String) { Log.w(TAG, "Packet with duplicate hops dropped") return } - val myIdBytes = hexStringToPeerBytes(myPeerID) + val myIdBytes = PeerId.toBytes(myPeerID) val index = route.indexOfFirst { it.contentEquals(myIdBytes) } if (index >= 0) { val nextHopIdHex: String? = run { @@ -186,15 +187,3 @@ interface PacketRelayManagerDelegate { fun broadcastPacket(routed: RoutedPacket) fun sendToPeer(peerID: String, routed: RoutedPacket): Boolean } - -private fun hexStringToPeerBytes(hex: String): ByteArray { - val result = ByteArray(8) - var idx = 0 - var out = 0 - while (idx + 1 < hex.length && out < 8) { - val b = hex.substring(idx, idx + 2).toIntOrNull(16)?.toByte() ?: 0 - result[out++] = b - idx += 2 - } - return result -} diff --git a/app/src/main/java/com/bitchat/android/mesh/PeerFingerprintManager.kt b/app/src/main/java/com/bitchat/android/mesh/PeerFingerprintManager.kt index c48b5bd9..acdfa132 100644 --- a/app/src/main/java/com/bitchat/android/mesh/PeerFingerprintManager.kt +++ b/app/src/main/java/com/bitchat/android/mesh/PeerFingerprintManager.kt @@ -1,7 +1,7 @@ package com.bitchat.android.mesh import android.util.Log -import java.security.MessageDigest +import com.bitchat.android.util.Hashing import java.util.concurrent.ConcurrentHashMap /** @@ -204,9 +204,7 @@ class PeerFingerprintManager private constructor() { * @return The hex-encoded SHA-256 hash */ private fun calculateFingerprint(publicKey: ByteArray): String { - val digest = MessageDigest.getInstance("SHA-256") - val hash = digest.digest(publicKey) - return hash.joinToString("") { "%02x".format(it) } + return Hashing.sha256Hex(publicKey) } /** diff --git a/app/src/main/java/com/bitchat/android/model/BitchatFilePacket.kt b/app/src/main/java/com/bitchat/android/model/BitchatFilePacket.kt index 5e47742f..880c9954 100644 --- a/app/src/main/java/com/bitchat/android/model/BitchatFilePacket.kt +++ b/app/src/main/java/com/bitchat/android/model/BitchatFilePacket.kt @@ -1,5 +1,9 @@ package com.bitchat.android.model +import com.bitchat.android.protocol.TlvLengthSize +import com.bitchat.android.protocol.TlvReader +import com.bitchat.android.protocol.TlvWriter +import com.bitchat.android.protocol.UnknownTlvPolicy import java.nio.ByteBuffer import java.nio.ByteOrder @@ -7,16 +11,13 @@ import java.nio.ByteOrder * BitchatFilePacket: TLV-encoded file transfer payload for BLE mesh. * TLVs: * - 0x01: filename (UTF-8) - * - 0x02: file size (8 bytes, UInt64) + * - 0x02: file size (4 bytes, UInt32) * - 0x03: mime type (UTF-8) - * - 0x04: content (bytes) — may appear multiple times for large files + * - 0x04: content (bytes) * - * Length field for TLV is 2 bytes (UInt16, big-endian) for all TLVs. - * For large files, CONTENT is chunked into multiple TLVs of up to 65535 bytes each. - * - * Note: The outer BitchatPacket uses version 2 (4-byte payload length), so this - * TLV payload can exceed 64 KiB even though each TLV value is limited to 65535 bytes. - * Transport-level fragmentation then splits the final packet for BLE MTU. + * FILE_NAME, FILE_SIZE, and MIME_TYPE use 2-byte big-endian lengths. + * CONTENT uses a 4-byte big-endian length so the outer v2 packet can carry + * payloads larger than 64 KiB before transport fragmentation. */ data class BitchatFilePacket( val fileName: String, @@ -30,87 +31,53 @@ data class BitchatFilePacket( } fun encode(): ByteArray? { - try { - android.util.Log.d("BitchatFilePacket", "🔄 Encoding: name=$fileName, size=$fileSize, mime=$mimeType") - val nameBytes = fileName.toByteArray(Charsets.UTF_8) - val mimeBytes = mimeType.toByteArray(Charsets.UTF_8) - // Validate bounds for 2-byte TLV lengths (per-TLV). CONTENT may exceed 65535 and will be chunked. - if (nameBytes.size > 0xFFFF || mimeBytes.size > 0xFFFF) { - android.util.Log.e("BitchatFilePacket", "❌ TLV field too large: name=${nameBytes.size}, mime=${mimeBytes.size} (max: 65535)") + return try { + val nameBytes = fileName.toByteArray(Charsets.UTF_8) + val mimeBytes = mimeType.toByteArray(Charsets.UTF_8) + if (nameBytes.size > 0xFFFF || mimeBytes.size > 0xFFFF) { return null } - if (content.size > 0xFFFF) { - android.util.Log.d("BitchatFilePacket", "📦 Content exceeds 65535 bytes (${content.size}); will be split into multiple CONTENT TLVs") - } else { - android.util.Log.d("BitchatFilePacket", "📏 TLV sizes OK: name=${nameBytes.size}, mime=${mimeBytes.size}, content=${content.size}") - } - val sizeFieldLen = 4 // UInt32 for FILE_SIZE (changed from 8 bytes) - val contentLenFieldLen = 4 // UInt32 for CONTENT TLV as requested - // Compute capacity: header TLVs + single CONTENT TLV with 4-byte length - val contentTLVBytes = 1 + contentLenFieldLen + content.size - val capacity = (1 + 2 + nameBytes.size) + (1 + 2 + sizeFieldLen) + (1 + 2 + mimeBytes.size) + contentTLVBytes - val buf = ByteBuffer.allocate(capacity).order(ByteOrder.BIG_ENDIAN) + val sizeBytes = ByteBuffer.allocate(4) + .order(ByteOrder.BIG_ENDIAN) + .putInt(fileSize.toInt()) + .array() - // FILE_NAME - buf.put(TLVType.FILE_NAME.v.toByte()) - buf.putShort(nameBytes.size.toShort()) - buf.put(nameBytes) - - // FILE_SIZE (4 bytes) - buf.put(TLVType.FILE_SIZE.v.toByte()) - buf.putShort(sizeFieldLen.toShort()) - buf.putInt(fileSize.toInt()) - - // MIME_TYPE - buf.put(TLVType.MIME_TYPE.v.toByte()) - buf.putShort(mimeBytes.size.toShort()) - buf.put(mimeBytes) - - // CONTENT (single TLV with 4-byte length) - buf.put(TLVType.CONTENT.v.toByte()) - buf.putInt(content.size) - buf.put(content) - - val result = buf.array() - android.util.Log.d("BitchatFilePacket", "✅ Encoded successfully: ${result.size} bytes total") - return result + TlvWriter() + .put(TLVType.FILE_NAME.v.toInt(), nameBytes, TlvLengthSize.TWO_BYTES) + .put(TLVType.FILE_SIZE.v.toInt(), sizeBytes, TlvLengthSize.TWO_BYTES) + .put(TLVType.MIME_TYPE.v.toInt(), mimeBytes, TlvLengthSize.TWO_BYTES) + .put(TLVType.CONTENT.v.toInt(), content, TlvLengthSize.FOUR_BYTES) + .toByteArray() } catch (e: Exception) { - android.util.Log.e("BitchatFilePacket", "❌ Encoding failed: ${e.message}", e) - return null + null } } companion object { fun decode(data: ByteArray): BitchatFilePacket? { - android.util.Log.d("BitchatFilePacket", "🔄 Decoding ${data.size} bytes") try { - var off = 0 + val knownTypes = TLVType.values().map { it.v.toInt() }.toSet() + val fields = TlvReader.decode( + data = data, + defaultLengthSize = TlvLengthSize.TWO_BYTES, + unknownPolicy = UnknownTlvPolicy.FAIL, + knownTypes = knownTypes + ) { type -> + if (type == TLVType.CONTENT.v.toInt()) TlvLengthSize.FOUR_BYTES else TlvLengthSize.TWO_BYTES + } ?: return null + var name: String? = null var size: Long? = null var mime: String? = null var contentBytes: ByteArray? = null - while (off + 3 <= data.size) { // minimum TLV header size (type + 2 bytes length) - val t = TLVType.from(data[off].toUByte()) ?: return null - off += 1 - // CONTENT uses 4-byte length; others use 2-byte length - val len: Int - if (t == TLVType.CONTENT) { - if (off + 4 > data.size) return null - len = ((data[off].toInt() and 0xFF) shl 24) or ((data[off + 1].toInt() and 0xFF) shl 16) or ((data[off + 2].toInt() and 0xFF) shl 8) or (data[off + 3].toInt() and 0xFF) - off += 4 - } else { - if (off + 2 > data.size) return null - len = ((data[off].toInt() and 0xFF) shl 8) or (data[off + 1].toInt() and 0xFF) - off += 2 - } - if (len < 0 || off + len > data.size) return null - val value = data.copyOfRange(off, off + len) - off += len + for (field in fields) { + val t = TLVType.from(field.type.toUByte()) ?: return null + val value = field.value when (t) { TLVType.FILE_NAME -> name = String(value, Charsets.UTF_8) TLVType.FILE_SIZE -> { - if (len != 4) return null + if (value.size != 4) return null val bb = ByteBuffer.wrap(value).order(ByteOrder.BIG_ENDIAN) size = bb.int.toLong() } @@ -128,14 +95,10 @@ data class BitchatFilePacket( val c = contentBytes ?: return null val s = size ?: c.size.toLong() val m = mime ?: "application/octet-stream" - val result = BitchatFilePacket(n, s, m, c) - android.util.Log.d("BitchatFilePacket", "✅ Decoded: name=$n, size=$s, mime=$m, content=${c.size} bytes") - return result + return BitchatFilePacket(n, s, m, c) } catch (e: Exception) { - android.util.Log.e("BitchatFilePacket", "❌ Decoding failed: ${e.message}", e) return null } } } } - diff --git a/app/src/main/java/com/bitchat/android/model/FragmentPayload.kt b/app/src/main/java/com/bitchat/android/model/FragmentPayload.kt index b902222b..e5000934 100644 --- a/app/src/main/java/com/bitchat/android/model/FragmentPayload.kt +++ b/app/src/main/java/com/bitchat/android/model/FragmentPayload.kt @@ -1,6 +1,7 @@ package com.bitchat.android.model import com.bitchat.android.protocol.MessageType +import com.bitchat.android.util.toHexString /** * FragmentPayload - 100% iOS-compatible fragment payload structure @@ -111,7 +112,7 @@ data class FragmentPayload( * Get fragment ID as hex string for logging/debugging */ fun getFragmentIDString(): String { - return fragmentID.joinToString("") { "%02x".format(it) } + return fragmentID.toHexString() } /** diff --git a/app/src/main/java/com/bitchat/android/model/IdentityAnnouncement.kt b/app/src/main/java/com/bitchat/android/model/IdentityAnnouncement.kt index 2dfbe9c2..f3caae01 100644 --- a/app/src/main/java/com/bitchat/android/model/IdentityAnnouncement.kt +++ b/app/src/main/java/com/bitchat/android/model/IdentityAnnouncement.kt @@ -1,8 +1,12 @@ package com.bitchat.android.model import android.os.Parcelable +import com.bitchat.android.protocol.TlvLengthSize +import com.bitchat.android.protocol.TlvReader +import com.bitchat.android.protocol.TlvWriter +import com.bitchat.android.protocol.UnknownTlvPolicy +import com.bitchat.android.util.toHexString import kotlinx.parcelize.Parcelize -import com.bitchat.android.util.* /** * Identity announcement structure with TLV encoding @@ -36,29 +40,15 @@ data class IdentityAnnouncement( fun encode(): ByteArray? { val nicknameData = nickname.toByteArray(Charsets.UTF_8) - // Check size limits - if (nicknameData.size > 255 || noisePublicKey.size > 255 || signingPublicKey.size > 255) { - return null + return try { + TlvWriter() + .put(TLVType.NICKNAME.value.toInt(), nicknameData, TlvLengthSize.ONE_BYTE) + .put(TLVType.NOISE_PUBLIC_KEY.value.toInt(), noisePublicKey, TlvLengthSize.ONE_BYTE) + .put(TLVType.SIGNING_PUBLIC_KEY.value.toInt(), signingPublicKey, TlvLengthSize.ONE_BYTE) + .toByteArray() + } catch (_: IllegalArgumentException) { + null } - - val result = mutableListOf() - - // TLV for nickname - result.add(TLVType.NICKNAME.value.toByte()) - result.add(nicknameData.size.toByte()) - result.addAll(nicknameData.toList()) - - // TLV for noise public key - result.add(TLVType.NOISE_PUBLIC_KEY.value.toByte()) - result.add(noisePublicKey.size.toByte()) - result.addAll(noisePublicKey.toList()) - - // TLV for signing public key - result.add(TLVType.SIGNING_PUBLIC_KEY.value.toByte()) - result.add(signingPublicKey.size.toByte()) - result.addAll(signingPublicKey.toList()) - - return result.toByteArray() } companion object { @@ -66,45 +56,29 @@ data class IdentityAnnouncement( * Decode from TLV binary data matching iOS implementation */ fun decode(data: ByteArray): IdentityAnnouncement? { - // Create defensive copy - val dataCopy = data.copyOf() - - var offset = 0 var nickname: String? = null var noisePublicKey: ByteArray? = null var signingPublicKey: ByteArray? = null - - while (offset + 2 <= dataCopy.size) { - // Read TLV type - val typeValue = dataCopy[offset].toUByte() - val type = TLVType.fromValue(typeValue) - offset += 1 - - // Read TLV length - val length = dataCopy[offset].toUByte().toInt() - offset += 1 - - // Check bounds - if (offset + length > dataCopy.size) return null - - // Read TLV value - val value = dataCopy.sliceArray(offset until offset + length) - offset += length - - // Process known TLV types, skip unknown ones for forward compatibility + + val knownTypes = TLVType.values().map { it.value.toInt() }.toSet() + val fields = TlvReader.decode( + data = data, + defaultLengthSize = TlvLengthSize.ONE_BYTE, + unknownPolicy = UnknownTlvPolicy.SKIP, + knownTypes = knownTypes + ) ?: return null + + for (field in fields) { + val type = TLVType.fromValue(field.type.toUByte()) ?: continue when (type) { TLVType.NICKNAME -> { - nickname = String(value, Charsets.UTF_8) + nickname = String(field.value, Charsets.UTF_8) } TLVType.NOISE_PUBLIC_KEY -> { - noisePublicKey = value + noisePublicKey = field.value } TLVType.SIGNING_PUBLIC_KEY -> { - signingPublicKey = value - } - null -> { - // Unknown TLV; skip (tolerant decoder for forward compatibility) - continue + signingPublicKey = field.value } } } @@ -140,6 +114,6 @@ data class IdentityAnnouncement( } override fun toString(): String { - return "IdentityAnnouncement(nickname='$nickname', noisePublicKey=${noisePublicKey.joinToString("") { "%02x".format(it) }.take(16)}..., signingPublicKey=${signingPublicKey.joinToString("") { "%02x".format(it) }.take(16)}...)" + return "IdentityAnnouncement(nickname='$nickname', noisePublicKey=${noisePublicKey.toHexString().take(16)}..., signingPublicKey=${signingPublicKey.toHexString().take(16)}...)" } } diff --git a/app/src/main/java/com/bitchat/android/model/NoiseEncrypted.kt b/app/src/main/java/com/bitchat/android/model/NoiseEncrypted.kt index c46a114f..150eb064 100644 --- a/app/src/main/java/com/bitchat/android/model/NoiseEncrypted.kt +++ b/app/src/main/java/com/bitchat/android/model/NoiseEncrypted.kt @@ -1,6 +1,10 @@ package com.bitchat.android.model import android.os.Parcelable +import com.bitchat.android.protocol.TlvLengthSize +import com.bitchat.android.protocol.TlvReader +import com.bitchat.android.protocol.TlvWriter +import com.bitchat.android.protocol.UnknownTlvPolicy import kotlinx.parcelize.Parcelize /** @@ -127,24 +131,14 @@ data class PrivateMessagePacket( val messageIDData = messageID.toByteArray(Charsets.UTF_8) val contentData = content.toByteArray(Charsets.UTF_8) - // Check size limits (TLV length field is 1 byte = max 255) - if (messageIDData.size > 255 || contentData.size > 255) { - return null + return try { + TlvWriter() + .put(TLVType.MESSAGE_ID.value.toInt(), messageIDData, TlvLengthSize.ONE_BYTE) + .put(TLVType.CONTENT.value.toInt(), contentData, TlvLengthSize.ONE_BYTE) + .toByteArray() + } catch (_: IllegalArgumentException) { + null } - - val result = mutableListOf() - - // TLV for messageID - result.add(TLVType.MESSAGE_ID.value.toByte()) - result.add(messageIDData.size.toByte()) - result.addAll(messageIDData.toList()) - - // TLV for content - result.add(TLVType.CONTENT.value.toByte()) - result.add(contentData.size.toByte()) - result.addAll(contentData.toList()) - - return result.toByteArray() } companion object { @@ -152,33 +146,25 @@ data class PrivateMessagePacket( * Decode from TLV binary data - exactly like iOS */ fun decode(data: ByteArray): PrivateMessagePacket? { - var offset = 0 var messageID: String? = null var content: String? = null - - while (offset + 2 <= data.size) { - // Read TLV type - val typeValue = data[offset].toUByte() - val type = TLVType.fromValue(typeValue) ?: return null - offset += 1 - - // Read TLV length - val length = data[offset].toUByte().toInt() - offset += 1 - - // Check bounds - if (offset + length > data.size) return null - - // Read TLV value - val value = data.copyOfRange(offset, offset + length) - offset += length - + + val knownTypes = TLVType.values().map { it.value.toInt() }.toSet() + val fields = TlvReader.decode( + data = data, + defaultLengthSize = TlvLengthSize.ONE_BYTE, + unknownPolicy = UnknownTlvPolicy.FAIL, + knownTypes = knownTypes + ) ?: return null + + for (field in fields) { + val type = TLVType.fromValue(field.type.toUByte()) ?: return null when (type) { TLVType.MESSAGE_ID -> { - messageID = String(value, Charsets.UTF_8) + messageID = String(field.value, Charsets.UTF_8) } TLVType.CONTENT -> { - content = String(value, Charsets.UTF_8) + content = String(field.value, Charsets.UTF_8) } } } diff --git a/app/src/main/java/com/bitchat/android/model/RequestSyncPacket.kt b/app/src/main/java/com/bitchat/android/model/RequestSyncPacket.kt index ab52f071..73fc0497 100644 --- a/app/src/main/java/com/bitchat/android/model/RequestSyncPacket.kt +++ b/app/src/main/java/com/bitchat/android/model/RequestSyncPacket.kt @@ -1,5 +1,9 @@ package com.bitchat.android.model +import com.bitchat.android.protocol.TlvLengthSize +import com.bitchat.android.protocol.TlvReader +import com.bitchat.android.protocol.TlvWriter +import com.bitchat.android.protocol.UnknownTlvPolicy import com.bitchat.android.sync.SyncDefaults /** @@ -15,30 +19,21 @@ data class RequestSyncPacket( val data: ByteArray ) { fun encode(): ByteArray { - val out = ArrayList() - fun putTLV(t: Int, v: ByteArray) { - out.add(t.toByte()) - val len = v.size - out.add(((len ushr 8) and 0xFF).toByte()) - out.add((len and 0xFF).toByte()) - out.addAll(v.toList()) - } - // P - putTLV(0x01, byteArrayOf(p.toByte())) - // M (uint32) val m32 = m.coerceAtMost(0xffff_ffffL) - putTLV( - 0x02, - byteArrayOf( - ((m32 ushr 24) and 0xFF).toByte(), - ((m32 ushr 16) and 0xFF).toByte(), - ((m32 ushr 8) and 0xFF).toByte(), - (m32 and 0xFF).toByte() + return TlvWriter() + .put(0x01, byteArrayOf(p.toByte()), TlvLengthSize.TWO_BYTES) + .put( + 0x02, + byteArrayOf( + ((m32 ushr 24) and 0xFF).toByte(), + ((m32 ushr 16) and 0xFF).toByte(), + ((m32 ushr 8) and 0xFF).toByte(), + (m32 and 0xFF).toByte() + ), + TlvLengthSize.TWO_BYTES ) - ) - // data - putTLV(0x03, data) - return out.toByteArray() + .put(0x03, data, TlvLengthSize.TWO_BYTES) + .toByteArray() } companion object { @@ -46,28 +41,30 @@ data class RequestSyncPacket( const val MAX_ACCEPT_FILTER_BYTES: Int = SyncDefaults.MAX_ACCEPT_FILTER_BYTES fun decode(data: ByteArray): RequestSyncPacket? { - var off = 0 var p: Int? = null var m: Long? = null var payload: ByteArray? = null - while (off + 3 <= data.size) { - val t = (data[off].toInt() and 0xFF); off += 1 - val len = ((data[off].toInt() and 0xFF) shl 8) or (data[off+1].toInt() and 0xFF); off += 2 - if (off + len > data.size) return null - val v = data.copyOfRange(off, off + len); off += len - when (t) { - 0x01 -> if (len == 1) p = (v[0].toInt() and 0xFF) - 0x02 -> if (len == 4) { - val mm = ((v[0].toLong() and 0xFF) shl 24) or - ((v[1].toLong() and 0xFF) shl 16) or - ((v[2].toLong() and 0xFF) shl 8) or - (v[3].toLong() and 0xFF) + val fields = TlvReader.decode( + data = data, + defaultLengthSize = TlvLengthSize.TWO_BYTES, + unknownPolicy = UnknownTlvPolicy.SKIP, + knownTypes = setOf(0x01, 0x02, 0x03) + ) ?: return null + + for (field in fields) { + when (field.type) { + 0x01 -> if (field.value.size == 1) p = (field.value[0].toInt() and 0xFF) + 0x02 -> if (field.value.size == 4) { + val mm = ((field.value[0].toLong() and 0xFF) shl 24) or + ((field.value[1].toLong() and 0xFF) shl 16) or + ((field.value[2].toLong() and 0xFF) shl 8) or + (field.value[3].toLong() and 0xFF) m = mm } 0x03 -> { - if (v.size > MAX_ACCEPT_FILTER_BYTES) return null - payload = v + if (field.value.size > MAX_ACCEPT_FILTER_BYTES) return null + payload = field.value } } } diff --git a/app/src/main/java/com/bitchat/android/noise/NoiseChannelEncryption.kt b/app/src/main/java/com/bitchat/android/noise/NoiseChannelEncryption.kt index cf8c3f80..68209b68 100644 --- a/app/src/main/java/com/bitchat/android/noise/NoiseChannelEncryption.kt +++ b/app/src/main/java/com/bitchat/android/noise/NoiseChannelEncryption.kt @@ -1,7 +1,7 @@ package com.bitchat.android.noise import android.util.Log -import java.security.MessageDigest +import com.bitchat.android.util.Hashing import java.util.concurrent.ConcurrentHashMap import javax.crypto.Cipher import javax.crypto.SecretKeyFactory @@ -174,9 +174,7 @@ class NoiseChannelEncryption { val key = channelKeys[channel] ?: return null return try { - val digest = MessageDigest.getInstance("SHA-256") - val hash = digest.digest(key.encoded) - hash.joinToString("") { "%02x".format(it) } + Hashing.sha256Hex(key.encoded) } catch (e: Exception) { Log.e(TAG, "Failed to calculate key commitment: ${e.message}") null diff --git a/app/src/main/java/com/bitchat/android/noise/NoiseEncryptionService.kt b/app/src/main/java/com/bitchat/android/noise/NoiseEncryptionService.kt index 8b8bf0cc..96be8571 100644 --- a/app/src/main/java/com/bitchat/android/noise/NoiseEncryptionService.kt +++ b/app/src/main/java/com/bitchat/android/noise/NoiseEncryptionService.kt @@ -5,7 +5,7 @@ import android.util.Log import com.bitchat.android.identity.SecureIdentityStateManager import com.bitchat.android.mesh.PeerFingerprintManager import com.bitchat.android.noise.southernstorm.protocol.Noise -import java.security.MessageDigest +import com.bitchat.android.util.Hashing import java.security.SecureRandom import java.util.concurrent.ConcurrentHashMap @@ -133,9 +133,7 @@ class NoiseEncryptionService(private val context: Context) { * Get our identity fingerprint (SHA-256 hash of static public key) */ fun getIdentityFingerprint(): String { - val digest = MessageDigest.getInstance("SHA-256") - val hash = digest.digest(staticIdentityPublicKey) - return hash.joinToString("") { "%02x".format(it) } + return Hashing.sha256Hex(staticIdentityPublicKey) } /** @@ -387,9 +385,7 @@ class NoiseEncryptionService(private val context: Context) { * Calculate fingerprint from public key (SHA-256 hash) */ private fun calculateFingerprint(publicKey: ByteArray): String { - val digest = MessageDigest.getInstance("SHA-256") - val hash = digest.digest(publicKey) - return hash.joinToString("") { "%02x".format(it) } + return Hashing.sha256Hex(publicKey) } // MARK: - Packet Signing/Verification diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrClient.kt b/app/src/main/java/com/bitchat/android/nostr/NostrClient.kt index a4803157..442da361 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrClient.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrClient.kt @@ -2,6 +2,8 @@ package com.bitchat.android.nostr import android.content.Context import android.util.Log +import com.bitchat.android.util.hexToByteArray +import com.bitchat.android.util.toHexString import kotlinx.coroutines.* import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrCrypto.kt b/app/src/main/java/com/bitchat/android/nostr/NostrCrypto.kt index b25499dd..6521a702 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrCrypto.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrCrypto.kt @@ -1,5 +1,7 @@ package com.bitchat.android.nostr +import com.bitchat.android.util.hexToByteArray +import com.bitchat.android.util.toHexString import org.bouncycastle.crypto.ec.CustomNamedCurves import org.bouncycastle.crypto.params.ECDomainParameters import org.bouncycastle.crypto.params.ECPrivateKeyParameters diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrEmbeddedBitChat.kt b/app/src/main/java/com/bitchat/android/nostr/NostrEmbeddedBitChat.kt index 3f70bbb7..4aea24e1 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrEmbeddedBitChat.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrEmbeddedBitChat.kt @@ -6,6 +6,9 @@ import com.bitchat.android.model.PrivateMessagePacket import com.bitchat.android.model.NoisePayloadType import com.bitchat.android.protocol.BitchatPacket import com.bitchat.android.protocol.MessageType +import com.bitchat.android.util.Hex +import com.bitchat.android.util.PeerId +import com.bitchat.android.util.toHexString import java.util.* /** @@ -41,8 +44,8 @@ object NostrEmbeddedBitChat { val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_ENCRYPTED.value, - senderID = hexStringToByteArray(senderPeerID), - recipientID = hexStringToByteArray(recipientIDHex), + senderID = PeerId.toBytes(senderPeerID), + recipientID = PeerId.toBytes(recipientIDHex), timestamp = System.currentTimeMillis().toULong(), payload = payload, signature = null, @@ -81,8 +84,8 @@ object NostrEmbeddedBitChat { val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_ENCRYPTED.value, - senderID = hexStringToByteArray(senderPeerID), - recipientID = hexStringToByteArray(recipientIDHex), + senderID = PeerId.toBytes(senderPeerID), + recipientID = PeerId.toBytes(recipientIDHex), timestamp = System.currentTimeMillis().toULong(), payload = payload, signature = null, @@ -118,7 +121,7 @@ object NostrEmbeddedBitChat { val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_ENCRYPTED.value, - senderID = hexStringToByteArray(senderPeerID), + senderID = PeerId.toBytes(senderPeerID), recipientID = null, // No recipient for geohash DMs timestamp = System.currentTimeMillis().toULong(), payload = payload, @@ -153,7 +156,7 @@ object NostrEmbeddedBitChat { val packet = BitchatPacket( version = 1u, type = MessageType.NOISE_ENCRYPTED.value, - senderID = hexStringToByteArray(senderPeerID), + senderID = PeerId.toBytes(senderPeerID), recipientID = null, // No recipient for geohash DMs timestamp = System.currentTimeMillis().toULong(), payload = payload, @@ -174,16 +177,16 @@ object NostrEmbeddedBitChat { */ private fun normalizeRecipientPeerID(recipientPeerID: String): String { try { - val maybeData = hexStringToByteArray(recipientPeerID) + val maybeData = Hex.decode(recipientPeerID) ?: return recipientPeerID return when (maybeData.size) { 32 -> { // Treat as Noise static public key; derive peerID from fingerprint // For now, return first 8 bytes as hex (simplified) - maybeData.take(8).joinToString("") { "%02x".format(it) } + maybeData.copyOfRange(0, 8).toHexString() } 8 -> { // Already an 8-byte peer ID - recipientPeerID + PeerId.fromBytes(maybeData) } else -> { // Fallback: return as-is (expecting 16 hex chars) @@ -207,28 +210,4 @@ object NostrEmbeddedBitChat { .replace("=", "") } - /** - * Convert hex string to byte array - */ - private fun hexStringToByteArray(hexString: String): ByteArray { - if (hexString.length % 2 != 0) { - return ByteArray(8) // Return 8-byte array filled with zeros - } - - val result = ByteArray(8) { 0 } // Exactly 8 bytes like iOS - var tempID = hexString - var index = 0 - - while (tempID.length >= 2 && index < 8) { - val hexByte = tempID.substring(0, 2) - val byte = hexByte.toIntOrNull(16)?.toByte() - if (byte != null) { - result[index] = byte - } - tempID = tempID.substring(2) - index++ - } - - return result - } } diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrEvent.kt b/app/src/main/java/com/bitchat/android/nostr/NostrEvent.kt index 92752b17..97c3f59f 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrEvent.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrEvent.kt @@ -3,7 +3,8 @@ package com.bitchat.android.nostr import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.annotations.SerializedName -import java.security.MessageDigest +import com.bitchat.android.util.Hashing +import com.bitchat.android.util.toHexString /** * Nostr Event structure following NIP-01 @@ -134,13 +135,11 @@ data class NostrEvent( val gson = GsonBuilder().disableHtmlEscaping().create() val jsonString = gson.toJson(serialized) - // SHA256 hash of the JSON string - val digest = MessageDigest.getInstance("SHA-256") val jsonBytes = jsonString.toByteArray(Charsets.UTF_8) - val hash = digest.digest(jsonBytes) + val hash = Hashing.sha256(jsonBytes) // Convert to hex - val hexId = hash.joinToString("") { "%02x".format(it) } + val hexId = hash.toHexString() return Pair(hexId, hash) } @@ -217,15 +216,3 @@ object NostrKind { const val EPHEMERAL_EVENT = 20000 // For geohash channels const val GEOHASH_PRESENCE = 20001 // For geohash presence heartbeat } - -/** - * Extension functions for hex encoding/decoding - */ -fun String.hexToByteArray(): ByteArray { - check(length % 2 == 0) { "Must have an even length" } - return chunked(2) - .map { it.toInt(16).toByte() } - .toByteArray() -} - -fun ByteArray.toHexString(): String = joinToString("") { "%02x".format(it) } diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrIdentity.kt b/app/src/main/java/com/bitchat/android/nostr/NostrIdentity.kt index 01583dde..b61e613c 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrIdentity.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrIdentity.kt @@ -3,7 +3,9 @@ package com.bitchat.android.nostr import android.content.Context import android.util.Log import com.bitchat.android.identity.SecureIdentityStateManager -import java.security.MessageDigest +import com.bitchat.android.util.Hashing +import com.bitchat.android.util.hexToByteArray +import com.bitchat.android.util.toHexString import java.security.SecureRandom /** @@ -25,7 +27,7 @@ data class NostrIdentity( */ fun generate(): NostrIdentity { val (privateKeyHex, publicKeyHex) = NostrCrypto.generateKeyPair() - val npub = Bech32.encode("npub", publicKeyHex.hexToByteArrayLocal()) + val npub = Bech32.encode("npub", publicKeyHex.hexToByteArray()) Log.d(TAG, "Generated new Nostr identity: npub=$npub") @@ -46,7 +48,7 @@ data class NostrIdentity( } val publicKeyHex = NostrCrypto.derivePublicKey(privateKeyHex) - val npub = Bech32.encode("npub", publicKeyHex.hexToByteArrayLocal()) + val npub = Bech32.encode("npub", publicKeyHex.hexToByteArray()) return NostrIdentity( privateKeyHex = privateKeyHex, @@ -61,10 +63,8 @@ data class NostrIdentity( */ fun fromSeed(seed: String): NostrIdentity { // Hash the seed to create a private key - val digest = MessageDigest.getInstance("SHA-256") val seedBytes = seed.toByteArray(Charsets.UTF_8) - val privateKeyBytes = digest.digest(seedBytes) - val privateKeyHex = privateKeyBytes.joinToString("") { "%02x".format(it) } + val privateKeyHex = Hashing.sha256Hex(seedBytes) return fromPrivateKey(privateKeyHex) } @@ -149,7 +149,7 @@ object NostrIdentityBridge { // Try a few iterations to ensure a valid key can be formed (exactly like iOS) for (i in 0 until 10) { val candidateKey = candidateKey(seed, geohashBytes, i.toUInt()) - val candidateKeyHex = candidateKey.toHexStringLocal() + val candidateKeyHex = candidateKey.toHexString() if (NostrCrypto.isValidPrivateKey(candidateKeyHex)) { val identity = NostrIdentity.fromPrivateKey(candidateKeyHex) @@ -164,10 +164,9 @@ object NostrIdentityBridge { // As a final fallback, hash the seed+msg and try again (exactly like iOS) val combined = seed + geohashBytes - val digest = MessageDigest.getInstance("SHA-256") - val fallbackKey = digest.digest(combined) + val fallbackKey = Hashing.sha256(combined) - val fallbackIdentity = NostrIdentity.fromPrivateKey(fallbackKey.toHexStringLocal()) + val fallbackIdentity = NostrIdentity.fromPrivateKey(fallbackKey.toHexString()) // Cache the fallback result too geohashIdentityCache[forGeohash] = fallbackIdentity @@ -280,15 +279,6 @@ object NostrIdentityBridge { } } -// Extension functions for data conversion -private fun String.hexToByteArrayLocal(): ByteArray { - return chunked(2).map { it.toInt(16).toByte() }.toByteArray() -} - -private fun ByteArray.toHexStringLocal(): String { - return joinToString("") { "%02x".format(it) } -} - private fun UInt.toLittleEndianBytes(): ByteArray { val bytes = ByteArray(4) bytes[0] = (this and 0xFFu).toByte() diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrProofOfWork.kt b/app/src/main/java/com/bitchat/android/nostr/NostrProofOfWork.kt index ffbe6607..6c5a3f83 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrProofOfWork.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrProofOfWork.kt @@ -3,7 +3,6 @@ package com.bitchat.android.nostr import android.util.Log import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import java.security.MessageDigest import kotlin.random.Random /** diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrTestManager.kt b/app/src/main/java/com/bitchat/android/nostr/NostrTestManager.kt index 66f3b095..3cef6d7a 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrTestManager.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrTestManager.kt @@ -2,6 +2,8 @@ package com.bitchat.android.nostr import android.content.Context import android.util.Log +import com.bitchat.android.util.hexToByteArray +import com.bitchat.android.util.toHexString import kotlinx.coroutines.* /** diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrTransport.kt b/app/src/main/java/com/bitchat/android/nostr/NostrTransport.kt index 26ba8369..446d0368 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrTransport.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrTransport.kt @@ -4,6 +4,8 @@ import android.content.Context import android.util.Log import com.bitchat.android.model.ReadReceipt import com.bitchat.android.model.NoisePayloadType +import com.bitchat.android.util.PeerId +import com.bitchat.android.util.toHexString import kotlinx.coroutines.* import java.util.* import java.util.concurrent.ConcurrentLinkedQueue @@ -79,7 +81,7 @@ class NostrTransport( Log.e(TAG, "NostrTransport: recipient key not npub (hrp=$hrp)") return@launch } - data.joinToString("") { "%02x".format(it) } + data.toHexString() } catch (e: Exception) { Log.e(TAG, "NostrTransport: failed to decode npub -> hex: $e") return@launch @@ -174,7 +176,7 @@ class NostrTransport( scheduleNextReadAck() return@launch } - data.joinToString("") { "%02x".format(it) } + data.toHexString() } catch (e: Exception) { scheduleNextReadAck() return@launch @@ -248,7 +250,7 @@ class NostrTransport( val recipientHex = try { val (hrp, data) = Bech32.decode(recipientNostrPubkey) if (hrp != "npub") return@launch - data.joinToString("") { "%02x".format(it) } + data.toHexString() } catch (e: Exception) { return@launch } @@ -306,7 +308,7 @@ class NostrTransport( val recipientHex = try { val (hrp, data) = Bech32.decode(recipientNostrPubkey) if (hrp != "npub") return@launch - data.joinToString("") { "%02x".format(it) } + data.toHexString() } catch (e: Exception) { return@launch } @@ -486,7 +488,7 @@ class NostrTransport( com.bitchat.android.favorites.FavoritesPersistenceService.shared.findNostrPubkeyForPeerID(peerID)?.let { return it } // 2) Legacy path: resolve by noise public key association - val noiseKey = hexStringToByteArray(peerID) + val noiseKey = PeerId.toBytes(peerID) val favoriteStatus = com.bitchat.android.favorites.FavoritesPersistenceService.shared.getFavoriteStatus(noiseKey) if (favoriteStatus?.peerNostrPublicKey != null) return favoriteStatus.peerNostrPublicKey @@ -503,14 +505,6 @@ class NostrTransport( } } - /** - * Convert full hex string to byte array - */ - private fun hexStringToByteArray(hexString: String): ByteArray { - val clean = if (hexString.length % 2 == 0) hexString else "0$hexString" - return clean.chunked(2).map { it.toInt(16).toByte() }.toByteArray() - } - fun cleanup() { transportScope.cancel() } diff --git a/app/src/main/java/com/bitchat/android/nostr/RelayDirectory.kt b/app/src/main/java/com/bitchat/android/nostr/RelayDirectory.kt index f591b2b8..05a0f483 100644 --- a/app/src/main/java/com/bitchat/android/nostr/RelayDirectory.kt +++ b/app/src/main/java/com/bitchat/android/nostr/RelayDirectory.kt @@ -3,13 +3,13 @@ package com.bitchat.android.nostr import android.app.Application import android.content.SharedPreferences import android.util.Log +import com.bitchat.android.util.Hashing import java.io.BufferedReader import java.io.File import java.io.FileInputStream import java.io.FileOutputStream import java.io.InputStream import java.io.InputStreamReader -import java.security.MessageDigest import java.util.concurrent.TimeUnit import kotlin.math.* import kotlinx.coroutines.CoroutineScope @@ -284,20 +284,6 @@ object RelayDirectory { } catch (_: Exception) { "error" } private fun streamSha256Hex(input: InputStream): String { - val digest = MessageDigest.getInstance("SHA-256") - val buf = ByteArray(8192) - var read: Int - while (true) { - read = input.read(buf) - if (read <= 0) break - digest.update(buf, 0, read) - } - val bytes = digest.digest() - return bytes.joinToString("") { b -> - val v = b.toInt() and 0xff - val s = Integer.toHexString(v) - if (s.length == 1) "0$s" else s - } + return Hashing.sha256Hex(input) } } - diff --git a/app/src/main/java/com/bitchat/android/protocol/BinaryProtocol.kt b/app/src/main/java/com/bitchat/android/protocol/BinaryProtocol.kt index db17ba1c..70566361 100644 --- a/app/src/main/java/com/bitchat/android/protocol/BinaryProtocol.kt +++ b/app/src/main/java/com/bitchat/android/protocol/BinaryProtocol.kt @@ -1,6 +1,7 @@ package com.bitchat.android.protocol import android.os.Parcelable +import com.bitchat.android.util.PeerId import kotlinx.parcelize.Parcelize import java.nio.ByteBuffer import java.nio.ByteOrder @@ -71,7 +72,7 @@ data class BitchatPacket( ) : this( version = 1u, type = type, - senderID = hexStringToByteArray(senderID), + senderID = PeerId.toBytes(senderID), recipientID = null, timestamp = (System.currentTimeMillis()).toULong(), payload = payload, @@ -108,27 +109,6 @@ data class BitchatPacket( fun fromBinaryData(data: ByteArray): BitchatPacket? { return BinaryProtocol.decode(data) } - - /** - * Convert hex string peer ID to binary data (8 bytes) - exactly same as iOS - */ - private fun hexStringToByteArray(hexString: String): ByteArray { - val result = ByteArray(8) { 0 } // Initialize with zeros, exactly 8 bytes - var tempID = hexString - var index = 0 - - while (tempID.length >= 2 && index < 8) { - val hexByte = tempID.substring(0, 2) - val byte = hexByte.toIntOrNull(16)?.toByte() - if (byte != null) { - result[index] = byte - } - tempID = tempID.substring(2) - index++ - } - - return result - } } override fun equals(other: Any?): Boolean { diff --git a/app/src/main/java/com/bitchat/android/protocol/Tlv.kt b/app/src/main/java/com/bitchat/android/protocol/Tlv.kt new file mode 100644 index 00000000..60ea0383 --- /dev/null +++ b/app/src/main/java/com/bitchat/android/protocol/Tlv.kt @@ -0,0 +1,110 @@ +package com.bitchat.android.protocol + +enum class TlvLengthSize(val byteCount: Int, val maxValue: Long) { + ONE_BYTE(1, 0xFFL), + TWO_BYTES(2, 0xFFFFL), + FOUR_BYTES(4, 0xFFFF_FFFFL) +} + +enum class UnknownTlvPolicy { + SKIP, + FAIL +} + +data class TlvField( + val type: Int, + val value: ByteArray +) + +class TlvWriter { + private val output = ArrayList() + + fun put(type: Int, value: ByteArray, lengthSize: TlvLengthSize): TlvWriter { + require(type in 0..0xFF) { "TLV type must fit in one byte" } + require(value.size.toLong() <= lengthSize.maxValue) { + "TLV value length ${value.size} exceeds ${lengthSize.maxValue}" + } + + output.add(type.toByte()) + writeLength(value.size.toLong(), lengthSize) + output.addAll(value.toList()) + return this + } + + fun toByteArray(): ByteArray { + return output.toByteArray() + } + + private fun writeLength(length: Long, lengthSize: TlvLengthSize) { + when (lengthSize) { + TlvLengthSize.ONE_BYTE -> output.add((length and 0xFF).toByte()) + TlvLengthSize.TWO_BYTES -> { + output.add(((length ushr 8) and 0xFF).toByte()) + output.add((length and 0xFF).toByte()) + } + TlvLengthSize.FOUR_BYTES -> { + output.add(((length ushr 24) and 0xFF).toByte()) + output.add(((length ushr 16) and 0xFF).toByte()) + output.add(((length ushr 8) and 0xFF).toByte()) + output.add((length and 0xFF).toByte()) + } + } + } +} + +object TlvReader { + fun decode( + data: ByteArray, + defaultLengthSize: TlvLengthSize, + unknownPolicy: UnknownTlvPolicy = UnknownTlvPolicy.SKIP, + knownTypes: Set? = null, + lengthSizeForType: (Int) -> TlvLengthSize = { defaultLengthSize } + ): List? { + val fields = ArrayList() + var offset = 0 + + while (offset < data.size) { + if (data.size - offset < 1) return null + val type = data[offset].toInt() and 0xFF + offset += 1 + + val lengthSize = lengthSizeForType(type) + if (data.size - offset < lengthSize.byteCount) return null + + val length = readLength(data, offset, lengthSize) ?: return null + offset += lengthSize.byteCount + + if (length > Int.MAX_VALUE || data.size - offset < length.toInt()) return null + val valueLength = length.toInt() + val value = data.copyOfRange(offset, offset + valueLength) + offset += valueLength + + if (knownTypes != null && type !in knownTypes) { + when (unknownPolicy) { + UnknownTlvPolicy.SKIP -> continue + UnknownTlvPolicy.FAIL -> return null + } + } + + fields.add(TlvField(type, value)) + } + + return fields + } + + private fun readLength(data: ByteArray, offset: Int, lengthSize: TlvLengthSize): Long? { + return when (lengthSize) { + TlvLengthSize.ONE_BYTE -> data[offset].toLong() and 0xFFL + TlvLengthSize.TWO_BYTES -> { + ((data[offset].toLong() and 0xFFL) shl 8) or + (data[offset + 1].toLong() and 0xFFL) + } + TlvLengthSize.FOUR_BYTES -> { + ((data[offset].toLong() and 0xFFL) shl 24) or + ((data[offset + 1].toLong() and 0xFFL) shl 16) or + ((data[offset + 2].toLong() and 0xFFL) shl 8) or + (data[offset + 3].toLong() and 0xFFL) + } + } + } +} diff --git a/app/src/main/java/com/bitchat/android/services/ConversationAliasResolver.kt b/app/src/main/java/com/bitchat/android/services/ConversationAliasResolver.kt index d67ff432..93652757 100644 --- a/app/src/main/java/com/bitchat/android/services/ConversationAliasResolver.kt +++ b/app/src/main/java/com/bitchat/android/services/ConversationAliasResolver.kt @@ -1,6 +1,8 @@ package com.bitchat.android.services import com.bitchat.android.ui.ChatState +import com.bitchat.android.util.hexToByteArray +import com.bitchat.android.util.toHexString object ConversationAliasResolver { @@ -19,7 +21,7 @@ object ConversationAliasResolver { if (pubHex != null) { val noiseKey = findNoiseKeyForNostr(pubHex) if (noiseKey != null) { - val noiseHex = noiseKey.joinToString("") { b -> "%02x".format(b) } + val noiseHex = noiseKey.toHexString() // Prefer a connected mesh peer that matches this noise key val meshPeer = connectedPeers.firstOrNull { pid -> meshNoiseKeyForPeer(pid)?.contentEquals(noiseKey) == true @@ -29,7 +31,7 @@ object ConversationAliasResolver { } } else if (peer.length == 64 && peer.matches(Regex("^[0-9a-fA-F]+$"))) { // Peer is full noise key hex: upgrade to active mesh peer if available - val noiseKey = peer.chunked(2).map { it.toInt(16).toByte() }.toByteArray() + val noiseKey = peer.hexToByteArray() val meshPeer = connectedPeers.firstOrNull { pid -> meshNoiseKeyForPeer(pid)?.contentEquals(noiseKey) == true } diff --git a/app/src/main/java/com/bitchat/android/services/MessageRouter.kt b/app/src/main/java/com/bitchat/android/services/MessageRouter.kt index a6bac09a..1592d189 100644 --- a/app/src/main/java/com/bitchat/android/services/MessageRouter.kt +++ b/app/src/main/java/com/bitchat/android/services/MessageRouter.kt @@ -5,6 +5,8 @@ import android.util.Log import com.bitchat.android.mesh.BluetoothMeshService import com.bitchat.android.model.ReadReceipt import com.bitchat.android.nostr.NostrTransport +import com.bitchat.android.util.hexToByteArrayOrNull +import com.bitchat.android.util.toHexString /** * Routes messages between BLE mesh and Nostr transports, matching iOS behavior. @@ -164,7 +166,7 @@ class MessageRouter private constructor( return try { // Full Noise key hex if (peerID.length == 64 && peerID.matches(Regex("^[0-9a-fA-F]+$"))) { - val noiseKey = hexToBytes(peerID) + val noiseKey = peerID.hexToByteArrayOrNull() ?: return false val fav = com.bitchat.android.favorites.FavoritesPersistenceService.shared.getFavoriteStatus(noiseKey) fav?.isMutual == true && fav.peerNostrPublicKey != null } else if (peerID.length == 16 && peerID.matches(Regex("^[0-9a-fA-F]+$"))) { @@ -177,16 +179,11 @@ class MessageRouter private constructor( } catch (_: Exception) { false } } - private fun hexToBytes(hex: String): ByteArray { - val clean = if (hex.length % 2 == 0) hex else "0$hex" - return clean.chunked(2).map { it.toInt(16).toByte() }.toByteArray() - } - private fun resolveMeshPeerForNoiseHex(noiseHex: String): String? { return try { mesh.getPeerNicknames().keys.firstOrNull { pid -> val info = mesh.getPeerInfo(pid) - val keyHex = info?.noisePublicKey?.joinToString("") { b -> "%02x".format(b) } + val keyHex = info?.noisePublicKey?.toHexString() keyHex != null && keyHex.equals(noiseHex, ignoreCase = true) } } catch (_: Exception) { null } @@ -197,7 +194,7 @@ class MessageRouter private constructor( peers.forEach { pid -> flushOutboxFor(pid) val noiseHex = try { - mesh.getPeerInfo(pid)?.noisePublicKey?.joinToString("") { b -> "%02x".format(b) } + mesh.getPeerInfo(pid)?.noisePublicKey?.toHexString() } catch (_: Exception) { null } noiseHex?.let { flushOutboxFor(it) } } @@ -207,7 +204,7 @@ class MessageRouter private constructor( fun onSessionEstablished(peerID: String) { flushOutboxFor(peerID) val noiseHex = try { - mesh.getPeerInfo(peerID)?.noisePublicKey?.joinToString("") { b -> "%02x".format(b) } + mesh.getPeerInfo(peerID)?.noisePublicKey?.toHexString() } catch (_: Exception) { null } noiseHex?.let { flushOutboxFor(it) } } diff --git a/app/src/main/java/com/bitchat/android/services/meshgraph/GossipTLV.kt b/app/src/main/java/com/bitchat/android/services/meshgraph/GossipTLV.kt index 85ea6c9c..ea45d07c 100644 --- a/app/src/main/java/com/bitchat/android/services/meshgraph/GossipTLV.kt +++ b/app/src/main/java/com/bitchat/android/services/meshgraph/GossipTLV.kt @@ -1,6 +1,11 @@ package com.bitchat.android.services.meshgraph import android.util.Log +import com.bitchat.android.protocol.TlvLengthSize +import com.bitchat.android.protocol.TlvReader +import com.bitchat.android.protocol.TlvWriter +import com.bitchat.android.protocol.UnknownTlvPolicy +import com.bitchat.android.util.PeerId /** * Gossip TLV helpers for embedding direct neighbor peer IDs in ANNOUNCE payloads. @@ -15,12 +20,14 @@ object GossipTLV { */ fun encodeNeighbors(peerIDs: List): ByteArray { val unique = peerIDs.distinct().take(10) - val valueBytes = unique.flatMap { id -> hexStringPeerIdTo8Bytes(id).toList() }.toByteArray() + val valueBytes = unique.flatMap { id -> PeerId.toBytes(id).toList() }.toByteArray() if (valueBytes.size > 255) { // Safety check, though 10*8 = 80 bytes, so well under 255 Log.w("GossipTLV", "Neighbors value exceeds 255, truncating") } - return byteArrayOf(DIRECT_NEIGHBORS_TYPE.toByte(), valueBytes.size.toByte()) + valueBytes + return TlvWriter() + .put(DIRECT_NEIGHBORS_TYPE.toInt(), valueBytes, TlvLengthSize.ONE_BYTE) + .toByteArray() } /** @@ -29,22 +36,21 @@ object GossipTLV { */ fun decodeNeighborsFromAnnouncementPayload(payload: ByteArray): List? { val result = mutableListOf() - var offset = 0 - while (offset + 2 <= payload.size) { - val type = payload[offset].toUByte() - val len = payload[offset + 1].toUByte().toInt() - offset += 2 - if (offset + len > payload.size) break - val value = payload.sliceArray(offset until offset + len) - offset += len + val fields = TlvReader.decode( + data = payload, + defaultLengthSize = TlvLengthSize.ONE_BYTE, + unknownPolicy = UnknownTlvPolicy.SKIP, + knownTypes = setOf(DIRECT_NEIGHBORS_TYPE.toInt()) + ) ?: return null - if (type == DIRECT_NEIGHBORS_TYPE) { + for (field in fields) { + if (field.type == DIRECT_NEIGHBORS_TYPE.toInt()) { // Value is N*8 bytes of peer IDs var pos = 0 - while (pos + 8 <= value.size) { - val idBytes = value.sliceArray(pos until pos + 8) - result.add(bytesToPeerIdHex(idBytes)) - pos += 8 + while (pos + PeerId.BYTE_LENGTH <= field.value.size) { + val idBytes = field.value.sliceArray(pos until pos + PeerId.BYTE_LENGTH) + result.add(PeerId.fromBytes(idBytes)) + pos += PeerId.BYTE_LENGTH } return result // present (possibly empty) } @@ -52,26 +58,4 @@ object GossipTLV { // Not present return null } - - private fun hexStringPeerIdTo8Bytes(hexString: String): ByteArray { - val clean = hexString.lowercase().take(16) - val result = ByteArray(8) { 0 } - var idx = 0 - var out = 0 - while (idx + 1 < clean.length && out < 8) { - val byteStr = clean.substring(idx, idx + 2) - val b = byteStr.toIntOrNull(16)?.toByte() ?: 0 - result[out++] = b - idx += 2 - } - return result - } - - private fun bytesToPeerIdHex(bytes: ByteArray): String { - val sb = StringBuilder() - for (b in bytes.take(8)) { - sb.append(String.format("%02x", b)) - } - return sb.toString() - } } diff --git a/app/src/main/java/com/bitchat/android/sync/GossipSyncManager.kt b/app/src/main/java/com/bitchat/android/sync/GossipSyncManager.kt index 5c786365..f65876e6 100644 --- a/app/src/main/java/com/bitchat/android/sync/GossipSyncManager.kt +++ b/app/src/main/java/com/bitchat/android/sync/GossipSyncManager.kt @@ -6,6 +6,9 @@ import com.bitchat.android.model.RequestSyncPacket import com.bitchat.android.protocol.BitchatPacket import com.bitchat.android.protocol.MessageType import com.bitchat.android.protocol.SpecialRecipients +import com.bitchat.android.util.PeerId +import com.bitchat.android.util.hexToByteArray +import com.bitchat.android.util.toHexString import kotlinx.coroutines.* import java.util.concurrent.ConcurrentHashMap @@ -101,7 +104,7 @@ class GossipSyncManager( if (!isBroadcastMessage && !isAnnouncement) return val idBytes = PacketIdUtil.computeIdBytes(packet) - val id = idBytes.joinToString("") { b -> "%02x".format(b) } + val id = idBytes.toHexString() if (isBroadcastMessage) { synchronized(messages) { @@ -122,7 +125,7 @@ class GossipSyncManager( return } // senderID is fixed-size 8 bytes; map to hex string for key - val sender = packet.senderID.joinToString("") { b -> "%02x".format(b) } + val sender = packet.senderID.toHexString() latestAnnouncementByPeer[sender] = id to packet // Enforce capacity (remove oldest when exceeded) val cap = configProvider.seenCapacity().coerceAtLeast(1) @@ -138,7 +141,7 @@ class GossipSyncManager( val packet = BitchatPacket( type = MessageType.REQUEST_SYNC.value, - senderID = hexStringToByteArray(myPeerID), + senderID = PeerId.toBytes(myPeerID), timestamp = System.currentTimeMillis().toULong(), payload = payload, ttl = com.bitchat.android.util.AppConstants.SYNC_TTL_HOPS // neighbors only @@ -153,8 +156,8 @@ class GossipSyncManager( val packet = BitchatPacket( type = MessageType.REQUEST_SYNC.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(peerID), + senderID = PeerId.toBytes(myPeerID), + recipientID = PeerId.toBytes(peerID), timestamp = System.currentTimeMillis().toULong(), payload = payload, ttl = com.bitchat.android.util.AppConstants.SYNC_TTL_HOPS // neighbor only @@ -177,7 +180,7 @@ class GossipSyncManager( // 1) Announcements: send latest per peerID if remote doesn't have them for ((_, pair) in latestAnnouncementByPeer.entries) { val (id, pkt) = pair - val idBytes = hexToBytes(id) + val idBytes = id.hexToByteArray() if (!mightContain(idBytes)) { // Send original packet unchanged to requester only (keep local TTL) val toSend = pkt.copy(ttl = com.bitchat.android.util.AppConstants.SYNC_TTL_HOPS) @@ -198,31 +201,6 @@ class GossipSyncManager( } } - private fun hexStringToByteArray(hexString: String): ByteArray { - val result = ByteArray(8) { 0 } - var tempID = hexString - var index = 0 - while (tempID.length >= 2 && index < 8) { - val hexByte = tempID.substring(0, 2) - val byte = hexByte.toIntOrNull(16)?.toByte() - if (byte != null) result[index] = byte - tempID = tempID.substring(2) - index++ - } - return result - } - - private fun hexToBytes(hex: String): ByteArray { - val clean = if (hex.length % 2 == 0) hex else "0$hex" - val out = ByteArray(clean.length / 2) - var i = 0 - while (i < clean.length) { - out[i/2] = clean.substring(i, i+2).toInt(16).toByte() - i += 2 - } - return out - } - private fun buildGcsPayload(): ByteArray { // Collect candidates: latest announcement per peer + recent broadcast messages val list = ArrayList() @@ -276,7 +254,7 @@ class GossipSyncManager( val toRemove = mutableListOf() synchronized(messages) { for ((id, message) in messages) { - val sender = message.senderID.joinToString("") { b -> "%02x".format(b) } + val sender = message.senderID.toHexString() if (sender == peerID) toRemove.add(id) } } @@ -300,7 +278,7 @@ class GossipSyncManager( val idsToRemove = mutableListOf() synchronized(messages) { for ((id, message) in messages) { - val sender = message.senderID.joinToString("") { b -> "%02x".format(b) } + val sender = message.senderID.toHexString() if (sender == key) { idsToRemove.add(id) } diff --git a/app/src/main/java/com/bitchat/android/sync/PacketIdUtil.kt b/app/src/main/java/com/bitchat/android/sync/PacketIdUtil.kt index 4396ff5a..d08956fe 100644 --- a/app/src/main/java/com/bitchat/android/sync/PacketIdUtil.kt +++ b/app/src/main/java/com/bitchat/android/sync/PacketIdUtil.kt @@ -1,7 +1,8 @@ package com.bitchat.android.sync import com.bitchat.android.protocol.BitchatPacket -import java.security.MessageDigest +import com.bitchat.android.util.Hashing +import com.bitchat.android.util.toHexString /** * Deterministic packet ID helper for sync purposes. @@ -11,21 +12,22 @@ import java.security.MessageDigest */ object PacketIdUtil { fun computeIdBytes(packet: BitchatPacket): ByteArray { - val md = MessageDigest.getInstance("SHA-256") - md.update(packet.type.toByte()) - md.update(packet.senderID) - // Timestamp as 8 bytes big-endian + val data = ByteArray(1 + packet.senderID.size + 8 + packet.payload.size) + var offset = 0 + data[offset++] = packet.type.toByte() + packet.senderID.copyInto(data, destinationOffset = offset) + offset += packet.senderID.size + val ts = packet.timestamp.toLong() for (i in 7 downTo 0) { - md.update(((ts ushr (i * 8)) and 0xFF).toByte()) + data[offset++] = ((ts ushr (i * 8)) and 0xFF).toByte() } - md.update(packet.payload) - val digest = md.digest() - return digest.copyOf(16) // 128-bit ID + packet.payload.copyInto(data, destinationOffset = offset) + + return Hashing.sha256(data).copyOf(16) // 128-bit ID } fun computeIdHex(packet: BitchatPacket): String { - return computeIdBytes(packet).joinToString("") { b -> "%02x".format(b) } + return computeIdBytes(packet).toHexString() } } - diff --git a/app/src/main/java/com/bitchat/android/ui/ChannelManager.kt b/app/src/main/java/com/bitchat/android/ui/ChannelManager.kt index 5cc1375c..6e082b20 100644 --- a/app/src/main/java/com/bitchat/android/ui/ChannelManager.kt +++ b/app/src/main/java/com/bitchat/android/ui/ChannelManager.kt @@ -2,7 +2,6 @@ package com.bitchat.android.ui import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import java.security.MessageDigest import javax.crypto.Cipher import javax.crypto.spec.GCMParameterSpec import javax.crypto.spec.SecretKeySpec diff --git a/app/src/main/java/com/bitchat/android/ui/ChatViewModel.kt b/app/src/main/java/com/bitchat/android/ui/ChatViewModel.kt index 786e7e91..fc47828d 100644 --- a/app/src/main/java/com/bitchat/android/ui/ChatViewModel.kt +++ b/app/src/main/java/com/bitchat/android/ui/ChatViewModel.kt @@ -30,7 +30,6 @@ import com.bitchat.android.noise.NoiseSession import com.bitchat.android.nostr.GeohashAliasRegistry import com.bitchat.android.util.dataFromHexString import com.bitchat.android.util.hexEncodedString -import java.security.MessageDigest /** * Refactored ChatViewModel - Main coordinator for bitchat functionality diff --git a/app/src/main/java/com/bitchat/android/ui/MediaSendingManager.kt b/app/src/main/java/com/bitchat/android/ui/MediaSendingManager.kt index 8de53239..4703c3b4 100644 --- a/app/src/main/java/com/bitchat/android/ui/MediaSendingManager.kt +++ b/app/src/main/java/com/bitchat/android/ui/MediaSendingManager.kt @@ -5,8 +5,8 @@ import com.bitchat.android.mesh.BluetoothMeshService import com.bitchat.android.model.BitchatFilePacket import com.bitchat.android.model.BitchatMessage import com.bitchat.android.model.BitchatMessageType +import com.bitchat.android.util.Hashing import java.util.Date -import java.security.MessageDigest /** * Handles media file sending operations (voice notes, images, generic files) @@ -181,8 +181,8 @@ class MediaSendingManager( } Log.d(TAG, "🔒 Encoded private packet: ${payload.size} bytes") - val transferId = sha256Hex(payload) - val contentHash = sha256Hex(filePacket.content) + val transferId = Hashing.sha256Hex(payload) + val contentHash = Hashing.sha256Hex(filePacket.content) Log.d(TAG, "📤 FILE_TRANSFER send (private): name='${filePacket.fileName}', size=${filePacket.fileSize}, mime='${filePacket.mimeType}', sha256=$contentHash, to=${toPeerID.take(8)} transferId=${transferId.take(16)}…") @@ -232,8 +232,8 @@ class MediaSendingManager( } Log.d(TAG, "🔓 Encoded broadcast packet: ${payload.size} bytes") - val transferId = sha256Hex(payload) - val contentHash = sha256Hex(filePacket.content) + val transferId = Hashing.sha256Hex(payload) + val contentHash = Hashing.sha256Hex(filePacket.content) Log.d(TAG, "📤 FILE_TRANSFER send (broadcast): name='${filePacket.fileName}', size=${filePacket.fileSize}, mime='${filePacket.mimeType}', sha256=$contentHash, transferId=${transferId.take(16)}…") @@ -339,11 +339,4 @@ class MediaSendingManager( } } - private fun sha256Hex(bytes: ByteArray): String = try { - val md = MessageDigest.getInstance("SHA-256") - md.update(bytes) - md.digest().joinToString("") { "%02x".format(it) } - } catch (_: Exception) { - bytes.size.toString(16) - } } diff --git a/app/src/main/java/com/bitchat/android/ui/MeshDelegateHandler.kt b/app/src/main/java/com/bitchat/android/ui/MeshDelegateHandler.kt index d27719c7..8111cb28 100644 --- a/app/src/main/java/com/bitchat/android/ui/MeshDelegateHandler.kt +++ b/app/src/main/java/com/bitchat/android/ui/MeshDelegateHandler.kt @@ -5,6 +5,7 @@ import com.bitchat.android.ui.NotificationTextUtils import com.bitchat.android.mesh.BluetoothMeshService import com.bitchat.android.model.BitchatMessage import com.bitchat.android.model.DeliveryStatus +import com.bitchat.android.util.toHexString import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import java.util.Date @@ -130,7 +131,7 @@ class MeshDelegateHandler( favs.firstNotNullOfOrNull { rel -> rel.peerNostrPublicKey?.let { s -> runCatching { com.bitchat.android.nostr.Bech32.decode(s) }.getOrNull()?.let { dec -> - if (dec.first == "npub") dec.second.joinToString("") { b -> "%02x".format(b) } else null + if (dec.first == "npub") dec.second.toHexString() else null } } }?.takeIf { it.startsWith(prefix, ignoreCase = true) } @@ -154,7 +155,7 @@ class MeshDelegateHandler( } catch (_: Exception) { null } if (favoriteRel?.isMutual == true) { - val noiseHex = favoriteRel.peerNoisePublicKey.joinToString("") { b -> "%02x".format(b) } + val noiseHex = favoriteRel.peerNoisePublicKey.toHexString() if (noiseHex != currentPeer) { com.bitchat.android.services.ConversationAliasResolver.unifyChatsIntoPeer( state = state, @@ -175,14 +176,14 @@ class MeshDelegateHandler( try { val info = getPeerInfo(pid) val noiseKey = info?.noisePublicKey ?: return@forEach - val noiseHex = noiseKey.joinToString("") { b -> "%02x".format(b) } + val noiseHex = noiseKey.toHexString() // Derive temp nostr key from favorites npub val npub = com.bitchat.android.favorites.FavoritesPersistenceService.shared.findNostrPubkey(noiseKey) val tempNostrKey: String? = try { if (npub != null) { val (hrp, data) = com.bitchat.android.nostr.Bech32.decode(npub) - if (hrp == "npub") "nostr_${data.joinToString("") { b -> "%02x".format(b) }.take(16)}" else null + if (hrp == "npub") "nostr_${data.toHexString().take(16)}" else null } else null } catch (_: Exception) { null } diff --git a/app/src/main/java/com/bitchat/android/ui/MeshPeerListSheet.kt b/app/src/main/java/com/bitchat/android/ui/MeshPeerListSheet.kt index e5688a4e..3087ece6 100644 --- a/app/src/main/java/com/bitchat/android/ui/MeshPeerListSheet.kt +++ b/app/src/main/java/com/bitchat/android/ui/MeshPeerListSheet.kt @@ -2,6 +2,7 @@ package com.bitchat.android.ui import com.bitchat.android.R import android.util.Log +import com.bitchat.android.util.toHexString import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.* import androidx.compose.foundation.layout.* @@ -333,7 +334,7 @@ fun PeopleSection( // Build mapping of connected peerID -> noise key hex to unify with offline favorites val noiseHexByPeerID: Map = connectedPeers.associateWith { pid -> try { - viewModel.meshService.getPeerInfo(pid)?.noisePublicKey?.joinToString("") { b -> "%02x".format(b) } + viewModel.meshService.getPeerInfo(pid)?.noisePublicKey?.toHexString() } catch (_: Exception) { null } }.filterValues { it != null }.mapValues { it.value!! } @@ -367,7 +368,7 @@ fun PeopleSection( // Offline favorites (exclude ones mapped to connected) val offlineFavorites = com.bitchat.android.favorites.FavoritesPersistenceService.shared.getOurFavorites() offlineFavorites.forEach { fav -> - val favPeerID = fav.peerNoisePublicKey.joinToString("") { b -> "%02x".format(b) } + val favPeerID = fav.peerNoisePublicKey.toHexString() val isMappedToConnected = noiseHexByPeerID.values.any { it.equals(favPeerID, ignoreCase = true) } if (!isMappedToConnected) { val dn = peerNicknames[favPeerID] ?: fav.peerNickname @@ -435,7 +436,7 @@ fun PeopleSection( // Append offline favorites we actively favorite (and not currently connected) offlineFavorites.forEach { fav -> - val favPeerID = fav.peerNoisePublicKey.joinToString("") { b -> "%02x".format(b) } + val favPeerID = fav.peerNoisePublicKey.toHexString() // If any connected peer maps to this noise key, skip showing the offline entry val isMappedToConnected = noiseHexByPeerID.values.any { it.equals(favPeerID, ignoreCase = true) } if (isMappedToConnected) return@forEach @@ -446,7 +447,7 @@ fun PeopleSection( if (npubOrHex != null) { val hex = if (npubOrHex.startsWith("npub")) { val (hrp, data) = com.bitchat.android.nostr.Bech32.decode(npubOrHex) - if (hrp == "npub") data.joinToString("") { "%02x".format(it) } else null + if (hrp == "npub") data.toHexString() else null } else { npubOrHex.lowercase() } diff --git a/app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt b/app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt index af2882bb..f359fed3 100644 --- a/app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt +++ b/app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt @@ -3,7 +3,9 @@ package com.bitchat.android.ui import com.bitchat.android.model.BitchatMessage import com.bitchat.android.model.DeliveryStatus import com.bitchat.android.mesh.PeerFingerprintManager -import java.security.MessageDigest +import com.bitchat.android.util.Hashing +import com.bitchat.android.util.hexToByteArray +import com.bitchat.android.util.toHexString import com.bitchat.android.mesh.BluetoothMeshService import java.util.* @@ -131,10 +133,8 @@ class PrivateChatManager( // compute a synthetic fingerprint (SHA-256 of public key) to allow unfollowing offline peers if (fingerprint == null && peerID.length == 64 && peerID.matches(Regex("^[0-9a-fA-F]+$"))) { try { - val pubBytes = peerID.chunked(2).map { it.toInt(16).toByte() }.toByteArray() - val digest = java.security.MessageDigest.getInstance("SHA-256") - val fpBytes = digest.digest(pubBytes) - fingerprint = fpBytes.joinToString("") { "%02x".format(it) } + val pubBytes = peerID.hexToByteArray() + fingerprint = Hashing.sha256Hex(pubBytes) Log.d(TAG, "Computed fingerprint from noise key hex for offline toggle: $fingerprint") } catch (e: Exception) { Log.w(TAG, "Failed to compute fingerprint from noise key hex: ${e.message}") @@ -432,13 +432,13 @@ class PrivateChatManager( // If we know the sender's Nostr pubkey for this peer via favorites, derive temp key try { - val noiseKeyBytes = targetPeerID.chunked(2).map { it.toInt(16).toByte() }.toByteArray() + val noiseKeyBytes = targetPeerID.hexToByteArray() val npub = com.bitchat.android.favorites.FavoritesPersistenceService.shared.findNostrPubkey(noiseKeyBytes) if (npub != null) { // Normalize to hex to match how we formed temp keys (nostr_) val (hrp, data) = com.bitchat.android.nostr.Bech32.decode(npub) if (hrp == "npub") { - val pubHex = data.joinToString("") { "%02x".format(it) } + val pubHex = data.toHexString() tryMergeKeys.add("nostr_${pubHex.take(16)}") } } diff --git a/app/src/main/java/com/bitchat/android/ui/VerificationHandler.kt b/app/src/main/java/com/bitchat/android/ui/VerificationHandler.kt index 2b0d503f..cde3eefe 100644 --- a/app/src/main/java/com/bitchat/android/ui/VerificationHandler.kt +++ b/app/src/main/java/com/bitchat/android/ui/VerificationHandler.kt @@ -9,6 +9,7 @@ import com.bitchat.android.model.BitchatMessage import com.bitchat.android.noise.NoiseSession import com.bitchat.android.nostr.GeohashAliasRegistry import com.bitchat.android.services.VerificationService +import com.bitchat.android.util.Hashing import com.bitchat.android.util.dataFromHexString import com.bitchat.android.util.hexEncodedString import kotlinx.coroutines.CoroutineScope @@ -16,7 +17,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import java.security.MessageDigest import java.util.Date import java.util.concurrent.ConcurrentHashMap @@ -333,8 +333,7 @@ class VerificationHandler( } fun fingerprintFromNoiseBytes(bytes: ByteArray): String { - val hash = MessageDigest.getInstance("SHA-256").digest(bytes) - return hash.hexEncodedString() + return Hashing.sha256Hex(bytes) } private data class PendingVerification( diff --git a/app/src/main/java/com/bitchat/android/util/BinaryEncodingUtils.kt b/app/src/main/java/com/bitchat/android/util/BinaryEncodingUtils.kt index 549f5971..ce564eca 100644 --- a/app/src/main/java/com/bitchat/android/util/BinaryEncodingUtils.kt +++ b/app/src/main/java/com/bitchat/android/util/BinaryEncodingUtils.kt @@ -12,24 +12,11 @@ import java.util.* // MARK: - Hex Encoding/Decoding Extensions fun ByteArray.hexEncodedString(): String { - if (this.isEmpty()) { - return "" - } - return this.joinToString("") { "%02x".format(it) } + return Hex.encode(this) } fun String.dataFromHexString(): ByteArray? { - val len = this.length / 2 - val data = ByteArray(len) - var index = 0 - - for (i in 0 until len) { - val hexByte = this.substring(i * 2, i * 2 + 2) - val byte = hexByte.toIntOrNull(16)?.toByte() ?: return null - data[index++] = byte - } - - return data + return Hex.decode(this) } // MARK: - Binary Encoding Utilities @@ -201,7 +188,7 @@ class BinaryDataReader(private val data: ByteArray) { offset += 16 // Convert 16 bytes to UUID string format - val uuid = uuidData.joinToString("") { "%02x".format(it) } + val uuid = uuidData.toHexString() // Insert hyphens at proper positions: 8-4-4-4-12 val result = StringBuilder() @@ -340,7 +327,7 @@ fun ByteArray.readUUID(at: IntArray): String? { at[0] += 16 // Convert 16 bytes to UUID string format - val uuid = uuidData.joinToString("") { "%02x".format(it) } + val uuid = uuidData.toHexString() // Insert hyphens at proper positions: 8-4-4-4-12 val result = StringBuilder() diff --git a/app/src/main/java/com/bitchat/android/util/ByteArrayExtensions.kt b/app/src/main/java/com/bitchat/android/util/ByteArrayExtensions.kt deleted file mode 100644 index b2acf112..00000000 --- a/app/src/main/java/com/bitchat/android/util/ByteArrayExtensions.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.bitchat.android.util - -/** - * Extension function to convert a ByteArray to a hexadecimal string. - */ -fun ByteArray.toHexString(): String { - return this.joinToString("") { "%02x".format(it) } -} diff --git a/app/src/main/java/com/bitchat/android/util/ByteArrayWrapper.kt b/app/src/main/java/com/bitchat/android/util/ByteArrayWrapper.kt index da078d3d..db63b67e 100644 --- a/app/src/main/java/com/bitchat/android/util/ByteArrayWrapper.kt +++ b/app/src/main/java/com/bitchat/android/util/ByteArrayWrapper.kt @@ -21,6 +21,6 @@ data class ByteArrayWrapper(val bytes: ByteArray) { } fun toHexString(): String { - return bytes.joinToString("") { "%02x".format(it) } + return Hex.encode(bytes) } } diff --git a/app/src/main/java/com/bitchat/android/util/Hashing.kt b/app/src/main/java/com/bitchat/android/util/Hashing.kt new file mode 100644 index 00000000..06e675d3 --- /dev/null +++ b/app/src/main/java/com/bitchat/android/util/Hashing.kt @@ -0,0 +1,31 @@ +package com.bitchat.android.util + +import java.io.InputStream +import java.security.MessageDigest + +object Hashing { + fun sha256(bytes: ByteArray): ByteArray { + return MessageDigest.getInstance("SHA-256").digest(bytes) + } + + fun sha256Hex(bytes: ByteArray): String { + return Hex.encode(sha256(bytes)) + } + + fun sha256Hex(text: String): String { + return sha256Hex(text.toByteArray(Charsets.UTF_8)) + } + + fun sha256Hex(input: InputStream): String { + val digest = MessageDigest.getInstance("SHA-256") + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + + while (true) { + val read = input.read(buffer) + if (read <= 0) break + digest.update(buffer, 0, read) + } + + return Hex.encode(digest.digest()) + } +} diff --git a/app/src/main/java/com/bitchat/android/util/Hex.kt b/app/src/main/java/com/bitchat/android/util/Hex.kt new file mode 100644 index 00000000..6bf57345 --- /dev/null +++ b/app/src/main/java/com/bitchat/android/util/Hex.kt @@ -0,0 +1,49 @@ +package com.bitchat.android.util + +object Hex { + private val digits = "0123456789abcdef".toCharArray() + + fun encode(bytes: ByteArray): String { + val chars = CharArray(bytes.size * 2) + var index = 0 + for (byte in bytes) { + val value = byte.toInt() and 0xFF + chars[index++] = digits[value ushr 4] + chars[index++] = digits[value and 0x0F] + } + return String(chars) + } + + fun decode(hex: String, allowOddLength: Boolean = false): ByteArray? { + val clean = hex.trim() + val normalized = when { + clean.length % 2 == 0 -> clean + allowOddLength -> "0$clean" + else -> return null + } + + val output = ByteArray(normalized.length / 2) + var inputIndex = 0 + var outputIndex = 0 + while (inputIndex < normalized.length) { + val high = normalized[inputIndex].digitToIntOrNull(16) ?: return null + val low = normalized[inputIndex + 1].digitToIntOrNull(16) ?: return null + output[outputIndex++] = ((high shl 4) or low).toByte() + inputIndex += 2 + } + return output + } + + fun decodeOrThrow(hex: String, allowOddLength: Boolean = false): ByteArray { + return decode(hex, allowOddLength) + ?: throw IllegalArgumentException("Invalid hex string") + } +} + +fun ByteArray.toHexString(): String = Hex.encode(this) + +fun String.hexToByteArray(): ByteArray = Hex.decodeOrThrow(this) + +fun String.hexToByteArrayOrNull(allowOddLength: Boolean = false): ByteArray? { + return Hex.decode(this, allowOddLength) +} diff --git a/app/src/main/java/com/bitchat/android/util/PeerId.kt b/app/src/main/java/com/bitchat/android/util/PeerId.kt new file mode 100644 index 00000000..2f7ccdfb --- /dev/null +++ b/app/src/main/java/com/bitchat/android/util/PeerId.kt @@ -0,0 +1,38 @@ +package com.bitchat.android.util + +object PeerId { + const val BYTE_LENGTH = 8 + const val HEX_LENGTH = BYTE_LENGTH * 2 + + fun fromBytes(bytes: ByteArray): String { + return Hex.encode(bytes.copyOf(BYTE_LENGTH)) + } + + fun parse(peerIdHex: String): ByteArray? { + val clean = peerIdHex.trim() + if (clean.length != HEX_LENGTH) return null + return Hex.decode(clean)?.takeIf { it.size == BYTE_LENGTH } + } + + fun toBytes(peerIdHex: String): ByteArray { + val result = ByteArray(BYTE_LENGTH) + val clean = peerIdHex.trim() + var inputIndex = 0 + var outputIndex = 0 + + while (inputIndex + 1 < clean.length && outputIndex < BYTE_LENGTH) { + val value = clean.substring(inputIndex, inputIndex + 2).toIntOrNull(16) + if (value != null) { + result[outputIndex] = value.toByte() + } + inputIndex += 2 + outputIndex += 1 + } + + return result + } + + fun normalize(peerIdHex: String): String { + return fromBytes(toBytes(peerIdHex)) + } +} diff --git a/app/src/test/kotlin/com/bitchat/android/mesh/PacketRelayManagerTest.kt b/app/src/test/kotlin/com/bitchat/android/mesh/PacketRelayManagerTest.kt index ae896e53..481ad464 100644 --- a/app/src/test/kotlin/com/bitchat/android/mesh/PacketRelayManagerTest.kt +++ b/app/src/test/kotlin/com/bitchat/android/mesh/PacketRelayManagerTest.kt @@ -4,6 +4,7 @@ package com.bitchat.android.mesh import com.bitchat.android.model.RoutedPacket import com.bitchat.android.protocol.BitchatPacket import com.bitchat.android.protocol.MessageType +import com.bitchat.android.util.PeerId import com.bitchat.android.util.toHexString import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest @@ -37,8 +38,8 @@ class PacketRelayManagerTest { private fun createPacket(route: List?, recipient: String? = null): BitchatPacket { return BitchatPacket( type = MessageType.MESSAGE.value, - senderID = hexStringToPeerBytes(otherPeerID), - recipientID = recipient?.let { hexStringToPeerBytes(it) }, + senderID = PeerId.toBytes(otherPeerID), + recipientID = recipient?.let { PeerId.toBytes(it) }, timestamp = System.currentTimeMillis().toULong(), payload = "hello".toByteArray(), ttl = 5u, @@ -49,8 +50,8 @@ class PacketRelayManagerTest { @Test fun `packet with duplicate hops is dropped`() = runTest { val route = listOf( - hexStringToPeerBytes(nextHopPeerID), - hexStringToPeerBytes(nextHopPeerID) + PeerId.toBytes(nextHopPeerID), + PeerId.toBytes(nextHopPeerID) ) val packet = createPacket(route) val routedPacket = RoutedPacket(packet, otherPeerID) @@ -64,8 +65,8 @@ class PacketRelayManagerTest { @Test fun `valid source-routed packet is relayed to next hop`() = runTest { val route = listOf( - hexStringToPeerBytes(myPeerID), - hexStringToPeerBytes(nextHopPeerID) + PeerId.toBytes(myPeerID), + PeerId.toBytes(nextHopPeerID) ) val packet = createPacket(route, finalRecipientID) val routedPacket = RoutedPacket(packet, otherPeerID) @@ -80,7 +81,7 @@ class PacketRelayManagerTest { @Test fun `last hop does not relay further`() = runTest { val route = listOf( - hexStringToPeerBytes(myPeerID) + PeerId.toBytes(myPeerID) ) val packet = createPacket(route, finalRecipientID) val routedPacket = RoutedPacket(packet, otherPeerID) @@ -103,15 +104,4 @@ class PacketRelayManagerTest { verify(delegate).broadcastPacket(any()) } - private fun hexStringToPeerBytes(hex: String): ByteArray { - val result = ByteArray(8) - var idx = 0 - var out = 0 - while (idx + 1 < hex.length && out < 8) { - val b = hex.substring(idx, idx + 2).toIntOrNull(16)?.toByte() ?: 0 - result[out++] = b - idx += 2 - } - return result - } } diff --git a/app/src/test/kotlin/com/bitchat/android/model/TlvPacketRegressionTest.kt b/app/src/test/kotlin/com/bitchat/android/model/TlvPacketRegressionTest.kt new file mode 100644 index 00000000..8cb208f7 --- /dev/null +++ b/app/src/test/kotlin/com/bitchat/android/model/TlvPacketRegressionTest.kt @@ -0,0 +1,110 @@ +package com.bitchat.android.model + +import com.bitchat.android.protocol.TlvLengthSize +import com.bitchat.android.protocol.TlvWriter +import com.bitchat.android.services.meshgraph.GossipTLV +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Test + +class TlvPacketRegressionTest { + + @Test + fun `identity announcement skips unknown tlv fields`() { + val noiseKey = ByteArray(32) { 0x11 } + val signingKey = ByteArray(32) { 0x22 } + val encoded = TlvWriter() + .put(0x7f, byteArrayOf(0x55), TlvLengthSize.ONE_BYTE) + .put(0x01, "alice".toByteArray(), TlvLengthSize.ONE_BYTE) + .put(0x02, noiseKey, TlvLengthSize.ONE_BYTE) + .put(0x03, signingKey, TlvLengthSize.ONE_BYTE) + .toByteArray() + + val decoded = IdentityAnnouncement.decode(encoded) + + assertNotNull(decoded) + assertEquals("alice", decoded!!.nickname) + assertArrayEquals(noiseKey, decoded.noisePublicKey) + assertArrayEquals(signingKey, decoded.signingPublicKey) + } + + @Test + fun `private message rejects unknown tlv fields`() { + val encoded = TlvWriter() + .put(0x00, "msg-1".toByteArray(), TlvLengthSize.ONE_BYTE) + .put(0x7f, byteArrayOf(0x55), TlvLengthSize.ONE_BYTE) + .put(0x01, "hello".toByteArray(), TlvLengthSize.ONE_BYTE) + .toByteArray() + + assertNull(PrivateMessagePacket.decode(encoded)) + } + + @Test + fun `request sync skips unknown tlv fields and enforces payload cap`() { + val encoded = TlvWriter() + .put(0x7f, byteArrayOf(0x55), TlvLengthSize.TWO_BYTES) + .put(0x01, byteArrayOf(4), TlvLengthSize.TWO_BYTES) + .put(0x02, byteArrayOf(0, 0, 0, 16), TlvLengthSize.TWO_BYTES) + .put(0x03, byteArrayOf(1, 2, 3), TlvLengthSize.TWO_BYTES) + .toByteArray() + val tooLarge = TlvWriter() + .put(0x01, byteArrayOf(4), TlvLengthSize.TWO_BYTES) + .put(0x02, byteArrayOf(0, 0, 0, 16), TlvLengthSize.TWO_BYTES) + .put(0x03, ByteArray(RequestSyncPacket.MAX_ACCEPT_FILTER_BYTES + 1), TlvLengthSize.TWO_BYTES) + .toByteArray() + + val decoded = RequestSyncPacket.decode(encoded) + + assertNotNull(decoded) + assertEquals(4, decoded!!.p) + assertEquals(16L, decoded.m) + assertArrayEquals(byteArrayOf(1, 2, 3), decoded.data) + assertNull(RequestSyncPacket.decode(tooLarge)) + } + + @Test + fun `file packet uses four byte content length for large payloads`() { + val content = ByteArray(70_000) { (it % 251).toByte() } + val packet = BitchatFilePacket( + fileName = "large.bin", + fileSize = content.size.toLong(), + mimeType = "application/octet-stream", + content = content + ) + + val encoded = packet.encode() + val decoded = BitchatFilePacket.decode(encoded!!) + val contentTypeOffset = encoded.indexOf(0x04.toByte()) + val contentLength = + ((encoded[contentTypeOffset + 1].toInt() and 0xFF) shl 24) or + ((encoded[contentTypeOffset + 2].toInt() and 0xFF) shl 16) or + ((encoded[contentTypeOffset + 3].toInt() and 0xFF) shl 8) or + (encoded[contentTypeOffset + 4].toInt() and 0xFF) + + assertEquals(content.size, contentLength) + assertNotNull(decoded) + assertArrayEquals(content, decoded!!.content) + } + + @Test + fun `file packet rejects unknown tlv fields`() { + val encoded = TlvWriter() + .put(0x7f, byteArrayOf(0x55), TlvLengthSize.TWO_BYTES) + .put(0x01, "x.bin".toByteArray(), TlvLengthSize.TWO_BYTES) + .put(0x02, byteArrayOf(0, 0, 0, 1), TlvLengthSize.TWO_BYTES) + .put(0x03, "application/octet-stream".toByteArray(), TlvLengthSize.TWO_BYTES) + .put(0x04, byteArrayOf(1), TlvLengthSize.FOUR_BYTES) + .toByteArray() + + assertNull(BitchatFilePacket.decode(encoded)) + } + + @Test + fun `gossip tlv uses shared peer id and tlv helpers`() { + val encoded = GossipTLV.encodeNeighbors(listOf("0102030405060708", "aabbcc")) + + assertEquals(listOf("0102030405060708", "aabbcc0000000000"), GossipTLV.decodeNeighborsFromAnnouncementPayload(encoded)) + } +} diff --git a/app/src/test/kotlin/com/bitchat/android/protocol/TlvTest.kt b/app/src/test/kotlin/com/bitchat/android/protocol/TlvTest.kt new file mode 100644 index 00000000..eb98b965 --- /dev/null +++ b/app/src/test/kotlin/com/bitchat/android/protocol/TlvTest.kt @@ -0,0 +1,74 @@ +package com.bitchat.android.protocol + +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +class TlvTest { + + @Test + fun `writer and reader support one two and four byte lengths`() { + val oneByteValue = byteArrayOf(0x7f) + val twoByteValue = ByteArray(256) { it.toByte() } + val fourByteValue = ByteArray(70_000) { (it % 251).toByte() } + + val encoded = TlvWriter() + .put(0x01, oneByteValue, TlvLengthSize.ONE_BYTE) + .put(0x02, twoByteValue, TlvLengthSize.TWO_BYTES) + .put(0x03, fourByteValue, TlvLengthSize.FOUR_BYTES) + .toByteArray() + + val fields = TlvReader.decode(encoded, TlvLengthSize.ONE_BYTE) { type -> + when (type) { + 0x02 -> TlvLengthSize.TWO_BYTES + 0x03 -> TlvLengthSize.FOUR_BYTES + else -> TlvLengthSize.ONE_BYTE + } + } + + assertEquals(3, fields!!.size) + assertArrayEquals(oneByteValue, fields[0].value) + assertArrayEquals(twoByteValue, fields[1].value) + assertArrayEquals(fourByteValue, fields[2].value) + } + + @Test + fun `unknown tlv policy skips or fails consistently`() { + val encoded = TlvWriter() + .put(0x01, byteArrayOf(1), TlvLengthSize.ONE_BYTE) + .put(0x7f, byteArrayOf(9), TlvLengthSize.ONE_BYTE) + .put(0x02, byteArrayOf(2), TlvLengthSize.ONE_BYTE) + .toByteArray() + + val skipped = TlvReader.decode( + data = encoded, + defaultLengthSize = TlvLengthSize.ONE_BYTE, + unknownPolicy = UnknownTlvPolicy.SKIP, + knownTypes = setOf(0x01, 0x02) + ) + val failed = TlvReader.decode( + data = encoded, + defaultLengthSize = TlvLengthSize.ONE_BYTE, + unknownPolicy = UnknownTlvPolicy.FAIL, + knownTypes = setOf(0x01, 0x02) + ) + + assertEquals(listOf(0x01, 0x02), skipped!!.map { it.type }) + assertNull(failed) + } + + @Test + fun `reader rejects truncated values and writer rejects oversized values`() { + val truncated = byteArrayOf(0x01, 0x03, 0x41) + + assertNull(TlvReader.decode(truncated, TlvLengthSize.ONE_BYTE)) + + try { + TlvWriter().put(0x01, ByteArray(256), TlvLengthSize.ONE_BYTE) + throw AssertionError("Expected oversized one-byte TLV value to fail") + } catch (_: IllegalArgumentException) { + // Expected. + } + } +} diff --git a/app/src/test/kotlin/com/bitchat/android/ui/debug/DebugSettingsManagerTest.kt b/app/src/test/kotlin/com/bitchat/android/ui/debug/DebugSettingsManagerTest.kt new file mode 100644 index 00000000..9ae7f1fe --- /dev/null +++ b/app/src/test/kotlin/com/bitchat/android/ui/debug/DebugSettingsManagerTest.kt @@ -0,0 +1,94 @@ +package com.bitchat.android.ui.debug + +import android.os.Build +import com.bitchat.android.protocol.BitchatPacket +import com.bitchat.android.protocol.MessageType +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [Build.VERSION_CODES.P], manifest = Config.NONE) +class DebugSettingsManagerTest { + + private lateinit var manager: DebugSettingsManager + + @Before + fun setup() { + manager = DebugSettingsManager.getInstance() + manager.resetForTesting() + manager.setVerboseLoggingEnabled(true) + } + + @After + fun tearDown() { + manager.resetForTesting() + } + + @Test + fun `logIncoming emits one typed packet trace`() { + val packet = BitchatPacket( + type = MessageType.MESSAGE.value, + ttl = 7u, + senderID = "aaaabbbbccccdddd", + payload = byteArrayOf(1, 2, 3) + ) + + manager.logIncoming( + packet = packet, + fromPeerID = "aaaabbbbccccdddd", + fromNickname = "alice", + fromDeviceAddress = "AA:BB:CC:DD:EE:FF", + myPeerID = "1111222233334444" + ) + + val packetMessages = manager.debugMessages.value.filterIsInstance() + + assertEquals("Incoming packet should create one packet event", 1, packetMessages.size) + assertTrue(packetMessages.single().content.contains("Incoming")) + assertTrue(packetMessages.single().content.contains("MESSAGE")) + } + + @Test + fun `logOutgoing relay emits one relay event without packet duplicate`() { + manager.logOutgoing( + packetType = "MESSAGE", + toPeerID = "bbbbccccddddeeee", + toNickname = "bob", + toDeviceAddress = "11:22:33:44:55:66", + previousHopPeerID = "aaaabbbbccccdddd", + packetVersion = 1u, + routeInfo = "routed: 2 hops", + ttl = 6u + ) + + val packetMessages = manager.debugMessages.value.filterIsInstance() + val relayMessages = manager.debugMessages.value.filterIsInstance() + + assertEquals("Relay send should not also create a packet event", 0, packetMessages.size) + assertEquals("Relay send should create one relay event", 1, relayMessages.size) + assertTrue(relayMessages.single().content.contains("Relay")) + assertTrue(relayMessages.single().content.contains("MESSAGE")) + } + + @Test + fun `validation failures are hidden when verbose logging is disabled`() { + manager.setVerboseLoggingEnabled(false) + val packet = BitchatPacket( + type = MessageType.MESSAGE.value, + ttl = 7u, + senderID = "aaaabbbbccccdddd", + payload = byteArrayOf(1) + ) + + manager.logPacketValidationFailure(packet, "aaaabbbbccccdddd", "invalid signature") + + val validationMessages = manager.debugMessages.value.filterIsInstance() + assertEquals(0, validationMessages.size) + } +} diff --git a/app/src/test/kotlin/com/bitchat/android/util/HexPeerHashingTest.kt b/app/src/test/kotlin/com/bitchat/android/util/HexPeerHashingTest.kt new file mode 100644 index 00000000..1caf0a4f --- /dev/null +++ b/app/src/test/kotlin/com/bitchat/android/util/HexPeerHashingTest.kt @@ -0,0 +1,58 @@ +package com.bitchat.android.util + +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +class HexPeerHashingTest { + + @Test + fun `hex encodes lowercase and decodes mixed case`() { + val bytes = byteArrayOf(0x00, 0x0f, 0x10, 0x7f, 0xff.toByte()) + + assertEquals("000f107fff", Hex.encode(bytes)) + assertArrayEquals(bytes, Hex.decode("000F107fFF")) + assertEquals("000f107fff", bytes.toHexString()) + assertArrayEquals(bytes, "000f107fff".hexToByteArray()) + } + + @Test + fun `hex decode rejects malformed input unless odd length is explicitly allowed`() { + assertNull(Hex.decode("abc")) + assertArrayEquals(byteArrayOf(0x0a, 0xbc.toByte()), Hex.decode("abc", allowOddLength = true)) + assertNull(Hex.decode("00xx")) + assertNull("00xx".hexToByteArrayOrNull()) + } + + @Test + fun `peer id parsing is fixed width with truncation and zero fill`() { + assertArrayEquals( + byteArrayOf(0x11, 0x22, 0x00, 0x44, 0, 0, 0, 0), + PeerId.toBytes("1122zz44") + ) + assertArrayEquals( + byteArrayOf(0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77), + PeerId.toBytes("00112233445566778899") + ) + assertEquals("1122004400000000", PeerId.normalize("1122zz44")) + } + + @Test + fun `peer id strict parse requires exactly eight valid bytes`() { + val bytes = byteArrayOf(0, 1, 2, 3, 4, 5, 6, 7) + + assertArrayEquals(bytes, PeerId.parse("0001020304050607")) + assertEquals("0001020304050607", PeerId.fromBytes(bytes)) + assertNull(PeerId.parse("000102")) + assertNull(PeerId.parse("00010203040506xx")) + } + + @Test + fun `hashing sha256 hex matches known vector`() { + assertEquals( + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", + Hashing.sha256Hex("abc") + ) + } +} diff --git a/docs/BCH-01-report.pdf b/docs/BCH-01-report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53f17efebb5ce516434ce9e1933468e0f924facb GIT binary patch literal 512409 zcmbrm1y~&0(l$D{ySo!4xVyW%ySo!0I0U!g5L|*oa0$U7xVyVUaF;t|pMCZ|@_+w# z@9k%3s!QIg)i%{rtC~VlRGf~9o&%PmyP&(ZyP-Q9mYJB5*umHumY0`7*390*)smP6 z$Wdkxx3YCLb7l~?HF7l*H8XKAHRI=pb#ZkzGqQvA$jH=Qvfu7Q@yV`QckwT5DO)(U zHzYRX#P3BkCO*Q53++I<(8s6HvQt+#Bsa)bQQHptaDy9Y9+J|QQL3Ubnb>f5;^^Y# z>-ltb_EKo+%SqIR`IWISS95wcnR=d-{Mq-#cAwoD0{eCT>vJ#Si{#3T>65u!RsXsJaK%N`)md$&^`^Vx%)zEcUCLy9j z17v7&N?k#>Z_De{hO?gs&w>+%N*X4+cipIZ$Z)Th&f4m$iIr{atfEy*r>j_GH6k&c zVEQ6BnjEMye%7`q7^j2d^x*)U{IbzhGRKda8T)43beDvk_Xi#}W=ql6%*}fxHpfB! zM%*?B(Q@-z<;$i4mV;g`g5OYBJimBEzB}eHzUfRyVwh`G&1`dS{bwoChR_cMrk z6}$h%WyAa6`nEmdg9`!|$}ew?an`s^ztSwOn$nv2K2%1Ph1yd8C_|gt+!)Fc5$*5H z@SjU(o}Z4ohhA4(KYDsRoSi*w%-#C=`957;oIQckK5abt=%g+!HJ3mHX3lLhYDnnl zz&U`q>wPz!pHMfOVz!Z z*>DO?YQ9Lv9!&?_HdE}$PUW}x{d_`XzHZsvG!FUbGL6j>arH`~O*jHSoRUk%g*yi7 zwuRzCS{-kqY6%1q&U!Z#L9;5HCX|MrM8*vq%Yra285bimhcWw`z)$Msvsou?^%R!hH{O;R0qM--ra3bQ-VXEMa|3A^m4d{8bBkAOWTZ{ zp&)kPGJYl_tIr{;i^97{o95zfDEfHF;di5YzII+O_N?~(fawZW&tQTBdn$4df^12XMM<@eg`!sgPc2SA z^S4WJ>l@IgRX>^cn}B#FUnWL@a{==d^uu&q7_!1dnPsD+HD6@dd~v_4R>PFV+REu^ zS#+?-?DC**#6LpLFpGL81oqPP<(%ydTdC-?i_qr}>E^ffm2>t7vK_t}RUZ#z8?6n; zI3{URBf_Los6$3y+0h{k5^33V8n6RG-IY88TWoM=>YYJO&G_9Jt`9K9gip*nF$=Ma zs!-*6N!)PNvFNnR>(uc$DFD7~tE;nVKTTP+v(Fk)KDShu!sZ};1f7>DX;ITlKS&{Y zXQ}Fj8;U$vAL@D0K)8~{bh;xIpU&0v%j+u_j|_MY!cUyMt@TL@L=Bxpo!QHF`_Id| z11Z<+HLa!tX}F~6yUjO&%nI5peak2`CNGdPT}K~+vk)9Q<2IXrAU*xL~3wrnNF zXsT(&mpk#1k<_2DYY?R9XXsq+-A{i}5_~X@v0*)$vYaxblyd&oHT1~ss5lO;VDmK0DUQW zh07oo1GP!EZgHwA=(L;rOnMQ;Oo`3Y;5d~SS#cy82MuFeQYb8WO6W(#_=`!o{d!p~ z-a0aGIQ3DU9CX$|MErMU7An%5PMGA_#jz@6x2Tq@*O@e=0%y(PaCfxWjp1 z|NIB_NNag=vG)EWUA)s=dFcAaO`X_8zY0{nL0fH-mqKZPzBz7w;C^1@yQD>rJ-n8f zPJ8@LExvXMbhr?1a2UdTuiif6vAJPST0ZyuR z^zrOd6oaQMV&dQFnHbRaC}oBXNu0BkX36T4T~Qy>ZOH41L0i81Rq0Vkh2YBDu)-Xc z)+7hjM!gX1E*bSFW|ZAdrj=I~Blu2Y@X^GI;_9(Q7)Tjg1fg?V+aM_PqX09G~$GBbIi}O>J>h7u7 z$uL)We8U*wu81@be$6GuD8NP@E%_p^j^`++aW;sCE3mH-C5ruhS=41|G)0DFU`8~) zrUs2f08L1^hMK4IvyJppo{OhjK%v)amL8>1y;N6>MSY@wFk?%c2o7#gl#<%<3w@%0Dtu@(uF5aKMs7vLq@=i@Y+HH&1 zgjHa&BrTJMn!pmzk#@_wteg}+poR;l-Xxuf9kvq3K6i;59J+b$cB|S`DSXJdrkPwx zVPLSSA{`*xqk&J4vO3e%Bd~h4{P9uetDjmQYu>&1#d>|C(|d5e$9q@_c9u=8OdC^o zi>W~wRJAUAIF(@otAn*tMspa9cF=nE4hBTWlo^mAoxp<0ZLx?AICF={DzWuhM}(8_ ziLgysHGLdn;0Z4jwN=izy1UnsgeC@1Fgo^aukb_$bq26{+ji%E*7=eyux9qA|46cc z)LUK#`<9Nq5zH)HtZ(AqOeRLAzw$O!Pe(HbO$B3XGZR+^6*ptow{0mqBMUPI4J%V% zM#sj&Ma&>+W@TaNO3cIrq=l_qT@=lnMI7uL9qi5QU5Pn~8AKdx9h_AhjZDlKM9ti- zOw5!eg#XL}MMYHq$N~S%5t&#x-f&dpj9hGpnHb-aNM+)`62#Z}*L480w78Tw00aaC zAPJBF0A7~>A^m)9-;3N+vYC>|IHDF74& z1Ple_wFf`|00DqNyoLME1sWUz5()+k1QaO71WNuUdeZ^&7Xk2KAOKKgFl6AS4R55v zK{kC>Z;}_L+P)U$uwbfEN&e|hWbokvcY<990z(VgdEO2hJE*OW{B;J$H8 zcj2{^c(R!cN!*2Bjx8LPG`R~2m-(zBI9G|t=QRD3zj?qv6GMjDD0-)Rtbd<@bVr^sHAGWQW^jN zSULg2?k8L71@Jv15J%4eI}&Rv8qD2Emr3@$73b*as@Ceu>ju_jJv_QfwHOhtpZ3Mt z>C&G{3V?csMAgd_5HVG{!~Kng1Tzh)nZ@26yOhkowCcUmBpH+l=)&h%3J9F!LP^z zyvV?JhM_*qrWfVqXUa#!xN*~PP45@)$zJy>5t&$ssf`wiNpNRk;2*lGx|C|4f>h@E zi7DZb&jSF6?pKm7B@=4EKc(MVwJ?MHJ|tBQh;2+G)g?Ebng~LuUT<)v&2Nw@Ko82w zf>G`eS6VLabw9d;=i;rOa_w#mb1bQC1hFfjOA*=GW?Io?k% zX1}L(FyMpBM5u+Q#}mQ05zyE7V5(-9YneB?U3+i%W7Y^q$^-Z)Qq-^$gEu{cl^&_( z(%`WgoljICUP9}%tE*Xjt*%QZ(aF2gR zW6RDT7!neaWBx7DNGtsv!0bgx?*VC~iT0p-u0ue7L(CCLq2DJ5i6-Z96aDtv*;D8z z$&YtXd*cF_XRRJkV}^ChpxGU?AX{g=l|qMa!xI2r_DskC5HL^(PzW$^P_Q>900ICc zAwi%pu-GwKkI0o7mVwT>$%W5eIh*%AGd#y>J^*TZUe{WLQ=+btN-r!H%Pfd{`Gr?pgWU)H~j;} z5;Ki|Wkg>u_AG5kWvssb7IyLRlbugjL)(Uqfn&LI+r|S#)HVsu$YOcL#!J-Jom*mt z1~aEIl)Ze@^50b}s+!d2mTBqfNY%He_qMUwE-wGT_=mve6#Ynz`6Ow`+w`+Jo!7FO zm0^ArhoJMX2WITxc+SjFB0GVcPRga!2s%hq*IWvK-z;ti!iUEFFQdy z_if!hQCB~E1&BL6aSzJVrr|T0&h>vp^p$Ph<&XEHFmql*TiFa=^wuoivRj;_a;PdUF%ZSWqdF) zc9NahneoZ^M%1zZ@;G5A^h}Qt8-Wzoa@6@YWCnW4hw>1JS=9eKUSVO`T0`oI#qF{|vP+rJS>*(NgYa$&Z|BLpLC?0+(>QXoOplQ`YWx1)mRSU$Qj6y3>RAvp8?VNOB+ZU zU}ER6UkqeTb(}$`;PaJ&HWb4y=FnREm)sj7^5XiX+sad?x3*N(DfB*EeyP{e>wd=h zd3Hq2S!wFnn_xh4%yrLvnfefZL&)5=qp-9N*LH25f~3W==r#1DMr0P=%c7A&BaiYm z(<6N@yy73Lo^yf1?|Sk9z=Of4ZmWL1X`@eB|F$aloWh>;$9XqU6?cRG6xFtE!S+w_ zZ=DL%%Yx+>wWJ*_eYHfp7R!_?B@?zN2b#f)^766D+?&}}Ih&rpR?~sCW(_qKbxma@ zIh=&=uKtQ*F1$1br7{V4oJKI%^`>$Xv|-r(zS0bMchzWFlEc*uDLcRTud?5&S~?i} z?xTj^w!cUSQP#w{7OOmm0ur7_z|+U2D*nEz?M61v{kxk#y(T)E zc11cVspL3Q_xnP^C>@h$6As07q@V3UgWgV@ zJ6bm@i9?7U_YJ%=6lAjs6O<~9i&qkf!+lTiI1#YO@rlXNo7%f!q`JcI!bw01pPI7LeVxp0S9bx}E4gEQgeLU@w9?qDFbX#)Si97!5u@*S^A~J>Ub}*Bk zJ(J(hcUoNL@QOk~5Fmu*8rNRGX zApO#|)Pm1wQ$e`}2)=A6aB-07dj&-3=IBJgpnc%!i%GzJyvjh-burf@-b80%gT+3H)oL|Cl3Q{Ne%>>ZT4HIqfnX9%$P z{vb(Z>!IgNgkuW}Eot0MtTW{t88c2a#weoXtM)H*mre8km30<*wbUHqY{NmZV(Wq~ z@QC@&!qRbZ{XVKL8*D)o!k$f78x zG@aZhTkzgSCnFfp5rrZ9W(~z=4Vv~mO5K9tq@w19H68QSB}oY3BdpA12yz7I39e#h zr8{9ke1r3Lv+ZJ><5Q~4D|VA7D3GH5%Zg{j-|69v5yUX1`h@zl`1=hto8wc z>fybWM#j7Cn!Xve5_GX>8ZN1_E-5V;6?f){`0x%nQ+e??Tb5?fd?of^#INL$FE-hX z$usmIr>!KTXQ3fO(<*S)CKbj(wqpSoB8!w$93k8Tex0ME{96tW@c;dd4F&=t00Qj? z)WAal05|?6*9So%MrIWJF8?5YG9svRd2?Y-W0tNn-Nq_>MV*n5+sK{s}Ol%40q(UyA zYbJ;pnORtsjGUZZt2-ev$b^*x0^>Kj$SDMk-E#9p6jf>sgUbt7*vp0kfc^v>JR|QT$8TU48mPE)T6W&v<51J;A>Gp#M=}bhjaN zxTpGIZ8Cg(R3%QX(aywg{ja7no(7(>6S6;ih9yWOsdgQV)Cg5uegjHB{Tvi&zQ7mT zolr6Db<^@@++f|_qWIr<{2iJ+OwFiZkZ|57_h>G-$B`AA{(r>tKL<`T8uOg971eYI z1G-YkGbn&?5p&}$fqY*#`)|YgA7K10zSlIAy#h}DhrRM|=89`^_uS{3ttlx{b>1D` z7hnMdg%Rp1PxC*<6J1rZQAGy+3ON1eaQ;mLIO6E3m`MO>{Bw)F^;q)dj=+)I+PUzi%4e&7Q{87>ve zowugsMxc5>4m`@Je<*J$i&teRQ(Nv_|C!nH3b?6=*8zUZG)OrB zZ{-UV?Jv}O_T3q5v_EXrHTW|-9&vDP&}cpa4=DdnFfFb*rnQW2_sBBSQHLuE4{i_rVx7eam(KY+mksg_U`xQ=}j6X>SUJK!$11K=(F{pLHgMFR671l;5uM+ zDRi!X;X65#c|>2jUGMoT{sa5J1pPQtHVV~EOL)bne7gS9)-rJka#?t-%5Ta~usOJg zw4O$G8RPanmH+&i_Os9Wi<+fxOp9sVea>B#r+}69=yi&kGaucVr@luu#%QTVq@Q>F z=Gq#aN8{~~KHc-hqw?f=);4ONBiVc+oz0 z_?6tM^SD!m`Eqa5+uo)fx6ghU&tA({}{! z7z<_}Z6dWl55i{@IvC0D5|qt~d|Gd{Ix~lehNy~j^@*f5nnmWuULA4uyV6k>3R2DW z(y|Iywcp3ed?EFb?giONiPmy(4Z{vc=P%Eak^8m`&uYRsNoHcEhn$~-E+^OXmN|S#cQBu*i{6E{2DA~bCN9HQ&zmM}X z(6d}NCi}&a2Hvw|T{5J@t-f7mA-$Yrd!Q3vkxA>UR$FK<-QZd=pgx+^OtUcANTKe5 zT^#olTvg91ue>LgVD7Bx!)~Ya3C#b(R2r$qHp_bsF39;p^=82~)5&p}IHmMF{taI( zuZE1b3(d&636|qP|H5x&vcBpW^}mPkPghzoT#zD$45TG!(qVsI@L=#?er7{-&9AoB z|3~cqH2mlAtO~+TzZI0DqbJQtRX!qLKwo0~)Myt5d3)V=qLrRa<>1zsa0Ba*~2O z^;6ggZD{DZSE-C0CTYyB)d-fZhQX@vn99qv9c@3B&(i5ocDyvgrr-|<4e7(LiyVRk z?oWWig37rMcX*VtQM-1eE!pOCn}u zki?_L>$9;TM=6L~UYHDWH73+mzG-2-(@s_9v1dSckeQJgPn=#7*1=55s)XkE@3T#7 z7dzM+xMl^nIUyxmm=nLUi7GBU*q)HpQZE~k#W57aRk7QhLq5V#P?LSAlwo(v#+Wf9 zWOpez|M~+zTz%Nna9%svvNS%_-zwyc^(!4Exp?S}=BES;Oi%B_#&acWg3=}I9T`=# z;@cxP^`jr!n8}k#^sF~{Tapn=*o?9CpzU(2=@0zdp5w;4T|TgPcz#>+s?ZwNM$@dz8+Fp^dA}Q7+j4bX zD1})h4#Nw1<(R*k*6NEecXT!Vg>Ta#s2f5OWS-{lcNrtDzJ^Ex^V2G78__xD(yOCJLnQ}R<^n7Wc(OC&JoS zL&me|`3hm6l|}5TzfgWwKkD`L;|{p?Vprg?h=+^u0HprvJt%H4D}PkcN~cIoT+*r+ zkuxq)$qKR*uU&{HPKAVt+Q1}Kp2~YLHaTC4wxrEjioP=`sGLy8w6=9r*}%s`!`ht! zHHef?4=@&?B&g4{;eLuosWmK$Wr?HrgYGwWVR&HfW!`6|W1=(mrdr zAd>HV_`V_)l_YqR8!}JVRtqL@Im*U3KBKC2365R zSjD0^G7w!h>u{^r;y}jOZO!Nc@)hqm z?MOnS&&_`MSbgcWb{@+Z9cGxkMMw|_yJ+nRQ!2;v?m@|gaZAviKNYyronHY^7+mO; zzNRidh^RCcGErsj7*{F{6-ib}(eEI6mr&_-{XXg3t77dU!pJj|Z|b?HKXAN!UF)=J zzL?{Hbd^VpO$mgI^cieV(qwvn3#kC+W+v%W*h3s%!cbM1u|*)8+}O-^UiEePvi(81 zyxo=PlMg|%9NPItzXmzLW@L-@T9LEE$9U@&PDwM_)Sl)-FLFz^X5M_s78#tOZCi9k z-K+_;pgL@URbG{8;uSzHU2WlC>C`kT>UFBZ)RTQF{lHpPCok%6(v8f}ws{sQ@ilE7 z_=I^CC}{oOD#X<9;%+8g-X~G8_EL27j!xfOSLR;NN7HGYlUW=#BMq^xG0ZdmA^Gu? zF5H^cn!eJH@ig|wu7MtJjXt$(qZOFb4z6xxLr4mp4_5L$nUa6DZ6+NkjZof0sO2Jf ztmehmE~m5 zvS@^`UG0Id<7&=amYj4MWVLt9;a08HYh@!^P1TDrxMy|H)FNGZOz#lOk1RFRt?7ND|=i^L@GwooMYsKdiH1q;g#0;AmSKOxk=W_u2Lg>w?iNO1rD-C^NzCEkDNkGLm zT_7wSTJ?s6QSYo>U10r}_-<#sC;C8Cb!!&7Z)@w8ipoveVrCS6yB(FM!R_*Gx zY~@2kqaWE{CodjK$n&W@-3~%M63U8az~0H`^xU45&W;EI6UK@n;=J zfCS4jS4OXyzpGF>iAJ?_lA8OlL%3Y9p1cDCSbXz)4<{6oEj`q+TUefn0kic<4;K42 zn3Rdb*zL-9@V7~cB9XiEdtH=JqX5ER^E9d@%7xNV`cm2%RtWrk>FZ_HCj4t=Kpqgi zOp~D-v&`q$&D#c0Pkfs3R)oiv08~{k?-@n{#$pCtNenfSjLM81fPWp`W&hwSliPhF z0F^7CW+Y@ew{#Ril^5}@*vK;6^)_mgBRoyfdBUqLbQ)br6h%Oc%oEpwx)uR3f6^5% z{MmJwE3{Ex!2XLeYC+-c?ZYO}Hd0~7tH%GK=oR2s2}GjGl9X(MGtOmo;TI6b8j~k; zSp1vQ6ZGLtj)zQ^j1?}qR7DS}C#c-OOYl*nDPZZKBbRYlXW4MGICb@G{F3z(@ zvK}~n_ICP-@A&0QRxZBl_U$#s8M!N(%F5OGPkeKyok&zMvl&Ql-(ZHU49K;5yu_8O zrxcOUMPH;v>a-q*8v^gBX6LQ+tyci3Zga_yLY4o*RKnT~r`*)KfXdbti47QwB0yka zpmkJk*V%z3!87B_aNWXAY7W6i=^d{=eyU<0uXPK`OD>MI-#VP1@`IWk{=;y4^|xlKCOXzsux?ist{Y2$V%e;D}d~dLe)+nD|<{f55Xl8 zYvE7GKix_fN33WYc{zXF^mjX8_?-BKxAtFD0&vPf*k`e`2?@lh^%jh{-h~hF%1doJ zE1<=DWF+)#XHk3|gBL;`n$&>7K}|S4o&Hu2>yP8^F6;yhEgFDOvwIl- z71N(+BB-~HYlMGXdD2IJT#=RaH>JO?*d*HhKTh!dx9c~FMnn4#MZZfCIb8g)UCQda z+p7Cjf@#3yW(T7pMWR_rxf7WdVTkW0)J6oY&`L#Ht>BrMs?c2+~c{%$>2L= z+&Z)C2g!OWGBPRiF-7ElJ=XMcLN79OC=J`AE1T`=z;ax#JeC41|F3RcrjPH@n{>b6 zP3eEdbnB!An>EHpq}3zXUwXk?;TWFK>o4fI%8`HBkE=i{5{tP+MXmk;UMqsl&|0T+ zZ>VBHZ>`2XVj+PUn7#`jGg(d&nIIz*TqWkzWwFQMNA@$?hl;Q6MV;=IJ zp;eOO(&pVp3;@|M?+)I$@XVKn0CJwWs+#c=CN|!wX~(1)EFl`KaG5&fKEwwLX2_HR z+VrfdUz0x@qJAp)`K8dddkhew7>-1-(Y$8|xIS=r^i}6rr$vc31ko?8hw?Y`P_RVE z?WQ6TMcWVSg9yRG2=+Cq#a=|7g3z5)zI&eY5Em3v0`$3#VS(K|vuC|DmGWxx|m zN7alN=9j4Dvv_@-P@lLV8y_CuY5u@$=RyvUl8)JHNJ6Lj0?DRQz;qiOysf6U?D`1Rvzssy&GWPv3RP7|#mGx1TBu>kk>*$k_GOo8IPDy#sD7z+=f$iji?qt|oqIM{K!!Wkr z{9^+5nd9Sp-o%v2XPtCi8!DO01+N=X>>fk^Mz4~!7^Hg#k!KWdo^7-2;TJ8}=Tu1Z zAxz+L_z~-$X(NdiDOX%6wEfu>+xqzWU0E>M0ejunN7Vi4p@GRh>ds=i!6BgqJ9bxziu8oYRMhKOoIZ z+3g$DIPkiE;2D=$dMxHCNY|BIh7JUC!@aQCA(*j-$1PFuOkl`bztEXt+eKt0St&xT z0Pw&YD3w1Q1p+7Ttp&I!5KFY-1ZBOyA<#RtMm4J1$V#FYE;PCh$E6ZH)#b(&5@c=Y zo7%|Nft4tpMKGT!(3HL6tSALtE&v-Rf%f7-h}R2?B%lLh(Mw2r3LfQe?L6)h^1LHX z)uq;z(BojFAkkFZm$Mp;)Lke&T z`O6)sbPPeh2^LDif9PaOq4Dc?RZNcNfloEJDv`FG_zG&Gj7k2SC}Kz!uEXr3zE|ML zA+F&b{z$dmCH-y$Pd(8pJg-K|51wCEaZ~SRdcdsPXIjo;=0ief-6HF2vr%z^l@m`1q@J z=`;{*jQ3ojwQQ^nsG#IP(=GbVWeljydyz{F08b19`E4TV4+09_1n>ti&;!6D`~d)H z;2b>YhRZQrAogW1FK`o-7yx+B3N*ZoWxX8bof_udQsAu}`^_2SHH<+94Q8!@!Vi!{ zHXg-i3gWB{eE+80f$uT~oJ&LuG6o0)0D}7Q0|CUqkbt89O9>JAcL|XI1po@HA^sjc zaO`gj2r$V677>O1Dk36FM^NSd9RKD^M+lu4fiD5fzOdd>F5t&_)RFJpDhO;5mi`6cY5GlO2Djz(T;P=fz^afYc5~ zkfNDb*2skSy+P;2l4vY7f=YIcQ6NU;;(2BW98cW!)-z@572;(fV5HH4EM2xoAQd5D z!~$S{AUpDFMU>JRPNX4b2aH3c&x25ZUGgOW`UDz%4M~|$G;CT3b?AD705a9@Q@1g| z08>^c9)e{#8o5N@W)ev08B?>;cD*dp4zeu1dICvktUNEq*jZ*pc#0T>!85dXg!2BV z$wHoklYdkCO&aS67@iX{GLK|h)NjS;sG@%FG0j@|3u|E)lx7;tU(T89PTHQLNIV>O{~Df`MXG;DITyes zpoah)EdR`5@hsM}^V#;+KaKOE$U^JH9rTm+{I}p|rV@n=Wi>ktsf@h@!uMa^<=q(vzXEDsz@D?uh>p$bVG3v__HeULUIE{FzvSkCw7vo>^Z<(|s7Kl|iU+XS(q2BI zo-04Ji6;e#^WP+L?5LCxX$Hd#0i#J|%OOVK-<)9TFh#DHCu7H!hR-mpuhnl5UIsDs zTX+_CV8m^KA!Bcx=hfUAH~JlLc++NrnTq+A9&I;-$a_ z7qrw)J1cwB%P(x+nlK%XJ#VO-=);@Yi9+$LdNM2*zfwH|y^McDVIBqy4PQ zWLP1B5_&NJM97~Xp}<3wQM;pNNC0fEO8r|Es#+SRaf(p z<$s<_1C%30H{;sx#{{~7(l@|zEJh(k8K__{UA+X5BwY}w?v<*}H`6Np-5jlt=-}0a z;WT%*iF>Om*`D$~J6wM!?_~ZvKR}6ICEEkz&T6c+i2owvanR)#^sCZJ{pF$@Xv?xUb3*+c<_$A=rdbumwiW$o!#nF4^n(qIr%RB{!!3rdg?AWBbijlc-V)szbt&`@Pe z*fkay>t%c{1%q?mk9Yd&3Ohc@YSw?N$BL)oirc3h5F{S#(UPlN0oz0ccQBxdg7Fp0 z@x`rGI=KUHz~Yx}i%arMiR!x03Y+%l4gM3wR(xY*iDKB6I5?2mPYR~g{WJ~RbP>~q zEhj5pgZ5A{(NyK=K|9ebxs6+& z(K2e+DwjgR-UUz zF@5s@m_uOZdpM7n7UF3p!P_McrAt|&V_r~n=<*SU=_A9)1k1BbUAjYvxJ`sJ(yY}5 z&ejV5Vx8l~%QPM&)gIJ?J$?loC*I#Ld3+;gFQ=kUTvgKgHj)qr&t2ySKlgp2R8VXyd2wfr+988cV=8pHAFOT6P zYUuukQ%r+>mk?hL7n8o(PdN=*cX-fvDs`0MjW4UnYA2Uwe16CqoH4ZS;Z8Q!g62P? z`F@IJT!;*(xXCh}KYZs7O>L=&*jJZ0Z_l?t~}@Zt1TpTh{Z@>eou*XM4iRZFnF?io&6EgD8gB?vZPuth*FHK&EL1Jy`iTBMAgzj}42V25uUH8d7PgB+CHON3tJRArkMVv86w@e*fPtO4q|7d zh}3^14FITjD%QDL#2tDjtM< zM)tRUxBoJ>zXx59w-B@3cka_3I0nLcm|zMP2@%qrHXnc>It%IveetaYpCTE(ii0t} zN`b&fm4mB5UC>aI=eV-6@^LeYd;j$IOUlomMX^MLtNdDQ{j z>hg-)6h2e8U#!5I>@5fT71Z8$p)cL*-yc7$3`L&yoxXG%I3%?lIV5%Z9cQ+yo!U34 z5ei&4v9G^d#6D+Q7m(lwaYVDvxHyf<9`)Snibd6=^_cc3WcNOHxbl(c*K>Ql&ZMDoY+W0g4OK(iei)9E z8D4M`hfCyq06zvTq%3GDb83Bd%}1Ut-SW-b;3UaWAhpOz2H59>B~?j^HwPx%X1(ZKbFb2P+9;=s9O5SN(KY-Giada7(wPY z#9M8@qN$7^AKxd#N1*OcNR|mj&GF73ZH!k*VJPt_*qDphaI?}(B^OMKC>oX`DEg2_ zkX)4DynpB4JmtLjsfjw5jvAp*c#mctXZfs{X>_E z%;!cwTCa#mR-YLt2$u(G23YHAopuhyfthHD6=qyFcLl;`(RfXa@~$k6!_9IO&C5`# z6V$SKZns*Hb|*mDAK6k*0r4G*ZLyJZubH=@$bCQ-w3%mFLgM>TpO_*JOF-&r<_d#L z-GW_(&0Ez4icCqyJTIoS3%rxP^)mE(6ju}h=|6)-x#EXI3JpqD%(5@2YuWlXTV?y< zV&X~(+~{|ny?t)*9*#SEb+AM^c!Hou!}07mZ7h$l%)k~Jz==-+_=rV6q8E5k67|#= z1LtX~a@Wn{7b=$x4uU7|DnC^kEkM!k4}RYW#1#06{vJ}q2bET*vfuiYDxcWTc8upi zr~mf;5RZL&Z=_S#Ny4?9tjxmnA*hr^To5wXF8+~=QESl3GN14fd^K7S1PvdjRV+nP zku6W}{RC}q+7EB-pg~dj*G-I%Ty|o{V{`pYxhQamOElX(?pzPDzGg|^whERzV4;i| z`w8|dyo_sTeuB%tCzbMXqhx{}#%U9w?7e zV@Rm?V0a(;YFo{B-4m-!rTM9kb^+`2u~4Mb_|16ll2}uo&(1FeSXNu?^la|wU_S1^ zzV9{%i)dWUVya%M?c~SR_S-74;VhF3(SWX5e1f~0etJ9_X%Ct8bG*~2dzLa!%a2YT zjea(g)fG)jhrwo=H~OwKhy!cEw+bE+VVKCz5S#iSwDW^Ggnx*ICFdNq<=sBYQZp{I z;kO~j2XZ7KnvG7FSY>mT$OPOUjyVq|VJu85ahhB5qGs^*zU1WUi{IYEL@GXzZp5rN zORoEOGg|#D<8MK~t4L+3IC99ZcM0k((X0@Z75=~gDMpUSDnT4@OHzR?64*73xZ?-$ zo${BnqKHKlh*Y`%4FWD7xtw6+&#M9Ot&u39YD4y)!AY+E*H)dvL8A9j>KK5ssxUIM zh&?VXYhD;X*^Cg#k3#Z_MLYg{xxK1bVnN8XhW)#s-~r@0yj5hq!W?*f8Aod2$Wm;{ zaUaoJ2=h=7^uzcDbdf5LahdJAGv%vYV5vi9^o+>329jonY4=U=H&i*aCBu;0-XEwS zUAr@bHJe+~L1+cR7MQB#nhc=b1V4zC-nLqk9Qsr(TJB^VT~49b=9OA)0uGT(h#64^*1hlois&NV;+CLS9tL#U6T__43S7+;0bd2)ED1Lj>xrsb(RTWU}K;>~T- zXg4k3WYvJVis_zP5GmX!pbk+LvBWf6%ja$ zBgY&}u;f@#wA7Aeb*4wO)mF*4%od8whR524{#;nE!7KpDXI&j;ym6|A2D`)QrW`q~ z&B!q!NH5xtxw^5hl;3Yb0?k;g05;ugXA`HQB_-^S;*)bsK7`z`mN`i4zTITlpfOW# zyrwsl(Z=N&!@{Z0+&>q<>nO9}?S&C*nuwpI!y|~j5FzM6<>SYJ`=(7`sCWmU9^&I;2TP;HiSBd3UeIWP~Br;?slor(iK8n<$D` z(rw=CBG`Iouyc{|4$VSqJ2zYa$UzGcew%^{iLOi;T-rlj+BV`$Zd-<3HW!`Dli)#g z(s@aTDJAv%u@_quu-5>E(>9G@=q{}|atDED$^zm#v439^{I8?3M7@e2>q<2#xX)1% zalRGfyY79%6S=9=VaJlig4|LNX91<-0qc$$@nq53C0*@MbE7LvRu6s;*yPS$jIvfv>W@L8;{LL>-tz0JOB0dp@`on-Eo6`LsW#Fq~Sb zuSPzUtMzK%6}bcXo42%$lH&5CxgMp4v_(x@-~ABA+Js#Ya>T$dCm#$|ScjY^!feMA zQEQjs$e~)_emV}v2MU{$ZqYYe`@5y_=}5Lh9f#@Z#T#(Pu2aap-IXAA;eF9rTS5}g zabf)-`e`hhA}N6g>W*Wj3zGLg1=w4P)%?(0eX$NY3$_?~S8F@ri_ep`hM(X`8aT43 zaWF=T!JKLnP95`lcN+?A3E|R!l0opulm%L{W8&3zIxN8p?v93~IR&JpjRM5dm7Wrs zp(;9hvtI{9dftB`7mAzk`Cu@{cIM_3N;@R#F_S1TT+N)B9PUqMjbE?8x|2f}Fv)z^ z)23{2O<2#F7y)Fh`^6cf8`@+`dABBP`Ug7i2|8tHZh;u#1Yq8jK!o;z%XBrv`?K$ZDo;@bA6ejHG+p;Dy-FlfI z7s@2E4?={(hCEZ7PHq~qTWf1Br=)Bvjt!H;!Rsl#E<_nX4Xs@CO~$^krKlf_dsm@Y zpk78at_s>C7apSO!l1kvf}}d~q++IkwpxjYqj2ow(+awT%il zcED0yUBn#83)H^)IC5d!(gP+}$|g1#Fw}^zY_;)LNu;@c_{3u=HKf=qhZ3CXV~)2V zbL!Z41WD&?1N}8}Xjpgv_otComXI{efAtjpDed!BM?2dr#KeFJz5bs}D%*aef_iq|x z`v1n|(KG!wfq6-PX>eooPFuI{1c30R&!oYx4&wUOZ(QEn=h@kpB?+n3J^eGjfxIxNo>ckAeF=NQ~}R@JSjt%H)Bn!iM)%YY8muYev^*d7?R z<2y|0$XB%69>g18XGEFIhs($v8u$J27>7EQ+tNERYqyOZoFA`NE}U%|y6X`;XiD%M z%L-59MPW{EF0OAwYuolJ22o_z3@^=9%e{CEnljL%rBa|xBpg{Lx<2RYUGw8UC}=G} z^C+<$K4u(NfRoF8Hfy(@<-q4cY(Q6V4*)LcO?`-`(?nR`wbhLwzyc1~iC>*Kfbk1} z@?3!3gnX!Y%z#VUFb7{L0UXa;H&Xu_@;y538Wrx!LHs|6{n#8sXz_m58l3lCs&?YJ|%lUW{a zX3UZmzaKs9RBm-B+x^obe?i}Pgw)62l7ws2s9X@CO-{q#37$Z2B^~J51}Qp z(bNkBBJl*!*MB)#ub>~cTr#|y--z8L!lUX6OwQou`AcO!7o30?#Zs*vaBMCY3G8YL z1b$0@-G96TixCrxF@TOR&fK4gLuZQ&uZf?Z)l49i$^aH!V%#2|L6vdP3u1)OeoTRS z_m|)B(Ynzbmf5&i<}!^e=>~k7^nDI-j|ibJSoO0BdSV6FJ#KD&X4n#$_mc(z!i0`< zSTX=;7(_GhVBb|;v+)Rx>lLUgbLk5ZMk;YEvs{r*o*%(erWq1#bU9-HnQiv!4$mA2 zIREzyR4a@f;jH15u#rCrVHL7sCt6A@7?uVSyl&$cw{F^%m`0z5Y_oDqX+4o^znzhq zFth(=WIPn7Hv@W}K(U?fB}W8Uz1pzW+V@IpUAuAOF6X4Jq`YL4HV!l<*X^@eG6?~> zWvHuMDVI@Uh!K-=T39iBlr#4)sxT7x!5aT!^mVP86M0{z*n91C$KD`+7zZ*`G-SI@ z4M3LiVT?PV2w(*!k`=^~JwaWC&qCR!=EJJ>U&~?x1Z@LN$aej^ayB(Ec%yKII)l79N)hag;(%*4pPZckD=P~CY+A?o%0hyD1#c_nEkcdHO* z5uhpsPj})i_f+wtvkfCz0DXXe7{^pGfiC3@uEyV2)xuIPZXqw#_EBO-8yf0UEEztIVPF(Gc!0tJGa>A+4T1As z;X#&=KF%Byn0#O@jQnIVksG{E$H_1FaN?C2SI55W&-dhGb?&4%pK|l`BEgcmX zGg0tZ8+-{%iaCD6=s;+B5x{*;Od3XL+8lJ*9)avc92$o2scTTBMd}Y{cSD{*Nhw3r zGq+anf*fikeguAwput4yusj1CRNT8)+woySDLF2X5tbsF`Y8-m-i`EFjank(-07dQ@%%){~ zA>Lj0lBK?DJ6OwtCi&L{lalM92j(lklW7y}0~S`yT)~HcN%?G?GMci^ft=i4aRU~0 zo0^|U-X}X~YKhVn;)4<1;2Cwj1BL=aXt@|6+iSk>>hODdg+8$**)0#fu4>&jbgc?m z$4pt2P&?~DT}@wA9HgPgypvT*^8Ck;X7CBL~?4q+vvVDo@m^<0K6E)V4-jWcd*E*_T00*@`cn zoJbe}r3%T)iDFqxa6kGDib`(~-=cOQ2~Y%oo#O1MKlwC9L0O{`kRdCMC2>am zI)j0(5-Wl#C# zi``W&j4iEI#z9`Xf3bhyX#7~aUfMf_Yi)+1(dxp{RIX9m9zJ{@+F3mx>_fJ-ZLPqW z_q6rl=JG}nlx*+@%CGF}vQp4wc$Ih>B~pru*mioEG)Ch?pm@;6aYN*iUfcEHZuGuFj5n zT*JtEx_&+$PGo6iXK2&7D$vnLfO?U|aWT`PGzvVKFCSf08h}bZ3e*cYl6hP9tbxx| zLW(hBpvU%{Oh$E91C?TqT=sbxA|S&dvrHfuhLvyv)52I@w1fw)*wxW*lLCU~BJr$c z0Jt1uFH*xwlx{X4hG*qiPizu{!Ht+V9O(=wiv-^7i-{EZ=^=p0@5#ZBb&l5SQ8KqK^k6sG z>$(@Zj#+jV-|nZSRdOxeC#^%-GEsJ@{4IIie}h7(>2cFwONdIxgSUv0y=brWyWBh0 z|8@VQd6T2)V1vziux>c5x!iiXUL)&cMc&Rt-9jfhnf?AoI*)@m)sK^+elhYHU+`?K zf?Xa+v@V-I_K@!|ez257?UCw1MAVu=bSnE1NMe0J92eD}h(TmK#q#b*z#y2j7IuNL z9+Pu_Vctd8hlN1(*O?0<=Fm3La2N^5c`W%*i@ky=?-8_}^u@grlfh;I)qyi$MdU=S z4&Rvm-+u`N$WX#Dd!fMX=mHq#WM=S1E1x-`%7`Lg_<$U>k}^4_$p;WC#R2(EZvC11 zl`@;N?wR2zw3Sr-s`xDtXLeqe>gkv$&Erjx#&^C^VILbUZ3sFoO&RBY28-cmp-P}! zkdhbBQi-l0#qk1#-+fBSdt%$@|14-QC2Y%bzntQ0ivc@xS!R+UQ>$HdX!{eAqt(&&gj0%pTb0h zbth@*n4BcC$*2kNkOrt1*z#Um7lU9fJfARdfgmWw?05#h^9UWQQ#nLC8w9Z>D#k?ePpEz!Q0Z>NSR@?X|UWMAXg{_L1ch zg$?h5(xqA^_;77qmUGWB#}qGE&a29St>f#vx(cJTvOevcq|$kEOuA^XrET%41{#L= z=mpBd+b$S${#_n0q^nezqZs?Sa}lQV)-Ehy&8U~2Hyk7N&ev51 z8ffA39Q#_lxL$RQ@6p}VS7lS1l7YD_4Y6;!`tBYFo0U+#QNvrHMV8z2OzL0wCO)F-ap{>592X0{{w;l zx`w1@`9J9Q??`ld7S{hl@rzQEwmo2h@48UE)#_#775+^Jt(LrH;|G#H%m*h7cTLhE zHb*4AYcTg`hgEQlfOrkoe-(k9G1J}FL`)-D!izRJ<7HuCP_iyyF}Fd38t&)oq4o3V^>5jA^YHK{Pk#CNcF(WN!HI#3xf$}H zPH%3A?0K;jb|jN3mAD90ZGV)(!Wnd^5u%3G{i7@1RIQ@05Tf3Z)M(igADvBs@$fi^ z$lL|`zA6MW%FI;9J=6Ty$SHeyU`bI)q=QUd=A`s-aO+sdiR4NcV~ssdcW^6#Zd{bi zd8E|D^T}MYAxh~?&S~r&jnWRvPXSC$d1g%gi(u#?7z`t@p;r?V%oS~Qz+6~H*RDyk z8pzS4F>_vCm)xa8K01n%LAwtw3T;?Ll2qB(w28R@#6n%=0Hm{Af2@p;#%9+R<|0gd zNF-_0+RL5B$b9JKEWGDiO{^}q_gfuJwf*(8r8S4a2yMGeRSzR>|BuuR6N4r4W-64F zMpG1$*;ri@E-W+Sdz~1i;yaTgGUb-@KSt(-Lz^aB`K6BkE|I)o)B~UmSrwcTvhntrxrQBv_i<{@lIY zYnrA4%qs^-MWd|yB1gyB>iETUV+n2j@o{?TLv6lCP#gzCJ~W!zgr(kIIw0R&mc7i# zsak=7ESQ?I7GMD6S}6dc^gTc?;Ag!Nt26*qcd1LxUTDg;B_zEqgw}vyl{S#kUf*kIH9I#a#T$qwu}DWT^*L;ee^DlV~Y2f zC_jrSc;T^Nyjf33h+zx@DHiMxv?JnN%Vr_kI2jC%)843c#~``rOHeu!L&g+CN5GEt zLfJtEwN*7VnfdMATB^2XlY{61K_88cm?!jvaeP88DocwbA>Dl6Q$J817*fj+1B$*n zLWM`LenwY6MPly~BkZ$`)YLL8swJ}^=68>zD9p=fksu{r2ZQIt!1x7@xD#xoXTvyc z*$MPkTa)6hex0aEEK-t`c!oL(Wabu@`7$T5;nt5PLvadA^D5#`2KRH(Zo*hIw0UmS z%M8bEwG+Pf#0$mDGTbQz2|3zx0I=FdQ)7e zjKwy}MR&z>amBoL-0;A0A!Yi7S53)@veVWQxL4I@D#u~oB|?}fF{ffrIfNlb@v+r4 zOdcqwvK)F;vN zPxf}$$oJxln9$7SyH{XS&K$zund_Yu8>`%+O-$gnuLQBtk4SAkfiYs#H<6k&#}86} z3U;YI=;$fO2kqFMO{;{uWlIJHE&-`+-SaqS?z#_|aH+v27LgUTtzfDpEi=ZnXgeVm zS;HPwLmQBb21;+y)UCSFvsdFUR!d3+&Cy%%VDr!ehBsLCr#l>7Z3ulf5_QF_-!HI{ zq$pcVO3nt)LmK>#p>TOe3K(9-?nr*}C||#yo}A7gubF3SdDtg{-2x7#F}6e2N^MCnV+|AEC*C<(rC0K;z@IxtF%;`xG;U1mW?JV0r>3Xs9KA=zInb0RmC;hP zx(96u2f3&CDvc&EeCQv^bVA@&+f$|#LGbHMP*8eZv{%mXR(Iajx_07BwepY6FWJAH zp^qTWb%(c(X1(H`A@1S*r{exk#r{`8r)Q#L{PzJK>wmCwu>Lo8jxKd=+YJ^Z@0Xg{ z2Vb(zltLn)U_fv8t63mROFg&&oK2Fedgifn53*+69!GJ>WaDvrlU#7C2qgE>zY7;= z+zS*Wx~Hlqrk<}4-UnF9bXFQ@!z7f-Tg4di7mpGTX+CXiOnW|Kxh6Fl*I&|RYE*wd zojt!E-WRq8JUm}s={kH~UOuW8yIQq(Hf>BIgcX=MjXte;rplM3I;fag#=;ghNh&f9 zJ;cT1DtW#+R2xT+!;d6sFSXKyc~n)h8OkP(#(KyKPY)}gx&PK1ROg@OxRT~SbOw?zB4;Hb?~pYJh><((dON(WM$Rm{p@c0Xw|lD#^xH?6-OrYf_&{KaAPd!XUxVzK2+l0 z-$kg@HemLSDp&W4QEjRLs+!9MSB|;~<8MF5?w@DuCgzt%8}8*)uuxy;;G*ow1040} z$ux{PLnI-W7{NI(^_UdeW9JOqVYiwFIkIZy!YUNJp|eI>n8zn^jqueLwAu?3QAZil z7fVnnHvpSARe));xGjTrFHup7$nZ|llF-wkPT${9zTD9(Mrk6O@Yy5YK4Ab@6qP{f zL0;e3dKQ4Q0hT=S(c;~ItT$TlX%L>Xjq=fcWLzPR*~et;FX=*TGdNzi1XU{yj41~V z(M(l>+^MxnI7T83p0L))+)gnBY9-Sc4l&~{!=O-)5@$w=Duuqfy}im_1+KZq`M#`! zMLtza;}8CAC94$M2q>93-n3L@lg4dH#bO7@dIDYw+9b1IR_T9vjr9lKAwJjCyX?0E zJpin^hX~u?;y$9_U>iY6R9uOe9-7mmexFPT$XekG1Uo7Yn7n=~o_!XKQ{8@#>0Ho0 z2I{ga+{ztDbakyhquDt_Ef#(K9fya%pnV>c;VIXVWKiOMIqE7C8lS6*nH~SZtn)gv ze3pJGnM{bF+O=Lvz`;lwV~hn%X~y~KWSgF7{u1%YcSnA(rT)Wpn^0MtZv0gLrd@<> z+$sV?Q2b&;X#If1`WbUXg#x@f3)_}faUIf18Q%f7PmLlQg|9udauvsM)T8q_LNuis z8U!ld$6%kS6jXF}fr}N+ZWeVN*3KNxY%5U6U;}dUlR6|P-xm*1gtTIT^6z&4lsHZ` zEk{E|G*}&Z0IfR61FFMZ8j;6ao7#NJ^gG4l!qTA1TOy!*_wP zqgQK_>fh;U!q%8G^dlrV4P_AW2+P zl+&Xv{Up78X_U(05+B==iwD{LONSh1tvqj>YWZqK#1X z-jD7!kuJjD+33kKrGw^}1Nrp5l!(UDAFziZ)q_LAgE7pG8zUk9YTfOG{6crBemvXw zAAkbGGxGn`^8V>#|Fk?7Hv0cLv zovVu>7#;iu@ICyYUo(*?KhY4=FT%I?#W_*u7dw$S;IK`e@`?){k0p6rpC0#z+t2&G zuZ0=fkOkM13|+YM-01Pi5b+B`=y!O6A1|N3G8``!&z6>+@|L6P%kdrWkH^dLjBJnB z>*M47-a|wU&uHs-37yc1Cwlg|(|JN?(FDF0+L^*FW{m;)k5$vtKm%BmS zZ?^*27D%(7JH4;DhnpX+Pd0~91b5L&--W;LU1>1wOmoDTRqIG~c%P)A3%_pmx>Lr? z)pc1I!wKjlH{W6fUA*deXqn*O+KJ&nh9-Li7D^5GwTM`0SvS*r2ASoqXvl6-X=t-Z z?2Pd6l}Bo8XfKcGOM}un?=v%W2Cg3xVCvr+Nhy)F&B@*|k$S`+0RWMolNrrX5fX7^ zz?p`@bK%K{+&+g`qya$xHOe-NLIgjol(t~X4R}_io(U3l>XMHB3_uwf!W`lF)%iT$ z55wIXed|i!oz}ezGRER{kAGSA~TC~Ar4tFj%Vf6>OATtb7-r24UB9=2ELVVFA zHR~+a<+C$CFsz=h=%7(#jT3*XB9Z|!Qlb3-Ar~5<9~5E;=Mu;c;J1)Y-s%FC294w= z;CGRFE*&|DPP!=8EOw3g6SE)y5PlELDqF#?KG5%bs>okuNYe=Rvn1#PjwJo-zK%{l z{xK3^n$YxZYrehqh+$zx$iabT8Qs|YE@76sq}4eAwZviFVuFcl9~-A>Hxl@B{K@&0 zzaXcebS5!xN1YtuV9VA0yYtb(6?S7?$vPeSgbH8606hn<}gNW znC}~S5MD2EbI%0l8vH+3&Jges67^ztSU;izxd2x7_Ujd!Eh zEfXpEq6Sh=OI#=|=h1+m`1->Myo4uV${<$wHF$ENhqg{2^z_9;U>)QtK@cnA$b zz(8P7GZ30F#7dM<*>q-Ny+iQAYs+XZZg78tA2YoN!*2%tXivgq1UtOV%c z{UG{aeNNcZ*lgkrX{1#BUA%T?I@sYikWFu-w7}v#0P5V=mdadnRg|LSN^)#BN-sR7 z%95=>?8?_ijZhzy8>@w1CQxrZ)oHG60<^Lh_c@f`sXPGj+abV(NHA7To{qsXB~X;{ z$CxGy-%mZL$w-TJ3%Y!W?_9enl@+aI(H>{NYS?glXFY9cStN;z-ND-KxOFxuXfW64 zj@b9ITz|WcHm)Pl719JccG@^&?wY21?U|I}V0fwO#oSKnx@2wOH-?A>XC#_<%S6~K z2Psx-ZuW12LV-C5<&z7x_mXMZ6_~qcInB9_Y7zhYrMhT z46UZyk&@^)Zl17p%sCfoi@~PsJBfZM49mz1@d1*OI+y2RW9H#!gL&Az1);u{=Fr_H4#}}<6ie`l z;$h|3xf0oB@^`4RO6tnaG$`}qGL2=GvBD6oipSzv>P4C${qGUr>XU_>HeepKsxV1@ zIsAc>WnY<#E}an>|D0M2w%$$K~qi`W4c! zfv2S`R5?G%6xJP)18_7~*@`~KIGD_9Sv|qL5j|&tOxR3o@;w&2g|=pvxy1s5kTJun_5ch$6|a6;IM6mCas^%d#u-gologCXdx5$& ztv+%x$Y9a4AYa~Z!!`^x4ERbAXAo88IY>YIA@mf}_yQQLUt{P)8vN8`^zX50=jnSz zqKQ!bQyAfvn2jkKG`~52iO>|%|2|NK)nR8wo-NJk4>IUvadmyJTogOhj-tb4&kTD; zQ>AFp!m{emDTB%_E(BIYT#RML7ZxM8L+#Yhj&2GZ4KB#I5uky*wzd#o;_JSy6XJ+r z;HL*iRyg-c=AkF3)EipoxDV{A=lpAfD3i*~xGR3Go$86({e1K?vcXMn#rr54rs18m!ht-roeIo)nCO9__2J?%+Cokt>O4pgOw8Q7v5&| zP&t@&-J3btg_Y~6q>Ydzlnq&Vh0E1-w?vAG5*5QnHO&&F!kRH(aYfk}It`EHV{4aa zZL65i7A%iQ|5e4g$h%P|b_bw$5`nUCJZagG>BYU6%%4Lw;>5jNb(we!jcyO9Q0oG% zF_(OG;qsaw{|I)-TcnjBuu-Mf!~%t@6cmJ!as&oZ1El--siseq@W1}Vj{fNPXs4Z% z1CeYHl&Tv08cqti(knrhda!~kISpn~84t-h$5YzTdhZ?6az;y9JE68eUA-C`_?e}- zThkzC)je|gA=RvNIEZB8W*=}-p2*sf!xl_iF!ks_{-IaR&Yrn9-BMPE$RcHRhZKTQ zsT%R)ruz6P!rQ7+ODQaQNNcMV<6q>Y6E3ooPb4;}L}jTKZY0I(U`GI8=51P3_;-Y; z^mK+Gq)Q5knD?!yQ%;ygs808frh zsl!Qi8g^1H)fpAA6_E|{q{bG#q!+X(pe}3Vv(%I@t}*BB3aw*D$tWX9+f{_qjq2w% zYKE#0{HEO9V85A~^LZCRSz2_MW4u;!9IH&|Y?@bRFx1zEnfH=Jd#xZ;TyDmaw!lZ7 zYmd0=t(X(gN^A0NJ$B8Q_Gw@#k(wnQG*Q76tV)w2(;!ut=ojWZ3w2_M1BM$NpInF( zXH-zfAVu2DW1cfg{QAn$964djlFz@E-1;2E^&fX0)9zNe&Gbgr(KpB zC2(Jtju^+YiC%^ni0^F)%@Ka$&!%*#snzJD2NZXt^=XnoriME-34;j^pnW8R9%NO zgPGOk02ZVZN_C*-%^)UYvf&x+v~9W}(psR6rh%#zc`Q}P)xvos>Z|q2qNZuB+qf^~ zqvcR;{VUu|(3@wppHIgY^MX3Xc9C*sho0{PW8-qUB9DZ{^e7Vtr~px65To{NqegcH z%7v$T#}5)?jHQsk97ZR-oT$a!(Bl**_`O8lJ1G8xR2n&PsfN6F87zo6y>uiSGd9x= zFP|o@E>^j=x}H?s5FTV@X+Dncs8f?qJ8!p|rjXqAaJ%1q+pHmdhb9EZ+-gcrl)!A|JL%&E1kqbp&Z%&mzwWNHy$m(<6!B*(VI3RDgyvXA+v z%>9;Gx1DAfM zU&?Uu{r$A?=jZGCDJT1n*U#PC(N{@~YfaDBj4SQx^HRr2%MH&CHy75lr55_P*Z1A^ zr<3V`m(zm&+;OW^NJ&e`O3eE%oGkC>lg?Sln-2Qt2#?guI5*XcMZYX#Gxcj22bT}b z>r9wwZ!4pVmcvbWPIcQsT+eu)MxSbwrp3U*_w!>&$Hl@{MzF!j0KFBwS51}6cxgrU z4WrUX#Jhu3?VzUPh$m*_&sa)!&7_DjyL)14wi?&4B6Tn7#syc&?o<{1xv8T*~gI*SA0Aly&Y_v%-HswcDH$T;Vcda+Nx`~ z*Iu~S3p{HGYcnF6V?uhT%>wB3{pK^tbwDYCI|nQIgRf3{}r7{pg|4! zYfYO&j}2U*8SRz?ZyPxokN)A4Nn;_7AD~yZK}9o`k#5DqTdPEe-$#(xk6nIfkSf3w zNMpqZ*E6r#f-4ew$+d7Z&nu1AlH(^5GAxmU5{(%}ci={QEzR$8lIjzf7VHzY7i<^U zjQkdGf6C6?)ANm-Z`3?$HJ3f^`@vj&--NizR2(hufu@P=`4Q*SXBN=FH=#?279DV0 z_8DM>I|~>_uvvF0FdoU$F4Uk%DOyYj@gbg$fHgLrsuIPp9)^N8x@!0-qai(kpx{lZ z&_5nl$soNMt*ZjX29FiaVh)3uqZmZCdKPY4$lF0ovek5FoMNGs!kmlr6*Fs~$vzrU zqs?54gt6Rt%xnl0mB6K9_z5TtZK=Ki#Z&7&?lf8zaX&scnnW*g?kc(D6eHCGksh{O z>tfW8Y}3nXm^;Rmm<5KYd9}ct8U_eu^%p1&9tIUOL}v3~-5}262ozR!cVA@?AeN7$ z4$X6(!a~WoCK_a)f^rLmuJcjIusMkrfNxDMrB-;PMFS?Y>Qxe2*;?e?!N5c${ZUrJAcg!AGkW%ygf#P?P*$SH_^o$ zMN=hQmQe1?;p#>0zB)RD-aPX*a~b?G15Pa$#!#KRm%)p$lD7V5g~#0Hts`ieaPZqk zeLKu1jshx-cGCcnThFkI3xt&=zPBjnS?Dn6m|1?rzOs0h_}Cf{N|mL^htTJB+$0Rk zNlD;F6DaUgfl!Wie9)vH*u!>C9!r^lgXPX9&oP#BhEC@3OsPm>5sG^OzJ%>l7I~Pn zrf125?Za+)2RA>Jn@$|h&=A8+~$6O zwzsajI=_5RlI;|tC+_Ke?rjpQv4I(9B8hl8YfOd)e*5Vo4&NRx+T;0z!7FA0Y$&?9G71>dy4J#)w z##eC2lZrGhz`LyS?m=lY2;az`%1htjxxlncP02@Nmw$$Qo?JfqrR z#)raThwpO|x$zn`1J0jck)94U;wDv~PU{?~9qXVNAG~e-4udvfg=%*KffqtF6i(0& zG99+;xu+G&^2`}JW<@|!ur(*kIxSVC6nSOgyp`6F-wy)?<;>7fN@>VQxE=B4JCp|I;+Wk zS$alkN!1#<)mb{(jX=a*A`SvwrAgy3tWO(yi=O_O>`M#(5My|tBG)HE#Fjwo0y^FC zc!Dp-ens1Pd(hZ7lTP4iGNoOsZVW!WWu4TC3UYc|$@p6BIoa6GU)ng3JAnCSmb;e} z1?XZ^J&%=gLoAde-=N7qKh&%fBJo1rN*+nIR3<(jSs<3~$eu%U2WtdA^fzT4*sT26 z>i7^4QYV)DmoZ)r;>CPd;(SsfppTb&2k`G zIIt-~dCjqd30R?NSKI=kMtO21Iu1t?ee0!rJ8eFoUR}bOt*mb(^3=A}8JVNEd*QV2 z%$?f_i{~&(<Bdm_P z^VJgrdR%ptr5*1Uk(>FvD@Tgq-N77Hmi)JY}AAPHH1f)aa|V|`MaNSe0g%VO@v*qStk(mvPk6;9BQ%Z!(%olw=`ua@j&KIheVcm#Lk!4S*cX_>aUE6u@%> zfL8*5b9cvijfIgMZ9`s~TETjswt$%d04JyMg&Vj zN?Vu2H+E9hDT?gKGOpGr;>fGFnihZU;xHY0cs&UQqe170qW}bO@-1KSROf@om&KD^ zvfH`c=AW78+e6s8zD!=s!N!yW3WZ`l7qKmVH;tp#;lK1hEyQyvAY~}~4=K9w37QbR z#}(Cj3P-pkJ&@<9?9EA!HP?%`cpS8A*Mcv+>x1;jLH&xkxs772=@pAExT}biUtc9& zvn)_{hBSM_NVW%XQLvq2uYRvz2bCJLfI*icP@zEE*S=Hg}OYJz81z%jYt`P znh0Y%2Uqe(QcWgQC9$SB!Dq>q-T0DKo~`yopQ5+XrU0_A+HALS-z#nA ziFzpUdInDV+CokbA`QeyI>{?Yu?Yb=6h8tBpmeQjuz|$cC+!5mKP)XOMS(t3_fYJ1F#%ZboH+1@k z4{AD*CK?aIAH$%Hx^fV$8yA!xu&19 zW(0RoTzk9Tx>%0l>j|@1y)!u<8@wQ+F^Iz3WPQP>@%ckbTEv0Fc^<0p(l)NYX*3mX z)q~2f_gD)h5iE~*OCQo6=gU2#n|4x5podTo0Xv^4b(g6JfTAvQ1(+JDH13yfuP`z< zk~Xm>XCReLlst9oir9!ngft24Q8U$TgQDz(?h%^nb4A6f{NlL#ln}~jap!>svVzDt zNT`(N5!#0Mky;sQawZQ&T4XGRT(nk}DV-=Yp0A(4E@sBujxWZ{Zk`1v>Yp^EJ+N}2 zGBjFvMwJVlb;ppjq^bQ(;5^4^`!JJ1h*tQw;}>-CTP$;*ne-?(-1J>Om7y^Mhl;uH z5P7{j2zW`VvDqTbGfkQkrpN}XIro*=>Q9qfsLObaONeL|H@`dH`KeZ1#Cy>eTKll0 zSgs1Lm2hI$wEnE98apn5m}cM?BMCO6@5JPLq{PU6dNuGWw?ZJM-zOwrd9^N%EN8Q9V2rLg!Q z5BGe=5x!)vTGM&zx&>S^2VRF$FJs?MI{V>a$ZRRVdnJX5a#7HFE4^IE)-T8CY%=+D%SJvY*788rh>+R9@L}=t=*%&&4>o;Rhy~lQn zNW6dNT7M>5f4F-6gbtQvd#Akt0+YYt=d);Jr))XX_}Ahq(zgQQF}Xzj*HPC%qEFf6 zT<+=F&aS_nZP&%FpFy;%WF|3tUvgv%%ZrUdBMkB*-2z1zEM$b#|AkB=7F zpRbpXmOnn%-sJ6%6sFSmAVwC2XIKPNfY)3UBC!37T? z;u!~raI!bBwzyCFJX~L|EuKZV{ap;NxF5SWNuH_KNh3W#&C;)^&Xcdq`+sD(ehp{U z9n?S5yskK3xgFLx)T-PnA0)5eHums-on5~>y;uv@WgO7Mf_JZ|a2hWvdt&2cf3v4& z$W~0s7mb;4Q%^S8iNS;@@k?8%{FZ^#m0h$8KIrtbg<{po+xs25EcOVau;2nnWSVi+ zxc8=kxMq4~ZXY8FmOIdkzOEdja|WI`HO+!Kd5*RYL&7~Ep(9Fk2mCl)+phMn6*+P> zcLOu7=clkePn_RJF|OygB7ir4c+~zpe!ld;?mQvX4{m2u#4=?feK+l&$sT8dGKhdF z%IK;Ai_EPh)ACp}ou*_ltsW5lUyQwDcdl!@W*ghKZQHhO+qP{x8L@4R*tTukBO}?F z^WA&bYE`RR)wi_#fxGqR=x4v=rPN-xCm%=MXMgPm&igvQdvTVBhwn5tXZ64M<|dwR4P6nua)MIF$QSm=`+YK5Jo?C5l)<@{Gi$Q-?~})Z|~&ux94zwpRc>a z$;Z=lnM6D#7WvV2brMZ7$ZAd9CDGuO{xWnRti072HFh=p(|gbR7_ixhOL`006T}b; zYq$&(yLp}<3&D^*qn)Al7i*OJP!5s9yJ%L6zH;}UJt=VB%;U7-;Jvt=_;!chQI)O&5xHe+%%d42MHK;rwIxs#vw06KXtuBk zU_Lru?aY~?IUAM__8d?uFk&rp5AdIP0CEBA3xRHQDi%}@!CEiPhd%Ux7 zf4u1qEI=Rek^!~Z8m=AW)1Oq3F9)!i2;_OBt5z-8LXMf~6ZSReNL^wNfA^p%tU%IwY~g>?HZd4I)J{Et%{?GE$(r8{ zdn!7xL#oQ)yqsR$AGwE_m5|;C%u3o6ACkApe{fZ~d085|-QPqSPtkEw!UudG&!eV} zDR36OeJsDQV715B^+yTUpT&en(6(EJV%PYhuT@ndwKm*^mCwsU)Qb=NWGXY(QOQw; z-`h_SIzeAkt$_nPvDKTE!jnT55#>x(Bsu&DJy@Ig>XAzVa{g{{lBb{A2s)^MHKp}c zkCy}aOu-p%gY9n^fnXKmgRxFEjB_=*$9u`W!Am0hf_Tw`9TwG@lWqu(!giLLO>~&qo^=m|ycSvAjF)NhM(mcS!BS-T_{dCD(Ts)ame& zD&!+Mix^b7_na57L-f&*?59=cdNyC9d%4|8+XI_+W?GR8-&;mKjYZs5!uZ8d^dqiY zZE8m--Qrq9P(9<=;Xq~JC@7C@pwqSI=fiZFflT8X(D*_kj?JUe(OmD{&8>?pF)(H! zd1`<*k5;-ZFC_i7U2e59uQ@bwRbmtb9@vmLc>(E zQ^sjAN2ev@vx0_Dz^j)GpIi&+WYhJWJ=5*Tgax?p(V<=tb%4{9@c>XHRL0w%i@-p7 zG;eE_qXf@t$OkJmv?Zne%+Ck*|Y6M<+INplN8C$s%+w!cllfKc8HKF8e@O#=x$jmpgO4|p*dhq}& z;!9HS)gJBupYbkU~_P^U^6Man}JoXzj61Y6I`M(rFPo zn65ZI`g2vdmo^ag$|e@pKB1aEuacITqBdiX$s^y$SVLB6o2Y|UMrhjNPBtsgq-=pW zkWMAd^;HP;$+|J|`XKS6aDn2uV$1RnWfY)cZ7@uz93-J=mCU}tvuqdUtSel5hZC<@ zFSSYn)0+DV4MrkPKnLc<0xO5O2)oU8uAs*mnq|Gr0GDeKD3Z?c zE(oGM7>r2*QiCT7d5Wl0A8i7*c<+qf(}P;94cIAr*)w`j>i9tSsjD>=DQZQ|n1k=2 z36binNx?CJ9*sn2ZMd0XQ;U`v*|o+grYdPULM1Y5)3t#N9?`k2oaDg9{_D-Yw7Cl^ zhf($?nJx4Qu;R9jCv_u9qR$(G^90jl*0@>mUwz=l9E%4|3MG{h9Xsm@9zPLivH z&u1v)rrPuS&lkm6Nji>4P||{I%UJ1VNur${7Bos{UI?VaypavI1saXSO>v`th&Cls zWMcltYS*$9Qzxq~lZipOz!C`&X$%}W$Fp`6?xZaq`$X-K?W#w=u!2k4dVD8DHJYZh zuLst4Oc3~)KbVD&XTzRVli1sl+VAnTdGgEb=HxjZGd`{kMc<506ohKqX(S5MZKxy; zrEh`4QLL$##iEQ)75x5Nu!mF5ASFo-`uyZY*0I?nGq`#ED#{@P3RCZq^wg~tB)nxc z5K>>sPY+e!rFP`JU&H9w4=is-Sb$cM63*M2-*`WXcUbo9c>K{Q-mj_pH!583c@Maj zxwmyGo+ME77t(KL!&q?(%_UWFuS@1ZE_1JS;J%SH+&tSp$~$-8#7!)tVDmTWcw-eQ zhr7q1>ZKo-E}8e;l!7Wn(th#?qDXn_gj?W&M607^7i`MK5|tw-_hM&ry%tAx@3XtK z`dq(7-@WyBFF5CmG!Cd7^?<;=E`aiEIv1HzB<0 ztMbZz(yi9f^57QCm8lM5$Z~uNePVsOmw;+{ZCT#ggWl+efQioJ-Q6*mfwls#`73D) zU<=ET)+&@$0Xpq@sC8_s3srd_bnomqzoTmND{%??AfEn6XAW%i5KD_`8Cg1?;>;1= z&e|K6$??e81Za$65PBVTbQfW5qhjoO%yH6M&!q7rJ&YDT1j*vc=>8SW#GgCcwk_rP z^BF#H_JFj!L99#t@qS0pkp1aN7_9twW-Wx5c zbUok#`b2m{No%f2wLWVStK7@N`19F5+}qLWbu{vl=5y;2;R#18@*ejzXqhc_;pHj=luq-mw(HRN^@okmkMfArS0~D{c~>r5MU<&PZ$`Ox*Y2O8e{zQz+W;F{SPz}J zD5V80s6a)j@Jz?&nD=x%2DFwSJ;i!6lw9Qp**NT(Qzz}lk*ndKhk=+^0UWIT=vAM| zFjfHMBw0{norl{qd6zkbZ7PBk3}Q4qH*>t>ZluQS^KEL3)kVcIhDCMYWXVuF!4gGzM!-ATKBo$*RiUmaS88x`uu^a1Y?(;pDbg(FOubmNOVRvw$w+?%%uZn?Xq2j| z#~JlvwX1lp#i_d5{Cw8HR>Jne-9LhjG#e*vu{!1y z5KO+40UC0~^oOWGed@-vZ~9ZOOvWSut5_cg>!R)o;;tmB%x`DxqrW{K0g5jqs?f#xhf8boDZ5xI4_)5Zu=lA<~ za=IKHRJnCbZfA@4L3Y<=zm$8 zgY|y|lbBimsrml%@BhNutp7xm{!jVbRP1p(lD6mCx-(~hXNMXhKtTa_b@w0CHqsV= z6NGCtzmh?i9cl#nk!8fywYvSkm&EMU1F3iF6_h}Wp1iuX2 z^e)`@34Vfi27cmDA31LN4P6%G6XSj~(!H;fSx#r-D#%}VawwL6VpywRJXYLlaPwy+ zFZ*XDZ^Ip-8~VpR7yQRPSHFIKdVBhD&oi}5${|t)Mv-B2 z0&{+*e)!$^e<&M~I)Oz2 z>f7r+CWW&MFqU=TKNGpg=EHC?n?P^O!Z@C}B&Fu|Yu)Ux9sb^K@S;B_56?~t@$p5b zmZ*KTC$5cuJguci?L{pcn9Drk;-F(f}{RC-Aw?c}^x0)xxR~p`N?1retz( zJkJfq;sr=h|b3JL^d1fA$}1{8$U#=MoQ9NV!T35WCC!b4{C|V4e|;z zU=0+*1(XD}0JhhLBn|P<7!O1apv)x+-MLwY=2{X~|O4&R3!#WOKY*UqA()lyru9TGG?K;}qh$!|{YtGxW+_ErCs*E--RA zi%%FR(W}W1O8N6~f+1$6+7@Je+olH#abb0j?y6!tVH3cV=JYigET#r2lW9Og#vVp9 z_r!5TG|I4(;^_ihvWX(}OP0n4ZBec5F=*YKH8Z+t@dr{1P9&&IpiDJpo)L0$t&}LE zalx(70z6fl8wpkDHMoyoy7#c3JE?iQ2|G6NW)6(yjR@p(_VweI$vg$mM;piHPv>e4 z8Cmyo&x-dgs-}4!))5D8_#7NuocV1RGqqNEDpEo^(%4vI!M5y8!`;#vHvP#_N$7y# z5oI>uPpB(5QdS!YDWgOMfnkwx{VBn*FeCwV*$ZjVqEFLJKM!=%pxq2M^NFtSi8=?V@Aqfg{*=wx4;Ji1bk)|!RTl%HWa0J@3`>@|Zv zACf&phCvO!4JHM6>c|6&4U+h4aI`7I8Zvu6m*@fx-DV}vO{r464m zYgF$ShnJXYyKKYIw2mEciS2l7m{evoja7hz6)yt~0tg^AO;eQZAfMBxmn3-STU6j! zVQ?j5pmDo%xU~qj4bDUTV#>*6+(n)mo6sE}f*mhE=YTMin+Xr*4ZZiC#X24zE!5oV z(hwV)>%-S;5?tY&c{+*^Jl0$DRyt53NUsln2|#R=!<@cJ>ZkyQmL_PiQ#w$QH-exf zuWVP|Ap`JS5Zl+;XemdmuDH^V5=$uBxgP*-dabIAJy;d>UJ~xkK_pe49MVK=ED_03 zO+r^lq9R}nma-T#*OY??O%cGGHuG09O}um=fFOKStL9Y<@;{%j2uk`< zp7V^72FuBn$V6!Wz(WeKTR41|g$D0OE1fjZFKz5XExv}fD`IzHUUeiFOo_obkL7a{ zmPp$XaZ09}j~8fc6`2}TKaRs)O4PPUXbw3P;aG&Cg4!wop-_VwOgSZeVH0m+OrJ{w zpDpaqNIE7tMw4}f94uaPya+30N%g1(5u>tNmAx%uKi6iL+pj{Cy+1e$wtDf>s40iW zA5&Bn5&sOuV8RvH<<`by+PR!?dmvKrzOxUYu2nk}I=QhWp4!S}o9HoIslZ^D@e)o& zjoF>Z6?lD|Q;vyH!MT{ip4Az&1%geOqP zOQ_YCmpJA)Rx{fo(sW&%*C`?j^O8s@(PC^X#-$M?hDOMe5vIKYhhmIq+t1xW zLit2kyjyY1cI!i~F z2}uc_Vjc%{WNHvclthjb3nF>;L~0W}lQa!pl;)X0p(5 zNh=DM{ZXG;-qlSl^Hc_autAfMrLRJ{3wRLYfAH)5}h{y|e7oQRL8QE;mRuH9Eu=$cE zd{<}_YKcn6a)CL+f8cElReFi%CY6S2;&486$}0(Eq)GG5ITd&oe)Ht^7NrwQyFV}3 zpoptw*UpZqhf4_9$wbVsvMRL)<+KM9aP7>b&j3t_*hN#uzWOF_DFig5NcpaknOkHg zo{1gJ=xEm*WZv}qw2kLXuV3ITBzYOH2OF=J>pK^2(h2X_XbS)fzaBR!l3+q0`Q2S4 z+U?AN>UEBVeT1YUu^HIwGEBDsg*7CM#)c&|X=d^^uSG-3Ubk$R#cc}xc$pg#6LY2s zM|_cQI4(VIza)$()mBlJ4znD*3(tab;TD7g6X{z1x&i3zU-wkARSE$!8lM%p7cMYv zGl=|J+$c$lcBKmynRgg$<``=1Ge}|eQ70X(8N^ZN>IJizygVw%LalhEFl>cq&szSC z>eOzZMzXq1Kp)y^DMu{-D%z}wgB6h~oc%fN0$*sn2oyNG)*f4|pYu8MOjqir?qub8 z1N~>aGi2#2WWY^4Gp-@noRFo^#G)PL2Fn@Sv?I5IX`aGIE(G)y2IT=p z49|9_42!*qDgj28Z}~FhfBu*!kHIMD5Ib1aZRk2zjhQf zvtyPAJZs~5Om!!NbPAjDcLk+GZ7w^Rv(kwc;zq#v{lZt!HiuteOnVEZG)Ta57)x}} z=Rgl6j=x9_SYpcHtk%47n(}zXVN(lu+9Sz1lcjptI<(|#tMm{e9f|d29ltYgJvlO> zGmk!vF(b&vUg|wkQmOYkvynQM1k}l;0FM(N_=;to?9V}1{9=zV@#dS0Ac%Y2j6=62 zVhNA>XX#Xm-y|vRWYx3QRz!TfEXWHBI?njo-DvF08T()eJ1Ku3%lJ($_d`5;>N`92 z%rYJahHQZX?&@(}?MiT|Brf`mqLZ>Zxalikb2i4AU5x~@KVR{qYzG&P?+wPO5Nqsa zDqSRM>7PJf4(C1harD7%fe6Xkn*lxJH-zN8do}Sk&~~e|WoxZ@q|V3Hn#=-^kY;XG z(5Z8D&}YWRXv{jE;dSxphD?o@Z-JAK3dX}x2A@__EiadSnlO$(=Qu4`NF?Ic{hAKK z=^y1Tj$xo<=JHx;D7Loi0pB3AC(d5lsb&#V?z~La*=HYdf5Pae8K3E4w2VBOUM zTVzwa2kh6wi{ip2Td@1*(AbpkzRebc#bPgIO*~C;r_&z+s?_%2l$XAD5hMGeyCtW= z=q9;A^J!GMx#ONL)g2dRl7@n8)9!-&?7nx}Ve%fZo~R-pfxhyagGnBtLFnk?vpmeq z@5lG@Z3?|+Hfs5$b6rWlwxkO~BYi1^QdwjR^c4kFdk3IwRjnMZk0)@WzjbwO)Af-*C)WU8nB+vuKH z_dlQS&o%ak^Qs})q0SNKivFH`pu^LU!G2!@8egp#jEK-`+b-x_O4l(m*mC((O9U#` zvmo11(b2U4u}@b9|48Dlrh$|#V#~p9_I7tw*jLZfu$L5oWe3h;d)MSa`^4XWKG6R^Nu2i+UTr*^^S?vie|h#_ z^krve{~t3m`#+fbKcO%C|4l16_D2#Y{*lCg=@*;=6dliB*#QjzBxyzA_6gX)CxjEg zW8ZE#Al!~b!^V96-0U|>w043==VIPdB)R&yCNPP6za5@$zfZ2}`}=(_t_~jmpye&N zGlTfy$)LqGqudLF=-1!l!^Pb%m$xUEU`5lJ^QW6<|L^y=o4Q;7_vghwb-jLHPfs_a z-(Qc^t-g=9+?5~c zi6K9{3-^a4XYQ6EN4~2=+$8&q<}&+-e=~n9acDOk=i4CvZKu&({)_&VKJjR2t9}xCyu*nw`IXIn4(F!+IQqJ8t?X<$>#g}QlXQ7#XI`9z0m5kuGUjXu z^3Zs5tM)#}y#2+2Sayr{!BSegkA5}N4n&gE?BnXg_mzcKdNzdnfMW5r@L=Xw?nzMSJ-Z4xFzu_0RoT`I9@FfY)AJ z9}cjuKfB@h-jJR~_Psv{{4+GS{S3`)Flem}ZVb$8)X{yIT$>LkMQS3uZVU7Hy-%tC0)8P$Vc6EDo;ZBZA+GwoJ>Mt2RNWHDkAZ`xmc6xXQ0TteV<-(G?hZ}ox zNB~S$dfi#vz>Nlfb&d+fYksPtEN^2aA#w?<3Yr#RqEzPjgq|~h*-pe56h=?CL!Qhq zxG}bwJ+*x0#F#TB|K1fb8dVcD zV;5n|5YsD{uYXL8A1xyZo1?78x9Bw(i9jW0@U_s|*BOhggeCO_Bb+k0hJFd%QgbW-LzDJ=_0prn}}D zyM{%7o)+>Ra)gTT0Zi~1mw3kHkjKemO^%VP^xz?FD5l(6VYz+18NwC>;PVV@o>uU9 z4T)ksO&i1LC1*83e&-AcirQ}md$MVSNC>P;MC3faf)MqAsx~xSYbXGSeX8Uuv?E!9 z$GL#bn$l|m@3J6m(%>`;!Ds$TP+11=|ITcD-W|n5qoV}2B36tBMfFpFITr9r}$C!-jq_(~VT&3zjE-8wW9s1RYZ`4FX85kz?2(AzvGB79H) zdV-*Szz2<*{^O<&j|Mc;6cK>FB^7}s5)~6nACfQ!j{nGVB*b{0#Lr8Yp-gnkW}PK^CHl;7DiYk|=mLfRsPqCd|St z%+37gFn-#wB!tY{VrK03DS+DH7qb7kViOQu1};X_87p=a+ccB;;Vzq5diOmA*;`@>s!LPn1S=tI83XLSI&nP!}9N z>n{riV7&CN%+s+ZrT}%Uu6|%N-VAPJUyd3Uq)*NeGkx0e3v)FC&PSsOpDYf^eGVrg zI*AAmbd@@2T{3uujgHF`W8n}K^K}=*cR5;I2p>AiGFQd5Zq{Ks*`j7rE%j%H5YdwC z1BXEdNV2n&zUww7g1{bC1*p@;p~f$8+}`M;0j#FHG=Ep!T#(9BNL<;W z5JaN~K}IV5;&JfF0^lpHwd@;KAifE@0an5BtQb72h2gr!EPD-%MPY_&$xS$(Ns6wE zXY5Q|fjLkYQAf>$44pEGZw;9;y+N*B))r31`6$n!aa8f0nKB2UQd0ErrWDXY{CYpb+*|{V%ydLSi|5Pi~IbHos-%3-};2)Pj} zKPq2M`rgEZmuTUB5JS2vKgn&DXYqnRclPuxXYd47{xS{I_|9bMoWs;WRO)Y;lFzEu zLZM1vrngR9lwXy>m{d0(Yha)c4bY$!#oM1TO6b&3h@OEJA9Jbzk-ZP7qnA@l@d(}j zqt%@_{O))a9m@$~Kt0_xe5M-(-4 zn1&{yGTK;i6iR!86Ej2j3r9QY@@Wi}&ZGro{p=b#_1Q$@*_pLRPaJ41YGO!ATv6Lb zPNZBx%-BU}Lb4>BX~r->6rIk@M|#*TbhWF|8QVQ!XSCMiiy}#MS}rlKU;19*MbAj6 zr$?yi&^nn7iY=%D=OwvLRabG3L3e3%hy~M6o#PXdUGQsFNoiOjgy|Yi}=pxms z6+zz7lcZXOrxVwnq=9ZE)#zOHkaR;H7d`8R%cI)+4|GWdp2F_RS;AaBC3`{sI40HS z^nAFHByVqhmosH4QM#daRBc<>jHu2#c8p(W^dGP0#GX#itIDEIroo9J^tHlox4C1? z?GFOcW+N%Jq#-uLIxv?9H1je`hZU&zAaVTsE~nc34JENXY^ESt3|Bg8a+lTuV69Sx zIMnERUu^^2;Me1pMCh*ZXHrE$wfLw>dz}jd`BY1(1oZPHQq;hdq@;sM%JrT~1q3w; z_GDFg;I#rM_1vwTUnOiQ$$iVVX`aCbDOBVY^(wV_XfHkM?6%Uy=KDPoY)Ja(eI(k* zP7x3@nmsba*HJ#@5{%=;{Kog7Nr>w4l%|&3ayjmltg0+;Y^5>KAfC+p9}0&Ob;e`A zjw8dd5Gg`v0+yyq2cB3@@y-Y++Oas>tt7FX-YZ)e?{sI^AKmqJu;1&kM~bfX{Svy0 zp(PxXrB2K5dXAz&JM8Y%M->$lj@Z*nEB1U7ht|l!2mI2`JUho!o=vuhQ730kmNJcom546 zo~}9A+i1V+%qxOsa`w`yC&CoWN?(C0r$=F!oVSzn%qzj=z1k4=KdhUWXQ11S_Ft7N zQQ>Z>uf#5(_1b$gEQxqS{v-$}Po*RgHnVt^^|b|irKC^`*%7K!y6YbwRN*Bfv2+rv zEa8|Rs@S4=tkR;*2dZ$Q;N^hf48Jgi;x=4Ohu$D`SIrcW*7Pp?PDi-A* zt7KzpI8M1xB}}-ewCXs)z_3LexOuZc*o6A!etg27q|H5ilSKv`u3}0Pf&zSw0SF(; z459wULwFjx4$KP5<5%_2mm=&vTSix#?eqmPJNWU-iD`L1lHl8pyN2;e=F(%;Pbph? zY0)*!AR^DdV~q5!!$)GJF5zS#zEYfz=JPP`ImIU?>N=+NOgcu+Ey8gV?^Z1IL{*Og z7ou}{ljrL#vtO|)+nu#pS%XaT?MCamGT)_jHrxFEUms`G+MhEPO5#z~0Bt7t{bJrD z;;HA_qUY42N3e1)13o@|te527`{!yLoNhAcmw!Xcy|M9q=B)te`D+sxw$=R~Lh9Wr zk$p$4e4*OkmMOnp90r;@Dfd*XTM9m?c3#7G;rpE3F^V`pFa&>1Ifm@o@y)zndh{wY zi?Frhy@W7X_R(Yi{`10aef7^Nv*^z$Gyd}uq1}H+ssEzqzm&?x`d?&d&VSC9|0hc2 z{AaZNKMl11wGP(&pE}sp4bA_)4t5oT072B@tD?TDyWH}hiI(@DiT3XE@pAuj`}k({ z-%IAleszL2qA{hi&v$ME5^?&=zi0m-qHflNer-iI}b_3ZVKA*gAun*U(T)fT&WXjCE z3)svx=L0w>4=`yJ@tL8_ zP#v)BpuW9dV%VMKfU&I6e@y5MP_g;#w7MQE;HRH=ZPtwwe%`hDbN~GQ*maujp8vzA zJ-Tog`-V$2HD+^{LBmJqJeG#+88}dZzo|g;EfX=CODv1GmonoE!9fK>tW`{hsdT5obf-yDI1<%z1sWA* zB51V4(LffHV{1X8YBeW@I%UeuY$`7UO#w?#B3Eu(D2y`OGLh_B0dtUu6VbThpGdb6 zi-w$c3v5+MtojSCFR(XgUWq0MM7K?WEU#OkVw$&A0lWICV6m1RrN9gMw17G{rVh~G zCnAa)KN>LM1@ex#(TmQ|*CFd!nyRW4mL+`>Y0&7SwfL(!`}u*H!=|;J7b0g8xzU)) zC1yfRrK`bKbF0y);w(?RI0COw_2P>4iRoO_2NbqYE%RY8n{Cx#o41csx~3`d38An) zqxzw4#13lcLn}8OarrgHmTA=0NPldVJH=<d4Ga= zo6SwaWf7iUWl9cL<~Fs3j6p=i>`gmTNc1OkF)h=QvDuCN~aCAZxppoc=7f_zJw zwr+~KhKhVb(P zik!tmyF=ArTKO32yUCq0!y3$EFkTL@POTwW4;m>zdjO&1i7K7JnW8MruAmNRA-^Tu zNp9(y4#1lFkk9k9WyoTb8)5S_5$wUk>kTFSgyT-i^M?$*^&|WESQqFCS&uK5qAho3vm{(-V$UFf8574O| zD<{0^rpSDMqD;unSBYcGKuMv3GL*(OUp zmEuuWdp$1*5msySgF`u{lUzzeIbx7J;tFT%#oFRP`ugsh* zr9GgiI6`H^-G#Dz)oe*561;GL;VrWQ$c8d=GxKb0LI+$x8(2(i} zk#=9vgQNo&2^nV!5Dc2ZQ92pxcevW6A(mecC^@j4z+>!v(QS-Dhnvi+DT7wcug2fqS z_r`MCE*kctFeG8eFNt+)B`tC6kIbe-wC&ZU6RCS^J#-js znMxFQmCCxzjAd766}u8Yx2*8=+_2V|y%5ltk+cX^izf7>s#t#JmSu;t~di#2HmDd}3KM+ll+AsZ%91nD5axHTYq^(K-82%dLa; zi9D#8f3Cy~j$YQVTxM9;SIS1SydK9=LwNIIMRv?L#Aa+*%P;X}*9<3|^!)yCCTHue zStoH94e{L{(NYu+JD?e^$+@`ZiLh zL$-(Bkl6C&+#KVPWjO2t-B4D;otY;DHDI}Slv1&#NS6*IlR176(6uougjZVwLRC)B z`O~uC`f=WNy87KS9`XJ1xU0|S=i%$;Nvp0gJx0(Dsx?Nv<^+mjg!0zZ=^#tiysdee zqBYGglP?~ws-%b-ctG#v-+!v^_?;4?*g{oe6{^(|Kp7#8lslN#*$OY)SR9pW!CrT+ zyBO)a`CQr}eLcA-)@Sd7qo?wrMbsz!Lqi1Y$AlYtvqD5lZwGvpMkw!XMv$kx{lFK#^O;b5@AyLoO zN{+f+GqtfB@d3+9OuTU35QY2VF&McGihzytPI4A)1dNLIsk*fli$Ws)pb}&?yrR`< z04sM5Fu_8}H$@wq0!l%1n1Y3x`kQrW&lWPw44622R=*n{N~vT~+OL4i_>`PNT|X7| zJ?NHdfv_&wp4d0Z;As5HeoawaZqVKf6f@4(8|s*8#>MFc_W+z)G|=@29bJ=Ogw7IUYhdBfz%)c0dG8QLqqw&^n{#aB}wVuv8; zSXYDOMWoHXIprl5pX-2czP;x>0u>1ab7CrJy+l+^Rf?I+A7I#an+IY^#?)dd;6&$ahb8yjzLXmf=`0+t z4dv5cN-t@dpH(*(5MnOHLaI2su!7@Ivk}noz zyW($+-pp2GDSFm(tyPU+W-{0BN<385%c8W&_!Iry8YG)cdJ??WPjpK)!;g=Ml`0qQO>J+oGc^)(T^UIy&LD+B_3sI=UbiZ52~d1{8^8*kZKFDN z_7K(L0JVFt_`9n1f7@ZxKkcv!3u6%asyO6NHfEC3_sjO)1&2EqyqUMo@%?nzUB5q& zPWyuo$9>^G{%`o{=O|$R9dQ3k(fSndAJXM#k@<4!NhqUy6`xgC# z!|dH}r@zYdQ@s99 zjhp(P8n^G);P&(T%_f}DKQ(T^|6)XczW&s>TmDnyw*IMci(7g8r^bD!^yX0*$joz! z$4ATK5gJGiphY~#E+D%qE5Ny_TLyc(n$^c=Eg$a9;|0V4(_O&-e3lvquzqFZ-d`Q3 z>@PUSoO9$Vf*=oY3sV+N%!*qHe~roi=~EVWbGPYn_{-0~4DJ=m;rp@wqv*8v+wsk= zIDzyjP64oFzvON)+1%$R$K9vl{gdM!AYq8w`N?rBXAAdUl_c|my(=Yk-tOq}{r30t z{pm1IA738lWSFOteFBrsxqt|g zCqDYMKUxLg!G$bzDg*S!vnVs9PMM>RfXkI(t(n-46b@A0_E4@0Fbx)fwX+#m{<{%N zPy=8tqS&YVHA>-$>P4G}m6qT= zo%s4D$Rpyd>`=oS zLuP`5-3-MOQ;}0yI+ryA)O!b+h;#vfSV3<0kwFojf0uB;vyr`F)DzJ(1RncBPdbSY zsVTNfA~y5KcmPwmDfJO#0b)aUM`*^vy`(NID|5=p)qmD2(t0jR69cngw%w_xz?NbS zxd#NQm8pek?smKen=VHs+#O2ZWGZqmb_bCIRN)_!p}C0yHA@1n7m|67z>VCX2_ zIyJ)R!GWz)EW}R9YO^4H{Fke_kCtQ)d^Ld?6HqbMoJrEajGQ2mauZvEQe&}^3SJFc z*o#Q1@OCJ&1a4!CG&6G(z4ELO#3QULE(FQd^ve5>N2@0omuMdlB_j1OsCg_Iu#Rp7 zNBpSfOX$T`9$~wQ&o*~UrV?J%PQYJ?w%03RG*dj=odr_%t0{&&{&+|pfMYf+hBXQ5 zG`EOxzzz)^1V7_0W=-w}tS&-x6gqOl@1Xl$1UKIKTf|w6CFw&pWS*Itts5?YC_LcF zlG$Fyi3W%>J5nYKBYX_G(SrRC#}*b3Rfkxph=S5F29DN3(-6-C5kSyc00c=aH9TW8 zF&UnGC75P&7cKYM^?W3=yUc0CtS%@5`&dx`us3KQp_-yi*mD|Tv>03yj<84!7T}8R zF_qe&W$q|Om};ftu?-Skp+9$=JDo`i{aY7j>Kg0rr$xXk4ET~m$?ZzmRCWo_8^ioK+6K=u6 zUKeaZgfDUjQT`Y43ThEf63eB6JxLJDVf9-{FI8En$(XFow;*#y1~BNm+W_qPlI>+j z(3-E1El4_D0K6i~ zj^aXI7?gq^TaGN@Zk6V+8_{Ap-jvNy1$F2C2s7thc|6Jlud~1!Vin@=KT8`C&D$d5 zb$aWj{gs+fbD&w7vk68*I7pkELnS%MaWRDExh?4$K=8jbo64YtL^Zn_ea-#0%Jq*(JIWCAOUG|8Pq zOm3Ojo2Gk2sY7tba0Hj9^FWy_bW$|XTc-QP!Q~y7j5UY=3rj*j$Pd{Nlv$nwObcdo zFDI5FRdM-i=v7eOhF}ORt7{l&Ps3ttlh28HT-(r`yJw0@3;fFLx@Z3Y%3u=+PXQvo zi&Lh!R&O-XUw872rHrrrWI*UAfYCZ;Pz_E{hTJQz)vAcrV-b1nqn5YmVRVImp}pa8 zCnjrbkRPpph9WIph&kXu+PxMCPo=={eKvH z$L36+C~G_FsAJooT{_ewbx#&&PQfj zNI?fnSu^4&oiTBWBy@^{6wX;8?2+5uFTDVYQ5Y?)*0Pj=CDU0_gp90~Wv>4D>_b;~ z`^zzB=lcTQ*YorBU}NG!vv1I1(x^!km0Dgu*w7x>=FgOyp#4v!3u{w@b7GChw+oZo z0M)dNbeT<0fT#mL7LAAO9+{~>sznQwBQW8GSsNw>11a`F%$7Q+bIR6aNP=}=6l{PF zQYLAqZC83G_)S)R;!Ro_anQ}Ph(6*43};MeM?!P-0%{mKG45da{hw z8IcM#nw6NvjOhl2j&rM3?J05PK86Iok^|#!Do+UIT(m7_7m#%4A6}sEocUBOaSb#H zbk@w9hS=#HvuE>bu;En&yp&Ce+<3uzO{tN*8nbS#k zEb6AJ*plE4j~%;;{*6lv^!12z&Jw zvfD4%fLHQ!zK{w)hsQ)8&-ge8-ld-Q^KGkv3VvrX({BSq&Sww zEw{wJP$&+-fl@;xd`2ipWTth$GwC9~Z)bZDAA^8m;hx|&!kTUWTNJGk$hsg|MQ997 z(K6y!fuqmzI+<|z7=X!)4ZMF{T1+*{w9RU{csrA89<4@vRQ2M+ zQebYV=sU=P-Jx5l0y~$&(Xbj|qhZ7Y9u6Nosmw-5dS_CO z8HF8d$%o=^gSq@vVOSj*^)e0xjeu1?3|;9;6Z?bd6cGzGHTsc;c6lczxW?p(OX_(4 z#`a`mz`Qo}S~SB*t9em!ZGhDNcJZ=K4kMeG(`k5WzQKt+QI%6dk6vYeGwlOS~^-Hi{9TiIoR94}8s+Z+t7XMYJGE#Hu_aE2jD2{9al5RzlYB_2R zO%F__07{}6|C=fc4~u1M6$8Drb=G!i$A(ggJtb4O&!nOunzC+RY;U4mT+63L^Kp3hYg=2hkC6j)@|tpMiT|j(y|dRb;;@K z5bRy-yp1$9xWNCfC17)_BmBywm4L(5HCP#QU^2KoG* zn+UXFq=E3SuF`)R1({^@4&yQeK>>~`hFrXpD3x7*Ykgem(ByVh_vjoca zf=r5D+DdU`B2e>*g|a1I$*tp&uMOajuPLh&4O`bycA9~SHt;#gxNxNED}o8zETzsV z;jFkic>;I^CU7V2-6F(?*1_&#bTDdr{!T{kif(ZDXa{0P6ox82XqB_!h(@SeaZ`&c zGnuV5B>6Y5_FDu=ZiQ&#Of=m?R%?fQk2+97O>QwbJaPRUL)F%h<1K`CM^F)%G?6S} z(KlQ0J)fBOr9Ryz&DjXEYQ%JC^uCAJ-Mhe6)rdWGGN&j$w;2GTv>$G@q;8l(Ec#iX zcoMV(km_91clDfQU~D;UoHv39OvO5L|21+GMIbi4%K)W_+Q0-MNqEC|Y_uT;%&kX> zcHCECzZJzFV-rt#>pnJ(l>7u9*?3>YV?ze$b&po@uV@@az8B`4vp?Lg+(UZ8ze{_= zwIGyO_x^!nmjf*AmMv$WIZ?kOwb#sv21a8KAX>b>Ypw0B=se|SH+I$iYBh0=?AqQ$ zQ1PEH>F&vYgFuxziRoVUpJDnV zCr)-=kl zf-$4y!%LgZBMXeFIjz0*Cp{PO_el2W?GJq#`CH zFy&Ph3EEj{3xEMrxC?vtNX!lcLxUztxjQo_uh8(y$a%ep<)*YDdH<3yQ%rmP zw7s*(Bb>U)zts z+3DIQKHYA);Ua_&<*XO*7;IwY3g;DP6AXmWOHxSWOO;F1dD;_OV$}!c$280ggPRg^ z?4wk)x;69N1cNiCKnl;DWGBR)=Os&|SAjWJ6YwCILA8VdDKeH7yAyM1Cq;9nQe)5^ zLtq)p@9yFn$|eRa=ZG*O3MHpAt09E4u8dN@Kjs@N9@_1dw6jnb5sT*rQD@>r^)Cal zgh~I5k?-@4a6y!jwM@4jc@Mlhci>AzCmD0Hn{LY$-I3>WI)#N!&ai(T+m&D`3m!S$ zH{*#L!bSl=mA+KURd~@*OQP;;^3)ITU>bFh_)+iGGQU`d2vr3Mt%03^%4*y@>t4%_0Lv69og7h4iu4YuqW!p^%ZTpmi69Nn)-tXLTe7V=B7?qwmcdM7H~=v`~I66d~JzZcGUp9f2pFu48|); zh6o^f9}R0}=B6o;5E5PjVehLvO&X~THSNpGxMQTgy9-+tN{@b`KW2@Ys;Iw;uo6yi zls5o9NX$AaFbtqM4hh=6%Un`mgmcJsC_0BMI~uR-BCn4FWR;c9591|W2*n+f82u|+ z7;2Pg(IRV|Hzi_x7gU+_kB7<=Gg2Os*?5EGMtJb*9}J{)?Mi4;m=W2RlbK07j6 zRYX)4WW{Q^3gr#Fx%O_=EuqEo4Bp?i2hxBz(e}a~c%~Xq=3E4Aj=RJ)I8hergxo>o zsGGmhqHx~z+Og-SJL!*YZ5+cUB34~=+oOvsK5|2#Et#d>a(0a_MXpy*NCu{_J zOKCS`?S{~_>52(?xpYMBjPom{a`RSQ?G7_&d?r1S5}Tv{ei$Q$#k)7I0ZPUmxpc(z zdRKq++p*3ysRe(4QN#wL7r9S3C6j_jp#)^@NLW|$*`7Po#ok~xTA(Gf4i9-S5nvjk z;D-JfpYXIEeP#Cnh0-6h_LW#9(cC{=A<${Jugo?hs56MoNOo` z`$vojFOPKwAvn;0F%ep=7p7;tPN6{ zDJ_<^Sy={#09Q`Jbq6e4H-uftle3}ITa`q@+RzX-))fSx^|>xrmwuh04_8nPb{cKr z*7?=*Tm(@^#D|s?;z0F!3;G$m&Sjn>rbs?*W4lPnyc(gHtIHlJ{6STJKGlA3^)m!8 zGj;WUN_Y?Eud)5AWZVNMa}jB&79P4DAJ_54p#x_R(g`k=LXMF_=%YS^Y|9_sZCQZ%Q&1Te}`ih^+B)o*sLUEA5Ut$GmWWPXI z#z4F&-fP3J7DWx&GiU>zS6;Lz!V5X(t0O)3wh$%aPki9`9To*$f1){fd3k;R-M%h3 zvU_=Ue>5p(aZx~O*E|t=Y`szV=KR>c-YTvawtoGgy}^mK#sB)8d9nR|e0>=C8#{x~ z@7wPAG0@}VRoq;&!{6=s?d0ma18bO$>6`7-jg5CLeF?wptTWKpalNPg@?73A%j@+z zA%FJqRqE%H=IN^Ryp5k!@RzsA{e2MEACLHxYYdyiCO76`lY72oV$(ip#H&{2wbWb! z_I_RWr-ISdz4fCye>KD{3^pKk-K;`DyK&+3b6`jFMs|~mqx6w!a&x}}JZ*8b@H|OX zQ1lQ5|L-OP0k`d~dE)SIHm!Iw8Ic_VR@#+L^E2YzyuC=x&E zv+N%dsJr9nJrlXa|Y7t-e{3AwA#1MZ5sOda*FcED_I)RMvp@pGpy-FEL6fkr zEVCGmM;wt6s$Y9=cMBaOC9Vta?M>Y({*be54O~@fZVZ0HYn_ZSo!8OIMq7wiQ>A9p zM$SN@HGk?n8r>6FH4d>2Pw*P$MS1ybMbGW4y}(oB5h{$k4vzc}iOFLD~FkSBmR(YWU|N#0UI zwCoT_yrQGlI!*eHN9#xU8V_`UYbK*TqJk)M7#8wyS)9|aq2yEDM zFw(5nxNI!xlHBYlXKqnG37E-WEactQ0zpg@AO+wxB2NfQ;Et_@iCQ!{S~7JSkhBqK zp$Es31nw7QAA+TnqZ-FCp;OnU0+dr@#SHV#!c|&#e_t*SIYl$nNxh9e8=kvhg-gOu zxyxEn8fO@`KjYNrg=kl;!&Z4b-f(%D^hFId4Kibl!KSPlaOOqsiyOK-5kep`qQ?V* z6b9)DZ0&I_lI2fzSS&GtpE&UgKmm{{@**_*TU>Z(4HyQOAWFj8==xH5ZwI!qGvDsa zV>c~1KY25E0}lra40~ml#~=v71DAla!kph=erT$)^pP#RFBd-1n=+kUOqonupeIAmZErQ|@q7|nNa4=~7jbujX=EMPsihN4e^ zHAS!kIPeNFhqBY&IZ&FwKiwi7*}J$-ppEM(5$q;iy>lv*@eYXYWRO(0c-@EY@=S41 z#aBv8V@n4jSRlNIkWrM9CD-(2lyi4M0LhIsRKu3$3RQV|ZJvzQI!}XaN1Dj{HBj;A zP=L3)It&;EeLDDq0%d*S<9a}qp46_|ptgGW%mn^XiJIMvIhz*qpqLF?soT!kQIiKQ z4NB%LHH*oE8s2REGLcYJScl^oNy}rs$zVwI7pyHY<2ZVjDDR(Nf;Yu{-f7JY?@F@b zO|)&DMo42v6P^mB@_3XR6xZ|(yPGID9+t`yh|?h(Go{2fqSkYP-LOhj)oNhSe5w8l zg_E8P1@grcCV5DXUVK$hj86-u%kVm^k+oeKddv43(^#DsSi3zev99?$x& z5U(cF6t1GyL#u7%UNh}F0s~f+bo_ZA^`8L$bKZHx8y|4VheKF+D0eYygRq2l>dWAS z43}Xc`$#-aVUC*fhRXmD_0nN`iIf(BIB%P$=QfY)B7~H%DU>SHDYMF*lPoqtcvSks z6cDA;2%k+@@bwgS53GNG{YK$x@~d;p2sWs-SI$>QXworM=c{3vp*u)M#$EwKOc-%` zL8&~-P@BT3z}70QE;0!4XFTgx7(+XkU6c_hh7@68YK}n^*g}N3gC%rBPQ&@PJQ=8; zHk}fB{SiQ=qbQ&93cB%J?nma+f^XLrRmI(;%igTk0{+V!mGR}`M(&zh$oPV5Sb?tj9SqLxuClW7&Z0{ZLakkr5{GAAA4(}9_~to!l%eifuK&IySISs8!mc-W>kO*D{69rYx zU>U#Y++3vs60R|R(GQ~io|dXp7po<)aM=7Ej7L(6mXP-l9eJ6YmYI6^(-)&&vK4?5 zcB$mU{m!|vZ@*KM{>!Pp9f;a2izlGZC?juc4D)`O(jce81kLK%3N!2vH7&WegJ|8X zQX;K*o9hF0S$Z)~QzM=872Z$~)KAv({Sjzd1jT}0*hNHC1l47t;T+p&#eA`oZe9|| zb5omtN*W)_tP4o*bXg;k94Gx~ar7T~ttDWCj!BLCRInMEq$K)k%MH$~tK}32H3W zfU~#E&~raL_BV3y_4~gl&~y%Sev-hjn~tOkbMLH#$=tn!2}Uqv?1g_6BNn7kyup4V;R--bWrx0_Skg_(#3=l&&4+hd z9Ro0L5Sn$}2zjxCQN_AJQ5GyK#zN_W91{NIiG!SbDh0h{v1s#gULYGrhEyF!b&17p zdJ<~oOxwGQAiO45Nt)cUL?o#0BBrkCPE3ODLwlF139`xR>GX_(D?nld3Kb!|xrg(c zg_X+Mg=qEO-_YBIx=aNqeq?qY!j{S+bu0gr$a+`SHs7%AEgO7}lgkd9^8vZ>Ze3kk z(S|Rjk4G{>Vq1f)A6xhbykWv#1@sRC1$935E8gERgL@I{aoV`xV4Xw7IRZ5TRs1RH znF#z; zt~dUWA47a@TY+pAT^Mcu?ptqECr+lFH?-0Q|A8Gj_E-1YGJyBaIzXId>p*XAoV2hU ziPBW|!QgxlS;1XQNk7bd3#DO=)QXe5Ijm^%fB#Pakv*+*1$-IsA`Dl!1p$tOR zB7XtYKd^cDk-ms$rt+dWuKYt*8BE?&h%@LQMJWB_LG-S2Q z#%CzZemf2?7XBmZ6Rd6e%o&jtVr_t(TWjq{q&7_sTgO0=hXzc-L#6GeF4CZ<>|T*t zNiZ<9s>pYNlAnxdt=3v-oShMgxy@Bedb2hkF_uJmbzuiuKigGg_@)r9w;0^Qt1?Tn zWJq@WKjZk(8jhumF#$P1S?l>%qMVWJeAteJR!7lzk0dl1g7BH{oOn#p200 z>+RRd{&{IN*=A7xdQIvCxXUsTv@t6CZR}0EE_WiQ6L0cAG6M;##k`Ro0d|LC`q|I% zsqH(D#e?J&8gJgyEA}3XhSu0lggm z7tmX!u@Q4HjOe|hdb`$Z(O%xMW+i|jfHbxW3}e&)dZ-^CdZ&}g+S##o2PSs^#Hl=$ zK~c_{2&>ORw5I*SrMv`KQ@Hy$w)uYicXn{lak77VVE<6X5WI#}9RV=I21O+-{{D;4 z_WfG@T5n!!vDvV(#ryAN=f^hn{Q6KrA3KxN?X$Mo^)~Z&#^L4zKK6#6$NKsvQg};# z_~PtjYER$Lu+6y}a&TieGW2CgTS`=!$IGjO*-7^rW+J2Oh5O)oVA}0XX}pUd=TVR} zMSlC)9AX*wu+QF2W1_^wZMJyg%z&wtL|-Da`SW3~CgWKD!Go->VxNr;vXfY9y4HMD z(f#{&Vt!jkb3k*!`dCo&vPlk*TSzIxkQ6?PlH%EA@5fbRr(BW&Ytx93E^_)i-{n%$ zZF+hYvE);P>e;^&=|!kL2nPoDSgB=OF32dUff+n$E!h#=pGxi?MRbt&uu8yN2#`pD zTEepJy`5S`?Zbca`qE=1eK+3wob&slh0pt|$<6Vau;Q3E1v)#V_%);BM2qg&>VcDy`7iaN{iOxuN%^YMsnX>2ilB z)BB;Hr{|U;VRP)Hc-i(P6t~a&)!mzK%{C9ekNfxQ<5!F8x5xYA-P_$+n`#Ul^+~Ee zpv)&EeY3FdUR&XJ0SC5xhRy2uO>qg>$6MBax(6SM=QlVN=r~86b5O=x^~?mK5-C z=Jhtqs##!5m_VPUPuRo%5pl5dB9aImtU2RYAQeiHM9?50l=GzGp_(~d#}g!)gpw;F z(gCvnE4bOJ_q7E!iq>_;yln)vmd32FA%FLkB!x85Grc+e!fWZy((j1SPvC%@395dR2yq)eBP(mF5GpH=6P8?e~yWtyOLPW z3!O7KmFN!T=On1AZGVuqRpU`N={6TcJL9O31=-~VXqM(A$um>KEyiTyOA5=b6y4A# zHKp0~7*q}{>GmCmn0i4zk2*!qPQRP4mo^WbzQ;YV8+Idzjv0(hRWn};qrUaIM3OQK zOy=L)Fc1#K0{pZ_jr;(o5G0R&Q3=V%e&>}<7n{=xpWi8;$HaiQ#B{RgXLo=K$!B(G z5Wq~{+x2w+wzfV(CDK47Y_G&&RTj>HLaAuy?}0BZMtt0p(X^ zY4EoOT9S3}j4~Dez8%SuU_=;|uUw(@2jGS!)!8-W3v#6|AyOe>thFd8#Z)1|6vzOT z)gwP841Cj^E(sC`77y%l3`-EC>JM(WC^JtTh`?#^zcG)gbSU_|OBO5zJJ}Vua>>cq zL{bx3Gx7c+(dGVaEV%B*&%qixNlif5qGV8ixn{FO6 z98Hco$1S7(kw1%e35ZgEnC=Sml_mS*2eb?bIh5BUp`*R+!zwj>)+I$_ZoN1!;`fl&sMoCj~Gs zEv^+2g=Ojkq^rdxV0l5Sl8GJ#8iD+#wGc_NBO)$xoXQoCtOBB#8HAVc`o$=r^O|Wa z!ia#@=I<&roO{KHB&34;9UBwhxQefKA=i^4eQ|gTbc{TJ*R=P1z)Ia}-+KZoz(D|~ za{OSRILEmjqMvBxNXWK7|7(N2xS2-0lRLFKPBXoCt1yzdm6 zYCT~Cb|9IA%c|#;gKX$zI3m`er{}RnbnNklC^`PZ1noO$i$NV(kAxK#R|z>a0w!40 z_CRS%DbA5aVeUIF4a#4WX!R50!x1M?0#qYG3mg`AC6=UIat1cDjEeeJXVdjpe^>5i zB8#Q-K*myzZxCdJkGBn$CV?!hGfkJJsv=lfs{_{?(yMXzyLrN63S>RnP4PHAh5|@l zW1GFJLM9rl=Me%=r5scIr~>=~o2tYZLGt4zJrzk0q)8hNYn1CFnM`hv$T+Qw=Ltzo z+I}Ey?&ky+Exa9nrjLl^RZ*N;6#k$?4BEB3E9X_ACGG&3v)%lX%UQ1pehYtjgP}>683t&8(S_ z4jvJ|gp0oX@wmC{F-XbCFsoZ(Tzu?MdOXUIRD7~wctYT-Swp+G*Gc9NEY~jlA^h%Lbg3EgFcSAfwhd^fd^MG_zL5-c2 zDO-&%ZB=~RuPJ>05*R+|s6zN%IwS-xNBNtp`ZU*Ja5aDoiPDd}7YI{R;s(b!Gv0^U zyS}pR>ak3&SIsau=AOZWfvM8@9an0IiR)qw97dU#@L1nzO|BF?b?_*oE#oqg@}g89 zlqM)Ik*sZ^Nk5r#O?t1=sE1(^g(9SxJb2aoESpu#rfM@yXmYqlW~T1+tg*ZMsV;5* zcTjo>^>I|!dij!|%6^@*148v}QiN5+>lYoMKtWF!WxTe8Q?8_Au~r$Vv5bV`R=E?+ zL93V{@N^0B5g=3H1kD6TQkFL0oHZ>qDjcfu=as3i)fv#ogTiWlAm+EyymOJlP0c!q zqDghoxw;;hxn7FW1bUwvRoQG_d>c={a=da2;2Sze3|s2sq7(e^FlQEx&Fo;Uc(=bQ zo^(hP3bSi<#z_KKsalL%%2{YMoS19rh*7W^Ur-de$Uw9?wChdQj@+kfqP29MR+6A# znGwMZTKV8o)PMYpHTBGyim*8UNTAW7wJ%l?^>w7eZSQ9Du7IGp8duKfJ^OdLXXPDW zOiYwvXPt2^2|d z-#@*fb%+g}JxDZ9ui|Z$=ZZuZeFu6qGm?pD%@Axh%{u&B%erFkrFQ3$%|Q5d44L1? z;oh>R1E23_NBV9VpV~?H1)t=N_xFDro&R$l{*Tf5r=k46Bj;F|+5g8eKPxlG|6#FH z^fNkRvm^bC&X10MbF~ph>`;&(i!EC;2m~<@tD&NJWX~M-waqKYv;l_~j^(TEPEz@c z(BRqe?e3h;yvl`BfQTLR*o>8{5%`=s<_m8`Ylc9r+@9)MW({C?#pYQv2wVKFwT$SOOiZS+`P)I7KM+nl64=Qbvqp3C)`C{0!BgCj-C8LGEJ`T(!!d&>k9 zJuO=L^v?|yKIac~?{^QLRG4mnl|*Lo=j&sQ=u4v;v*4wW)-bc5s?iuG8?HOm%HN*s zjE;om+j*D-cY4}m4M+)u`NU$TJ`wSV8famM`on$)yK*9m1r6P6|e;N+%HG))Q&aK>hza$<}|5o5_zopn@679r@JFFW% z+R1s;o}BB~0e-Y%H-_2IlK%Iizd7HUoxDwP%1_z(0Y!wAUoumURB4W27$;!NG3iDi zY*d<_4W$L5wh4`m6X$C4D9-$!&z(Oy;OhD9;p1fGrKjuT=;fr)S{#E(p49w#U7fmsIoQN#E{9i0T(8bl2Y2Rl89X{ z10O$MqQL0^eP#{{nkyNO%GV$>#<0Hvf4a(6_iT6R+@aZfoBdzFUg2&Xdc!!7D<ke~Z5ACA}LDChO~A|AbVO0efx`%ULw&dxe6B2etx7 zreR)|)N8`?0R+O$>9R#J>5W+Npzfi~E3H|bCld-LM-fkl6ZJOII#klMC)|V)9)`ov zJgZHwahSM2&LvkPvIeR3gTwj-JDY@L6x5ky0XQ^@39Col4AGcY(>ZQdd|XQ{G5HA{ z2OLt5pgD=95yC>%vWD=)f6g?Dg8%F*^7}ZZyvT>-@|LH#4dFPpOd#Z%I`(ax*e2{z zgdWOWj~g?k+r`rq8SFzwV?mddU&-_arjI#wa-zty6OGm;2(JwZ2d(jfSr%QwY5ePF z7dS?1uBMD|HM`q42^^h`c}NelT>!(~gN_ z(1Rq^%{N)x5XRd%vIs{rIw926Q>MKSY1zbclQF#Oh4*2@mnVxSmb&`L&MG|8Z|QJA zHCAY47FT)0;Y;KiVG6w1wH{>;iJeOu&vQ#XReo&%2USryiBp2J*P7l!Zozb@4NE_d zkglb5sRldAhE*U&P|Qkz?rJM#YSf!xc-oUHZ5(V=a6~L;d?j%*7b(f|@IZ;FbzDni ze%s)3o%)>^eIAG}R|{}uqhTBhi{v6)uwb-T-DITsak>;&RxUT+1CjM&9X}H&1;$g! z<5?aGq|sn$4gFB4txeJe4f@%<4~ZHpBv}`eLT;1YmaG&&%;OJ=IxJz6k>3vFDGmLa zLc$@YjNw0NDHAn_p|7RV)lU`;^YOBkuif2L{#|4FD|Jhwz`w`)lXl>Mz||A9%<**P zeSxXoXlG%awlJ?3Cw2$EXPEC=_?3Jod{*E$(4%0yZ*v#HE8?QKo_{uc%P=*y)HTMp zyeh^BW>X|G7AtwpDR6SUeY#kz_>LjYtL>I+r@I4*T>s!wb@s#R0Cuv6_$658LU@t zF~Sx=i^^Yx^W7<=*2QH4Txst|N-}PX zXyN|yVa;MT2vM9cW@`uDtl6wMnNrMie}`=w6YmxlLl+>qqHqRG4^00OZ|_m ziPOT^{u!R^ccEn~l$Ft_g0j&FHmLY;>Q9cBF1vBaLpa>lzrN%?kqvP-0TT*H7&=>332Y2(1(FE@cS1)0nRNb~~n>M4T2v+lZQ9PSc{8Q}e@+y6h83zMM1zU*E7^OC!7bYk#+2 z2S~_U@?&>=gm6_Gbt4+bGWO~7SS$ax9+>|cH~w=nVPyDksK>_eKP@M0jQtcXciww5 zx8YLbiJhDG_l~cx$LC6@Znu}G+xz|J#`V+2cc<@u9X>y=*T2Wsj*g0VLb>6Y1Nx3H zAJcXZTkWN|ZT9N+Z?&#&xh0jCoE==0ttE(}x0E(V2;-adK!<;2$8{n6V9ps^&V;Ke&G0B^6ex3LQ`gVE||ZctoPixpF$&&kXk z)421O#OmcRsMTsE*U)K2s#d)`~$;3sV;`!;HUxPjoS|gDzscJoQ@d#hX2O83!%11E?2II3s zncSpNHXhBzsM80Ms;O=X(xlRlIf6|ezE2jV^J}_66!9Tnod7Z7O3MW?d{GSUWq<#n zJrR|a_3@i@i>32qEbAx4oawkDkUiN;!U)m}3C!r8KUiuUM6D#tX8q7NWu|Go`iIiE zDr*1u0>vV`Kv`mDFgVA`leIB(*5{z{B)7l6ZXbJ8ZFBIty}jK2y?%uH{u~Scd%S%` zF)q5OUsq`ejh#=I*Ql`N5gk#ah*CYn3z@~4&a$JUWg_ywr{mK1=JM*?~S=Sf`pTCUzT!Nq$OGH^s+p3NfGY0 zW?hQ}g{V3jfqvJcrm~hZd!3^;Ixk*kQJ=oY0m;re*bF(8uUWFQXOXIKyrNXAN4l_x zLtJsf%gJ#0A89uuMEDnFHMSO$Hx3?xedV_?(R4( zM%*T`XXSS&%{JjDpGm#{gGmgW_az?^P#jyNZJ3Gamb%S{-rG^NP5pM;5F_UVqFog& z^7~4!hY`7^R9I@+zU_i%rJm#RiAP8{`>Ao+SATi29UU5UxSXOXF&J6|{Mvf<9mCujZB(2DG133h9 zAv=wt`?40PiSL75*TVuoOL=TDYB)GjLNc4317u-0dWqFL9&AxV-kX6Pa7!Mi7eX2j za34A31$Aob;A7)yG3cFmhLpAoj{us01xJ!&m>DHUnBu41 zYEaRdh^j&*xi7Npcn!v4H{YH>||@NpTj|vn_pq9($(z?JTme?BN~Y!mHN{f+WQ1LdttbDL!-9WX4lG&+ibw_3nrLKNc%U#rMRr*`2P$@;Xuyjo?f zgZn+C(uXvv)<(E3i6y6spwvDuc5G=pqe}G|lUShYp5&A=l&Y{o8U<9l{L@Tl_9?)i zs^YCa#e&TQO2G>^nB6Q8nZ42^V$i-W2Qeoo5!`NY6o+SSKEHa9k+-I)o?~iBNrTy{klj zA8a6Mi#3!LBSJriS~--}nW9j=XEPZxADL8)T2ET!=@&2X%+!1YlhhF%4 z$wkd6d#G)ryFo>nQhrGq?xe2xY10{@Y)SilE0Y8;vi}1eox-_CNmU9LCQn1Wmge>x z0Mb&Z**-5ebM23E;kEr~nBY1l9jz*(6w!_3z@V?g=OpSEBw%t2yQzIE-@mI*5>>6# zQk=T22ORFG*cxeXNyyoIhSX&<6a_uHn}{0~Y}V5~sp?)xOQbCL6zOrx(Td!uuhw-u zw9)H<4jcH6dHx-J))<MAg(J8*O4rbiV&-f+#ru6Y8op z1uA59Jl18jm7RIc(y}j>nqlD+3yp|m(~Ws%u*_UFX3W4C^6N~)x^+WZ1KQNaI!7OZ zS9ne7Y3LDMsYZEz3(m)c%~@AgOXo!@;wJwYw#7}DIV>!yeI;0Q7{>nb zFp?m8ydw4ltJ?TzgAhcm^H%sc1*NQ!MytoQ7{;QIiuOWDo{>1^%mpddb^3=Wjb2-}Z(R8bEC zhF?`p_vYOnousGZM+3Viou?U6mKy0ad4a2Kb+Pjj1^tvJMOVY-%Mp!X8oC%Jj@=h= z2-x)bW94pYjDcD-DJxT<4AGWTY)x9pmO(`{^zGLo<(`$%23C;oP@V58BUs56)F)baU(IX?Uv zt!^}P){Ldq#X`KTg1#Fh(XN}d^9in zFM42PCq9}>-LkDL&{u6wJfUv62OZht>8ouJO5KP6kKe$vs#a1{2UkKL*onAiVpF2& z(982z4!FTf1N(%!^p~Kl=FNtw1=g3-e#PEz7VYVaY|tuV2>c43c+Y0K2mPWB#0foCDo>pEc`DljycoCr{ z23q)iR6W!t46b6Y0we9mwsw>v_07dCP5vA$5%u%mf$ZBPVJ0qm4&IFD^u1AOk6U5@ zS5G?}wGoMX2OPfp2bEWhYTekJ@)>>})rfoE>2#%tVJSjJ##FHge#65r)o+HrPRL()>?H!U}Ahw$oq9dtM zv^Z^OnU%ydCU~zL0bD&ucR48M_UOa~yTc&{^os82MU1-U_FK9+f)c70(15yRhWapP zF5AdAkGZVK(DQ3txA$7|i|EQ^))};QW^ng>&qT|aIt`+>3k!b6LF5kt0u0ltKtPIr zG&MPC95ZrCA8e5k77Px2c{>OWWW}bsDP1`NX9((*u1)Pd*YCQ0R9#Vl6{mR#e3Cs( z6bMO1X=g1XUMc$WsyLZE2$v1?Gb37JD%3g}aMLU)NT`@%awXBYONWYuN~7B5EM@9B z%}F~^ddr$w-ELps_Gjp>&Qr^bLgTHs;UmuGJlsnA#Aj=_3GVKF+Ljv7r+Muzmp227 zvaS1|!0MlPsU?BH`;_9^4F0lZxe-8+MrQ=CjU8zj+_^!FYIAR3q~_$?c}VdniW6&S z?4s+AQjhX%TlG2I+$Q64KGTryR{z?*Z|ti~NWAkaPqzI6*#y0B&(|3>9r)61*L`Sb z*%!PbvI^G!f?EGerTnK$fsupx|8ps@v9tUS)XK)r`hP&JOX@qe8*B(ZFF%3?Sl;cA z0txVdpYfU|1d7@UkSE6TE}KM(zRdEXaNXzAM-0G99bita1_2Xd9X=nw^Z6R%3K*yS zVCvA}yTQ9|xp7s0^I-i*ER#Np@K!-M>XSbf`uz4{|2WIIv~M2PhDdw+_kLW%e_idn z>f`3Nd5xEiXS!nh?bVV{cXQp`;yTkXL_}R-V&av}KRKR}1}AD`bsXks+K{nv=^>mp zV{`4BO|60AICNit?ovJ3Kb4eJAT*qbGxS?WHt-*fCDf+sc<|Df1?iuka9bJg^{zA& zS&3wl>LH)DH=pM2w5~HkHoilBu-i-)%pnVz1u34t8HbsE)P$MzN+d)mJ!`YA>ShbqN%et~(yzRR0b z&;rNN*R;FJI*;gfhl~kD1PCd;7mS{!k`W0CE<7V2vCK&smlJkF_&r%=my&(Y_{`Rh zn)u(@UAP|Ne;(lE`xa(VcDg-7(lLeo7>iSx8q2kNsm@ijE6?W&Q_M9^H=S9l)L*V2 zTwY$5HnyJcTt2)$-acz);9okf9^h!ax;&JPE$T27q7xzJepkHo31F6$BG;(bItn~e z-8*|(Cyoe=6)t!3lsaO9ND?rV>*%yhP=_ifF+#pl4fDek9rY3-sSaaAa^DW&CZ{$s zvZ`X`?}GoU?oEg=@>+{X=_fE$8(Gy!h#S=d2{Fsl_SXJzYYM6jt`!XedtH!TN=3#( zw(`jvlMqapl9H}Q20}TCo{6LxG-}FYZFENJy0!Pma4BpeRPZ0VgftAdWQ)>Mkwv!{ z8%5E$EU-^0j-ZZmoxyzgMRJ_1J)#+8MUB!1WY(Lct_z7c`j&ZD;!wY;UH@TAr?i@> zvPvYuj^^6b-!I_>V+(|e31@KtbN2U(nk^{S<%xHF0K!t`jt>edD3i{^B1_m5`4oEk ztwOO@9EgGM<+;Z=Pabxrmjy$^#<~7sa7agtGi5eTz5mS8ahe=~AlEsF1@kSoL zU0aC9kO{fcs;yG{aK~srSiUOSf0^vHYfJN3B1lQY-}+bQ=B*qRyqy$vjjCj$Vn6e} z29bU+2GM%s0S8?SX81=k@|$?L%$!?BsG;uJx!ae^{-;wo?(`~Xmm9uU(ETIyHNXS; zyOfbOG4MccK5x@txD@)MLR_i2iaGgJ<0y6rak%+-yN*C&`j$e0%GmR_3Jp?}c`PY3 zkX;lkl0yIWR4R_@h{A2gt=5a)N2`UYNTP7(#qf)dTN68y>ILC!Q(nxUCvZnNvAjTT zWkgMfwkAWkbl38J`%rQ=x5MGio0~k>HL<9BbUg<-Y+i9!r=`?!yy)>PWo)Qq_E~r~ z(}isWYdunEIKwJfZek>1QR}Md!+Bfr(%w&(*aw0j6|v=GNuhlLu?k|Ku3OIb5O;IZ zhv!BiR9fIAbt$th!0l!gOF6CIfkYS~TE_rYPY{c`vj~2Z07bgG_ zU)Peb5=x3~esSF%rTk$QqQgTD4GU`Z(Mj=QRuWNaK(+-Zha@#S{l`#6 z4><+w(2Vj3=5W@F>wZdCFUZec;A(B4Wo&Z_Vv4zv^5jdRiT?AAd_z16;ohcB>k)y5p`f)Q4H00Osw)`s z(q{od_6m-JZ4Q(tLbd%nuJ(v#eDQxIbC!fHkz*P$E9U|2R$&2Xivy&s7D7{T;{4(QU~%Tc7f|we31x=|5QjB> z{iqX8OsGZ%vikXS#A5{U76{T6u#CG(c43zQl34@;1lxm|6i)htJ7k)awM_KEOn|XUhikaTgxsH`!wUh@w|?Kfkova@{<59_4X4Sw+WVdl`S2?Ma}#Jq+?j)U&j{~S zXiXHCxBq$y>@>;=nDciJRGfu0#9#=Z*yDUINj%qM+n!<%T=2lcAo3_CS1(4A?AC}A z;bdQesT-Gbtxy_?Q;xZg&VZ<7D0Us|9pd9+#7oIA6V1_*c19<7X}H@Wu4NQYds(VG zIxrh>X{m^$kqYBru#kJ{Fj6XtwiqXxu9UyfWaQB?2aGs3r-XIPbsSV;LRb{`U6rc%FOU&2-tuTrBAfs4{Qd0 zRq^MvEM5;8-cEWVwLra4-hd%$Y+1&S!wgfZyem@#q!=6~f`1U3!ubu$=r-gJO;`ze zN>wtnuaS^Z8a$;Hp%C#*yr}_Ui{SbYUs1K{nep3nJKX4YZJN7_4-kLbg3oqXO(LhiX`;i`X!I%R@(4eU}Ef4*W?4Xl^lhJ~Qpjab*S;tv*ZrmcoHa|FV*INOqype5nN( z6pL@o{l#}6et@Kf0tj6vyts%3t_9*7NIiMfwrk+;qx;n{E26!}k0PHismcIWxdm}K$B@jHk(6IG5>3@n?N z$zYF5w@N6NFZi7cbb%gfb#HLh(1^w-4_WJOquM ze?^lJvh&(}j5W_&2OL0T7lMnBsTR5$*fQU&o&c?-Shf+a!rWA%SrUs}3cxrL88D3K zaOk6nM!m7=lsqIu>Ka5OSqHJGHNT?Nh?9- z<|pgjVgwL>lF&7DSxPlcRz=o9>b$4SFE+HigwV>s9E^kSIJ`@C-&if2pHx&}!Hhd0 z0}8hnuvH*)kliT99yN?P@KD{jGawGIT%@UIP&)S{k$B$Otf5gZi76v%vFexU0Fe+; z^xwJJ`mUX0MW{NI)D)k*SBH#6xx3u!d7yZ+;RJ8k_1fMfHaQKAOH2-95~ zL_9R^cG!5AT4v{@ziC>r;-hRZ5J1E8*&)P{?XTU-<u7p_&egQcDnq%T;&CK#9F)D;vfS~Sl{EFBeJ3OG&O%g=aS1&1LVdZ zqb3&{))hy!@MOgfGjqH1!il`X%*7~Sq1gW#j|alX6a&w6i#Q{vE1kp!rHH$$Rbvwx zr(-~15r+%BBmoQYLIralSAfGN40332+Mf57Y(#5 zgdS*>Va2LPDIY?l9VJH>CVlbZVQkOW`YpTzgH-MgMy3q73dJPXO{EDuDxV&ZO+6YIo4|8(MYGI%eAl#q2Hi}~61>z(*}xrUk_@Lzn0=-e zkFcz5MX6qn-%2iF8<8oTnfZ)1cHA~a%Y~Y-XA&Hh=zxjC(eLA}zaMFkJ*DoX^4DyR zb&h(jt_(MQk<{?A*2bNw$adVW777hxP4CG=I+UT}X^(V88-{{>|2{E@6x0tT$4S%8paxDwnPKTrI3VPmTP8CJ-5YUN`-*($Q1;5cjbv9X1fWZ}G%%T$ zqb<(zWnG{fbM_h5HIA-W(Tt*dI%-&|jY>isQ>)UvAXKGIgFym|KB4FH1V`;iN9-FIw{Mvsd-yaIqcH)P!(|$kYO-*` zl%VOs(^jr!T}9eY_)*7@P}kT6$u#axtYniZtehgcSIAn99~^iOElF#knII`vS&nZX zse!{DExLNAO`$6BrV*!s)g;6o3w2&83dsfqzwA-HNj|u?stbG~qvf+8;A8W6#9OtP zkDwA39JFo^14>QfvqioCeqcby%Z#DMdK@lcWeqYfsYyOVVMIu|5ZU!X@L{^<&7i|y zv7RZYU8R64W-6j=$|HxQftH*TrUvMvlr{)l>)x$O#!*mjU64)4ud38FdV$QRzZ#<^ z*ZeGmK4VHVG8{_Hi4PT)j)KW7G{(hC=v0#r)mWn^612Dzo9=_^(xQqocTEP+?vz9O zYgd#xp;ZOMIP5wIF3*w14=1q7=1 z+Zrb&2veaKP{K3$uM!7EjM1w0yijOaq72TNdd*tLN4#s;1^8^N(v0ge;pAK%l>xgw;dN=#$Gr19xL>})%U?bffg1DlT2WUZCeRz zHxq2OHag@o|G5{Q~QEwwOpe|WO9J(EQtp}8yM_~{b zJb3f_+-Ojy1-&~SMDlhaPX5NQIDIqJkQce6KSZ3bs)aXK&}%=K&oGJQr2s4z`1=)B zbUdFCVnx1`v6D-QnYwXa1lB zR?yCc=9bKFDe33_wfl=@44Pvi++;A1=VF%^Pp>M^bt%$;hnnw^vDZ#?5s)-<{;UlH zg{4=cicc$8R(}Z{meHLworN`*t_h6Y7rW5F;Dr2js`hrSEvo38;E0>GDxZ&?tf;0X zsvrocwJN29p-6N~{d+%I(0B`}2Pe2d1q55Yk)YMn@#yQ`?gee1LliocMQ@PaVaua? zqfR72f8Yfp0;c5pL1r%e!4!T8)6HSgt7NO`h@VqDmjb^eP1qf3D%C#CIHlJ)5e<0h z3}5~-WytS=MyePWwH0+GL7mBz_U^yte-7HcGRiPf=0Av=ei;SUP2FSiU>4zw&EHXX z0%;*OD$v#zwEyLND`KE3KunlaC2naj{h$MaJ3*;mS!DXbA6yKEiW<|4-sP{?sE8sR zV}>A99cH{1Y*S9{M>23(=?d*~XaTRiR~AXn#^MD!1K8;sUS=?AOxPE?%~yRvl!vPk zeekKJGh`RW8+y2V4=O%~5*698>sNDPY#RrGbi8Xuq00%BOK(wD_*)30V-Ly+sY_0pFe_lsq?C(i-lILyUN=nd zWV#Bys&$pOLWp7^X3WTBNB7=3YkawyZndW3QnYm_Z zc1NxgoissJBvNbc!o+&ymUjq{#gwdEEFSR^4^a*P?YarRlGSE`Ay}KRGGL3?&N|S) z*@HAkUe1BKLQw9?mKt9)m28vEe{l38Flr$ID*>1cKcG><=h+&&Zs}Ftop2{x%>Nc% z=WcwzU}%dnd08LCvQ2&i>Vx4P|A#5?-=p2XWLsvA|Bkz2CS{pT|`H=UHRjj59v zJ{t$?|3J3==MDv{_1~e)pdzFZMr>Hp1ZbBvzcNmA8l-Qdc0hBZ+E}l@Bfo{_1pI+@#<(X{rlrX%6hxo*X#M~^ytgS zHDiD5<@hu?eZM~{^-rgByL`WoQ+tSOyXvpb`}Poc-c1T`-VKTz--*t4#V4N*#pvI# z3#@ZwS2qvNdA@M^V9{I(!xYa`52qPiw7ccl6{tRo4TXQ`FKyv{J2-eZI&|c$J{z(* zLAK5FD}kJsWZ<9SzfUHmHz-%i*)bTK*_ZMEVx}quVkW90JA~`PZ`cXB*xasTV@|Kw z@#nE1dIvAGZ2F}!MO-omy=pM6ie9?ei%Po>QM2Ay@KUp(Hx4Ie zWQ7g@&z;*l*A^TJKUV4NUlwCEHn(rD;e6kPU^TWYlfTPy?LX0aeJx)}mlO2wS^pb< z;#!)O^e_C0;Sc@y6T-}d|y}(C^f1{1-ONhGVK^y+3*ViQDwx*3q@3n{aohQRa<<(!0+!ke@ z7blqwimrtLiou!ze0EpB4lK@qV9i|tLAF@**(@b} zANFzurkjdqp6UjLy69&hdj#|lY#O*hDwukHvZ zG}6mdM&|257-k*4Or^?OxU?OlDfM|AtLUb*K#gXr^2Dd2yNU2S<}?dK?Mh(;LqmKo zC#Pa0!@6LlKmqVJg;iKsHzixqzu-3*A`Bon=u5og&C~*G5qE^y8kM|tWH^QVQMAuz zc^VAh6H+G1LnKUSOf=S*!?2~OK;O}=+2yz3EH&esGYUjY(j=?r5)Q~iQj*Y2JxKiB z@W1qF6}c;3x@#{K0#N7h=b)Wexj_P!3D`J=0J(nm8%Qa*uuS)eXP;lLyn#ix)5q2q ztx#y@VW(2dRD@DXd4>5m*vSo`Wn<@<^)FU}zz6zOb)>u|5_8L%MbN7=lf(+1kz z)0YmD=Na0apU_9Ia0bU2q1~>rSI;w7%p8z+>3~tATWqG`TlKdB4C|6}`Z-Zc#nMEj z33@3?kIKVQFhvPBX5KFrka@>yQ*QV>VNzR;u}Q9>H-$>l=s*~(AdnyA0|Y#<*IW#< z38b!chm{w?kFHm&-OnJN9o1r}Dj9)uMm9z_i26*4?Hb7pfO{yABIAQQdUfX_h$!$c z`YI420P!5+9?F>@J7x`x--c&I)f%_3Q1Edtc#l4nv)I$LwHUZb%F9Ej)jXdi1nQp=U_*U? z@ozX2C9@oIJ81BaAk{d|{V%9siw8sso^t3WLtNo0)SIu*J%Q|u$5g^HRh7^=0WYfkY&z5 zQ)J5ntrtv5h-+O?$U8y}FuEb#xhK359b?fMXuyK#og}yS4wF6J&2tW|h$nY*M2H*Q zX=G^%-sk$r@yUM4%bZ+GJ`;=k$EFQN`UR9Z=0b~YxJFV%$LqM)fp`NgA{v%orm%MO zuqrG?r!+4%Aq}Vr#=a2l9m1p|FCjBB4+n_*$qQO=5`WkuuI$zfQXC2I?GT9;L8d%0 z>YO8Y0WoPb5@W5<66~2H_z5@Z!mScnfdlQ8uLT{Iu?T_bKFjswGQlMxBwN@(SPjy0 z5<4o716^0E^z49!YH*XiJ%d=;kwiNP`;cblVdOJQlq^pxuqD;HN&B6j1kKm&fJanJ zHG-gPMX7l~ByhE@)r1cYt&`RQ?Wc@306aAj320pQtkorSgqnm)kD?19t5S(IH)-Ib z2FL%MDRZPs5N-h=dgfK2oH9wH%vKVFCJB>@qWdlD=-}Uqbrv#pZ6&+-Ry!6qY(TBy z$zVZz&-R$s>0w$~8y(x6*c9N1QLVAFR!=6WdWm2=+6$Vyw)2eX~^yYPWMh z==LJL$db3Uv;p;D{3lnqz7^Xp&k*%$@?8^It**3S=qt^=9?@CBoUb;ojYfOPfC4dl zWTzl9b~zwLHK4jK*o0Tb8k26Wtg_%MqOt{lFkcd@xKWUt4l>UQLc(hj7TSX4=zPRO z(^XrK_G~H@bng>+c@sTxq)>6pgpN^4I#^2mCS5{TMVEz0U9qQ>F4slHWKc1#%w%yR zc8kuX^y;yUECK0otCg5sWN}LP$*5A5`9QAhuxXb>WxE-sHtws5Q8k`15R$s#kJzqw zhujLEfKbRO**1C*x0Kcxk+UtRlL?7G{aVA0CAl(+Z_(Re_}+K|xvJ89S%5H0mZV2S z(&2?xdnjB8kxtXL$N3)(JOHn%kbnHmrsGdug=39n$i&YO5Qrh9G)#0nl9dl^@PE}u zsp#d*5G-f|COIf6jM3HQS!zr8KR%|V6f+qcWaH=$2>psgvt8a` zlH%+u7eEt=c#EE&N;HDEaa+%AW0=SGe|+pzRBs)3Pa{tI&N)h*vh^6Cb=+egzVbQK z%_(M=rbl%E-6bv|c{d#^4)X8A_tDGwRcm9Od2NKUadOJi*RdG=8;=o{h?7sJ+Wf}7 z@H7Jx3~n8bhLr|wxB>}?fJG9)sbyquUuyF?iz;(440JtTuP|>%m^Jik1fLkKt!PLM1yjJTyfvVB! z+w&Nn2jfZV+#m~Ht%#auE{F5ECH-Z~nbIry1+l=n%bn(V^a^m44(P&E1#qz?Cq$6K zlDZ0}x4kg}ozj61?<3TIedQ-nINZ|Te8p7RyPJk>pPdWKy-_vr8vxdhFpHkwYd%Lv z!$`WSU~M5?zmi+02;M-8dljbfpq9Xie0w!&`5w+lvlnBb{ZE8IMI!lVet@P1ei@4; z&$O!TbZD450xCT##~8RRnP$YO?F-e52>xi*0AG$LpF%4cseHX5YVb~xd+?Z@-%0%} zAna?a`RO>Q4o8Pqoi<3~#m&@h}x*6R58oxD~@Na8>ychFyR9TPxh{#q#kg8oLclSWNU;+{MXyw;df{5 zGaZc4wJp_}_w_QXOB6NXTW&hPNF-b3nXMh8%o(1-u}WDtdYW$%oCmtSCsg*NtwWAp zjiv$!AyN!_FG#h&#Kr7gK8QKHq$#YOc!%$1h1-;WZC%GOs2)`ieM99&j?!%ymrFGY zo!`+oOAA3E4eYT3M&{AjZPo1_!lL^AVGP3Kt3AD}7mS z;dGxohb7bLW>tUwX86s3)D4yZ5E%ma~jFiB$HQshPFop*2f~zL-cset(7H*u|-TffQVqrh*I5x#hi? zJE6}e<@PRvoQ2tlcjJ5G7Bpuo+wE|F;>LSsZyZnJbiN3m-7wewI!YaN3U8hHJpgw>+ zA<`c!h8qtbZX|bPwf6N}s41BmarbXs<$DuHA;_UMba5kB)#X>^$6SZ8pH(O>?mzvd z+k1jCFRtr0V`8b+DdD}4I|ezl@rRFB_xo|g#dwuSwf=;Uujh{uqr3ZaxPKb2o15GF zt$1So43RB`^SheUZyCC@r~!ZrTomL__onT9Xk~`ezk4f3~Max@{>`e zGn=_hHHmjLb(z=+?Rof;eC+D)D=yd@L*k3Q2k}tevb)lp^`g4T_7i2ek&1#FR!oc& z@_GJc+y3VB>@ZYIGu9zR-$5p*Vy^s`$k+AT(!z?Ya<0_^{9H#P@?SQLJIWG)#8{LV zaCdqB3@q-U!BOnT{w2dMH(C)^~a`ctvtTcJJ|VVO`a(#zhEKQNAEt%^zk^?hlp zAi-mwUIBcd82E^jUcQF0ThzMWh#>Nh+n0U{MOW8xIU;5JnNFroCOMJt#XJ^}lF~c{)E8%v z?~7s7-!XPbk`jw=GgQ)UFYoEHn^p-K(wfe(;794tq}bluKI z+VK_27c5)k(Thn{s{LPr_dsM9a20bA#t9KFn_ z4JWHuYT2Q0$euBCcLUv>OB-M`zzw-geq@n+Vqu0!c69;PEN+av$RQ<`+S(mm`F_6nf7o4)njL8p&Nb{v95xBpR^o`w*emE=31CDB z%GufWL_aE!?Bftf+GJ)ldG<{riOg4!-rIn(80)WhGrTFHq~sew`B~}p0x_OzqOefV zrD;?!Drgv$H?%=)X?!U}IG56?&n11Y3R#;^zN4D>$;CU>P9 z94sC9%m+kWc&>6f+{z4H+4nsYKx&r+dJjCVyk>8mq`5^0oTBj@K|-{6VO8c8nCyl8 zVJ}JU0vf>Ks+JP0)`3*mE|CvRT32Byq_d!!Y^ooXd=$)BakzCw5Dfb8=c}H^qez^jLx=^jVGM=_&0I@4)K-0-0F6iVeb^6Ie_8Q-+f84P~_l#xEa7+?VT@h$?jF& zRclZ9(Kf$6HPa`z!pRMxUap{FBmK=H+^r{|QUvv!5WLqE9Yy#Jb}9&!XCmRA*_t+V z0p&+Q^dS)#mvS(a4Oz$}P*gF;Vahuo8SwmR`YHAXc6JRKvKX>ujzB~ayV0JoRN?Ol z2!2eji>VgOnZkMC@~OWZBNc{A#oM9cF;jBn3{Vtdt`Isp`=~j!Ns^-{84b#tBa|RT zoo7g^h*lvkmcYZ<*voUxZ8%KRoGj%1B?lS|DAAJg1M{={c1B4P0yQ*XVgp3Rh=+Gs zuJSm}`8?~J5q(U(IZzA_jZIAO5D!I z2gU8#L$2;Uq{x_O^I=KoL`B9mPHLArh((zNBE&%Itmp8%36Pja)1DOI=G^HVcD%dU zF#~AzOpIHleurHwRDK0 zjYD@__NZux$^=S)sec)iW{>7BCFDodFol!3TpUpj7OPUkfjaO&|E4mwo{@tMi>nn! zv6dU`-G@u*GJ5c@#sV`o`}3Z7<38TVThvP3AkD}NI%!4G55Z^>5fOUpo8Qv|iOFH` zmd|k1^I}Z7Pq;1=`tkQ=Cepk2G7JFh)|KLZbb@pueKub^pAVF*|1?m-5B)$bMz z*Vk-yZux{cb(K&v)WIXGGK&Wu7I7GZsYE?njUK5v0bB7!7{RYGe31pHU^kPS{ZHmo zOfJbl$zGo;ID!RP@pnX?NnyX9Y?C_m97eDY}CITYwU zi3jkg-WicP)J9o;${fD|hk)lN!y_LmR)$~4N`EJ8<*Cc3LASzbhsp4X*PHMqhluLY ziGl&@Fs{|&4A{K9vc27E6StkN7(39hn6Nnk0=G3zk`bP<-$ipsZ5x;&xWMdnU={#8 zb10jE2s$n})gy&;8<54*2G_F!^ao07VlPWEEI$gkB6HMEsmohERw4Mri=Y>(954DdJpl>;whBO z+QYPH!UcA_c&_)O&cNjMZ}BRiUHTGgQOl|6+(xcpy9d+QfOvI>`Ob)n{ zZ)K2fQP13tEPz@abOwtZMzLRyv0Q0WP4;ELRWkGMpKT(-+Ul#@v97CD#9hk6;;p&U z?&@GA_7>EJ?^#j&*gn-8!;01M^$8uyZ)vDWYssqH z{ku|oDRMnc-zk+|0vd*#^O*LuM-+0?yYGrI7hCA6G`{nkrJD@d&C!^lKP%>%MUkZl z=?r2t(ebzD*#?;yHQnbUu$Ba6*YAajOp>w(gnEyc5`lP%6AK-^7$#L>0#a*p&`i`M zIvJ&t@6Z3eUgBW*$0_jtCF}p6>_UgOvbI%eJ_P)5g*^bUx>dkCy#xJ@U!GAHHZI)$ zabDgssN!J-VrP5QAd_;FS7&X@r-a%vtJmc}_>b{ncv)NBy0ehYGs`2!WG)$X{)FVX zIyKhs?Ct8WFYPDy#^H+jw8yvITi$Pv@0;b~?4QMm$Lq`C{n_qhx39-+E$`3s`OCd= z)kt|$Vd(hvSoyIfzHY>OgwP&W@acutlU**UZWx}o3dcIU(eRTfy~f1{d71V^IoD9W z`a)zbyYOq3m5RQ44y%2CQ=|H67%Sw+)R&RtgLpH(Mg1vexVz#hrhJ(w+MDv;Az+sU z(tX%Q)<1l5zgp3f%N*ypN_#@oyjBIDm|sk_=~Wi&s?F% zRL#1XN{<7>T6Cj=jIoIdN`#yI6v&I-2wib9F#jj9jxHZIemvq9EDnhrlrnLU=0!SZ zi%47~p^hM`Ia`JHdG-33>&N3vmE7s@Ltv2-z)d^%HL;zdAuif-{Flf1dWHKq-d$GD zP=fy0d^yE0b5uo_=FIQJIUX&3xT`>V;qzgAe%x2L)7|~;;jisv1TOV-Jr6`usK}EnTRj+)Lsc>EWGSOqX$%zhBTIqnuG;Fh8WT zEd~D^IY_Idz(75phky?vq@6i|kuB)Uw=3DU^3a3r2UW6ho#|VDKMg%Bcul8yJF*lM;=8e=LJ;EKGbYMP1 zsYa;vQY}>9@PsC7(#SxQ0KHFv>YI90wxUX1q4f3az#v~!+mo<#7ZFUbKWO!DUwk#h zF7fa!YCUWv{xu^Aepj0U(@f52KzULGLwcXO_PVqz``8kO4qsCU*zq+wky8W<5X-6T zB*Bno0*B5uGX^ZTK{X`seJ7j}y1P|0Cut+%G$$y0N1zQlme$AQkj)vzEV^MBbZ`wi zbMK98qJa}=#I6_4iJH%r* zaG?YBrA3G%bObJTX7uZ+pi!>4qXimc7miKvvS0p>qP;0gN|i=bdghDu;*ujBqZKUp z>_oKg8TSae-GCn=fKr)Rh^(}!gzy9D1o_%6PhGeIf}Cs##q$D`4*Lu~^`F+;VfD_4 zK&BiG4!bcfyAEUaE+uy08u&GZokxmb3;tHtD9ZS*1Tj#z6+LfPY@@I>K{L>o1`qav zCAcq@PwEAQ>u_jsRf|BmG(-stzJen})XjCk9XI+GX!ctH)WkV>#e3uZRez%~w~mm- zk&5PdiM_MmjNHu!vksJJ(F7&9otOarsO(FUJf`(Y*Iko+l@{tH&+#WfUvY0smuP2o zD2Gx6C!7Yv;uawZ&aj@+)N59z^57CRhvX zz>?ZlW6)$=0P@THY&U8C2EPqKuDw0MGGTBwJ&(^CSl7RXwibtwLJLPiPgS$@Yjpuc#gYZv|L|Y)IZ|mcDpuQvbwiG1$X;g6Gn>I)je){41>Yj1 zq|wmOz|PoJ*Kl6=(JWx@sasl~i7B9IxJbW!Eg$IPvhW|lHxFUv$p|eU9$q?NE@f@@ zzUk$XgBzx=2usWfvW^J`0>3S~(obA9kjif^33x0)l-bxkjdEe+(!j;GQMlfN`}i1i z%%CRuk0iz1`KOa>?xOZ+3cM)$q|CM>y*~wXit+PfyMo+5f$Yd|^V$CxTInRxusS|r zuV>*b@v&^^p>^)cAX~td-S1Me1UzvE0v+`_#d2a{&@5e4qcv5g|CY0;-PPM?CM85Xbpk4a)!+^?tv8*mlt+&c>djszd%3t(2G$u+v$1tLKm`jZIG>+b7Gc!l z!rpz>alpJ@jY`D^hA|_z*bM)Zj#!&Ta7JJq*}&{!C{NQDJ|ZbLn-V8!yq9r^7GBQY z&Sdhk=WZx)n+)6PhcvbiJVVsjCxN>nsDZ}ApE0F~iC%R!MYKsVU;shU(Q2uaBfEpN zp5ls@29|UgYV1*$f}D>^vjvYSykgA@jGVNU$KmyQ$M}pUZR9C7<2jyxS~#Nz<;%q;y(fF-1!(59`p>pGH7Ir5ra_0-Y(baZ(wn03UZuJheTZ1tjX;(fP&HK827jnys>^heQJ?43nqd5=EcMsRG==OiTS3>F9ZXa9 z7G$xo&i1$4%NKH)or>>hnzWATH}D_H4blG~VE(&x`d635ME~DWfE*nEuYk$H@jnqT z8-E1M{U4ajbM?$U(7p+(xI73ZtXfj$CIGY%BkTdeh~PDLIwT`g>J}W@X!W$JFit^1 z(t14>^IDS|%6S)geev1y=H%|}>3&E^v#j#_zWs9}W8x~7O<9^599@rj`}8{q$#=g07F1`mZ&vUrR0Rc9tCJ{k<{_`1k?tG2ZMDi@w6oesvlZi1&mr=N;}=-PS?`Y?gf5;Mx9^oLP0 zudLdulKaV@nUUA$?Qr+B`-czB@Oq$&6>-+Jtd%AmTjvt#vHq#10GeXh86C7R5 z9UP)au1aK^?LWO0I=i5nWx!?zIhnO=UVBIZ`~p~l1w~E)5wDt_+oIr zXQvWzn@raUW!0bqdE9jBSSkcZZPFfH|51pTu_~7arWCD)-9ZTtNslsf1#&TZx7HCI z*AxnbD}#L!@F=$jfQnpifo9nOBm;ovo}FT*bpw1jn`fQqhN8yLHfm;HgM37UtG8-n z-EkK~_M9U0K!x2W-923y@C_D_k$X_f$BtP9I~w()(uT;a7`3>~N&R*BXDXfbBuPR4T zN5czra)XuqfWRm%W5wzWC-Tz;bTnkYhMqOzh0K&xWL=a;Uw#c@-DQu&DDDmx4K^&t zgt{Yfvo(-CEJjt-ibC|{h#W`;8en-GFpFLox27^}WDgEs;sQlOnGH>r1%vaV){Sln zqV6x|p{OU2%ndZ|)Z^77#HCMcc@9eZmtQ>BP|tK8I(e|>OLFb481+z4X22wn=#aKcHyA=z*rIuR%*8NR*<`t)&>4Cq zzy}UAdZf{%$&dA;hF#vV^9RX;xTaKI*=6BfP8`%Yfj(hdhengKAZVKWuG86`|7DX_{Oo2A93^{(Bl#8}TEy9V)mgJbB1=+t4B-)qeAYGm_&2 zbeu>Om7a9O!#z-nO415)L6e$@9dUaH$M~Ab1JL@2nX4Rq{0ELb&`%9qXZ2pzA3^;3 zv+wozY8l@DH``*u#F1m3@&;Mm!6$oGyb=qia;Cw115BK%yB~JOB7tcR%do1l5>9Xo z`X^s2rTY$c*$O{Vm978JDbK1;=%^%`qj~071(yBn1bB;9>{`Hha&S``=99pFO|h^| zTzn1r8!3#)@7WTI#WZG!XO1VDw3I!Au_LtAeq%08X=2Zf$hf8vxz=Y)=e?9EUc|cK z1#kiRD1S82moRwM{F*q3Hn59S<0&~B!6A;Q%e}sgz~-3^jIb<6nRtp1!(dS$vrI|r z$}D{~KUr8v;{6c)c2Wzt*8*`-CVq{oOlCi9bxDtDSM;vd)5~}qRS#uf^x5>Ad zaL1w7wmU4gMln-Mz+ld(%C(liv^$#OYUAeET?EB0W9)9ycCPr_{3uZhrXa)>(1eqM ziV`Q(m==)L30eGl=4gZJ%xPy0F2gF@s3q%?iNEQA8W+|57e=_x{QgcD+De&@zBGbV zfx90E@llQfp9y8ExK|?KgX^sO?JcUMuv-{zuocb(M5sOoyXA)%>IXWDFQyhaz-r7I z1?+nuVYLf{)`+f`yby|ete{zPA+{b=8@*D$BBDhDYR;FV0 z&V%u)e#L&h04Vn3>1uA@{aJ5r%*5!k+h`22da*q}B@sPvr7gG=1>k=K&edEN6YPyo z1WJhvDjR-Y47t_`-)yr4zo6Iu<#7QwmtGUalWSxe??*@ywQ!fovezZv*0Cj48N*?n z<)mha0Eo5lDgvF8uT<@~e`DRCGayrvH~eOk!eTmUU)>ZB`)zGqPd`w;3JVVdS0A%I zWYd1NiQG>1(Wf^^#5Ap9a2ys@V?63ch8B&|znU?+WPaYTZQR*p+u75Q1h2}pY%>5G zvC;9xGcjm`VwSYQMB5Wi=q#5;)Uh_J;fWAq42{=x^QT}m@DF22aS**Y{*+&kyywJc z<{wg6lbv0D8%HoYHyZczxI6}dtliXcevejm6d`S_tP7C~KiW@`bUh)w7W|Z;Ptw0? z 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%0D_$i~X_&lCToA?TS{{)HU?)4%Dv{C`;z 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

(%&mYWzAC$4SFP#Q7WZ1jDt&6GxYv3Uy*iq` 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 ht6%NjKfZqV_@D3Y|GvZcfN