From 2d0249cf30e861d19797cf0abb7afbec8b0f1b1e Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Fri, 6 Jan 2023 20:24:09 +0300 Subject: [PATCH 01/78] feature_coin_list module initial commit --- feature_coin_list/.gitignore | 1 + feature_coin_list/build.gradle | 41 +++++++++++++++++++ feature_coin_list/consumer-rules.pro | 0 feature_coin_list/proguard-rules.pro | 21 ++++++++++ .../ExampleInstrumentedTest.kt | 24 +++++++++++ .../src/main/AndroidManifest.xml | 4 ++ .../feature_coin_list/ExampleUnitTest.kt | 17 ++++++++ settings.gradle | 1 + 8 files changed, 109 insertions(+) create mode 100644 feature_coin_list/.gitignore create mode 100644 feature_coin_list/build.gradle create mode 100644 feature_coin_list/consumer-rules.pro create mode 100644 feature_coin_list/proguard-rules.pro create mode 100644 feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/ExampleInstrumentedTest.kt create mode 100644 feature_coin_list/src/main/AndroidManifest.xml create mode 100644 feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/ExampleUnitTest.kt diff --git a/feature_coin_list/.gitignore b/feature_coin_list/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/feature_coin_list/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/feature_coin_list/build.gradle b/feature_coin_list/build.gradle new file mode 100644 index 0000000..3d3f823 --- /dev/null +++ b/feature_coin_list/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.ryankoech.krypto.feature_coin_list' + compileSdk 33 + + defaultConfig { + minSdk 21 + targetSdk 33 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'com.google.android.material:material:1.7.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.4' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' +} \ No newline at end of file diff --git a/feature_coin_list/consumer-rules.pro b/feature_coin_list/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/feature_coin_list/proguard-rules.pro b/feature_coin_list/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/feature_coin_list/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/ExampleInstrumentedTest.kt b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..ddec370 --- /dev/null +++ b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.ryankoech.krypto.feature_coin_list + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.ryankoech.krypto.feature_coin_list.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/feature_coin_list/src/main/AndroidManifest.xml b/feature_coin_list/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a5918e6 --- /dev/null +++ b/feature_coin_list/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/ExampleUnitTest.kt b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/ExampleUnitTest.kt new file mode 100644 index 0000000..05ad837 --- /dev/null +++ b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.ryankoech.krypto.feature_coin_list + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 1185bd2..b5de30d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,3 +16,4 @@ rootProject.name = "Krypto" include ':app' include ':feature_home' include ':common' +include ':feature_coin_list' From 597dfe1f7ec5a6702fec97710711506875309f77 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 13:44:39 +0300 Subject: [PATCH 02/78] set up dependencies --- build.gradle | 2 ++ feature_coin_list/build.gradle | 41 +++++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 281fe88..93b22ca 100644 --- a/build.gradle +++ b/build.gradle @@ -21,6 +21,8 @@ buildscript { mockk_version = '1.13.3' coroutines_test_version = '1.6.4' turbine_version = '0.12.1' + okhttp_logging_interceptor_version = '5.0.0-alpha.9' + retrofit_version = '2.9.0' } dependencies { classpath "com.google.dagger:hilt-android-gradle-plugin:2.42" diff --git a/feature_coin_list/build.gradle b/feature_coin_list/build.gradle index 3d3f823..17f1b8d 100644 --- a/feature_coin_list/build.gradle +++ b/feature_coin_list/build.gradle @@ -1,6 +1,8 @@ plugins { id 'com.android.library' id 'org.jetbrains.kotlin.android' + id 'dagger.hilt.android.plugin' + id 'kotlin-kapt' } android { @@ -32,10 +34,37 @@ android { dependencies { - implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.appcompat:appcompat:1.5.1' - implementation 'com.google.android.material:material:1.7.0' - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.4' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' + // core android + implementation "androidx.core:core-ktx:$ktx_core_version" + implementation "androidx.appcompat:appcompat:$app_compat_version" + implementation "com.google.android.material:material:$material_version" + + // local modules + implementation project(path: ':app') + implementation project(":common") + + // dagger-hilt - for dependency injection + implementation "com.google.dagger:hilt-android:$hilt_android_version" + implementation "androidx.hilt:hilt-navigation-compose:$hilt_navigation_compose_version" + kapt "com.google.dagger:hilt-android-compiler:$hilt_android_compile_version" + kapt "androidx.hilt:hilt-compiler:$hilt_compile_version" + + // retrofit - for network call + implementation "com.squareup.retrofit2:retrofit:$retrofit_version" + implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" + + // okhttp logging interceptor + implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_logging_interceptor_version" + + // timber + implementation "com.jakewharton.timber:timber:$timber_version" + + // junit4 + testImplementation "junit:junit:$junit_version" + + // junit4 + androidTestImplementation "androidx.test.ext:junit:$junit_ext_version" + + // espresso + androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version" } \ No newline at end of file From 5996104a8dda45ede5cecdc3ecea9347ec73d9a3 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 13:46:47 +0300 Subject: [PATCH 03/78] implement api service --- .../data/data_source/remote/CoinServiceApi.kt | 19 ++++++++ .../feature_coin_list/data/dto/CoinDto.kt | 48 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/remote/CoinServiceApi.kt create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/remote/CoinServiceApi.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/remote/CoinServiceApi.kt new file mode 100644 index 0000000..d3ca7f3 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/remote/CoinServiceApi.kt @@ -0,0 +1,19 @@ +package com.ryankoech.krypto.feature_coin_list.data.data_source.remote + +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Query + +interface CoinServiceApi { + + @GET("coins/markets") + suspend fun getCoins( + @Query("vs_currency") currency : String = "usd", + @Query("order") order : String = "market_cap_desc", + @Query("per_page") perPage : Int = 500, + @Query("page") page : Int = 1, + @Query("sparkline") sparkline : Boolean = false + ) : Response> + +} \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt new file mode 100644 index 0000000..e502032 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt @@ -0,0 +1,48 @@ +package com.ryankoech.krypto.feature_coin_list.data.dto + +import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin + +data class CoinDto( + val ath: Double, + val ath_change_percentage: Double, + val ath_date: String, + val atl: Double, + val atl_change_percentage: Double, + val atl_date: String, + val circulating_supply: Double, + val current_price: Double, + val fully_diluted_valuation: Long, + val high_24h: Double, + val id: String, + val image: String, + val last_updated: String, + val low_24h: Double, + val market_cap: Long, + val market_cap_change_24h: Double, + val market_cap_change_percentage_24h: Double, + val market_cap_rank: Int, + val max_supply: Double, + val name: String, + val price_change_24h: Double, + val price_change_percentage_24h: Double, + val roi: Any, + val symbol: String, + val total_supply: Double, + val total_volume: Long +) + +fun List.toCoinEntity() : List = + map { + Coin( + id = it.id, + symbol = it.symbol, + price = it.current_price, + marketCapRank = it.market_cap_rank, + image = it.image, + change = it.price_change_24h.toFloat(), + marketCap = it.market_cap, + allTimeHigh = it.ath, + high24Hr = it.high_24h, + totalVolume = it.total_volume + ) + } \ No newline at end of file From 3b060ecdf8872efaf9238f5215d59e1f22686886 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 13:47:36 +0300 Subject: [PATCH 04/78] implement api service di module --- .../core/di/ApiServiceModule.kt | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/ApiServiceModule.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/ApiServiceModule.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/ApiServiceModule.kt new file mode 100644 index 0000000..79f405c --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/ApiServiceModule.kt @@ -0,0 +1,53 @@ +package com.ryankoech.krypto.feature_coin_list.core.di + +import com.ryankoech.krypto.BuildConfig +import com.ryankoech.krypto.feature_coin_list.data.data_source.remote.CoinServiceApi +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.create +import java.util.concurrent.TimeUnit +import javax.inject.Singleton + +private const val BASE_URL = "https://api.coingecko.com/api/v3/" + +@Module +@InstallIn(SingletonComponent::class) +object ApiServiceModule { + + @Singleton + @Provides + fun provideLoggingInterceptor() : OkHttpClient { + + val loggingInterceptor = HttpLoggingInterceptor() + loggingInterceptor.level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY + else HttpLoggingInterceptor.Level.NONE + + return OkHttpClient.Builder() + .readTimeout(120, TimeUnit.SECONDS) + .connectTimeout(120, TimeUnit.SECONDS) + .addInterceptor(loggingInterceptor) + .build() + } + + @Singleton + @Provides + fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit { + return Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .client(okHttpClient) + .build() + } + + @Singleton + @Provides + fun provideCoinServiceApi(retrofit: Retrofit) : CoinServiceApi = + retrofit.create(CoinServiceApi::class.java) + +} \ No newline at end of file From 34b34a6f23e4f7461516d9f8f69b15a9ec521fcd Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 13:48:56 +0300 Subject: [PATCH 05/78] implement repository --- .../data/repository/CoinRepositoryImpl.kt | 15 +++++++++++++++ .../domain/repository/CoinRepository.kt | 10 ++++++++++ 2 files changed, 25 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt new file mode 100644 index 0000000..1c89cdb --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt @@ -0,0 +1,15 @@ +package com.ryankoech.krypto.feature_coin_list.data.repository + +import com.ryankoech.krypto.feature_coin_list.data.data_source.remote.CoinServiceApi +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto +import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository +import retrofit2.Response +import javax.inject.Inject + +class CoinRepositoryImpl @Inject constructor( + private val api : CoinServiceApi +) : CoinRepository { + + override suspend fun getCoins(): Response> = api.getCoins() + +} \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt new file mode 100644 index 0000000..19236f1 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt @@ -0,0 +1,10 @@ +package com.ryankoech.krypto.feature_coin_list.domain.repository + +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto +import retrofit2.Response + +interface CoinRepository { + + suspend fun getCoins() : Response> + +} \ No newline at end of file From 8c2c2b94e5d3e5874692241d6492096a60019a04 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 13:49:26 +0300 Subject: [PATCH 06/78] defined entity --- .../krypto/feature_coin_list/domain/entity/Coin.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt new file mode 100644 index 0000000..53216f8 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt @@ -0,0 +1,14 @@ +package com.ryankoech.krypto.feature_coin_list.domain.entity + +data class Coin( + val id : String, + val symbol : String, + val marketCapRank : Int, + val image : String, + val change : Float, + val price : Double, + val marketCap : Long, + val allTimeHigh : Double, + val high24Hr : Double, + val totalVolume : Long, +) From 54d9c5ba094d2b62767091de5ebfd795b73fa28e Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 13:50:03 +0300 Subject: [PATCH 07/78] implement getCoins usecase --- .../domain/usecase/GetCoinsUseCase.kt | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt new file mode 100644 index 0000000..02cb22b --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -0,0 +1,32 @@ +package com.ryankoech.krypto.feature_coin_list.domain.usecase + +import com.ryankoech.krypto.common.core.util.Resource +import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity +import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin +import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onStart +import timber.log.Timber +import javax.inject.Inject + +class GetCoinsUseCase @Inject constructor( + private val repository: CoinRepository +) { + + operator fun invoke() = flow { + val response = repository.getCoins() + + if(response.isSuccessful && !response.body().isNullOrEmpty()){ + emit(Resource.Success(data = response.body()!!.toCoinEntity())) + }else{ + emit(Resource.Error("Response not Successful.")) + } + }.onStart { + emit(Resource.Loading()) + }.catch { e -> + Timber.e(e) + emit(Resource.Error(e.localizedMessage ?: "Unexpected Error Occurred.")) + } +} \ No newline at end of file From fb9d0c6438ac01f00a4f1beff62092c4f5aff4e5 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 15:08:40 +0300 Subject: [PATCH 08/78] fix data types --- .../ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt | 4 ++-- .../com/ryankoech/krypto/feature_coin_list/data/dto/Roi.kt | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/Roi.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt index e502032..e861048 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt @@ -21,11 +21,11 @@ data class CoinDto( val market_cap_change_24h: Double, val market_cap_change_percentage_24h: Double, val market_cap_rank: Int, - val max_supply: Double, + val max_supply: Double?, val name: String, val price_change_24h: Double, val price_change_percentage_24h: Double, - val roi: Any, + val roi: Roi?, val symbol: String, val total_supply: Double, val total_volume: Long diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/Roi.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/Roi.kt new file mode 100644 index 0000000..a163758 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/Roi.kt @@ -0,0 +1,7 @@ +package com.ryankoech.krypto.feature_coin_list.data.dto + +data class Roi( + val currency: String, + val percentage: Double, + val times: Double +) \ No newline at end of file From c3f148154be670db2f65ddf3a367b414cdb16188 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 15:09:23 +0300 Subject: [PATCH 09/78] implement repository fake --- .../data/repository/FakeCoinRepositoryImpl.kt | 215 ++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt new file mode 100644 index 0000000..8a01ca8 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt @@ -0,0 +1,215 @@ +package com.ryankoech.krypto.feature_coin_list.data.repository + +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto +import com.ryankoech.krypto.feature_coin_list.data.dto.Roi +import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository +import retrofit2.Response + +val FAKE_COIN_LIST = listOf( + CoinDto( + id = "bitcoin", + symbol = "btc", + name = "Bitcoin", + image = "https://assets.coingecko.com/coins/images/1/large/bitcoin.png?1547033579", + current_price = 16923.04, + market_cap = 325934668465, + market_cap_rank = 1, + fully_diluted_valuation = 355472891513, + total_volume = 17324993150, + high_24h = 17021.29, + low_24h = 16710.14, + price_change_24h = 154.92, + price_change_percentage_24h = 0.92388, + market_cap_change_24h = 2557781776.0, + market_cap_change_percentage_24h = 0.79096, + circulating_supply = 19254993.0, + total_supply = 21000000.0, + max_supply = 21000000.0, + ath = 69045.0, + ath_change_percentage = -75.48315, + ath_date = "2021-11-10T14:24:11.849Z", + atl = 67.81, + atl_change_percentage = 24863.64704, + atl_date = "2013-07-06T00:00:00.000Z", + roi = null, + last_updated = "2023-01-07T10:58:06.894Z", + ), + CoinDto( + id = "ethereum", + symbol = "eth", + name = "Ethereum", + image = "https://assets.coingecko.com/coins/images/279/large/ethereum.png?1595348880", + current_price = 1264.4, + market_cap = 152465403313, + market_cap_rank = 2, + fully_diluted_valuation = 152465403313, + total_volume = 4738147647, + high_24h = 1275.78, + low_24h = 1242.1, + price_change_24h = 18.52, + price_change_percentage_24h = 1.48649, + market_cap_change_24h = 2033182578.0, + market_cap_change_percentage_24h = 1.35156, + circulating_supply = 120524497.701488, + total_supply = 120524497.701488, + max_supply = null, + ath = 4878.26, + ath_change_percentage = -74.06476, + ath_date = "2021-11-10T14:24:19.604Z", + atl = 0.432979, + atl_change_percentage = 292105.57124, + atl_date = "2015-10-20T00:00:00.000Z", + roi = Roi( + times = 98.89428081326518, + currency = "btc", + percentage = 9889.428081326518, + ), + last_updated = "2023-01-07T10:58:08.421Z", + ), + CoinDto( + id = "tether", + symbol = "usdt", + name = "Tether", + image = "https://assets.coingecko.com/coins/images/325/large/Tether.png?1668148663", + current_price = 1.0, + market_cap = 66308002007, + market_cap_rank = 3, + fully_diluted_valuation = 66308002007, + total_volume = 22830407217, + high_24h = 1.002, + low_24h = 0.997607, + price_change_24h = -0.000014506074960785, + price_change_percentage_24h = -0.00145, + market_cap_change_24h = 26631461.0, + market_cap_change_percentage_24h = 0.04018, + circulating_supply = 66272490385.2966, + total_supply = 66272490385.2966, + max_supply = null, + ath = 1.32, + ath_change_percentage = -24.38936, + ath_date = "2018-07-24T00:00:00.000Z", + atl = 0.572521, + atl_change_percentage = 74.73609, + atl_date = "2015-03-02T00:00:00.000Z", + roi = null, + last_updated = "2023-01-07T10:55:07.354Z", + ), + CoinDto( + id = "usd-coin", + symbol = "usdc", + name = "USD Coin", + image = "https://assets.coingecko.com/coins/images/6319/large/USD_Coin_icon.png?1547042389", + current_price = 1.0, + market_cap = 43793762275, + market_cap_rank = 4, + fully_diluted_valuation = 43790483878, + total_volume = 2138738912, + high_24h = 1.002, + low_24h = 0.997155, + price_change_24h = 0.00025959, + price_change_percentage_24h = 0.02596, + market_cap_change_24h = -67821872.7326355, + market_cap_change_percentage_24h = -0.15463, + circulating_supply = 43775348278.3757, + total_supply = 43772071259.4457, + max_supply = null, + ath = 1.17, + ath_change_percentage = -14.7167, + ath_date = "2019-05-08T00:40:28.300Z", + atl = 0.891848, + atl_change_percentage = 12.14047, + atl_date = "2021-05-19T13:14:05.611Z", + roi = null, + last_updated = "2023-01-07T10:58:02.371Z", + ), + CoinDto( + id = "binancecoin", + symbol = "bnb", + name = "BNB", + image = "https://assets.coingecko.com/coins/images/825/large/bnb-icon2_2x.png?1644979850", + current_price = 261.01, + market_cap = 42629851070, + market_cap_rank = 5, + fully_diluted_valuation = 52217835573, + total_volume = 429267785, + high_24h = 262.55, + low_24h = 255.42, + price_change_24h = 4.84, + price_change_percentage_24h = 1.88825, + market_cap_change_24h = 737476415.0, + market_cap_change_percentage_24h = 1.76041, + circulating_supply = 163276974.63, + total_supply = 163276974.63, + max_supply = 200000000.0, + ath = 686.31, + ath_change_percentage = -61.94239, + ath_date = "2021-05-10T07:24:17.097Z", + atl = 0.0398177, + atl_change_percentage = 655869.36318, + atl_date = "2017-10-19T00:00:00.000Z", + roi = null, + last_updated = "2023-01-07T10:58:10.067Z", + ), + CoinDto( + id = "ripple", + symbol = "xrp", + name = "XRP", + image = "https://assets.coingecko.com/coins/images/44/large/xrp-symbol-white-128.png?1605778731", + current_price = 0.343551, + market_cap = 17368882302, + market_cap_rank = 6, + fully_diluted_valuation = 34350451021, + total_volume = 575571042, + high_24h = 0.346053, + low_24h = 0.334424, + price_change_24h = 0.00761656, + price_change_percentage_24h = 2.26727, + market_cap_change_24h = 346730797.0, + market_cap_change_percentage_24h = 2.03694, + circulating_supply = 50563767827.0, + total_supply = 99989171756.0, + max_supply = 100000000000.0, + ath = 3.4, + ath_change_percentage = -89.89294, + ath_date = "2018-01-07T00:00:00.000Z", + atl = 0.00268621, + atl_change_percentage = 12686.92874, + atl_date = "2014-05-22T00:00:00.000Z", + roi = null, + last_updated = "2023-01-07T10:58:10.468Z", + ), + CoinDto( + id = "binance-usd", + symbol = "busd", + name = "Binance USD", + image = "https://assets.coingecko.com/coins/images/9576/large/BUSD.png?1568947766", + current_price = 1.001, + market_cap = 16437019062, + market_cap_rank = 7, + fully_diluted_valuation = 16437019062, + total_volume = 5323587945, + high_24h = 1.004, + low_24h = 0.999316, + price_change_24h = 0.00102026, + price_change_percentage_24h = 0.10205, + market_cap_change_24h = -255937616.80016136, + market_cap_change_percentage_24h = -1.53321, + circulating_supply = 16424967238.39, + total_supply = 16424967238.39, + max_supply = null, + ath = 1.15, + ath_change_percentage = -13.3031, + ath_date = "2020-03-13T02:35:42.953Z", + atl = 0.901127, + atl_change_percentage = 11.04527, + atl_date = "2021-05-19T13:04:37.445Z", + roi = null, + last_updated = "2023-01-07T10:57:59.111Z", + ) +) + +class FakeCoinRepositoryImpl : CoinRepository { + override suspend fun getCoins(): Response> { + return Response.success(FAKE_COIN_LIST) + } +} \ No newline at end of file From 33d42997cc2baec9a763d91ee9854ab1bffac48b Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 15:09:55 +0300 Subject: [PATCH 10/78] add test dependencies --- feature_coin_list/build.gradle | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/feature_coin_list/build.gradle b/feature_coin_list/build.gradle index 17f1b8d..94b22eb 100644 --- a/feature_coin_list/build.gradle +++ b/feature_coin_list/build.gradle @@ -62,6 +62,19 @@ dependencies { // junit4 testImplementation "junit:junit:$junit_version" + // google truth + testImplementation "com.google.truth:truth:$google_truth_version" + + // mockk + testImplementation "io.mockk:mockk-android:$mockk_version" + testImplementation "io.mockk:mockk-agent:$mockk_version" + + // coroutines test + testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_test_version" + + // turbine + testImplementation "app.cash.turbine:turbine:$turbine_version" + // junit4 androidTestImplementation "androidx.test.ext:junit:$junit_ext_version" From 3df3e9b4b0a315b0eeeaef8de4d0c3527d5d13f2 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 15:10:21 +0300 Subject: [PATCH 11/78] implement tests --- .../domain/usecase/GetCoinsUseCaseTest.kt | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt diff --git a/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt new file mode 100644 index 0000000..8cfcb38 --- /dev/null +++ b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt @@ -0,0 +1,107 @@ +package com.ryankoech.krypto.feature_coin_list.domain.usecase + +import app.cash.turbine.test +import com.google.common.truth.Truth.assertThat +import com.ryankoech.krypto.common.core.util.Resource +import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity +import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST +import com.ryankoech.krypto.feature_coin_list.data.repository.FakeCoinRepositoryImpl +import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository +import io.mockk.coEvery +import io.mockk.mockk +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest + +import org.junit.After +import org.junit.Before +import org.junit.Test +import retrofit2.Response + +@ExperimentalCoroutinesApi +class GetCoinsUseCaseTest { + + @Before + fun setUp() { + } + + @After + fun tearDown() { + } + + @Test + fun `response successful, return Resource type Success with data`() = runTest { + val getCoinsUseCase = GetCoinsUseCase(FakeCoinRepositoryImpl()) + + getCoinsUseCase().test { + + awaitItem() + val resource = awaitItem() + assertThat(resource).isInstanceOf(Resource.Success::class.java) + assertThat(resource.data).isEqualTo(FAKE_COIN_LIST.toCoinEntity()) + awaitComplete() + + } + } + + @Test + fun `call flow onStart, return Resource type Loading`() = runTest{ + val getCoinsUseCase = GetCoinsUseCase(FakeCoinRepositoryImpl()) + + getCoinsUseCase().test { + + assertThat(awaitItem()).isInstanceOf(Resource.Loading::class.java) + awaitItem() + awaitComplete() + + } + } + + @Test + fun `repository return null data, return Resource type Error`() = runTest { + val repository = mockk() + coEvery { repository.getCoins() } returns Response.success(null) + val getCoinsUseCase = GetCoinsUseCase(repository) + + getCoinsUseCase().test { + + awaitItem() + assertThat(awaitItem()).isInstanceOf(Resource.Error::class.java) + awaitComplete() + + } + } + + @Test + fun `repository return empty list, return Resource type Error`() = runTest { + val repository = mockk() + coEvery { repository.getCoins() } returns Response.success(listOf()) + val getCoinsUseCase = GetCoinsUseCase(repository) + + getCoinsUseCase().test { + + awaitItem() + assertThat(awaitItem()).isInstanceOf(Resource.Error::class.java) + awaitComplete() + + } + } + + @Test + fun `repository throws exception, return Resource type Error`() = runTest { + val exceptionMessage = "Mock Exception Message" + val repository = mockk() + coEvery { repository.getCoins() } throws Exception(exceptionMessage) + val getCoinsUseCase = GetCoinsUseCase(repository) + + getCoinsUseCase().test { + + awaitItem() + val resource = awaitItem() + assertThat(resource).isInstanceOf(Resource.Error::class.java) + assertThat(resource.message).isEqualTo(exceptionMessage) + awaitComplete() + + } + } + +} \ No newline at end of file From 9b099e9128c4780bd1ce77fce92abcbacaab6d3a Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 18:50:28 +0300 Subject: [PATCH 12/78] correct build import --- .../krypto/feature_coin_list/core/di/ApiServiceModule.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/ApiServiceModule.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/ApiServiceModule.kt index 79f405c..4a99e6b 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/ApiServiceModule.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/ApiServiceModule.kt @@ -1,6 +1,6 @@ package com.ryankoech.krypto.feature_coin_list.core.di -import com.ryankoech.krypto.BuildConfig +import com.ryankoech.krypto.feature_coin_list.BuildConfig import com.ryankoech.krypto.feature_coin_list.data.data_source.remote.CoinServiceApi import dagger.Module import dagger.Provides @@ -10,7 +10,6 @@ import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory -import retrofit2.create import java.util.concurrent.TimeUnit import javax.inject.Singleton From bb5330e18b6e8e086d20185171d4ddb93a34eb73 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 18:51:26 +0300 Subject: [PATCH 13/78] fix circular dependency --- feature_coin_list/build.gradle | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/feature_coin_list/build.gradle b/feature_coin_list/build.gradle index 94b22eb..6b31427 100644 --- a/feature_coin_list/build.gradle +++ b/feature_coin_list/build.gradle @@ -30,6 +30,12 @@ android { kotlinOptions { jvmTarget = '1.8' } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion compose_version + } } dependencies { @@ -40,7 +46,6 @@ dependencies { implementation "com.google.android.material:material:$material_version" // local modules - implementation project(path: ':app') implementation project(":common") // dagger-hilt - for dependency injection @@ -59,6 +64,12 @@ dependencies { // timber implementation "com.jakewharton.timber:timber:$timber_version" + //Compose + implementation "androidx.compose.ui:ui:$compose_version" + implementation "androidx.compose.material:material:$compose_version" + implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" + implementation "androidx.activity:activity-compose:$compose_activity_version" + // junit4 testImplementation "junit:junit:$junit_version" @@ -80,4 +91,9 @@ dependencies { // espresso androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version" + + // compose ui + androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" + debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" + debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version" } \ No newline at end of file From a6cd0f8e9bff0155d381f65b208bbed8a38b22ad Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 18:52:26 +0300 Subject: [PATCH 14/78] implement searchbar component --- .../presentation/components/SearchBar.kt | 77 +++++++++++++++++++ common/src/main/res/drawable/icon_search.xml | 9 +++ 2 files changed, 86 insertions(+) create mode 100644 common/src/main/java/com/ryankoech/krypto/common/presentation/components/SearchBar.kt create mode 100644 common/src/main/res/drawable/icon_search.xml diff --git a/common/src/main/java/com/ryankoech/krypto/common/presentation/components/SearchBar.kt b/common/src/main/java/com/ryankoech/krypto/common/presentation/components/SearchBar.kt new file mode 100644 index 0000000..4bd3177 --- /dev/null +++ b/common/src/main/java/com/ryankoech/krypto/common/presentation/components/SearchBar.kt @@ -0,0 +1,77 @@ +package com.ryankoech.krypto.common.presentation.components + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.* +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.constraintlayout.widget.Placeholder +import com.ryankoech.krypto.common.R +import com.ryankoech.krypto.common.presentation.theme.Green200 +import com.ryankoech.krypto.common.presentation.theme.Green500 +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme + +@Composable +fun SearchBar( + value : String, + onValueChange : (String) -> Unit, + placeholder: String, + modifier: Modifier = Modifier +) { + + TextField( + modifier = modifier + .fillMaxWidth() + .padding(bottom = 8.dp) + .border(width = 1.dp, shape = MaterialTheme.shapes.small, color = Color.Black), + shape = MaterialTheme.shapes.small, + leadingIcon = { + Icon( + painter = painterResource(id = R.drawable.icon_search), + contentDescription = "Search icon" + ) + }, + placeholder = { + Text( + text = placeholder, + style = MaterialTheme.typography.caption, + color = Color.Black + ) + }, + textStyle = MaterialTheme.typography.caption, + value = value, + onValueChange = onValueChange, + singleLine = true, + colors = TextFieldDefaults.textFieldColors( + focusedIndicatorColor = Color.Unspecified, + unfocusedIndicatorColor = Color.Unspecified, + cursorColor = Green200, + backgroundColor = Color.White + ), + ) + + +} + +@Preview +@Composable +fun SearchBarPreview() { + KryptoTheme { + Surface( + modifier = Modifier.fillMaxWidth() + ) { + + + SearchBar( + value = "", + onValueChange = {}, + placeholder = "Discover asset, coin or token" + ) + } + } +} \ No newline at end of file diff --git a/common/src/main/res/drawable/icon_search.xml b/common/src/main/res/drawable/icon_search.xml new file mode 100644 index 0000000..ec342c0 --- /dev/null +++ b/common/src/main/res/drawable/icon_search.xml @@ -0,0 +1,9 @@ + + + + From 853583defc67e31db50eeb35cddbea8ddafd29ba Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 18:53:58 +0300 Subject: [PATCH 15/78] add basic screens --- .../presentation/CoinListScreen.kt | 29 ++++++++++++++++ .../presentation/CoinListScreenSuccess.kt | 34 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt new file mode 100644 index 0000000..1597860 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -0,0 +1,29 @@ +package com.ryankoech.krypto.feature_coin_list.presentation + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.Surface +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import com.ryankoech.krypto.common.presentation.components.SearchBar +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme + +@Composable +fun CoinListScreen() { + + Surface( + modifier = Modifier.fillMaxSize() + ) { + CoinListScreenSuccess() + } +} + +@Preview +@Composable +fun CoinListScreenPreview() { + + KryptoTheme { + CoinListScreen() + } +} \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt new file mode 100644 index 0000000..7e91dda --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -0,0 +1,34 @@ +package com.ryankoech.krypto.feature_coin_list.presentation + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.ryankoech.krypto.common.presentation.components.SearchBar + +@Composable +fun CoinListScreenSuccess( + modifier: Modifier = Modifier +) { + + Column( + modifier = modifier + .fillMaxSize() + .padding( + top = 12.dp, start = 12.dp, end = 12.dp + ) + ) { + var value by remember { + mutableStateOf("") + } + + SearchBar( + value = value, + onValueChange = { value = it }, + placeholder = "Discover asset, coin or token" + ) + } + +} \ No newline at end of file From 7076ea96fe27d1c3f2057e3c6faf07bd36f132f5 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sat, 7 Jan 2023 18:55:34 +0300 Subject: [PATCH 16/78] remove unused imports --- .../krypto/common/presentation/components/SearchBar.kt | 2 -- .../krypto/feature_coin_list/presentation/CoinListScreen.kt | 2 -- 2 files changed, 4 deletions(-) diff --git a/common/src/main/java/com/ryankoech/krypto/common/presentation/components/SearchBar.kt b/common/src/main/java/com/ryankoech/krypto/common/presentation/components/SearchBar.kt index 4bd3177..bba6338 100644 --- a/common/src/main/java/com/ryankoech/krypto/common/presentation/components/SearchBar.kt +++ b/common/src/main/java/com/ryankoech/krypto/common/presentation/components/SearchBar.kt @@ -10,10 +10,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.constraintlayout.widget.Placeholder import com.ryankoech.krypto.common.R import com.ryankoech.krypto.common.presentation.theme.Green200 -import com.ryankoech.krypto.common.presentation.theme.Green500 import com.ryankoech.krypto.common.presentation.theme.KryptoTheme @Composable diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index 1597860..9c64da3 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -1,12 +1,10 @@ package com.ryankoech.krypto.feature_coin_list.presentation -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.Surface import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview -import com.ryankoech.krypto.common.presentation.components.SearchBar import com.ryankoech.krypto.common.presentation.theme.KryptoTheme @Composable From e1e54c39b30f1806e78ff0c5b366e4ef15efa6a3 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 12:56:51 +0300 Subject: [PATCH 17/78] update coin entity structure --- .../com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt | 1 + .../com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt index e861048..dff85af 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt @@ -35,6 +35,7 @@ fun List.toCoinEntity() : List = map { Coin( id = it.id, + name = it.name, symbol = it.symbol, price = it.current_price, marketCapRank = it.market_cap_rank, diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt index 53216f8..69d8f91 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt @@ -2,6 +2,7 @@ package com.ryankoech.krypto.feature_coin_list.domain.entity data class Coin( val id : String, + val name : String, val symbol : String, val marketCapRank : Int, val image : String, From e447aa7c3110128b631c80069901c76d16a123b7 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 12:59:44 +0300 Subject: [PATCH 18/78] implemented market cap string util --- .../krypto/common/presentation/util/Utils.kt | 43 +++++++++++++++++++ common/src/main/res/values/strings.xml | 1 + 2 files changed, 44 insertions(+) diff --git a/common/src/main/java/com/ryankoech/krypto/common/presentation/util/Utils.kt b/common/src/main/java/com/ryankoech/krypto/common/presentation/util/Utils.kt index 0849e66..cc8e1c8 100644 --- a/common/src/main/java/com/ryankoech/krypto/common/presentation/util/Utils.kt +++ b/common/src/main/java/com/ryankoech/krypto/common/presentation/util/Utils.kt @@ -32,4 +32,47 @@ fun getChangeColor(change : Float) : Color { fun getInTwoDecimalPlaces(value : Double) : String{ val df = DecimalFormat("#.##") return df.format(value) +} +fun getFormattedMarketCap(context: Context, value : Long) : String { + val million = 1_000_000 + val billion = 1_000_000_000 + val trillion = 1_000_000_000_000 + val quadrillion = 1_000_000_000_000_000 + val quintillion = 1_000_000_000_000_000_000 + + return if(value < million) { + val df = DecimalFormat("#,###.##") + context.getString(R.string.coin_market_cap, df.format(value), "") + }else if(value < billion){ + context.getString( + R.string.coin_market_cap, + getInFourDecimalPlaces(value.toDouble() / million.toDouble()), + "M" + ) + }else if(value < trillion){ + context.getString( + R.string.coin_market_cap, + getInFourDecimalPlaces(value.toDouble() / billion.toDouble()), + "Bn" + ) + }else if(value < quadrillion){ + context.getString( + R.string.coin_market_cap, + getInFourDecimalPlaces(value.toDouble() / trillion.toDouble()), + "Tr" + ) + }else if(value < quintillion){ + context.getString( + R.string.coin_market_cap, + getInFourDecimalPlaces(value.toDouble() / quadrillion.toDouble()), + "Tr" + ) + }else { + "Over $1 Qnt" + } +} + +fun getInFourDecimalPlaces(value : Double) : String{ + val df = DecimalFormat("#,##0.0000") + return df.format(value) } \ No newline at end of file diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index a1631b7..fad1980 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -3,4 +3,5 @@ %s Image %s%s%% %s%s + MCap $%s %s \ No newline at end of file From eb83079cf03b97c938453d42aef6d76a01140fab Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 13:00:21 +0300 Subject: [PATCH 19/78] update string format --- .../java/com/ryankoech/krypto/common/presentation/util/Utils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/ryankoech/krypto/common/presentation/util/Utils.kt b/common/src/main/java/com/ryankoech/krypto/common/presentation/util/Utils.kt index cc8e1c8..780debf 100644 --- a/common/src/main/java/com/ryankoech/krypto/common/presentation/util/Utils.kt +++ b/common/src/main/java/com/ryankoech/krypto/common/presentation/util/Utils.kt @@ -30,7 +30,7 @@ fun getChangeColor(change : Float) : Color { } fun getInTwoDecimalPlaces(value : Double) : String{ - val df = DecimalFormat("#.##") + val df = DecimalFormat("#,##0.00") return df.format(value) } fun getFormattedMarketCap(context: Context, value : Long) : String { From 73deff930d2c4997cfff189e1a178697c1acc0cc Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 13:01:46 +0300 Subject: [PATCH 20/78] implement search tag --- .../components/success/SearchTag.kt | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt new file mode 100644 index 0000000..94cbb65 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt @@ -0,0 +1,84 @@ +package com.ryankoech.krypto.feature_coin_list.presentation.components.success + +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +import com.ryankoech.krypto.feature_coin_list.R +import com.ryankoech.krypto.feature_coin_list.domain.entity.Order +import com.ryankoech.krypto.feature_coin_list.presentation.theme.black100 +import com.ryankoech.krypto.feature_coin_list.presentation.theme.limeGreenYellow400 + +@Composable +fun SearchTag( + onClick : () -> Unit, + isSelected : Boolean, + order : Order, + text : String, + modifier: Modifier = Modifier, +) { + + val spacingValue = 4.dp + + Button( + modifier = modifier, + colors = ButtonDefaults.buttonColors( + backgroundColor = if(isSelected) limeGreenYellow400 else black100, + ), + elevation = ButtonDefaults.elevation( + defaultElevation = 0.dp + ), + onClick = onClick + ) { + + Spacer(modifier = Modifier.width(spacingValue/2)) + + Text( + modifier = Modifier + .padding(vertical = spacingValue), + text = text, + style = MaterialTheme.typography.caption, + ) + + Spacer(modifier = Modifier.width(spacingValue/2)) + + if (isSelected) { + + Icon( + modifier = Modifier + .size(14.dp) + .rotate(if (order == Order.DESC) 180F else 0F), + painter = painterResource(R.drawable.icon_arrow_up), + contentDescription = null + ) + + Spacer(modifier = Modifier.width(spacingValue/2)) + } + } + +} + +@Preview +@Composable +fun SearchTagPreview() { + + KryptoTheme { + Surface { + SearchTag( + onClick = {}, + isSelected = true, + order = Order.ASC, + text = "Market Cap" + ) + } + } + +} \ No newline at end of file From 0a3f45f353b5149348d0a851ea17f5aed55754e9 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 13:03:23 +0300 Subject: [PATCH 21/78] add enum class --- .../krypto/feature_coin_list/domain/entity/Order.kt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Order.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Order.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Order.kt new file mode 100644 index 0000000..0c2d7de --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Order.kt @@ -0,0 +1,6 @@ +package com.ryankoech.krypto.feature_coin_list.domain.entity + +enum class Order { + ASC, + DESC +} \ No newline at end of file From b3dd35027e86a705a0cd29e6759be898852c305f Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 13:03:48 +0300 Subject: [PATCH 22/78] add color resources --- .../krypto/feature_coin_list/presentation/theme/Color.kt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/theme/Color.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/theme/Color.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/theme/Color.kt new file mode 100644 index 0000000..b7efe08 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/theme/Color.kt @@ -0,0 +1,7 @@ +package com.ryankoech.krypto.feature_coin_list.presentation.theme + +import androidx.compose.ui.graphics.Color + +val limeGreenYellow400 = Color(0xffe3f379) +val black100 = Color(0xffeeeeee) +val black200 = Color(0xffaaaaaa) \ No newline at end of file From 0dfd2182e4227fd88ed134782a68247e21a6baeb Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 13:04:15 +0300 Subject: [PATCH 23/78] add arrow icon resource --- feature_coin_list/src/main/res/drawable/icon_arrow_up.xml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 feature_coin_list/src/main/res/drawable/icon_arrow_up.xml diff --git a/feature_coin_list/src/main/res/drawable/icon_arrow_up.xml b/feature_coin_list/src/main/res/drawable/icon_arrow_up.xml new file mode 100644 index 0000000..a12aecf --- /dev/null +++ b/feature_coin_list/src/main/res/drawable/icon_arrow_up.xml @@ -0,0 +1,8 @@ + + + + From 728bdda9eca96e950804641b7f4df9848b0203d2 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 13:04:48 +0300 Subject: [PATCH 24/78] implement coin item component --- .../components/success/CoinItem.kt | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinItem.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinItem.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinItem.kt new file mode 100644 index 0000000..ea455d0 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinItem.kt @@ -0,0 +1,152 @@ +package com.ryankoech.krypto.feature_coin_list.presentation.components.success + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.VerticalAlignmentLine +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.ryankoech.krypto.common.presentation.components.CoinImage +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +import com.ryankoech.krypto.common.presentation.util.* +import com.ryankoech.krypto.feature_coin_list.R +import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity +import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST +import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin +import com.ryankoech.krypto.feature_coin_list.presentation.theme.black100 +import com.ryankoech.krypto.feature_coin_list.presentation.theme.black200 + +@Composable +fun CoinItem( + onClick : () -> Unit, + coin: Coin, + modifier: Modifier = Modifier +) { + + val context = LocalContext.current + + Row( + modifier = modifier + .fillMaxWidth() + .height(IntrinsicSize.Min) + .background( + color = Color.White, + shape = RoundedCornerShape(10.dp) + ) + .clickable { + onClick() + }, + ) { + CoinImage(coin.image, coin.id) + + Spacer(modifier = Modifier.width(8.dp)) + + Column( + modifier = Modifier + .padding(4.dp) + .fillMaxHeight() + .weight(1.0f), + verticalArrangement = Arrangement.SpaceBetween + ) { + + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + modifier = Modifier + .padding(end = 2.dp), + text = coin.name, + style = MaterialTheme.typography.h3, + ) + Text( + text = getFormattedBalance( + context = context, + balance = coin.price, + displayCurrency = DisplayCurrency.USD + ), + style = MaterialTheme.typography.h4 + ) + } + + Row( + modifier = Modifier + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier + .padding( + end = 4.dp + ) + .background( + color = black200, + shape = RoundedCornerShape(3.dp) + ), + + ){ + Text( + modifier = Modifier + .padding( + vertical = 0.dp, + horizontal = 3.dp + ), + text = coin.marketCapRank.toString(), + style = MaterialTheme.typography.h4, + color = Color.White + ) + } + Text( + modifier = Modifier + .padding(end = 2.dp) + .alpha(0.6f), + text = coin.symbol.uppercase(), + style = MaterialTheme.typography.h3, + ) + Text( + text = getFormattedChange(context, coin.change), + style = MaterialTheme.typography.body1, + color = getChangeColor(coin.change) + ) + Spacer(modifier = Modifier.weight(1.0f)) + Text( + modifier = Modifier + .alpha(0.6f), + text = getFormattedMarketCap(context, coin.marketCap), + style = MaterialTheme.typography.body1 + ) + } + } + } + +} + +@Preview(showBackground = true) +@Composable +fun CoinItemPreview() { + KryptoTheme { + Surface( + modifier = Modifier + .fillMaxSize() + ) { + Column { + CoinItem( + {}, + FAKE_COIN_LIST.toCoinEntity().first() + ) + } + } + } +} \ No newline at end of file From 744e642e6c30b6e3ec6aa5563aeb60acfc1a46ac Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 14:21:15 +0300 Subject: [PATCH 25/78] implement repo di module --- .../core/di/CoinRepositoryModule.kt | 35 +++++++++++++++++++ .../data/repository/FakeCoinRepositoryImpl.kt | 3 +- 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinRepositoryModule.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinRepositoryModule.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinRepositoryModule.kt new file mode 100644 index 0000000..3a981e8 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinRepositoryModule.kt @@ -0,0 +1,35 @@ +package com.ryankoech.krypto.feature_coin_list.core.di + +import com.ryankoech.krypto.feature_coin_list.data.repository.CoinRepositoryImpl +import com.ryankoech.krypto.feature_coin_list.data.repository.FakeCoinRepositoryImpl +import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Named +import javax.inject.Singleton + +const val HILT_NAMED_REPO_FAKE = "FakeRepo" +const val HILT_NAMED_REPO = "Repo" +const val HILT_NAME_REPO_FOR_ALL = HILT_NAMED_REPO_FAKE + +@Module +@InstallIn(SingletonComponent::class) +abstract class CoinRepositoryModule { + + @Binds + @Singleton + @Named(HILT_NAMED_REPO_FAKE) + abstract fun provideFakeCoinRepository( + coinRepositoryImpl: FakeCoinRepositoryImpl + ) : CoinRepository + + @Binds + @Singleton + @Named(HILT_NAMED_REPO) + abstract fun provideCoinRepository( + coinRepositoryImpl: CoinRepositoryImpl + ) : CoinRepository + +} \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt index 8a01ca8..a0ac29f 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt @@ -4,6 +4,7 @@ import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto import com.ryankoech.krypto.feature_coin_list.data.dto.Roi import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository import retrofit2.Response +import javax.inject.Inject val FAKE_COIN_LIST = listOf( CoinDto( @@ -208,7 +209,7 @@ val FAKE_COIN_LIST = listOf( ) ) -class FakeCoinRepositoryImpl : CoinRepository { +class FakeCoinRepositoryImpl @Inject constructor() : CoinRepository { override suspend fun getCoins(): Response> { return Response.success(FAKE_COIN_LIST) } From 9964a46a50333d8432e74687007cd404c7aeaf1d Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 14:22:26 +0300 Subject: [PATCH 26/78] implement sorting logic --- .../domain/entity/SortCoinBy.kt | 7 +++ .../domain/entity/SortInfo.kt | 6 +++ .../domain/usecase/GetCoinsUseCase.kt | 48 +++++++++++++++++-- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/SortCoinBy.kt create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/SortInfo.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/SortCoinBy.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/SortCoinBy.kt new file mode 100644 index 0000000..9c9e9c7 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/SortCoinBy.kt @@ -0,0 +1,7 @@ +package com.ryankoech.krypto.feature_coin_list.domain.entity + +enum class SortCoinBy { + MARKET_CAP, + TOTAL_VOLUME, + PRICE +} \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/SortInfo.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/SortInfo.kt new file mode 100644 index 0000000..85dd5cd --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/SortInfo.kt @@ -0,0 +1,6 @@ +package com.ryankoech.krypto.feature_coin_list.domain.entity + +data class SortInfo( + val sortBy : SortCoinBy, + val order: Order +) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt index 02cb22b..c2a58d6 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -1,25 +1,30 @@ package com.ryankoech.krypto.feature_coin_list.domain.usecase import com.ryankoech.krypto.common.core.util.Resource +import com.ryankoech.krypto.feature_coin_list.core.di.HILT_NAME_REPO_FOR_ALL import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin +import com.ryankoech.krypto.feature_coin_list.domain.entity.Order +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onStart import timber.log.Timber import javax.inject.Inject +import javax.inject.Named class GetCoinsUseCase @Inject constructor( - private val repository: CoinRepository + @Named(HILT_NAME_REPO_FOR_ALL) private val repository: CoinRepository ) { - operator fun invoke() = flow { + operator fun invoke(sortInfo: SortInfo) = flow { val response = repository.getCoins() if(response.isSuccessful && !response.body().isNullOrEmpty()){ - emit(Resource.Success(data = response.body()!!.toCoinEntity())) + val sortedData = sortData(sortInfo, response.body()!!.toCoinEntity()) + emit(Resource.Success(data = sortedData)) }else{ emit(Resource.Error("Response not Successful.")) } @@ -29,4 +34,39 @@ class GetCoinsUseCase @Inject constructor( Timber.e(e) emit(Resource.Error(e.localizedMessage ?: "Unexpected Error Occurred.")) } + + private fun sortData(sortInfo: SortInfo, unsortedData : List) : List { + return when(sortInfo.sortBy){ + SortCoinBy.MARKET_CAP -> { + when(sortInfo.order){ + Order.ASC -> { + unsortedData.sortedBy { it.marketCap } + } + Order.DESC -> { + unsortedData.sortedByDescending { it.marketCap } + } + } + } + SortCoinBy.TOTAL_VOLUME -> { + when(sortInfo.order){ + Order.ASC -> { + unsortedData.sortedBy { it.totalVolume } + } + Order.DESC -> { + unsortedData.sortedByDescending { it.totalVolume } + } + } + } + SortCoinBy.PRICE -> { + when(sortInfo.order){ + Order.ASC -> { + unsortedData.sortedBy { it.marketCap } + } + Order.DESC -> { + unsortedData.sortedByDescending { it.marketCap } + } + } + } + } + } } \ No newline at end of file From 2561678be785845026d53975ef81dd592d189555 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 14:23:07 +0300 Subject: [PATCH 27/78] implement viewmodel --- .../viewmodel/CoinListScreenViewModel.kt | 72 +++++++++++++++++++ .../viewstate/CoinListScreenviewState.kt | 9 +++ 2 files changed, 81 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewstate/CoinListScreenviewState.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt new file mode 100644 index 0000000..20cda01 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt @@ -0,0 +1,72 @@ +package com.ryankoech.krypto.feature_coin_list.presentation.viewmodel + +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.ryankoech.krypto.common.core.util.Resource +import com.ryankoech.krypto.common.presentation.util.ScreenState +import com.ryankoech.krypto.feature_coin_list.domain.entity.Order +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo +import com.ryankoech.krypto.feature_coin_list.domain.usecase.GetCoinsUseCase +import com.ryankoech.krypto.feature_coin_list.presentation.viewstate.CoinListScreenviewState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import timber.log.Timber +import javax.inject.Inject + +val sortInfo = SortInfo( + sortBy = SortCoinBy.MARKET_CAP, + order = Order.DESC +) + +@HiltViewModel +class CoinListScreenViewModel @Inject constructor( + private val getCoinsUseCase: GetCoinsUseCase +) : ViewModel() { + + private val _viewState = mutableStateOf(CoinListScreenviewState()) + val viewState : State = _viewState + + init { + getCoins(sortInfo) + } + + private fun getCoins(sortInfo: SortInfo) { + + getCoinsUseCase(sortInfo) + .onEach { res -> + when(res){ + is Resource.Error -> { + Timber.d("VM Error") + _viewState.value = _viewState.value.copy( + screenState = ScreenState.ERROR + ) + } + is Resource.Loading -> { + Timber.d("VM Loading") + _viewState.value = _viewState.value.copy( + screenState = ScreenState.LOADING + ) + } + is Resource.Success -> { + Timber.d("VM Success") + _viewState.value = _viewState.value.copy( + screenState = ScreenState.SUCCESS, + coins = res.data!! + ) + } + else -> { + _viewState.value = _viewState.value.copy( + screenState = ScreenState.ERROR + ) + } + } + + }.launchIn(viewModelScope) + + } + +} \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewstate/CoinListScreenviewState.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewstate/CoinListScreenviewState.kt new file mode 100644 index 0000000..bb068c1 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewstate/CoinListScreenviewState.kt @@ -0,0 +1,9 @@ +package com.ryankoech.krypto.feature_coin_list.presentation.viewstate + +import com.ryankoech.krypto.common.presentation.util.ScreenState +import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin + +data class CoinListScreenviewState( + val screenState: ScreenState = ScreenState.LOADING, + val coins : List = listOf(), +) From eaffc0658616ed45e024a697a28056c797ba8b67 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 14:23:51 +0300 Subject: [PATCH 28/78] add screen state logic --- .../presentation/CoinListScreen.kt | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index 9c64da3..cd6042b 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -5,15 +5,34 @@ import androidx.compose.material.Surface import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.ViewModel import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +import com.ryankoech.krypto.common.presentation.util.ScreenState +import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel @Composable -fun CoinListScreen() { +fun CoinListScreen( + viewModel: CoinListScreenViewModel = hiltViewModel(), + modifier: Modifier = Modifier +) { + + val viewState = viewModel.viewState.value Surface( modifier = Modifier.fillMaxSize() ) { - CoinListScreenSuccess() + when(viewState.screenState){ + ScreenState.LOADING -> { + //TODO : Show Loading Screen + } + ScreenState.ERROR -> { + //TODO : Show Error Screen + } + ScreenState.SUCCESS -> { + CoinListScreenSuccess() + } + } } } From 5bd21ec8e6f86c517c413a755ab046ba622d50ed Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 15:01:05 +0300 Subject: [PATCH 29/78] change function visibility and val name --- .../presentation/viewmodel/CoinListScreenViewModel.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt index 20cda01..b7c8f4e 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt @@ -17,7 +17,7 @@ import kotlinx.coroutines.flow.onEach import timber.log.Timber import javax.inject.Inject -val sortInfo = SortInfo( +val DEFAULT_SORT_INFO = SortInfo( sortBy = SortCoinBy.MARKET_CAP, order = Order.DESC ) @@ -31,10 +31,10 @@ class CoinListScreenViewModel @Inject constructor( val viewState : State = _viewState init { - getCoins(sortInfo) + getCoins(DEFAULT_SORT_INFO) } - private fun getCoins(sortInfo: SortInfo) { + fun getCoins(sortInfo: SortInfo) { getCoinsUseCase(sortInfo) .onEach { res -> From e6b69b4cce219b07ffbb149cb6a68accf8ed3bb9 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 15:01:55 +0300 Subject: [PATCH 30/78] update logic to use state and state callback --- .../components/success/SearchTag.kt | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt index 94cbb65..e73a7e0 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt @@ -1,5 +1,6 @@ package com.ryankoech.krypto.feature_coin_list.presentation.components.success +import androidx.compose.animation.animateContentSize import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -14,29 +15,36 @@ import androidx.compose.ui.unit.dp import com.ryankoech.krypto.common.presentation.theme.KryptoTheme import com.ryankoech.krypto.feature_coin_list.R import com.ryankoech.krypto.feature_coin_list.domain.entity.Order +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.presentation.theme.black100 import com.ryankoech.krypto.feature_coin_list.presentation.theme.limeGreenYellow400 +import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.DEFAULT_SORT_INFO @Composable fun SearchTag( - onClick : () -> Unit, - isSelected : Boolean, - order : Order, + editSortingInfo : (sortCoinBy : SortCoinBy) -> Unit, + sortCoinBy: SortCoinBy, + sortInfoState : SortInfo, text : String, modifier: Modifier = Modifier, ) { val spacingValue = 4.dp + val isSelected = sortCoinBy == sortInfoState.sortBy + val order = sortInfoState.order Button( - modifier = modifier, + modifier = modifier.animateContentSize(), colors = ButtonDefaults.buttonColors( backgroundColor = if(isSelected) limeGreenYellow400 else black100, ), elevation = ButtonDefaults.elevation( defaultElevation = 0.dp ), - onClick = onClick + onClick = { + editSortingInfo(sortCoinBy) + } ) { Spacer(modifier = Modifier.width(spacingValue/2)) @@ -73,9 +81,9 @@ fun SearchTagPreview() { KryptoTheme { Surface { SearchTag( - onClick = {}, - isSelected = true, - order = Order.ASC, + editSortingInfo = {}, + sortCoinBy = SortCoinBy.MARKET_CAP, + sortInfoState = DEFAULT_SORT_INFO, text = "Market Cap" ) } From 770d773dbc0ca84ff977a52e0a50b7da72299d92 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 15:02:46 +0300 Subject: [PATCH 31/78] implement search tag display and parameters --- .../presentation/CoinListScreenSuccess.kt | 64 +++++++++++++++++-- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt index 7e91dda..0005c18 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -1,15 +1,22 @@ package com.ryankoech.krypto.feature_coin_list.presentation -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* +import androidx.compose.material.Surface import androidx.compose.runtime.* import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.ryankoech.krypto.common.presentation.components.SearchBar +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo +import com.ryankoech.krypto.feature_coin_list.presentation.components.success.SearchTag +import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.DEFAULT_SORT_INFO @Composable fun CoinListScreenSuccess( + editSortInfo : (sortCoinBy : SortCoinBy) -> Unit, + sortInfoState : SortInfo, modifier: Modifier = Modifier ) { @@ -17,7 +24,7 @@ fun CoinListScreenSuccess( modifier = modifier .fillMaxSize() .padding( - top = 12.dp, start = 12.dp, end = 12.dp + top = 12.dp, ) ) { var value by remember { @@ -25,10 +32,59 @@ fun CoinListScreenSuccess( } SearchBar( + modifier = Modifier + .padding(horizontal = 12.dp), value = value, onValueChange = { value = it }, placeholder = "Discover asset, coin or token" ) + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp, start = 12.dp, end = 12.dp), + horizontalArrangement = Arrangement.SpaceAround + ){ + + SearchTag( + editSortingInfo = editSortInfo, + sortInfoState = sortInfoState, + sortCoinBy = SortCoinBy.MARKET_CAP, + text = "Market Cap" + ) + + SearchTag( + editSortingInfo = editSortInfo, + sortInfoState = sortInfoState, + sortCoinBy = SortCoinBy.TOTAL_VOLUME, + text = "Volume" + ) + + SearchTag( + editSortingInfo = editSortInfo, + sortInfoState = sortInfoState, + sortCoinBy = SortCoinBy.PRICE, + text = "Price" + ) + + } } +} + +@Preview +@Composable +fun CoinListSuccessScreenPreview(){ + KryptoTheme { + Surface( + modifier = Modifier.fillMaxSize() + ) { + + CoinListScreenSuccess( + editSortInfo = {}, + sortInfoState = DEFAULT_SORT_INFO, + ) + + } + } } \ No newline at end of file From 35d3f488decdac4df2d40df3d023b1ce1e495c27 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 15:04:03 +0300 Subject: [PATCH 32/78] implement sorting info state management --- .../presentation/CoinListScreen.kt | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index cd6042b..9ce66fc 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -6,9 +6,11 @@ import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.ViewModel import com.ryankoech.krypto.common.presentation.theme.KryptoTheme import com.ryankoech.krypto.common.presentation.util.ScreenState +import com.ryankoech.krypto.feature_coin_list.domain.entity.Order +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel @Composable @@ -18,6 +20,37 @@ fun CoinListScreen( ) { val viewState = viewModel.viewState.value + var sortInfoState by remember { + mutableStateOf( + SortInfo( + sortBy = SortCoinBy.MARKET_CAP, + order = Order.DESC + ) + ) + } + + fun editSortingInfo(sortCoinBy: SortCoinBy) { + + val newSortInfo = if(sortCoinBy == sortInfoState.sortBy){ + if(sortInfoState.order == Order.ASC) { + sortInfoState.copy( + order = Order.DESC + ) + }else { + sortInfoState.copy( + order = Order.ASC + ) + } + }else { + sortInfoState.copy( + sortBy = sortCoinBy, + order = Order.DESC + ) + } + + viewModel.getCoins(newSortInfo) + sortInfoState = newSortInfo + } Surface( modifier = Modifier.fillMaxSize() @@ -30,7 +63,10 @@ fun CoinListScreen( //TODO : Show Error Screen } ScreenState.SUCCESS -> { - CoinListScreenSuccess() + CoinListScreenSuccess( + editSortInfo = ::editSortingInfo, + sortInfoState = sortInfoState + ) } } } From 26d41fd74a9668a9ae908973d355ba84b8bcdadd Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 15:20:48 +0300 Subject: [PATCH 33/78] implement coin list logic --- .../presentation/CoinListScreen.kt | 3 ++- .../presentation/CoinListScreenSuccess.kt | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index 9ce66fc..8c34ca4 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -65,7 +65,8 @@ fun CoinListScreen( ScreenState.SUCCESS -> { CoinListScreenSuccess( editSortInfo = ::editSortingInfo, - sortInfoState = sortInfoState + sortInfoState = sortInfoState, + coins = viewState.coins ) } } diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt index 0005c18..bcf440b 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -1,6 +1,8 @@ package com.ryankoech.krypto.feature_coin_list.presentation import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.material.Surface import androidx.compose.runtime.* import androidx.compose.ui.Modifier @@ -8,8 +10,12 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.ryankoech.krypto.common.presentation.components.SearchBar import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity +import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST +import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo +import com.ryankoech.krypto.feature_coin_list.presentation.components.success.CoinItem import com.ryankoech.krypto.feature_coin_list.presentation.components.success.SearchTag import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.DEFAULT_SORT_INFO @@ -17,6 +23,7 @@ import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.DEFAULT_SOR fun CoinListScreenSuccess( editSortInfo : (sortCoinBy : SortCoinBy) -> Unit, sortInfoState : SortInfo, + coins : List, modifier: Modifier = Modifier ) { @@ -66,7 +73,22 @@ fun CoinListScreenSuccess( sortCoinBy = SortCoinBy.PRICE, text = "Price" ) + } + LazyColumn( + modifier = Modifier + .weight(1f), + contentPadding = PaddingValues( + top = 12.dp, start = 12.dp, end = 12.dp + ) + ){ + items( + items = coins, + key = { it.id } + ){ coin -> + CoinItem(onClick = {}, coin = coin) + Spacer(modifier = Modifier.height(24.dp)) + } } } @@ -83,6 +105,7 @@ fun CoinListSuccessScreenPreview(){ CoinListScreenSuccess( editSortInfo = {}, sortInfoState = DEFAULT_SORT_INFO, + coins = FAKE_COIN_LIST.toCoinEntity() ) } From 079a91865fe9fb94420f75561f9d38a131ded3aa Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 15:22:02 +0300 Subject: [PATCH 34/78] fix sorting logic --- .../feature_coin_list/domain/usecase/GetCoinsUseCase.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt index c2a58d6..763086c 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -60,10 +60,10 @@ class GetCoinsUseCase @Inject constructor( SortCoinBy.PRICE -> { when(sortInfo.order){ Order.ASC -> { - unsortedData.sortedBy { it.marketCap } + unsortedData.sortedBy { it.price } } Order.DESC -> { - unsortedData.sortedByDescending { it.marketCap } + unsortedData.sortedByDescending { it.price} } } } From 13203e8134f1a19ba9c6e55eceabe05ce0cd4059 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 15:43:07 +0300 Subject: [PATCH 35/78] implement basic cache --- .../feature_coin_list/domain/usecase/GetCoinsUseCase.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt index 763086c..92caf1f 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -2,6 +2,7 @@ package com.ryankoech.krypto.feature_coin_list.domain.usecase import com.ryankoech.krypto.common.core.util.Resource import com.ryankoech.krypto.feature_coin_list.core.di.HILT_NAME_REPO_FOR_ALL +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin import com.ryankoech.krypto.feature_coin_list.domain.entity.Order @@ -11,6 +12,7 @@ import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onStart +import retrofit2.Response import timber.log.Timber import javax.inject.Inject import javax.inject.Named @@ -19,8 +21,11 @@ class GetCoinsUseCase @Inject constructor( @Named(HILT_NAME_REPO_FOR_ALL) private val repository: CoinRepository ) { + var cacheCoin : List? = null + operator fun invoke(sortInfo: SortInfo) = flow { - val response = repository.getCoins() + // Basic Cache + val response : Response> = if(cacheCoin.isNullOrEmpty()) repository.getCoins() else Response.success(cacheCoin) if(response.isSuccessful && !response.body().isNullOrEmpty()){ val sortedData = sortData(sortInfo, response.body()!!.toCoinEntity()) From b00cbace44f17b45f803133dd06e7ac7c8e76b4b Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 15:43:57 +0300 Subject: [PATCH 36/78] refactor total volume data type --- .../krypto/feature_coin_list/data/dto/CoinDto.kt | 2 +- .../data/repository/FakeCoinRepositoryImpl.kt | 14 +++++++------- .../krypto/feature_coin_list/domain/entity/Coin.kt | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt index dff85af..0b860a3 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt @@ -28,7 +28,7 @@ data class CoinDto( val roi: Roi?, val symbol: String, val total_supply: Double, - val total_volume: Long + val total_volume: Double ) fun List.toCoinEntity() : List = diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt index a0ac29f..7cef8fa 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt @@ -16,7 +16,7 @@ val FAKE_COIN_LIST = listOf( market_cap = 325934668465, market_cap_rank = 1, fully_diluted_valuation = 355472891513, - total_volume = 17324993150, + total_volume = 17324993150.0, high_24h = 17021.29, low_24h = 16710.14, price_change_24h = 154.92, @@ -44,7 +44,7 @@ val FAKE_COIN_LIST = listOf( market_cap = 152465403313, market_cap_rank = 2, fully_diluted_valuation = 152465403313, - total_volume = 4738147647, + total_volume = 4738147647.0, high_24h = 1275.78, low_24h = 1242.1, price_change_24h = 18.52, @@ -76,7 +76,7 @@ val FAKE_COIN_LIST = listOf( market_cap = 66308002007, market_cap_rank = 3, fully_diluted_valuation = 66308002007, - total_volume = 22830407217, + total_volume = 22830407217.0, high_24h = 1.002, low_24h = 0.997607, price_change_24h = -0.000014506074960785, @@ -104,7 +104,7 @@ val FAKE_COIN_LIST = listOf( market_cap = 43793762275, market_cap_rank = 4, fully_diluted_valuation = 43790483878, - total_volume = 2138738912, + total_volume = 2138738912.0, high_24h = 1.002, low_24h = 0.997155, price_change_24h = 0.00025959, @@ -132,7 +132,7 @@ val FAKE_COIN_LIST = listOf( market_cap = 42629851070, market_cap_rank = 5, fully_diluted_valuation = 52217835573, - total_volume = 429267785, + total_volume = 429267785.0, high_24h = 262.55, low_24h = 255.42, price_change_24h = 4.84, @@ -160,7 +160,7 @@ val FAKE_COIN_LIST = listOf( market_cap = 17368882302, market_cap_rank = 6, fully_diluted_valuation = 34350451021, - total_volume = 575571042, + total_volume = 575571042.0, high_24h = 0.346053, low_24h = 0.334424, price_change_24h = 0.00761656, @@ -188,7 +188,7 @@ val FAKE_COIN_LIST = listOf( market_cap = 16437019062, market_cap_rank = 7, fully_diluted_valuation = 16437019062, - total_volume = 5323587945, + total_volume = 5323587945.0, high_24h = 1.004, low_24h = 0.999316, price_change_24h = 0.00102026, diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt index 69d8f91..941da70 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/entity/Coin.kt @@ -11,5 +11,5 @@ data class Coin( val marketCap : Long, val allTimeHigh : Double, val high24Hr : Double, - val totalVolume : Long, + val totalVolume : Double, ) From a609208de37532fcb67e41112e63ac89707c202a Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 18:06:53 +0300 Subject: [PATCH 37/78] implemented coin search logic in vm and usecase --- .../domain/usecase/GetCoinsUseCase.kt | 13 +++++++++++-- .../viewmodel/CoinListScreenViewModel.kt | 6 +++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt index 92caf1f..35e4f58 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -23,12 +23,21 @@ class GetCoinsUseCase @Inject constructor( var cacheCoin : List? = null - operator fun invoke(sortInfo: SortInfo) = flow { + operator fun invoke(sortInfo: SortInfo, filterString : String = "") = flow { // Basic Cache val response : Response> = if(cacheCoin.isNullOrEmpty()) repository.getCoins() else Response.success(cacheCoin) if(response.isSuccessful && !response.body().isNullOrEmpty()){ - val sortedData = sortData(sortInfo, response.body()!!.toCoinEntity()) + val filteredCoins = response.body()!!.toCoinEntity().filter { + it.name.contains( + filterString, + true + ) || it.symbol.contains( + filterString, + true + ) + } + val sortedData = sortData(sortInfo, filteredCoins) emit(Resource.Success(data = sortedData)) }else{ emit(Resource.Error("Response not Successful.")) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt index b7c8f4e..35357fb 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt @@ -31,12 +31,12 @@ class CoinListScreenViewModel @Inject constructor( val viewState : State = _viewState init { - getCoins(DEFAULT_SORT_INFO) + getCoins(DEFAULT_SORT_INFO, "") } - fun getCoins(sortInfo: SortInfo) { + fun getCoins(sortInfo: SortInfo, filterString : String) { - getCoinsUseCase(sortInfo) + getCoinsUseCase(sortInfo, filterString) .onEach { res -> when(res){ is Resource.Error -> { From 0568dcebfb588d251228d304d1fcd61bc8b12781 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Sun, 8 Jan 2023 18:07:52 +0300 Subject: [PATCH 38/78] updated search bar logic to seach coins --- .../presentation/CoinListScreen.kt | 15 +++++++++++++-- .../presentation/CoinListScreenSuccess.kt | 15 ++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index 8c34ca4..cc20c9f 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -29,6 +29,15 @@ fun CoinListScreen( ) } + var filterStringState by remember { + mutableStateOf("") + } + + fun editFilterStringState(subString :String) { + viewModel.getCoins(sortInfoState, subString) + filterStringState = subString + } + fun editSortingInfo(sortCoinBy: SortCoinBy) { val newSortInfo = if(sortCoinBy == sortInfoState.sortBy){ @@ -48,7 +57,7 @@ fun CoinListScreen( ) } - viewModel.getCoins(newSortInfo) + viewModel.getCoins(newSortInfo, filterStringState) sortInfoState = newSortInfo } @@ -66,7 +75,9 @@ fun CoinListScreen( CoinListScreenSuccess( editSortInfo = ::editSortingInfo, sortInfoState = sortInfoState, - coins = viewState.coins + coins = viewState.coins, + filterStringState = filterStringState, + editFilterStringState = ::editFilterStringState ) } } diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt index bcf440b..af1336c 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -21,9 +21,11 @@ import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.DEFAULT_SOR @Composable fun CoinListScreenSuccess( - editSortInfo : (sortCoinBy : SortCoinBy) -> Unit, + editSortInfo : (SortCoinBy) -> Unit, sortInfoState : SortInfo, coins : List, + filterStringState : String, + editFilterStringState : (String) -> Unit, modifier: Modifier = Modifier ) { @@ -34,15 +36,12 @@ fun CoinListScreenSuccess( top = 12.dp, ) ) { - var value by remember { - mutableStateOf("") - } SearchBar( modifier = Modifier .padding(horizontal = 12.dp), - value = value, - onValueChange = { value = it }, + value = filterStringState, + onValueChange = editFilterStringState, placeholder = "Discover asset, coin or token" ) @@ -105,7 +104,9 @@ fun CoinListSuccessScreenPreview(){ CoinListScreenSuccess( editSortInfo = {}, sortInfoState = DEFAULT_SORT_INFO, - coins = FAKE_COIN_LIST.toCoinEntity() + coins = FAKE_COIN_LIST.toCoinEntity(), + filterStringState = "", + editFilterStringState = {} ) } From 37cbb00f92fc485f096a0c0de29a92dc800e1467 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 20:29:25 +0300 Subject: [PATCH 39/78] implement loading component --- .../components/success/CoinListLoading.kt | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinListLoading.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinListLoading.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinListLoading.kt new file mode 100644 index 0000000..70a73eb --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinListLoading.kt @@ -0,0 +1,47 @@ +package com.ryankoech.krypto.feature_coin_list.presentation.components.success + +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.ryankoech.krypto.common.presentation.components.loading.CoinCardLoading +import com.ryankoech.krypto.common.presentation.components.loading.loadingEffect +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme + +@Composable +fun CoinListLoading( + modifier: Modifier = Modifier +) { + + val brush = loadingEffect() + + LazyColumn( + modifier = modifier.fillMaxSize(), + contentPadding = PaddingValues( + 12.dp + ) + ){ + items( + count = 15 + ){ + CoinCardLoading(brush) + Spacer(modifier = Modifier.height(24.dp)) + } + } + +} + +@Preview +@Composable +fun CoinListScreenLoadingPreview() { + KryptoTheme { + Surface( + modifier = Modifier.fillMaxSize() + ) { + CoinListLoading() + } + } +} \ No newline at end of file From 152f4f1bc987e5dd4ba0cfdbbc77be6d31a6e5fb Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 20:30:50 +0300 Subject: [PATCH 40/78] fix not caching bug --- .../domain/usecase/GetCoinsUseCase.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt index 35e4f58..d28bf04 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -21,11 +21,18 @@ class GetCoinsUseCase @Inject constructor( @Named(HILT_NAME_REPO_FOR_ALL) private val repository: CoinRepository ) { + // Basic Cache var cacheCoin : List? = null operator fun invoke(sortInfo: SortInfo, filterString : String = "") = flow { - // Basic Cache - val response : Response> = if(cacheCoin.isNullOrEmpty()) repository.getCoins() else Response.success(cacheCoin) + + val response : Response> = if(cacheCoin.isNullOrEmpty()) { + val response = repository.getCoins() + cacheCoin = response.body() + response + } else { + Response.success(cacheCoin) + } if(response.isSuccessful && !response.body().isNullOrEmpty()){ val filteredCoins = response.body()!!.toCoinEntity().filter { From 9022002133b0bc35b37f8b0c5e8df57b4c36e612 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 20:31:58 +0300 Subject: [PATCH 41/78] update work flow of screenstate --- .../presentation/CoinListScreen.kt | 30 +++++++------ .../presentation/CoinListScreenSuccess.kt | 42 +++++++++++++------ 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index cc20c9f..6a62208 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -12,6 +12,7 @@ import com.ryankoech.krypto.feature_coin_list.domain.entity.Order import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel +import timber.log.Timber @Composable fun CoinListScreen( @@ -64,22 +65,19 @@ fun CoinListScreen( Surface( modifier = Modifier.fillMaxSize() ) { - when(viewState.screenState){ - ScreenState.LOADING -> { - //TODO : Show Loading Screen - } - ScreenState.ERROR -> { - //TODO : Show Error Screen - } - ScreenState.SUCCESS -> { - CoinListScreenSuccess( - editSortInfo = ::editSortingInfo, - sortInfoState = sortInfoState, - coins = viewState.coins, - filterStringState = filterStringState, - editFilterStringState = ::editFilterStringState - ) - } + + if(viewState.screenState == ScreenState.ERROR) { + //TODO : Show Error Screen + Timber.d("Display Coin List Error Screen") + }else { + CoinListScreenSuccess( + screenState = viewState.screenState, + editSortInfo = ::editSortingInfo, + sortInfoState = sortInfoState, + coins = viewState.coins, + filterStringState = filterStringState, + editFilterStringState = ::editFilterStringState + ) } } } diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt index af1336c..d306a44 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -10,17 +10,21 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.ryankoech.krypto.common.presentation.components.SearchBar import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +import com.ryankoech.krypto.common.presentation.util.ScreenState import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.presentation.components.success.CoinItem +import com.ryankoech.krypto.feature_coin_list.presentation.components.success.CoinListLoading import com.ryankoech.krypto.feature_coin_list.presentation.components.success.SearchTag import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.DEFAULT_SORT_INFO +import timber.log.Timber @Composable fun CoinListScreenSuccess( + screenState : ScreenState, editSortInfo : (SortCoinBy) -> Unit, sortInfoState : SortInfo, coins : List, @@ -74,19 +78,30 @@ fun CoinListScreenSuccess( ) } - LazyColumn( - modifier = Modifier - .weight(1f), - contentPadding = PaddingValues( - top = 12.dp, start = 12.dp, end = 12.dp - ) - ){ - items( - items = coins, - key = { it.id } - ){ coin -> - CoinItem(onClick = {}, coin = coin) - Spacer(modifier = Modifier.height(24.dp)) + if(screenState == ScreenState.LOADING) { + CoinListLoading() + } else { + + if( coins.isEmpty() ) { + // TODO: Show No Coins Screen + Timber.d("Display Coin List Empty List") + }else { + + LazyColumn( + modifier = Modifier + .weight(1f), + contentPadding = PaddingValues( + top = 12.dp, start = 12.dp, end = 12.dp + ) + ){ + items( + items = coins, + key = { it.id } + ){ coin -> + CoinItem(onClick = {}, coin = coin) + Spacer(modifier = Modifier.height(24.dp)) + } + } } } } @@ -102,6 +117,7 @@ fun CoinListSuccessScreenPreview(){ ) { CoinListScreenSuccess( + screenState = ScreenState.SUCCESS, editSortInfo = {}, sortInfoState = DEFAULT_SORT_INFO, coins = FAKE_COIN_LIST.toCoinEntity(), From 3191bd4451dbfdf1a90f9d6cb1a2a4a05f96aceb Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 21:57:52 +0300 Subject: [PATCH 42/78] fix component bug and update --- .../com/ryankoech/krypto/common/presentation/ErrorScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/ryankoech/krypto/common/presentation/ErrorScreen.kt b/common/src/main/java/com/ryankoech/krypto/common/presentation/ErrorScreen.kt index fe5a30c..802f864 100644 --- a/common/src/main/java/com/ryankoech/krypto/common/presentation/ErrorScreen.kt +++ b/common/src/main/java/com/ryankoech/krypto/common/presentation/ErrorScreen.kt @@ -27,8 +27,9 @@ fun ErrorScreen( horizontalAlignment = Alignment.CenterHorizontally ) { - Box(modifier = Modifier.size(112.dp)) { + Box(modifier = Modifier.size(40.dp)) { GifImage( + modifier = Modifier.fillMaxSize(), res = res ) } From 0ad6ff0a758f3f9a383364f79d846d46670c1c31 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 21:58:38 +0300 Subject: [PATCH 43/78] add gif resources --- .../src/main/res/drawable/icon_gif_caution.gif | Bin 0 -> 113953 bytes .../src/main/res/drawable/icon_gif_search.gif | Bin 0 -> 466384 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 common/src/main/res/drawable/icon_gif_caution.gif create mode 100644 common/src/main/res/drawable/icon_gif_search.gif diff --git a/common/src/main/res/drawable/icon_gif_caution.gif b/common/src/main/res/drawable/icon_gif_caution.gif new file mode 100644 index 0000000000000000000000000000000000000000..008cad60162bf509d89c8c1015aa94a617abdb2a GIT binary patch literal 113953 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 Nss^g|*Hblx{{<&DK_UPE literal 0 HcmV?d00001 diff --git a/common/src/main/res/drawable/icon_gif_search.gif b/common/src/main/res/drawable/icon_gif_search.gif new file mode 100644 index 0000000000000000000000000000000000000000..16126288e8da566217bbcc8eb109c379e7079440 GIT binary patch literal 466384 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 z z1OX8t%+YTNcL)4945(#^6OeN56OULw%ysNU`_1n*19yh=x{m^PUhE8i5H4BnI$7dfJ!GzFY9200WBfzvqmexQF=l%;1uwBpi&>^qLF@g=i#oL?aytXM_Bvz1e1T>CLX7hfWtG8$sT!#1Z#1xO%(x+ zI|U*=3}R@i@i7pZ(r6Bk$-#tD_lvxSf*^Nwdf~Yus|*eil&n*kLEh!~r+a&IDZoWT2XV4k0Wfzeb`w~CzCgfKLXWeNqgN_Moj~IVyEGr> zr%HG+54WYC^B4y08$=}qTSvuQ3~_sxtDD2{JETQ(rJ#EcoOj6}wDX9kiO99w@(d0# zm5Tcya59ZddCG?G^7LDQ!c!<10F_AZ(IsCmHgYkbICNNW@O2D0wL=?rR~9}evIG}K z$|?%x5fv1?TSCBSs^KsXZUd=CUvTz=AS=OZT!3NZ9eUY~#;wU=YpJNitUu7Vob{pT zA8en_(k-(*96kb-!?}>fMKX#d=UBKs4(i`-@XNu2YeDOI>z}IE5o>C+h28#=8r2>GIG2w-C2}&?K~6rk>S&POCq}Kt zH2DV;SH^%BPG7b3^ecaAxtAYRXakENqI>z+E(mVhyGyOpgziSt#hZ#R25)?Fm($*a zNur;-3eIyk(sm1=yC`O^0(ikZws#)e$-#E>u+Ce$*(25S@uRPo{{;hT{ zwwI0@VW$FAFh^H=CBSxpG7<~h0~W|w=n0}_W~0eH72^Wg8@ENM@rJgG0^=pt$#d1A zGhF;rmQXtyT%%xp1tJiZ*o(+8p-)7W4!wjcyW?&m@gOpT@{WrgrehBYM3ez4Vj)Nk zwjWMO_fn7hm2X^OrjN#UdnJw}~p$rk_N|_)LNGpeM^qc+%0j`aTv8E}7%s;qZ7Bxo`gHS}S zDT^!BiH(>W&M?r45ag+O*z0ZmpEdG_jW7 z^nrzc$`zSvl~YX>HFMGc?$$7;{LYa!ZV@u2x{aT&yypbm&O*{=fEP*3l5@9cTyuw4 z@{k-FTzL?2X-`u~f!YBvoC38ckR)z@Po$4QIOs$fXAtI9i8eeq4Wb5sQR@z#ciIL9 zr0oYu(!LJr8Y|2eIlfkh{}zj6?y3E$E>fP;iHF7-wRF6N-NPFS9%u+ zg9ut16vT~*sfm?J8mmuGB4`_b=Tkl!TOzSabEI$=@hn!JvD9`!9q|J{PUp=dsdoe$ zc4vXIq>``bIRCEjE{)iao5Z+BX|+C)oixKbtad4_!dF;?Ifxf@g4nP?-j%d-bzUsJ zuCu^bq)&j6I!20N<;>Altj;RZR56|R`qZg|a=u8Z02Pxpy~aH!#Gpj+jJi&03n^Z( zPDb)kro9Z8+VeqA9M2!p_$?Og^j-&jWX2>BY(qO5^dy~=#f4%Ki|~uO)nh@o_^hIT zJMMyr#V;P(;b)h#B1mspY7C$TIH{|A!XisHWdS!qBq!`$=P;D;lPEC*Ue#2H`Nx4D zB12w$SW`OO{_mqS#wPjMr~4)eCQd?BBxy;+;kwmCh6;LNK9o-7sZr_F(aj$vpvl&2 zI~u+9iTbz~e_8Rva3l3UC2BtoG*67(Z0T#M81uAz+^RTs2=}7%>hNC{8D`-qID%JzC~w6@4VNmyWVvW z+@J|=`ylavBs!e$=g4GOT?MR^=_J8-G0|lV)WQni|;lgyz{l5t`>`+QUp-Z$(xp6JEmRD zqKXt2_r87Nf7SkRld57rs!tEUWwA*Wx8Xv7IFgcx6m`_7rP>H3Bb$*v((QkvqFwFZ zN-Vy{t3FW)ORCHew^gu$O4uuaXc0X_xm*1q$EI*|I_c-1`#S=w!8Mv-Vkt1{T6@3I zsbb|!qKD(;KUUG60hr|VJ(XEnPv_HJ&5x+QKQ{a+6!eN@7UY_eDhE|@l-*b>n6!@% z7&-Iu5~89#t+212j#joZ#{#B3YE*)1?rdEi*TCBk*A0bsK8^7wn4G4!LZ$X|M9DRL znCPG@T5K*&@(yjYh&UU)k0mN`pM~y?nT|%8XK$S!xE>`?C6Fh(8P^(>jwq_)z|xp> zTZ!fGJ2a5l>57BBv}#39O`lt7Vq_{mQI`8!>iyT+XgZkTo>oZqb=auXUWl1mZ#>0C zXkBAwKy=utyG_%iJBSGLRS{wV1*!@WL7MZFu|B5O-|n$!x~x>>elBcl*jHOs(jP|S zkTW*F?As>m#fbK$mEUe6U^+Rz_|zI(4G^*3=He#~4t`X14N+E4M6e#5G->!ln6_4> z__9|&F}!%=?~OA@!ss(Me4M}vWt7B`E@fqH_GkkM#11u?`dlY)l2$bePKE|@?F0M( zce0T!rt(A*Qqc~M851thO;VNq9@s1J&7<8{y=PjH(@RRy7dS8r7e9&POsJYU3GE4@ zK{t4S8j=3+=J`ps-?LSn-PS`vq8e^w5*dR;Q}!t*M*_c&&%1f zC@%SRE)$$y<@s>as+DGD4PMIT(OvvV2b$8vWaBfoFSqADwdMaacXkvtI%;2OH-CzN zFRQUtr6{Al_!8$D;xFr+$n&_UAw_PW!c<=o+dm%eN3|iRmNpnSX4#up0J6Al+*x+HKPDv`li1y6SZC)1Nmb=Yo&)nmOfMbTnpc+8 zzFXfgZ{OOJFO8AChkfGiVs>U&;}T&4Vwy5x%9m^YlIvpaV(4%}c|q>>&`Z++5U+4) zlWZ=XJD~n};?cpl8yrfy)CCM|qiJ3Sd4sogt?z@lBh~BjSrvg3{n7GJDI0`$hxNsoV@FJF)>6fW zt;w+==;|LM-Ijezdk!1s(<#I>SFQAoki_v1t8)Mq9pesWpqY97s7P*y`j+tn&QYc9 z4Lmz}$<6JmNPi`d%}e_lg}EZJO9hKrTNVY-{vQp5a!9Aar?YPhYukWfXLxmUEt;{a zeDb-!=mVlpFyy-`4nFWE7^cB7HdRhMci2{)k?OrI#iaT^q|3nm&dg)KO_JuX)5PC! zk0bJTEBq9sTX84xLlsxXhf60#%eZg{R@=4smrHti$_4&l?yQvvzyIaleh-i*@4qK1 z3n_X1{B%(A4?9GbzPrY>>8z*mg74W4 za|RJw*hu`dNB(4+_)Fwsc6La3^oVk1reT_I!BL5pS8YW5YfB&9_Pm}dhm9W@DHxl7 zysGB|6_Mq6D4o!PpPiEz$bIDI~a_}wb!0(vE9I=*!=kk8& z4fpzevW~;k47CF9(KJ_mC7{{51__g&{S_t_>>RT6@6{c;GbKvSG8L6?p=Rvum_CH+ zb5YvvON?F7Fj^=@G)@_9+P1um-Zg8ZHGXaQ!u6kD+vhWN4U!}GL#>~9(M5G{nmf}c z)0bfjcP-~93omlh&xjqoN{sGn9ZTsxEQ*YaG}*>u#Kp(` zbAUz{a-!bbR=p#H)EQau6wZSOiEY|{JMd6$$(}kQHkJar;}7nX(Cc@G zR#@pGQg^$}AGrismKXQgBb%xJqa; zY)bVm)21%~n!&|1b)7i%)*on5$@CMj0N6v;@r|XjTLul`zPNV~ENEtdyRK_o+{`6m zvnh%P)m5|cq#WWhiV3Jcv=At%x0c?o5qQ(%_v+P!Rck)x2w+THWIzY9IQ7&}eLx?J zc{l^cpvF#Vo}MlVsp44QiL&%z;F8~Ff4b~|QijEZAafZ=up7^Upp!+8EkjT?EITiT zzx>Wpd`M*MMzpWskFg<`4F~;|c+mBE$(tHtG7oH>AyYZXGHqmr0LxgrsP<7BVNdhd z_ke$wI<0#osDbH;y|CGxeKeW6_2j)_988U@}o$^u##~4Et_(V^s zI|N=Pz#J$!d+Jsq*rxxv{KwR3_!xJ)ca8iMD-Y9(%;i^t)1NKb5qo~i1}v6jzxM8Y1{aya#D1dZnJ(hKLa;my z*VYnv0T(mraQJRe$nGIFHpYC=<{;RvJT#9R|2pW<+;d=vfu7VQ4*?Xmc7e8^2@T+2fAHu%!Lp-mID9Me z1;}ZGaW^W*H3|pj(>=uP9x>n!eAwDe%Y0{eG!I!x{NurIPIRA*;X=@P6hxj)MtO%9 zn6M9};uudW?=Kj|Gf2sQb0QY<0g*7rhU3|A$1ar#4&f;SVNE+mxVf4C8Wu1Qk6SyQbb0$3EtLvABbq+CEk$; z)3t>eyoMIHLtS~$X}e1k)wM2sSS^hp>R0zUHSGOq(yWNrERhgGgM<(X9^EQ+Ubqyx z<=E2kS1)MTAL zXBoWmr@8H=y~!Ca|O_xVsv zG_64mW<$LdO+*jzuzgf4<1cK=?HeC2Z+*-ZFQ-`dn%btf;`dwO8W_k3Cfs7#+M^2= zLP6w0FvF1Mxp{0CTWBzK({V7P3U)JD(Oq(Uvdr)l-fl_(+{ca5agV`-8l>qN8+S|B z!gv}#%DD4{j_sbuu3yA_g5-BLnEc@`x!8Qhis$MjW?UgRGcJ#00(glZ0{Nc zSH%}oUI<_fZMkZU^REniLBFyg#>h@I9%?Q3kdCXNLhD2zJ-nlrtM`QrU^A!d*V6Dm z8CZL^2;f9e0ckVESY(>KRRY0{Fs^xXzke|`nJFUVL<6KUZs0(q#aqMF$EiDD+AW(- zZ0v!MAe$ut34#bj+n3CoZ+fg2!HNE@+^VhJEMB0mw8B|LEll^N06!u?CKHit-nv9y z>Ys-;YNU%1D`gB^Ad2*@mfEIs6zowh60Dg;^48^Y2vL>ofrH|wAP|Ms_G`W{s*T2$ zHf#n2+2n*Eol}f+n?{y>*ITYjC;iEZK z7I74%?;l7Clyk^uC8N>3=*gS!>$_!76sZZGShu#iP^^Eo5qemC01O30X%!WKUq%S9 zsP_Gkw9)`(kwciHd#%g~+0Y*f>t;B%%2ZOVMW>N~K)AstyCE`r@amC|(_=!>*uJe6 zVsckWSsW{k$T&hWS;Yw_PaoKsG$_B8iug5PCFK*7m=3?|GN>{MF+MEbLL>a7(ZAG( z+T7H9!tE*;7~Vn}mN!J4?@Ib=Bh@lh=qvH$!sNzZbodrrpVb6x9|f*CfHFWx{G`^V z1BVFQ!3{k7Vzu$g2*J<|-_6<}`El6BYRFJBDS#oFOhNataLZJJY)=xPLg4+1VHUQ8 z!xx(*?eCS-)VDFsfElL2$;v~uNrU)pj02FTVut*CNz$77&jR#cRQEpLe)UDI<@2p` zFKTi9eR^Z`y)RDPTi2L8n4mv&cl%KD-iHsi57o8EwD*p+>Wg=8AKE!L{5W}#dv&b; zSl>KgH8fyM?+Klrb(`J_?h0|tva*`-kfOnCf$^Q?12!XwbEDrX|YJ1VO=k~|- zcf&t)?CrbfZ4}slcI)*IyRPlANceSQr%pnw+H+_j`Pr2>{riTalA>Pq-re)<<;%N| zb3b%lJAa>{DX&{t!6%p}FE&<+ZEtD#(m!HzXk<=bXKNDQ<<44c?>I*(`d44BE@Jg| z;>*v;?dSVFeRichF*R7f|8IRLeS$T1z!T_0VgKkuAy=mQ4=mhrIG?$AAV>Ls)Q2js z2=$?Z|Dg|6{;dy@|EoUK@xSUr-2c#ra1K!{(VqX*hq{FNP;hY$wf42&w*StAWMM)k zgq-gD@A{C;7ZtR2^@>WC&41B{qDZQ|9+mv{_u&i{HH#Y zXYY(W`Is6b)Q7zO)`$KQ>O&bMgPH%Mv&`7Ru+04$NRM+K>=yq$r&g(}{x|+(|yr2&6*{%A01K0joLCcJOuM*zK$xDuNSeK z+=q-VcOKZWR?{!1@I`F&*#b&4X5+QhqAY2Uug;iukpUZLE@0nU@sh1XzeQQZ&nx@8 z0viAmTGgwMF%LJuQhZDeGo(C(!}p#&u6O6I+9=zSqgSVnZK*nUyvAgqX}S-L>=qSW z&*;~5UFhtYgp$01L7Zr}Pim&r^YB+KQa)bcnGz0lt&hwXgZD;eedw?ygiQs2;rsqY z{oPIcc`K;ot|Vm`xHPkd1buq|ajwKbp%l>;4pfsXBD=_RFiAUoK{#x-W)3dRSfr!a zuBf+;*%sEVnX1gngco;3$qY|3&~wfli%OH^Fkw;$2}!$|Y2wn##|Jm|o6LH3TdY}o z;bT3fRoVpI(2pf$(WP1h7gib>t3}h(YQ-EVO;>~{BkhTPB<9I>xjPIyeXmN)+TApA z#(Y-LtbcB@JiC8WJFd#imPsjg*f_|rHaaMR@nW_~^|7*TLBhJMCPN(rcR_$!ysXq# z_18RH-!V0D{H`_mnkhDEG&FhB;u%A^He^!G<~;1 z*Vt;AE9bdn06Y|It0qgzUQcbsz>MEWB@7Tu(fy9I6e*k9R=gW*PT^AxT$aOZbFuct zvcR2^T&p9!Kven$H&YLqiSfQUBvl2;R5vKfF}W$8c3|6*F}Xbq!$z#oOPPFC;h zR22ukdel}XOHxm%D#cMJzd~v>JyREd%KYV%(`1s#&2uD45sQ@f z8V68U;6Gh&!*$LM+z({WX?P8c30{7A@IcCd^_khZ<}``nYwh*DQr&7v$xw_IA2pdD zz^HSWi8-KQz~@)0$FVY@<#g zoc)*6T{cYbHD%rByyNKzVuz5GJhu={idR@7L#J+aq^a=KRkBx1B3hIPRXxEej$Ow*Hrn6LgUq`<1B?d{tSG&NRtk zW>0R|nR|B@GuIz2%0KQWH*{kZMk!_asj$*IKegnW{%A#{Gujm|fqdwcNWQYb3v~pj zJzrSWBRvTh5AsZ`8#Av(nfu^g_-S-tH_Xb zS=2mbY!O0C`qf&WUUyH9rFxIA;=7mmrhg}__s-@ZC|UG9I$BfWx4&N154B>l)~U+a z0}sfHv@E!kibCE?lfCgQ;0gAy4@}m(Va5%i;SnC22X6V?!#q5TeO{|M{MC~larhEg z0zBxbCDp^k)pg!e_(22CP;0;whJBFc1}((`mdl5YQ&$lWJ{Yikqc0%F7rH4CQ(&Kd zPfsQ9*0^PLF6)1nG{n;(7bF8(J~tBfe&nueZuXf>@LFy=#{yR6 zg-QIOJGcKlzaANU-+cK$VjyJFn$sUV5h6S>&#Q$S5SjL);cFMs4|vGr7)w_Q z@&`RsA4!SzAhP*{5A}Fwl5p2d`GUOVGWKOV^8h6_Ky%+aD3-TI#I|rTTG=U%Qela- zu%H0wHC7mWRw+JCXbo*uCEPMp%g9umV&OxG*&-K^TXto|WnyqA4~>x-cj{nXq&LCZc)xRLn$N}UF*cMj?qLGSmoK5I2^|;2zlrRHQps<4iEyEG=0uhHC$d_E& z+(NV2DG9&E2?{MeelH8t#6UQ(T)-98F-rQ`IK|pb4AKhM612f&2R!hrwL1;jLQ5QI z%F(`@QO%B6Zwmv@u0Mx!?-?2^01m{LJQ|nBHzu5?YxVEX_$ zqQx_&VtOZ%lsDmKyL>WFZqQ~x;Gn;TK;DO7ijl{Z?cK@*US(Psn_)k4718E3>lq98 zVt&gbPet$)4{o3zs-q_^A6Ndqhsy;$8QMN3G*p0_kIgDOb`*=u!3D9Z~zB>!8PiCXsP-#??EO1)JJ3TR=9nOP}Njb&{ zFn4a0+o07{1xFv^stTG=yFD zCANW$aGke)4plm=oP;4hT(3s;09)Hf&fkQ?A1j?#9sEs+rP zefp7E$-vp=*cKK#o&%$^PHJl)woWG!?vO8c5pB4r6fROqt|FCd5bst!;;XX4K{|61 z*Nir&Yal8h7#;(&B@okm=`wQ$6zDPKJcMX8?fNpznud5mA;bn(yRK#7#|6YAR1^zx zK97Y=p`k$^2Re(Ni%^ZTB2>}9m!v)Sx2Mx!A#B7c8lbzF76AsFVkRV@SbX?y#x7Qe zWr{I0g&9TA&a|8|}uHp=HUB8`EreTtA~K=V)F70t1MyeJRZqo>-Tz6{~ISv(yP zKMy}V58KUvYF??hgV^lOIA79wqWvwt@C>Pvg>Ib3(q#x5M9EHivG-Ky2sI3`yJYiD zOU-vsb5J3oaW{I@YOB#)IPgA(vk$titu;)Zq>)g)`zS@kmTLHtXw@?hr_-P@A=gB2 z(!^|U+_`LNLx&geu!|Qj&1iyGsGPz8+hOe_{>&r%*+<&m5?1$V2s#sbB^wryaWZ?w zAs_%|D}V-akf6T>s7z_ZS?LoS9yXGQiL%FU;D@!tB^vSlEMzEyYeT6GzDYBXw6li5 z_Rk}Dzt`@8+tW$M#V_a@{w4XhETm*yz_BGS2%P#rWQq?zz+-|ulEE_U5Cd_Vh<#2W ztX>d?i`>ewI|m3!gBL5?2zGAe1qY4%o^R>gfg1urBdSnCdd|bS8>yK|5C&Pzf97MK zQwh}qu*GPkpA!f0kC)@E#07FwE6A4eL#_vxTx?86NU6{j zVoQguZ8})}r(#NpkhxpSgO8bO#4F? z0&pPZR+&)@Bw+rw#Rq&Z72UvF7eX`)aME9Is&q9%x`$SnJ6QjOf;>t?&Uq^(Qd56y z)-!Ry$#E14NW9I|RGvynB?K9efO7qt14Xpg4~o;ldK$Mqun1B{^$!3EA}$7)ix~o> zcU@`DPzi3-` zEa>hnr+_D&i>-LVtmv49l4EkfUZ!{j$Ba5a=-n*yYF;P^1s-1K-Cza;p|=cd7DQ}L zPcr(W%$FpnD+KmcL;5!j0-Fh`T_aN9oUAqjTf*Rr2}s__((AW#U5Iu71Kp> z_74d9*Bx2$ECkXDg_x(!HPx%N|3_)ar|q9Lvr-E$H-W9Fgm%KXQ#9-U0|Z4vsVC;> z^)fRG{@*s7GmUupDA^_szqdI$=JT8Fo}b2VN51T+Xn5;hu5*)?0*B>2tD-h8JUhJf z_|uqq#HsZ`U7=+SZ~8vmIrTxh@Z5vYQ#og(WEVrHGh%ALH;})KzZ{EQc++(?F78w0 z)Sdbdm)Dm%b@uGnTuygAfA8?D#kN;2Em2?kM-3D69}(8wJW*$-v$nMcQSl&Z>e2U4 zz5C)4Uw)eYELHM!UBj`5-Q?k{aK+m(&tRn!F+(UXM(n##|H3WYSwQr*ka zmUenwq#>sbD%C4Z?9E{_@zcfbyPQ<_3oF$p5f>*56Tp?(g*?C0!b){$vAt$)@XhS4 zFZnSSPnq_GyiI)7vBT9qTBiDu-kyDGIa}8My&-MVYQppv6v_8_ySj)uY zWm!nY*|5A4(|1pzNV=EU*3JgerU8h`oa0x5%dVbYa|CkGbLA&`b&}KUl8Jcd%h%8R zO88q2l0Rkqj(8UGw;bdQ4(KIYLvIjBM?2UP|SZ!>7i*a-sFj4yRJ2O95&1ygktilTdq!@kAFY- zG^hGe@%L*DUG_g$Gh-5WnPm5EVD~J*ByALYGsGQCg~=f;WjoopQt@LJi|o>v%gLnj zWA^2rv4$~iz0=#ZBB-qyBrh*8alg;UF!5tU+$2=eI^HdtIyJkr-Tborzjy8#9Ular zo*y8XR2DCol6MFDW=eZ@^tF7O*pq5W_Mk>|$TxRXYYyzZCMIFon41ogL&kUGg5sa2 z=gV39L}ZfPDf@+TkZ!aHdN-0IiAK^y20tO`>~^C!t;dxoK0CghM{M~KgHL)rsj^CZ z^7hffSxYSuG#K9c=HUp_Hf=?F3arUI4or_`g{HHV$!*z|8jh6`bIk7fHTy34=sJI; zw*t)O+DVzC(bYjEP7W4l-QXHBY!;?CP3kNizG<$KkVk{6Nwy-bAb$Apc~R+N9!v~A z58@eZigmt)n*07A_TKy->i+TfAIxTU`_5P+(nw{`*d=L5LevnVl(8>SgRyU;D2f_O zC8-82BsDYEq>Nor26a)Xi>RyJc}~~${(Ro&e9q^4JKx{V59bdUxB0>CHLvI6d4Jp= zwD8L-c)qe^%K)}p&I8H%3;3#al4r1~v`(E(k>bw4{BxSd&|V)2#_oCeW1KW;&lW3F z$r%j4S7|ls*57atxoBcYy~t0ws^FCvQKp54aG(cDo}qSX+7yes(|OV?Faox9Fx%BN zO(J4JR7%kqMv}L|^z*Y+zItiJWap}bTerGjvACpHw&GjzRle3OWd`aTk!-i`G6)IC z^LZsy4#5n8LYYG6NuDKkDzXG?)(So$ur2%y3DsM@9NlEJ4JLk)cPB5 z!xe8$jAvcd7ZwHX5W}mkq{A!%0>IdP+EurVx4X}O1DOzzC=oj4>R7g>imAAF#D$E` z)S?V~%?P8FOv^u*9p3A0umua98e5HWPbEp$#$)yNJDeL&?5mc_hlt7gqTuR&fvTM~ zZ(>_!ip+Jj7$TZSbocAI>9Ry5&r+efentaV9ZTyyup2@r&Cu?oz&QWWG%0@YZTA~j z&fl}mR$dZO4qLk#s~A95m$@&1ZXyLr z1$|nb(mz<`>^>vB9iggV8V#k{ai0#H8*g5ad7tRRML>`3LOao6+d9>~rYj88N9zu> z4K)^qK|%G9#Z$Iz%%))eYI(H5FiNJu&*OeTIodN#i4olsHd7OT2*|2{e8wgdMdP;A z^5hMwoPF{?-+#OF&zvjfQ#+(dasDJxL#DGmD#cE%fsCxu`ixEVOvg|ltPhaX9eZdo zTx1CQlto`Ib;KqQmQVE6S0?@vs;iMxoO_Q@8nqPkncG3SQK_>sSHASKg6DM)%WpHV z>{#1yBLygjiYZ~S9jXbT`k43Zob3h*kLYgf$eHa3P0SM776}W?Ghtm+>6E?ob&uIt zYQZLFo8#U~qMFK8ZZc=T4qtG*sh>QUy)&dpJPN7s-Js-Bx|W#Qu&cDW;^BoCE(wyA z&P_Lt4!ZA|u;r&d&Db8+Le^!bDlYeGmVPROrw6SlD~};`$qkRpgEXXD$jym6G5H4| znsU!@x08a4(Pku@<7<|Vmf^b(2>wBL5QFQofy(z}_>M z=eBtXMd=mWR{uD30B}Mu_uDt$Ru>r2O3@T&F)imtx1z^^uQWF%PHq2?=R^0cZ>DrD zV(J*?p)G%W(97C}+s&*=?B2B5f>LzVD3iFGi#j5i!CvdnJ%CJq;}((Bn-{tC%22LX zjB%_<=7>r+$b|L`V?$q&-Q z)3jsMy@Sv8|K+5EsRq0Eb~;8m%y-Y;V~s2PQ6VJpCR)7br?`jl^e##~biuQkj=J3u z9}C$^Kl?94h=@NUfgidetdhxkszk7$kdiPUB>DM=dkYgSawYNAI!rqYrPqskKo$2T zlf5|56U3dhR}}sc4^icmN=}ke@zS=oakOKz3}h2A*$ozjFpbh(cP#794X zihjIK&1aL45)$vCs7}ayVTG3l>}2vS+Pa`AEY!(A62TgL?@|nhn7(jjZ#@JPN1$3j zVa+VO-*|d{tS}vV1JWUp-^!uw3?-EivZ^`k~;c;7n9VT%gHS?kx5vMBD}9 zRMZ0pnuxZEL}Dr24MN^eh4LUV1P0;OZq;H*X z7+?QDwvzRV&@r@AL@|eVAf61}&)(-mLbTA)pUY1DJcAAG;%5%#U|#c`ZW zhXE_{14u3|ti(08EKIQfl^A@K7$;RGB!fyRxKsj?&O*|uj!&4l(L+ScC&XW}WG^x- zk$~~Io3*N&eus!~B%RW$g|e1tePs%TcL-HW2+$(~xzK$*E%5)QY;|Odm7J55P*4FGQ7RnpPHo$f_sWr}6meFdX3!|okpoMA1&yM| zumz~hu#jD^(N!$?pxJRJ0%mt&v9zQmrWk&jRxWr`nZ`usGF5|Y@kunOH|xTCCwTc% z!~^)ngi-fq0Xmfc*FsW31bCTg`2DJaB|wA*VL&epHD~1#kmW2@k0j0fCR{w9l|Et{ zOF%uKqq$DIWa}%~0$>^!4`(@CGCdA*AvMKA)LuL&fzkPu(+U^peDn(Q^kMJdc>;dp zH|uJJgZoK{^Dqp^rlg-Ax$ju=aBayg4}#b@;z4$TRT)p-C!Nu z>MFKi(DV)y>ih;;|CobNQ*dSzT>(}TA%=ajPhGEM1$|8!W`K* z`WX=*#^jS2XU{44R9%%Fdd+3+HaF z91vUEe9BX(`$7#+vCUz`cO+0E!>o`tFOc!i$s6jDv{O>OuZhEoYa;!bR{poyIA1cL zete0DT0r_xF;59OiszNq4TmcgyHptI>+aL(tidk;A(1`I2MwD)b7rmchR-`#1Ozoe z#`b||2=u&I*tg5}$HG+N?_hKq#no5yw``T8?8XgpP}xL87zD1TWp@zFz0r|(2-roM z$pq+yF)^1OV?McW>HeliyC*d{SYGS2b)PzZg^iscU`LiPqZDlZtg=HMu4fK&xedeP zU;xdROJ?Rc1gBjwuo>1Ly()J?}szTFowuPMzhq8L(;D48w7Qs zLL@qJ0FlIj2YYM3;b6m8D$fdt01k?p=?DtkZ3Ka+`NYoPuTh>jBU<=Imhm9Mpd)n}XEg<~Op=3UK~ zIeQD3hRC{yB}LwGkvjZ$To&-kfpjv6UBAgVlG&K+=q+_=}Az zygh(ZS30r$^myc^qhyGRdN0Wpa$bOE^zdbW%Z4-qxfNjm1>%P+a}7CzN&!d(dyUmg z{mOap!}t4g*F+@O`%5Np)RaBB$u&(+*&@o8oktfHO)4dRBSQFy;`SS#jQ0xqH*e^5 zIQmb0Onievjl`qCO_oz6#l>W-0`cjL(WvW^t*|@B`Q06(DVzY^F^F8$PBpKNq@NI} zc^W1S^bTzXY~4p3i3DHDe^Np!*`xmdK?$+>VuM`Ult=d0pQi7GiqW7O)8MiJgYHk{ z*S~)z#)0j&B9y;)Y?3nO#eUwf^Lej`L{rLS(1ww_?awc%jJ7?QZ1tCY=s!Z=Ind!h zqI2|7Ps;GEql1s1Og(y`IBSr{}&AXKSJpLGD64+ zvZ?345<(34rsmaC|CJDWB$>Ou3fg?y?tc*s$+z0(>Rq0Q%KBdjp<*J3y$QAHef}wvSg!(Mr1HsULC4}N$Ub^t88tzIf{Tmai(9i!H6ACE= z8)l0ongiya8;p0EFZ1`*b}k(r|6L;6%RMh@x!&qdnC27X{>^i)Tb?7Y@3QnB6p!W1 z_n&_6*xzF8KZJ1m>$XV;qq;{akS@|C;}(uycI zZg8>A4lU-a;6VVEAusP#A=VQKlcvZ=LS>F^p3S%TTvBsy?zePE$w70#Bs~63p~<(H zxm-mLOezfIL^CiMKgwW+bQfMNSj4D5>Nf_<%SuB!qaH^&ig#I5?Q@`zeH)j?*uREYqluUv%o zT1u0?C1B|5rlMTf0-0LUeM9-8bS2L;jXSAD#{`(|!ng>eB+0KtG=Ior9$h|-OJdKW zT={9TBR#GCd-&)>-W^J70wThMor*cY6kWIlvHtXih71GT3#M+lB2ojYn1QEuxx45$_uaF6`SGons z_~b8==0t~Db*kU_@%3_ecPLVGsp>-Q`$tN#@}ly;7BZ9{a3xA7pqe^dB!zA(Q^SO< zH-)3!nX{7T>GtbHm*ML|QxiDNJPG+K{9E;*e-NU=lEfXJ?>HTVw6og`!D>}%U5%#V z;98D5$5ytrEMr4ZD%uAlEq8~Vq3*_j-?|3yOBRIrxok-6$Zr~67;t);}oC56+ zG68{K!xm|U&-0cU| zPYbdRJOG)MAPwnXR`;!zmbJsPTB4i;GYm08dt+{0JMgLAfMf1;bG@|mS)lIG`nJ=M zd@$}#C)0GPkr~SGsA%*>nAdYN?kEkY7~qGj!}` zJzx?KOgAMWl9z%qZ2a}Tn(p0gU;6phKqqzkI>l7N7gq2w{gEbyryYGcsbu3HUu`x( zK&VBDh*9|N_r`ES2KHV|tax3!cJf-|6jA%NKArV$>x*Qi9H0Z@!g2!Q0AR?_^mm!hPbC ziYcW*4O*UuY`xnu^1e$?cQy;ATgx>xd-~)I?o__y(;Xb>XVIv25-6nHJ?^NH zvy`b7WTsf3H!j$mVUyIY^rZ7(sM>?aGS`WKK@Oy_2JGG=}IlsnMB21wI zVxz|q>B!uD&KkIe?CRI48mmi5ojU&3=-^FzSP(=!`bsjJA7vOH-+dQ-d|muOZB(UL zL=t3cCPM9>Av2N%=#f3YV*7j?pHQmsjwW29m#no5%{=ks_8#22q<8Tc4m)wnXkr05 zXnPNoLGldnRGF+nyc6B}Nm5EA8!rpo%>q!6vJXcfo9KrdV3ckW2JemGGSSIS$?XKB z3w=B2snpQ-#R2P3)J8EQwCe96Gk+t8@nW|sBDAjt8qY$Ro2EBW0l0-}qn-Hk&~C7s z7AZJHu!r%e_>8rcq=MhtAt6Ro#rVl|xVMa5rC?+_?LC?BI`ZKTC$Bx(=sHuc17Ca_ z$Yzz%Fe(*0*_4`;Y6_yF8@3i7DN1%t{?+cdNdo-no`6D9XiA;8QCxmbFuH{%e%KyX zx(5OIoOB^TA5rD`caIDl(~r}jA+MlG>^;{)Gp>QCh()fb0jFZ|Z>$4hbzvYXDs(oQ z<)K_@usu5PCc%+D@9d0j6wuggUnP4Guy6P&*(099;d=q@!z;bKE7*gCLrV5SbM&Rq zLX56(Snl8#7bgnh1LbH~sN9YfTVY@{n2>kMt&pC@>3|+$$6i7(@oQd`DoW6P6ZC7X zxLfvnk*RqvQhh}2cPMJ$kWian$0Qp5I87E&2y6rmZ4onT>q z)-Wg3{TOt!L!Ho4CfZ0R-9+5Kj(|DA%I2FwTM1!b_o{3g(*Cst{}h4}j*$U`h>{?G zD(*;+*_%07Erqh%rx5iT&19Rs8HVWumko_8?E~XwGspopm{dpRL6E6r=}uGp<0Xsd zVS&CJWIHEul{*2LQbPEI(%1%<1-s3@luif7I(C5q-$R>0oB9Ds1_OWsyNVXur zbJJe4z8cpO$NelsEgSuS9k2Fn*OBK%{u$^tKKeWn;X#J&yjAH+gg13WPq)f7|BEOh z)n8Z~!g@#6{3HTG5H!kRmK2grEC)F&i@C$R+)fO?L%_69rQ{J5^ynh_htXJpumg11egV{z2K9o#w*N(z=nTEvrFu12%ZFR9Ab}cQ#YD{D%?Q%QO`fKrW?g)^ zBh$oV!KLig?vk%A@!wpOKxoHA|2$p2E>Z5UI}!m=dl?c)2wU_iZSPBgkPEm$(wW{O~p-d>;jCVPa6fQrJR7_)^U% z{JrmoVUsy9YFl>oFf4_7tDh-MTXdgaSsC0kbVuU;D}@CC?xW!RpSH>$NqB(7#8TmB zjiGMDmNb2+3mNK1h0{5xaqx^JVIEU4pz1ZsR*jatR51wF)`j{ZqguJqGw!2tiYrX) zV*v`xzooDcCm=|jdGu34;+lj^KOJ-UJf@q1`@wG0+2;TXWsiN>OefQ49r%w+Tfn>^ ze-M8qRqkQax?y0#CbolmP9#JuiGFq<(-g2o5iO+;*KBsY6CurAQ{~yH%~RWkz+Z%j z$~20X=%)P55G9Un;q7Cm%;37o2rYqxtN?T!D7GZ%vuG*%v9 zL!iq;5!($lm}lbvImGx6awwp4Xvo%^-m&9{Vm{6I-?5>vhVFdh4#7Tcw``2IE7x3E zQg;pFcz%c{goePgK|vEFM2xxapdn{l64ymp(rgj#(BSiV=|7nvhFyonkSC8L&$g77 zqXi^?6DCA{|6+#98Z_ovcrpZ{J@rTi18tR8e8YE6zWSILs@odh#c4d)%IV58lD-Vt ze!Nlj7r*@}Xpjjuw=-IGhn&s%kAmEJ#+;N3RV8m%g$dEuOV=6}qrV7Hha#U?U?9LA z0O`Qr7aagsVqb{(tdEZ`Mv_g*{n3_^>U``p(X>LF|E@%}z_>SAVz5%sHD)Ox+jn6w_}KzBDz`T;n0O=0pux);vyl-kp6V8 zanv(TIC(FeEn71Fr$<&i{<+HhF6fa(;<~9w5_4eN6M35y=wRQuz{op)_sF!%QvObe zMvse2SwU2}W7lnl-2_lq4wORB45dr>s5~wd88~a)LS>IyFApua4$F+g*uXAy^vT`! z$qVm?+OU&ZmCqkyr`mVQcDxw5S~=SD0{kcSJXRTLRe3yseevX|?C{QEl^62kDkJUf zFZig+$(QY;I{j+@9uG-@0$Cj7f5#04{LlXB{4@q z)i+L)ns5D=-OrA{d$dYTaM>_Ox1+qy{ zAS1n-(5=blY1`y3tzhp?Cn<$kJ)<0Zi@sa-a zTGyX}AS1H>YAp9yUR18gY9&SrOR6O|A&F_ar*ibVD9t#lRsQX$#}J{IT4}?aTg=W~ z<4?@@I*H|}9-*v>bP-%3xE6w|vP8FH-WOZnoo}3f90Ng-yNC73#`X(GKbL4?RQ(BD zsI)hAFhkZa+s$0o&szj0;l@lw8n5<>RlKhJyeE9?@1Q95P`9zghknr>f}1k{iu{Ec zk)Q6s{gta~C%XvVBV1QYpLgN^Subf>j>}xTY^1iG;~|-8z}^ed+P8H5q?u z<2K^xgs~iFk1xV?AwVfIs55*Z@LceHcPS^33H3(rmz(W@t|y70DP>@roeI;Y($XH! z@nr6kphhjWYO}2Kb8w-cxxP%^L%DR&gL>5(@7FzuGlhh)wt+MqmH zwn`uQ+1ml%1ELunML-C}1WKMILDl-`FdeO%iTf9*O1BzuGKc>(E_jSFVTDNaz2E~$ zakoqbKjW`1Jjyr0PQ$QR+?iZmczVHp9l5d3b#+kkOdXW?oY3>NeHYr5Y`0~q(V>2{ z_h>f_Bt@wgE@$kJm;WKUGJA!w1qrOwWl+tnjpBPY_sg`>yA0WHQ2VlNrArqWnxZyv zeaoAtDY|xBZ^b%lSJ`=Dfpv)7bv>egPQkBN@cqWp+5=0^z@j93m_fKYD3t`tidlu) z9yLPyIlq-GWv0v25p4|wP1xw-(;M|xZ&`2dRO99Bz0g#Zsi|umTfGBnpdga#9xf#} z5d?FMRv#{VS|ZbGx}ZaD%-TrvNZd2Ql4BwTYpA)hAqISjUm z#FJ!}b?Tz(DQOxb*TjDw-g_tjy_=yyh-j#jEhM6nmoRjBNyIjJNo&}J%|3>tlGEoAxmnd@|0y8AOzMI6|van!wL3vd-)Akh|FQ8mg z`bL3D(XLspgYYCz_u3mu?;Gy&y?bw>UC&^F2FvxB0fY69mWqG%zDcOrgffCz-ydv> zYOzzyX}Bo$3J8e8d9nddZXOA4n`ZZk%7n3aKj>fJahyGN8+SWz87n5+w>L}LF7bl) z^<-~*o^~(0{a9x6JCt8PPtpT9Bg5jOlPgS`hjM0AC3(1lU-gDBbkpg_bu%o(c@hoO z4dI{K=6>C~!;Yn;$ui>^mi_NJ@4o^8Q8B^R-N29SeeB~6Vx}u8@S0*b`%H7Vx7U|I zsYm-Re6K4ml>FpIe&dbULXbrCN%XHBJwdcxcUu6p1Qo{@i;Wk)w#}y=Ucq`GRb(gL zj(rS3s^>w%8pcHAH&IioJs{~Wc7teK^s}L|2Uj=H2D3G_{zThz#4Hr^XRlC(h<8|6 zcBc_Oh@u|zVrPf8PNVO(6(89f8TY33s`|SR7+=1K<-`2k%NG#Lf zownks+(PAH4|&V9u@nrG2WMRMy<{FHblC5XhaDt*>Oc3%NfD!4ZB`+qENWCY{~NZZNtdcz)^yq{-H3h4DGrL9M12mO^@qn2!n+&aZ=+q>ly&M~1z z_7*XSf;&Zb+57Uesh@2)oTid61o0$ z%2&7qvqz)*qv&(1i*1Aq`Sr(Pdi?>aG8-d8E^IYS&tKd}y$_eKF59)mQ&grIX&!LY z=3}kq&xHG-iJ5oz>dX#Q-$BJlchdfjzH=7#-O}9{o}%FliZy>+ zw)IQ=p!&&}u9LB{4G^(4>)R}bY3Sp(ZN=A?v9sk76Jlz=C@2f(n=0`^n%ICIp8Te& z+@hXUzi>JFvH6pmW#XgP*?NEmNY=3n%bUw-gvAWiWulaky1L;RxdjfK0*sVIcmdh_ zXR+T&X#*e?DT;v;`Yw^!^>J`$mhZA&*fcpWpU5q;`9)hTtSpnE$CB4cU(~r)F2R%R&mR=GDxW}6m>uk(1~W~(H-=7TK{cdfTgdo5a_I?G+QR-B!~^ut%qL`y?NKQRM0;%U zaUmkGYaI-u*FeyM0b}+sSWYVo)y{&?Il8k?$2$fqoM!w+jFyczf&v=Eu|*y9F)(*z z!UKt@oU@q$rAHX0hhEMfY9XMOWsa=zvMR3Nkw8Dhv-n6-vb8M!x#c|#9jt8 zAr4HYWm2IRw?b2i_*XKy7j5*BgP!upq}3SpP#&0PGv6f*>?wz$Li4Dl=rAH|#qLB4 z9k0hY5$`VCycf6elopHVg=BEzVAUModrk$e^2ayG*?8(GuEvLOGSK2S*blVA+Z{L> z#Jm;;izOB;o1RJ;qa5aJYuN(LXJ!4UQ`%*0C(Mb|llnu61x@I@HQkUiOKAHR=C<Z@%nLBbx}M`V#d3=MibEU2}Xr#Pm^;bWC{3j1Hap`|Tg>Fo62nQdjB%X9wz z0%!r{Y`hO+X96N}#PR?YdXyh)g)H3FLGYlJ{Sy*FkSvbeo-~~s?84plz8);(1Nsr4 z@(9FjbgZCw`QX0CYh?U)-TXmyJf!tMg+teV3y0!LwcZJEnMCN(5_4d7N}-~G!w?g8 zw1J9-euB4OwNwd0c_It-GVu%!VXn3UScm$A)}j3$ywu}Uak0chcO6bd5Ks@v-fUKB zYYVy^A|6Nx-6kE|;d$X;qTDPw9|NpIOBb$vy}$t0A&Qj6igFYQ`d#7ZehvZ~9M{4> z?Q^FVu83g~f{Mm0rGlWT)WAKVCSbn|%SAFMRnjiVyd^{rEy&x$V2X^eBiWpKV-m;* zX6qcY3`&dRmC-Zk2P8C$jPRpoRY_TUQ=z#_4oc5Yo#5heGjJvZ`C(1`;$kauY{{xC zM(ZWpf=+}g)>__-gHi?XOxl4aU|R=K5wZRO3028K9EHFJ`HAUziQh3S{i()z)3{?0iz#Qd3U7616L9mEgYfmcFg9iOs zZyumy^CJkF01R9um&S`_?w*ri2~ZqB1}$x}f=E{{UH6(TdPhbDlc1ht^JlsHRzs{W zblS!I0SzOd`j<9VUj^dHNX1B1spGhB1O#M_FVe*h9~?6MLC026;BI8_jeRs@+>Y7b z+RuV!%)tve7?At)lXhVeJZsz~d+G6UTxu2d*rvnl?$24bau5LoQ#W?1#^hxWDySX7 zLJ7hlvnO=SBf$I6u)QW0#^-Pwn~!PRxL!!bn?K$h>48(J#y%v8M={}6F;FiCP?p2P zIEb?x%p_^^Bni_`6{bZ494x5vEt8^?#)WB-MWgtZ&P4ymo8A=TK2!0_94zR1^^h>V zYz&`*9ZSO(7pu;LK{V3cUbgHc9n`(?5u;7Y9@3K{=if^!dK;On3UFUIxK%c8d(GWx zdHgsF11fFb%wog_wQapF-hN*+9n@v@BUMiNpuLo`vY#@+t=he_tqAY~L zYoa6K6A{$QP!=0b-x8l`RNRJvBvAa=L$Tw3%Z8SS$2sXUsD#)?(XYkw1g=O(bgEoa zEKh&{A#?!|fj@ikAx!lAeD7A# zq$!dpl+Dc>RLti;Y~f;mkR1J^2yf{4{6wCMs96l5YnP>@4u45!^HyZ2z@JhE*#MXsC;AXqU+3+iEx6GYZ|%N9=2} z?6v?r5nqiI#5)8xqj36VQ)Hd||1OzbSaq*E(?Nbn;(s+7wE!hE5`L+Nx_d^yqm?~m zskkzaccc$fFk}7#SRhrH6D==E{v_hh&d34Z5N&yU)jf7%7*7JeA%Nfejo2EEey+0) z`Ztou40-ZDNh1EBSmdC)m88>?U4~gO67UU04vD3V5Ws9F1x~dhTza8Mj2wyfAHRKc z^2P>fsX>rpj~g0H@!pSeR3y5wV=XVHcHN)4{bb?>_67Al@99z55$xE*_r1@oM(--@ zlzfpg@~HjsjMXU3|K(uH(87kP)}O@xnii$}Z(3&mFD?3~W%hqpT69WATR3MQ6Ob5O z7&Z3wC783X8Qk~)IqVEfLt?D5U|E-is_nv|GWp`PTs@YwUAIGO)b2}_XNRtaT}}`V zmC3aR=IYh;S7$lIArI@8XP;}W&xvVVJ1C*c2HBF)e$&-plZvO$^e;bnsZ(h2+*>Pe zBlkzZ;CYdzw++{>KkyZ{%uM#1$H35wch19qx6C|yNUhL=44|M+|3^VxS(;wtCNCq^ zr+Zo8@voNIFVydrS+U|B)@0kShzQ--HrPRwB(I~YwQn~7Hn?7~5j zvu@^#4N}j{-(H%3^H8*B{&(r@SnE7$^P}vgCQv$C4DT8-dFgquVDq!k4xGi0PECBp zv>&GN(2Fm2CDzec*Gtq73+Zl~n>Kr7DFx>bcF9p$Gu^7C$lV2&t1X&kV`~?Ti*EnU zjXWaOJ{xaaBo8B%Jx$f2(k|2)hO9>@&_3IfY&zv**pfkfd$$+=3Xi(-&r?6Pi1n*@ z$#WU9zO>YgcfQ_LFj-%}LD)MFQyZu}-O{+oVmiAp>_EqFH zs|^sCs7n>y3n^G-6Wg9iRG}-q5f-Gv;R!; z=j<0L6~H#uaxup!9g4j~_GUdR)8bO#R)%+ejBY`|Ae^EK~ zIYWvifI)l%k`P*A%3xU68ElQ6nP6xeaI@`S&0r6(Z0BxJEXK^L(A-{Pf5P7q>wn^; zW0=NG$>j)QA=7Rx(MH_QS&S$zlIsG7qfS%pwY45)@7NqDb-E0yIs}0kP((7sH;d|z zz<3(&2F6qDa}GmJCc51BZfi_6GmIE_L5;8x5a_{}F z=!ZxEe>6`r79u9)(YrRF-kVmEVk~J+9%UY8&jn8c>+x2J$IoFD)L~GI(}{fKJ~3O( z2F9Y0;=zKrk{VD{(>EU!w=d(0ql0Rsa@Fyup`CVncFWrRP_Fb$Z7jQS1GTlsp zb(`E};ggydCplW@@TAMVwEn4ozJ_#uLb~Lau#SyEVk+9G(73T;To@@x^2fsCJGpz| zB~MSGVkQ`xL=luvuWgNT#yh9^^?M7Ri^^VRGnD#sVFsis+_A<3rJbqxOkl1qKfcF& zN+MgG&Q0=Siz<`3$Q=v~Ip-$^ySKEBT)HPJdnUBQv;7LxW3{8`l09WT$dGiR@_c*9 zuY8^{a~#(^H7a91h5E-no@_Z5Q*(wWCVlw|Ot(Zt2_a(;@zka$P}d&!1yXqH9HL#n z?(%Mk;f4f}ZR_ba$kH-I*RMJaR*IeaWkFA8vNkRWc`yeG~*?cr%{GoK6- zocf?&TlB9p9P-QS263s`UH%fN z!|Z-#{aT8bmOaI4#nD=)3Oeb|MIB}t=u_2aC6Bj0KK}x?zK`tiUPVMHB~wgRS7d>sACQy56b_9XBMSc zzOrxlaNHh}vH3usY9wf+A-M3RT5X)Ea#a#&#c3JX9NpQ$o9;ovfeHw7AV%qG!y0fC zS+-i~K&y)uF1W3iiDc3*)hGqCMBlS$a3_ZCfY^YpL7IAg;E%QiClg0QT0un7Q=V*f zStX=^opolD-?mvkLKhb`7kV2MxL&-J;WNRo;JrD=7a1hmZBfjX^D^u99yWBgfj7I@ z;2s^145^njOwaD`e#7pT<2{0D?X?AI(LKlDRP;%)sfD7oc+xpTs!xk8hH;3ev}C$? zpZ0+S=hh!8J3A_pVy8MHFD7%d0!WNSn_svkJ{&iUdj5S>87@oUEiHi>eJFb{L4kF+~HA7K!;x7Z03xm|m6e;;Aig`(IjQh2mHOi z=svJv~hn2M*U~y79j{Xj-%HSEMMUD!UPQlwK`ZST@c#Xcuf9Tar3{d9I43ok;FLQ zELvIzSI0i8+4Scj`#;C=Iim`BpAdFSurWWnXYGHdc~V@$ zE3ryf+e15)hjJ8Hf6IV>);ZE{nl>$WqG@jXV?oxiv>Iq}3^G9FVAPe-5;O z=3d%TK)8zHF%jN%juGti>TZoy)<&caHcHAE#A)A~Gs9>RpPdt1$J}c8R<}D~_7L>y zQdW1J(w=5}B#4dHBy9PiTDoFb-3+V4zvs;eUzz)X`G|y&yJ7{}J}#$=hq#ics(cEV zH)C!>I_ykaC41GvDj~ac70y`48RT-HXrTccm9_PBOCwk}+w;%5nLuwHDE1JrmeSi? z>F|0!+9kB4VgXgDL%y9Ie92VBil>c=#7>YvxdxdRgq~&TDpXS{`IPY5M4aB4I9+tK z99+EQfGZWV!67~AcWm_cs2PI;x=+ZnbkzpXccT3Wwk=?|}ou$+I1f;kD3XYaCQNr6^9Gy7CHL34xpU zkcG-`BFgmH`~G|646Y{}IqRT7^}8 z;s6U8OvbJ8)s3DB82k zvz~JaD2#NjpyFs%qctppAj}U4u|G`3Y7+(2URM2|R|4oVQ0cQ&9~NRQVDjh6MNKSDObr+Y%8ryvw*R!nT?$ zm^>q00XFM2B2xDp?$5KSavnGUYsG@-M*vHSbx7Ib;7YVONP-6~!Jf@QU6|y?VaE$l zSU&wax$n#a_bs5RW=%y3u_FK|aWL@=Y%mA8yjN#p6aM}>s7TCZMR6)lXD zTv<0O(ZW_9Gb^B_bNKpXa?ISoPTL3o_AM9iV|sC*-N zDPXR<%VtiAy1g}cu(ks`o>*yXshR^ZcUXKVe=63Bub87Q)GEdEA1V%QYx00oV5rlg z8h|sh7ULfD*iujJ&AXXUt5ED8eP))JK0V?arc1u~6L52q7I;1UzG}aN*s}_?E)2w! z<5KB?voUyz5zC2m+ZQMzt>r+qL$1@kF zo?aho-|(X2`jf^Nieo7+M&3_OYP}fk`q?-AWUL=MI;S%FOhtA6$ymEe&$}lt)qlPm zf6xE^KY6O9Ah`bqGpe$K;51z-oErmeg~Do1i$rx-5z)>KD&W*`pjsj<1HGnT?!S48 z!e{^GDQZz}Dc0>Nfac<0dT$l1QhxpM%&zCgq}jE}zDSE6>);XXP?SfUlQGY z!*jdjb$hd(i5L0n+$!!yP4g@5_8Pu;`QYSmsl{K{D@-Ei7oUw>J{;;%t8)6@QC-(# z_hToK&EN01P5troqE)mkHfiaRf_67}?Y+8Aa_{kbx7olW6G+}o{t-bwL{J_f_AJ;k%?`y(u>r~SNTsHhZvX=Yclo1^%p{KI#Iq9Udl zU-ef)&G^~5uYV>PMj3%-gMuyCfTt{EfEINrxHL|yVvk=?R_$o80!Q=13bW|8HI*BMK^FNt$S zM9Ic?hBl|`Oq=rJF4*~7j#&<)4Ju=O9hWkw(U2lGRN+EBmz*^($X}J#TF@pii z7sw80v>>K-_@*onRNOxs7%sq|OIQ@C2`69m=qj`{Q z1eI~4fi-)tgymL14yD4T-R=kEY>7Z0c|WZ9wz=Esr*x)iRbPGcTkQqO_P4WeDKL1BspJrO0PIs zmXK=jlz}xUCz$@!6sT8dW)c4z3tRC0edj1S~8yv)grr#Q*Jd%oCO^+`I)Rueq8ZO zr>EsIiCN*jnz=9acbebZOT6V!8@EZ{$&$4U(?xDf^dNSq88iyF~#&WE}_QcJ$mZSMl@ZEu|TpU$pIW{xi{|-aVCLZ`30N>FR^5 zo>Tk(Dm_}8D!$+OqV#=8_MS9RnbwK=!|i>eH{(WSS_lqmWdv*eH6TOzMyqwa*oi$k z5}@v9us3k45p=M85S0Xae!9VV9kQ~G0|kZwM-QXS@`v*&rrnl0hep0uq^ovOfZ-^h z!uR@|@^eVK?5WTU{RVD5i*`ME-;U|gr{h(v5SU^a<=#d@74A*h*sIERh00kBtLHsZZZCo|nP^%^~`CeaXSiD4x4RasYLJ<=F3>e=%YqT}Iqyq?i9G>;9R-HB=PDK@)y%?)#WR&w(c) z+wJr{eR_{@CdEkrM9O+@6#hS$d-H#&|Neh_F#B%b8M_c8S+k5?l7@te8e5hY`%8Y=obtR1X+f09DQH<^C4Iy0TcOKL|&#dK=<$Igv{ zgJsAY&5g|uj+UH0jtZwg-E*$Ds#&d5=C&8v)+NZ>#GQdJpLa4;{}plSgSza!hSyoA z_D^r0oxxq7)R3wWKYm)CY!~F8UdhOI+R=epm;28}dQ(TRhLr81A42zj_<-yEL3+Wv4dfTL+eG_u`s0QQv zfiwsGC*8Hx@#cd3 zP3b9$?5@Le`^5BnD{>Rv_R>ETMm9k8L(!4@@M$kYb$&dHzvRE}XA$P&hS0uM2a5vf z*|#SY6$@^cY`CXdjP`XC)AeXtN^72xRr0$tQ@~jM=R<~6*vefg-N(M~m&c?K#!4~P zlE)8bZL;ut0biBBK9IPnRdmSg2JG#lU0<5T9N&+ezqppFX4U$nT^ajv`LKYImgzR2 zvce}&+wpC=q{>COE7fWTA6CXfUrD02@G-rl1gG*8E+5mFlaTWSRrAWylZ9~DbFeNj!77T(?@b-G@zD=5lxtoWY$w31WSgru0;+L5nwtxJ!<<8Y7 z*!Zve?}}^x1W<|XvqdU9gh4Piw**Int|#sdC!#aMbMUaeV4{@uWE-1>4&cC+UP2?8 zII>Pg_25pV2iZ68IwTQpt^tmo2@NDpWKHn)8Xm1Y3nuEEX`{=uNl7hSCBY7zgLx8-G|Y~5 z#G35@!E3Vgi{WD)>-0inVD(}#k)UDHT0Aee_pxkRstXvU`D*1Wudg9K(KUESB7ES< zSD%mr_l=e_15*W+Q2ak#UIxJ)EWQE(54xTicx*ox*WP#K~- zeTs)2C1Dw+WlE>0K)*T?162mHE+wXAeD4ZbTW1Vg0%}DNWFZJ553YGZA@s3Ibhr7I z(HR*Hg~FT#2Ez{bM6-751JMzG<9B;@Rxvqn+K@t9qdV3Q{__>W#!aVdBn33H#4 zX`K>umAti;M?K6b36rvNq$0q=<}I{zMGgO*LyTi1kFr?Eqvs09xJ5|KxHxT;2KVII zpUZ@~GU0R@6(pGyj$;1Fp$D%-{&bZ~_6?hHuXtBs)a zjht=*zd+OxPHgKUSb--|SR6V}tQ2Ob>CxaQSql+;6oS~zfxho@<(fcq*!UbVR=fBC z+%({D=P-RpAYL5^Q{FFOxWF&;5Wp5p>^eiBGvmS)8lB0?pd%8faDdXlfUIe~-KJUS zdA?oR=~L5S%H{K=4~d$6A>tSi zxD&A`Fvh#L!@j4(x<3=<9s}J?5_YP)1=wkaWb12jYyHH-MV-AvpnCS`sPo3lorGZ` zI+_P_8#_VOio{=@7}|;-?i<8Q97sW!eZVjZA<%)Oj+E zUl!yy0CkJ**XwnV74gd)A}AiZ6EJ!Geog zyy=ArVTlqm#>8?do4t*BGzCq1NMdj)}uac=3)geXa^2}Hv)egtLZ z+3RI%N-wcZmIZdE8ta+0xE?yTYn6z5OhFn`AXXH=W^?tmO%3VKNFhtcZ}`TW;;y{l zWBVz%Jc?LUJKQrQCTpwKT1LLekNvv6_>*)o#c2qNE+NmyPH5x{Cu?LW)_L3^OavnV z7f>J}!;z7NKwRm@PJ4nk4Pqrw=SEG`eJB!8ft*sYR11qBU|0l96XN(XT%Q9Img~Zs z#Q?3D6Yn%8W_)#UhAha$pF1n2r0Ld+1dZ!rad|CqWTJ!NJO|qff!!#Et54ipp278H zh;AuV(Guy>5yb6Mh zMk%rFud{clt`a+&Y9#O=T5(=`l0q0KUOmc3@Em$?)O9vK)A7D6OTQqU% zoe+iAvO#Oh=j~#GQf6<_CjgFcByx9ijZBT;#w3uCSPr7oVsT`+IedFJ3Fs2VQM;r0V-Rec>e zgx5ZBMoN{A8?x2|5|V4-08|7WwWOl|PQ9-UE6jvn%#s1alsS~J8~8a}TK52C256lKlLLaMfyMKM?#9EB&0~S&Y+Mb1!Wd%&TICoEcmy zzcS+qj$f!yDIuM&@;e1>DMw0^R3nLeP%lEP03B%*rUGap+` zG&WB%rebrIGcbq#o;)i!f~q$M6e+@Ycj`)P#D7sFHMc($3D?rVFTir$P75iLx^tBv z|3#7F|3#5P{zH)n|AQiZJ7G69`}tfsW$I#h8Yo>CIT!V- zZ&Hv(&1_*rUb`4kTj-FFxB5gKaWibl%P1sD%J<>Q567LJyKwf4mZ#N{$1G?Wv4Sxw z5>I32YxkP1KGSYo`?{;hsgYTW*5zKGW}ceNI(mU!g?}h4UB4vC_V7iq`VxbYw8oJE zJ^d@_vl?5D;2+sHIKG(;+t)Ok5hbKZ!Gqe|1#ZQEqe!(viX=HI?x9;d8|?OPinM7T z_XwD+IhR$O&^M@*DxJL>B|K%et0{Az<%fuc%~qRs{6$IqPDv0TF|`o^N=nz;x7)Jo zmWJ@!eaNKQi@fHd4b~5uD=p0Q7l54P(RsBEy191d!P?U@$9+aMCEe8%I1Cqsuyh&STUMx~J5?=P%9Ao}F78*a)@w8~ zUU#Z0;pM>r>xo_03pb42P*!-b+`5D%g(AIL0ZIbdX`ciyE9vt`)Uu@=-Mn0MMwi8^ zAGGcThto)(9mlyVsPm6a(%r-@Wc_1=`?H9qpVECMAFXBl5^A!g9J53onAvv7ek;#V zt9;}<*t>M>_35e(PpiTho6P_Cq%Q1T&D7J zH%v6)j*Qo+b3|35r$8Z)*p3eLKP$~lhUvI5&;cu=@_n=%a-Imrhn69IIvF+>X^-(G zJE&f>C)B6?WBZPSvMKTvk7^9raZB-(^=h24g+T)2$hiFUCkmLAqkIwXzQ!RDv@aWG z*JsfucJ5_r)!cI1za_@Yf1&O9a5}5V+q7OmrG#cVGhKKXq>wyfI@G%4(c2q_FR=aR z3^LF@H4=$c4G@?{KilbbVmm5w9KPXB_ygSC_XONxPwav;5KX4fUh>IM()Q}2R%FyF z-i>e>?Hg>_HFBn=HA~(%r4xj7h!s26l>S>)B4Td=&B|GBI@=m0IOCaj4dj2CJMSc;#0Nizvgc2D_(21x~Ob>05!GXN)%FH1{0^po~>RTZBcrZ zt*6JZ#(KA-_rwqi@Z-vnV?k;$2C~ltv@C3`00X{;t{M0?{?=XQTIr3e22i!^H<8oG zDo$=UMX@@bS0{%q&U_YAj!!ahMD3!?NPl4YZ0$dJWudi2BH1w+%w#U)Y6{+MH; zW+wJwK6z_SqO473m@B*ml}i?z1jIqAIX?vTE9RilS>47|oZGA|lZjy9xii z!X0#aiJ|fx-m+*&w|x%M*WZ6kkN4Q=1F0kUK&H`8_{KB4a*rK$LvA4HG@55;Ab-6S zl^UU;@}H@9_)oDPq=iV+~@@lah({~P?DCpsuD+c`268PuBVT> z?1q8n^sje(1Nfo@*E}P+wQ5Fp4Rw{@vEU9f{I)E$%L+6|lQai{a$|{}eL8t9$0X3l zf1y^wFGWRaie01_hf*ux>0KF`#s|r@CkE0)l}Ljqf5Fo$t(;ir#I(IXXM(Ypvqk0V zjgJqjw31dJNmKyrK#W&Kq__O9HDaYhg}(Nx9LGNUl1f z9`^1UKd!V)%MaH|{MTogmsNXZqb483Y%#Q$##M&i+}&4mJXsp5+%eg|$7PHa-CL&+ zMi+hCNQYA^xbw{LY@@RW4)&EOeOj4>t*+_jZEnBYo*M9?X#M6`=EdLVP5dzBX}oFN z`CxktmF%cR3rb!@Cw11I0z_zN=-EXfUD9}|@|P}ooR^J;2Yr=| zVvuxi`T5+Z#zpHSzvsp|>tfniNKc4kAO%{*cI4jtlhTeM4$;#WX^hBF#xL5wI(5QR z=w1&FqJf#wT81eLj{!D?GAvyYpd||8pE@fl5A&TAy>6UxD2CV%8bUQL8}cMqIBNJY zj0bVQ&ngFgiIwyVfstv!vq}E#-vc~Difhl(_QB*QoqxQ(E`0W4MJ7LGjD zYVXN`*TrS08gB)<(i&&e#y!yyD{w*Q@dV^SHVLzf@8ipYvUr4af2PT*1EG~k93dUT znGt$MVctQRrzawKB1o4ZnGOiIb zE%KF})@h>`vG+iFnOs>&#(qGkJ1pVAkZvFmMkOO$HfCj<3TmWyMR6*V>!F9qgaT9w zM_e1s-4fYII=Gn4K{n@Ox>~d+X@oxdk?$etPgc86Sm&Iq0h$%xif9QB6hD61GIO|| zSVBR9@mW3%`BfhIm|sFVv8OQxYVT%4rNe7@7(bbc6Q57q=OcqyDUT(i9&zZTZ|R0D z#1s}X|383ar%q=h*#eAo*h%SZ^ev`m0>AP?zP$?x`{~nJEZ1dS z9dS!&bq=*UpN`BRqip2Vj}0U9ByApcKqEQGTRe=6sSk8K@*3nY=uf9k%OoSYG~v&{1lx~27wLTqOLVbEm-jDd!6x==|gnJt3$pR*llznlv_cfu?Y(M0b)!=oi2p zSk|s1c0Eoo$RU_!Cp?@9-_3UR=2Y$q^+?)*ct*Fh>eCc*rC7v01tHc0Z}>WTYUfcTCmp8)1T+(;K-2BO-NQCCBkIunb(BR%{TvHi@ksxdx37N=-(?Z}80(c@FSeZyUW7E3d)L0oW>I-qTU5EE|_ql*m=yum}Q%u~LG2s)q?a0AvI5zQE*d8Xf z0|F+bXwl`9AD>n|BuP|4Ty0ZickERjZ`7`*Gk#S{IF=b=yde<_I zAqjqQD)}-gPC@^f09(ft(+v`lU_#7U+updQZX1%gT){@0sP_uQiqu5h>>)*D&e*IF zAzhRy%i3^gNe(SbQhY4}0flRQN>eCOU$;f-5z~9%!M&d`Vi0C~(V#fm8gWe9UWkx* zGA4;7i_dkV#oz!TDgNvLN=$0kHh@h;CS(|+XP^@rd1_eK#ZE9*bEoKZ%`is<7=Mal zWQ?(8p%EyNTXWj?*0i_KN(v+lhsl-4*vRWmh>(iQC+nLV1gdKrIcD_BXMhDsM;~F< zlrg(b6eGXK$Oc;LFS&`?HMR$@dQiL6G-@hw`9vTnAxcQ_$HmBdb)8ofcYG(JuMKip z0isIr_1t1g@j6Hi8|fXY20SFqt-brWQ6{ABxnhZMvMCPSNF(8)_K4UR4KQNUjOTJn z)R`2Bu1J@1tVlnZ@LE?1NJwWjb)Y~(V&m8gn#<2bZ`^5@H-LU88&zs-zPeF}ka8XR zI+c{n%aITkC&57R5@q9&MHQEQ1K>MdefpdHS(a?Z34>S-|!!VMBgUQAKNl9 z6hedV5x^Sc{)->c{2Bknk2ph6HC{;nU~M2gj1HHXc`gw&y!Fwbh7X(uLB!ZVcHfmz z+B}|9HL>+d|AVz-NAFAwSB;#-^*yN?VN~@#*Sb5*6rUPcoLqbCxuVC^+O-pF3#T^R zod|j~g}yQ+s2aK9q4@t9IkNu$B{|ykOzf|JbbD~zey{A^s_S0|{`yC_*}iez8p)Br z{!tF5dbKhg_(vi_|LCdn+*@4z|HVJjBC;r#R_acreR}m|I*pV*|2KG)E&C^UWHCRJ zK{k`qi2MkGM@Jrb9Z=dcD*vUGu;%Pu~Fl=$X(zGAY)tX9lAUliWgGYmZ%9 z{nk*~bh|=!gTw=Mv_9*nM6P3alEx*We`Fx^kB&L+BZ+M?yyq4=$GGOZ>0RRuLy*G$ zZJOY$e#ouVb61bT-UAIi!XCCvjkF=;yL7EP#w`ED7$#GKk zNV^xMikE1pj&e3_{_OKG%P-XWqqPXl&nUeU= zy(!@ZHA&+Wn{;cTOYbP-5WU!#Cp9mNY?sbBZZ_f0a{Itvv*ALsH{&J*)+?udrs=|X zw$lghCZ47~cY$yI^3zuQde+b4961k)eU_x7MQoPL?oM$xqamKg@eSNvtNJZq@Mdzt zE+z2MbJ{1~*3CN6{y|yd-oo~EU_?7iCLkavTf$vw(OJ1wYU78;X=hEg+>{k6N=CUS zW$hkoa$%CLp}+r?y}tEv0Ibp=MgS1iH$5=_)cA7qyJIKo{vaj)rsZumTg(e1?4dG$ zZ=`voTdus^U2G}yVy9uU{H0Po{2M#;$$e(B!nAh3kL}1(jt^CYI+WIdI6x6xg-6ZhxvRE z&I+lPaoZYD<Jc*tR1<*fBN*j4pGUs{Gzy#!Hm$37kgUOEb`s91izx?nvJudPEkRno+)A) zX484@Ib5lh-U}dYv|6y8lTrP%Kikexn%a->!Y4c;UMRs|jN?0uA$}Id= zz>^k8qfPwl`D(54aefddZBlz4)ncjoSJoxFZoou_%TJf@#@NMS$qXXVInp^2zy7Ls6_aO!{U-vZkwkAH6tf{a} zJMrSq;Bo3Iw7A@(S4>BL(BsbcFIPE}@1nh$;QKxepdP!0NrgKNSQ$W>uis+L2O!z~ zk?p9xtxj6u?SYSXd~Q4Qt1)H22%4M~U3#l3mpbkDFNh>&dvxpNgkCXeM+ix_UI23p zNRk=A8ty)#A0RSkBK}^AFI^f$c=|!g`m|Tx8eKVuyNwKbNeNe}A^));<4Kze{-3q# zmAA4LGE}x*X6Icy&y2Db-{~yTtsdV4GbE2*gsQOV@gB5oKe^%=zp7;Juy6^fCQWCi zUkZ~*)-{)vmZ(ti^d6W_Z+ppAHZ1R^!4x4`o^#7BQ|eGdwnne0YVbDWw0kuKUro(b zFY?Px3Jo;a3vqSHs`0L(uK|493sSPJt8l7km;EM#B5F|yIE(-bC{KVjM zta>AT1I*0f0)H8AIUGY|$rK-&_wT^RTfkjP*LQk9`a*7fzyC!1^I_`hq>iqpU$_Ru zL8UF|pWU5<1Y0GjV(zig>Z`GEorxdla(MRH{a1!|6MxEy$y&5$w(qU|sxC##y8-Sd z<_7ERu%Gqmv>ynY-CI$9*pud{<iYGl8ol!Q2lvdT(2Cc*Ar(WK8@p6u{zQvu}zjW_+h{zGVi& z7v*mc6yyI(!3(qfYI47(wvFL8Py+JDYqSn=fUqN8y=4ers-(%gK zSbewuV5v7rOmkh}kB`6GX7|mt7$*(B`Tj%leGStA0HZX}FdaL5WN^o;aAMse?hBpp z8zQ|xPDP%;zo8pqGT ztcoQSWyxDD+_;|!-gGu)Z7$k9i~jlFI?`95BM}(~ zr5L}6>1Tp=pNH(d>w_4WV>GhDfKt>&#CFgyTJw83e0aiZ7vC7{;_HlwcKhkzzre`V z3;-jZ8ucXhob>)ZWOSHL*4D(NYpb;VzrvHMvoQ@sxVOO5mjtKQC9l)b{ta{_x-aM= z?X-|tq5Ib@s)VvE?{y&W(bA&j3J&LBS~y5|N`w;&(KmYVrH?24zl%tm!=Hkz=uC#q z_06}4`Gt8|yWjvz!R2y<`>qRlQSH;#VA;mbu=_+;bdL-5&LZ3+THdOI1=7*iXgSx$ z!@H0m5191qjcLU@eBT-k_t zXg2+C4Jjz`vlgKSviFA;yoT;Aa65STRn936^nezO%OZU0F8J^_h{WE7>A;VzQsB|1 z8)8Y+6DuV#$#CSTjRz4?+jFc#+#>xCCsJ>gKkl&eWX#T{^UypJRr_F?^?5Xxf(U8Z z01mfx(rP$bs8h@sZc+LUvSP#!P=e#&6S&im34pxV_$%v=F- z1ZIGZYtqu6Clb17(W0F;wKNRveA)JVOu#8*M%N}P5&k9fXq9XTCJ0+YL>>W0lEA2l zEL%OZE1wMA#dH9xNCzEE^7bRwK;VXj#3tL0&!eA56u<8#07wLKIgCG$h)zUyF)NI& zS-&75Zr9WN$f#Rv53O5%+AwS?+X0ubl^%06Y}Hbs_dGF@ipu)CZet=dSjZ=WY_$w) zaB9ti2U`O&G%Un5&;o}Xb4y8Tqobqw&~s9@Nx8{~M9$3X5EL#Fiy+9Oe}IuBka8&U zuN#yBntDWp-_)f9#6TnYN5O5tOEe6!+#4uDN0}SANtWZEZ58#>Q#*~(BB(6(*&Nnc zz>Me=w5z=Ox(+NYrT}$gw>KYt610_=TUKu|Z$5~;#si@wOb!$7K})gq*%Qsi9qeJL z*AuWoC_1%9az_nF9$g}(UgzRw+u`4|_T_={ARC@WMBARkT>lEn+Sns{r;f1@t;y91 zw=EMXhu*M{uUqxj1XfZ34QbO?mj|i8OClVwtOjSd4w9j^D>gI)%$Ej_<{>h8$RfeU zEa7?z?!$tfcxf{$2J-~8P%?huwU8Xe6E8|d)jU8UM`@wmJ-Qd0@C~#JO>ZczAuMJG z6d4NB9?9fnZn(YG-H8sr4{GlMV5GBObogNS1>sE6`ME=78ZMHm1z;)aTMbV3&sLFGWd z9)x`z+aNN#!G~x~(1Zq15%)OQJ^^--pY3OE_5pHL${tz+0xV=kumcjs6CGY<<9|QX zc+!4yfQ8({v)s8O{A4Dq%*58419hapBFU(`K*6D7dsx^r5~{1WW!Hzt%NVak)e)>9 zie-@S=Fd*xR9G(u84rQ)AVb~BP!AGx??Z<@WCSY)o7axxvavlJYzGM!{AyicpZq(z z0*QfL7T8+Nqjd#h>mn>pfhb@NuAh&|T8Ap*p&Drw<0OK2v*Ifr)~f&v+OR-J%9C%U zKakz-7)uKB;@1#{r_X=O#Cy!_0-Wd*hpd8>W7#O?l zxbkhRdJ~FXFB=*!ck7w#$3>N7#@*~;HK0cgLog1jOsS1ch(Y~$%^`^kC$GIcmAp*C z_>)9*V@245A|{LM{MXjLLlU+AH+&`6%(LK%9C6?rvF#zd*!S(W;=ypuu_@{qJ=f69 zGlVT6!;+DJh=aRC-?&2O2$xeDqJlw;eiA#N^Cp0G?Axr^<@1#`wQLMR;7 z$Vg++R||{^-V(k&m)TQt@xqTaK3+H_8rSWNls@r%ovUUS3wFI2t|Hm-b;ddh0+CMb zm<#HNCl-x;!W9V+OHPW1dD){o4KtxQ1(M{& zVLJ>IrLd44V01!wm@fimVmN z$b23ukfj2Ek=k(27}s?d1oEjsWsSYqFGxpSJ1)qXn8ZSyQz8Loq$b8ylZt#mZJ)u& zyV*ku=^QQy9}zdjuM;{)v`hECIe0ozI~au$(uJaveEf7de%49*u?KO8scWhKU}<_+ zSB%uc87WyT;mjyhiM18-~#+0Qq<VHQjW1q+%sX23Y>*rLWI7Zdcy81gC zQ;wC_H-_rR;eRsMAgca^k65~w&M42;i#@#~bDmF_r}xNC27fTN`ME(4WVNp`9w^1O zuP2r0tWFXW$%P9X^${hlFNtES*oXQ}5~el)7`d)Ju_yRDIN6DY^5w{r;*K^#=jgE0 z!ws*%0X#9v+TLs8|6)ejZK`Kl-K~0&n)~|87e;||#O1gC7C3EJGthmm9NHnoM)eH@ zW9FDznu^XN_yHoq{|`3W-b-ky41FQMO;Tlx?y7F9OaDced$!3K0xYoD!h6#yw+x9CvF6> zc07hUzVFuv`O%o;qtTvUO1!|wm6HRbfy3986`!UJ-BbNFF_|_9!9AQ#8yvVI^(t*} zxN6Gu*T{nMXtVwQff=PjAjnk+0;%N2X0>M`CG`S&*+Csph?0fSHtH%siV#UimIk8; zLO!araVWTxDW+xxVM&BNC>Q(MyCVmud@ud?%D0Y-TUGByk7U^&5{sv~)+yMhTkr6x z|L=`#_5uB#_e$moFDA|n>qzgm3duW-wtnh;ZpYEMqNa!PTh3TSzq(hmA@^#4)xC6) z3;M|)c3MWy3_R_)xOv;)xs5irQ!i7;CsN+ENbmW&zsh3Zto@M>)>iA^Bu@4v7Pvm% z-Qupb{aVbqg9 zuW|{ed&~CMJQ@36Hfyi~%)8_A-E)KDf0>bIGBRVX3T)PpyZ&z0WNT#kfEjiChZ!MH z{)uE~tN(XqRQHz|N&j!msP2C2-Ruu+5-pHhqWCHi|1=%UyBk1-6lx%#9~Iz-Fz!ER*0Rm9Ji) zTZ8Oyw*RwPJERS-wn$!wt=@$s?A>ko#b;#G)!G$xS9|xVAHn8ngD>%RpL|{oST3>a z9$UMg@2KzjeD&oqn*r*2v_VatdZ7$7Xes=bigpg(X6cONBcpO+Mvqc-r!jcX7pi-h zzMGfa5+o76w!-{3(Mr7So}2>!M>EgsAAaiH>ParBAB2f}V5hUhedL5;Ya|$lC3vjP zV6A>yD8=7s__p(5v7an}2M!RLk?CgJ1a}_Av2ixy&uQj~;O!Z+c1tv$hwlyEILc zkxgkI+m=MXmBzqyQtUCI^P+N`3s8MZ4aR3&8G1Jcs;?QW{LT&0A3A$1rL{v@xNkG~ zbotFUXQdUnZn+}TosU5^@t&=s^0O?2y=I1ZVFVN}!pJo*WuU2feCgHJ3pQW2g{TOO zgVM)pBo7H(lw@k)@SrhVdIdOKBjA3#O}b^+FG4)k;G{zW4idmTVf~$&R_#c~JK#GA zQWes~zPYD&Z{`cjTsuJ!JD#sWkVXY`QsvO1IY#mRv<$fge%_`~u6R*|leQT!hzcE~ zY9TOPLoaY}EkitkCo0|Y#AYqiNPgKZxDx`(NmBd4)D7+|oVpo&)cYxyEt%4@$$%1s zF9h=V*u5`v{FTRT;tDQ;WSYZN}{y8g7v zUiT-Rl=Aq-ZR6t+S?wrd7E8JhlE0C-RjOeeX0m1rD=UT-tN4@98D)QJLl#n0kz> zlXk0GV~T^CW34?wTYNzA`?#3oRbHE5)ws5fH4oeMweNZ9m!zAmZw`8_X_~v#faSawHoI3u zwfodIs~P(|wbYl^AB>dpk3G)SGY~oNX?i9PTyiIY(;XbbP8Muk<{`RA)IUmso+!H;!ET;3B zZTCJwveUkHXW3AKrLOT!s*f}kB*9*uP5WS?PZvR~@hC!j6LW0$oeGdYCau=OJH~c- zg3t;bK>H&*wW!5UH_r`k@6gR57aA7^E!28X;bV;;UcrXgAgM3Z`O{(=+QM8?f4a2Q zYZ??8XOB6?&bqpY#>6TLS7zPq#l@JNP({uqfwRU)kEOPpgDP%UOl0S&oXq9*T^)zE zDD>WJTeqHD@n$v2ncTM)8%wBr#g&6cv=wgIKCUiRZ?InVYRlVyi$@d1_g%hS1jDO7~3-PiLk20IA-chzSZ2?T%b6o2F_$ic-_{kscb8UR+$)}+ zAIOH(?{L-D8(^pCv)eBmHGJeh8pf>NXsP@ZnYqGF_3SA5ViI=FWU(UmlJf|B&Au(@;0UMz?Vm0FZc`st5Nm%0Ru_0urw<26BbP|g zHnMsvlyrDds*o0uq!*YGFJ=LRh3**HaFp(0*S*syJPlYYPs=gIxk$#gSSB&32B8pA z22fGZ43S{nB&i?~#u?mmj0W{*T6!}PO&5|^pxBo(2aKP1{P2r!VzxX?9jd$OpK);T{JRpdA=D~wq=)2&&I2&^x5~Z5reK!W~%iItM zk>1f7xF$eIKdW^9mXIyBUBaz@b2?oKvftwj|r_v0~hMS#7fjBpn#qG2(C5r zM=TO}nOZhU{-Q^`4I@;Np=)QM2Ly)-R`RB_F`@MR&tF2h0!hx3ETL7z*ZT&RYc-ng zG73{;BAn|jzviz|wF}t0@V0jSiC0-F}4Xv4tIl_ycL&As2 zghaXYcYkS-U~AD0d;-~Ly$dX8m8l1RT4;T7`>iolP6KSu>upi+;t-e{2qA3~*-$m8 zJH>Rk*lO+$LHruY`6t5rhbFwk)O|M#mv^$@dIkaAbPRm;{y-)KtCiTTvucj8ypxQW zbBT{zv#qHd15(N(qcBH0dJ&$Yc8v(Wv-g13G9N2-;{;a1aFTtvJsz4)ERahn6MOA( zfMVO}3{9k_ew9;j{$zk+Uwg z5co*UY2wCc;c`t4985zNfctC$M2-Nfhtju_M(?}f>EPnm%o?Wm?p`Aj$^!Of2Y^M=3#=T9OIIXrD3`p{6op(1`~74Q*Uru{Xp<_99$ zh3o`bZz;VVo=ij5@Kc(BLdVWw$Ds1T{)R%i;}jr&3S+2{j`r3pzeZ%PQjivh>Ok9? z!NK17RyR*0a7l327|Z!38-Gp9P$oQD0FUFt!KL?nDD1YQyF)%~K@9grfD1gW`nj7J zdKyW%gao{;kQw|>rV+q^6FfxX63qORS4n(5E&&`p%bE-?+OGw`8*+-bW9EUf&@C!P ziMn{$2|8hgcE#weyy+-Toq@fWg`Xcn$`QqU#Nu9_klWh5&My-;M#ha$aT8Sh zCkg?epX|lMgJ5?CC>0a?j)gtU1QD!Kk9X^S^J3M-y`}*$;<*!BY1hyOuVPF;G4WCH zq&EhVhLtabNE zqN*gH>nzb+;5qVV+ zarGFSt*On-b>k@Gwr?kIW|{alGF9e9K(QJU#xvg2VfyulOkvl#?`>Kq6hS3O9L&?8 zbgY=1-8)hs*ru6z+*e$G;}irULu!Bj4zfWIFP|A#Llqc@m-x7X_(dkb2^kY^+zY z_foIn4L~o)xGRa|rapt)u1=(bRVoCvWv3$GM27J_O*5`}ydHADgd!F9MsQov{5BAa zj_~wFz%Y%!P7$lEb6xbB2v@ln0;R#eZ4!z_*VYTgBF37&VRg@B{=-zP_{U1feI5b6 zPT>v7^K4|l7;uZ!Gi?l1??1t5GP@mrit87P38du&;1XctBWP1M;$`Q`kaZ%j=kY{O z8P7QE*47V&#CL*ii^kn*aRy_Ydkz5ustnO_FZ@qB_Sc<1oQSU5*Ql&k5C2-I0_suw z`6~UNd02*Gwi-|MlRs!`GbbK)Vo)R-@kFX=a&OgLtJ^E_mYXK)>xvq7% z9TITz5mRJi`@_3;#DQ%DI8oYlZl0bemEUh}GfFHTk@@2mUA(S3dO5f{2s;}v;2tz8 zYrJNOLzlZQ&B>^kQoCGSpj6X9@Sr{R*{n#yAz~?r-6Ww~wC#^ubkx?#}BGTdIAR?-5tI> zDKU6=_{3eQ(a9m737Mz+Cr{ueC&wO5@ZV3C{F3?Kt)l-cA%evGAw+TnQ4)nncNJC9 z*`u`aT76fZIs!u1Ee>-pA;Uft-@qzbrT+T4xKtj0!S>LL22|#<_G`*Z$W z*W>v&OXiPNtdb@N!X|x-o?9N6zjtfXg=oEd3Ef0X>AWGWhc~3b6}1Z{XDwo<`qCVe z@qxDz(pKS~ejg@o#!YorHJ5L#)T{F-OHW0a*N|^7j_o(;|M1)@w#qIS{{GbU`Js2W z%ihTxKYM>)na9A3^nc;q{#^|1=`1?#IvcN$YsprTm)yvP6*48B;YW+?1`U zZ2yekj5mLma)FleV*gE6=Jek)Y8hUe#PIb;?W!ittJ76ybb|AO@;e9{4uo0^ng8Bb zg3ltG>AuV~ISa40yWbGurSntMtu~jEAvc@1Tr+%(VP)lX%yurNgLI5)yC$sAOFNgK zu~BcfD9{Q0Caj$H+il$ZC$i+6edLP9?ouDm?ID#hCmkP~hU0~2)C5|4DjYw&nG=rE zJY7;c8Nezc^}ZHbMe{$#waH~c|SjP?+aW(>&s0Uyo$&)vp9x53C$Ijl#w?MXR$J;t@D=pBg%?sWm zWJSkr*`KWQt6yN79JgL-)p%_6v_1Dg)7P?)&4}cSkqz6 zx_;xw)^(4}S9(Jp@1Ep8kBb2HBM;{`mPDT}hLClPrTSyfxYbhsntsiL^~P`+AF@46 zdPmlvi%ON!63%8x3T_OJJb@09)Lq4ocf>Xi)$+D{8r@>vKELV(7k4MdW=jTux{!2$ zTTPd^CpO4gJ_jqdWHlA47-RmsV)pT_H|e@~tK}5QqY5r5S70*#=@z}aR5xHM?#*F5 z3_hB8^@rtBLgnDP524|=A|`p6Mf#z-?VYl|3HHvipj*^69q6(8b7^qrB23yFE8b(| z`@Z0-kRNrs{Zi^qqNPuF6e>A^Xp-#Joxo=DcMF0^QORoAlHPPtnXA0pV>mX(gC?rV zE;gIYzeIk}=i*YUc03xpMX9>oRrfjtYP8p5G2w<0_NZ_1 zD$BRYtwvHIDy53mg?GdW$*m!Zzu6tms~I(9YWQ(bTJ=&&( z842(V*47)$qfDsb{Ar@UcU{Qlt`U*?qCWa8wYjK@S7$!ciZmUwzp^(CPJYGAM26*A zXcemA3oD?yN?s@zsUeA?UMCHM!8{L&x+J5bL;Bw9?1h8&$byE7k_BW<{EC<=egnex z6HPo_7almj(yv$)V>j+KjZUC-YHN$+yZ8i4){$ZQ{>B)8j)OFqrs?W=bvfTrJ92ri zvTP15FU4uU?Zq=amPjye^8w>Fq=Js!%OXoMBmYTVhCKEl$_1pCI1?~~IFW)twy5mY z@ofF^Qw3gGwGvf=O!*4x>H{vr9$Cc9U9ostm6n~Oc&g6ryRA0JIdhR$>Q$v@na-{j zU=#;(*z2EdD&lhM6mE1GB#fe5?%2~CLuQCRizWz({Nz7(-9)PQC1$E#iplteMZnfh zh)6N6XBmuHK2DaAK6{HCzT?LVRDnGbhwanS|mBN!-&py{RQ=E0)vMk1c+Y>ea&@#YXz5iE@+HW^J2k;AP zEaT8WcN}&5EsyTf{d~>i(Sq0U?}MJbjOxLT3<-ty<9(5))^4SL4!CjUfOs)tP9N(sun{~z|={2%JR|N9@zX7;h~1`!b>%3fnHq#>cA##Sn6>{1wG?Au7fQEDue zBn?WWWoE1`G-%O2lyIbuQ7Snq-`CV}p6BN}&+~JAKHuB*y8ZH{<=Tz z&q%KGrdyZq{f#E|pL<|Cq?4oPw~7_l;Ie(?`R9M6Tb8yX;gw1YbewtpI z3^igLMTmRU9XMoSGQxvSrG_B+gy}t(^=>;Xd(9&p%9KB{2j+BX%Tm4di;E{-1qB3r zo4|XML=%vVl6(5eWUyE>mOEltW1grsY@s1PL~-5xdg8W!pX)K5;E1ic6Pd_x87p22 zpV^$LhRkzbv{ioj^&}1zGtgrY<+%HWuc~r8h_LS}eYLG59@`WA+(P*6?w_E5ly_l^ z?dxFx&@!%hL!it2T81_(-%>AtWSfI4XhDHryPJ^kof~FZTf;4SF#-*zs226ma%Zgs znqX!&C)X?d{==AZSJQmJjgWOJUvPazNzd+RnK5POx9>98w#|hyC!=$Vm$PQyWsj*n ze00fO)6=IM(BaUqC;c5AWcFOaKI1KlH@Gen(^IT<)7_UuOKY%BqjdH~Tw-AAjGO9? zDr>g_>E>_QS>)eS|ET_QO{J6b>BQ<40lq@+L3f_BxX?@cS7$rh&SarMGW7~)2*#V( z*&A6C!`f?C7^l?C6@~@9>ZZ5*B$?-%Q}_oPPWBtvz0+iY!CFI*`|4|=t2djauBc~y zF?sVm?$E2JVu8wH^zLz#`FybKf!zD2vh;ANj0w`zK!81W?G}l4R87w6=}sf>M0U@f zH9JJkHlMrmMp`jq+FtPqZ^k?a9`|k)^8Uz!iv8@2H@@qg^>@&`1Z1%l&glgini9KoygpL)%G(?9Q#(Ytb?;*uF9 zCdAlU3cpa<^^Uj~Xh)gW93p6Gm@fF>z>P_7#yUSq@Y?gv74Lzh!ve?wt<}k3{~~1t zEui4#Hq#edg1+x2ocX04krijTsVF8$6d_AK*?W_aO_Y?%UKEdjd7G2cOO2Sb+62Hz zx_I?`H+b^j7LU-XER#jln2CuNwtRUFCXG*wYh4H0b+ z_{CQ+Zwmau5(%Huu%lMWC52)(WJ$IgmOnMGGs(q0romGaY|BW#VPkv4rcpO|NMFuw zFEZi-BS>pnJ=~WJC{mt;BIWGL!22PzfZ&kA-aX_DOAw>88xp78_i)!B(hOm5^ig}_ zSt}~2677hf{g$j)HHIIx)Ic9YyHT9Ckzf%FR8#xm(+fM>80Z=bGQuet7HEyXZkUH-f>UhUX6sTz zCUr92ApJX{LwKIfS;hHZw!b?nD>H8kE>_(nZG2#*5~e5#A(bu|SZsECykz0?M^Y|I zHndFy_aL*~#c+7!A>cMiMrtCQx{XQf1QPW1&+5Sn#OP+~kux1Txk7X*Cps+w+9BM% ze?h&{*#qDt{~EI;-<27m*j*y1vH>haD0_p0vOic+@gR&1q2Fs;7b^}@cucaYA$;jr zsZ_S3Ru}h~jP~G02SH#F6x4Nk`PQvfY6(YVUKa<+muM~==>=0Y3idi@`w%T*btlQb z3_-SZ_F}_pXobl$F%Ipr{+uJeKrbSoh9i&mWa2kw66#4{r*)Pa(g*^j1JC9lnLkaWG#;`f`M0wf z5}0^031$JU0AR3GmzOojijlsh%-E# z=&N3AD27U*40Wypm(#9`Bb|2V`>jb{n+X5Cz1p1)e?Y*0lRL==clbzUvLWzt2y(g; zcu;jr4))w@!>7KOgS$>Wws1-m%HFOBZe*~RX6idvqrr~s7!MvmPJ?+s_Ykm_ogBQb z2a7{U<|4DnHALH*Tmo`PoS)uGyT!}B5N})C3!`(9wOlla6jd_O58t2I~%@I7nS?Z<+q*N1MJ`Q08Bq25IWQ*BQ9P*j zhIR0xzTtlBOpjU*Ey6)W_ZA6Ts#_O6gHIL_yhKRgBBhg%Wi)Idup&fi)sgPyWvVxp zgoqGJDB)Jp-R`#0uyyV{s0$UIDnfx~bT8-%L9~qm^g_okDh|uIQ&9KF8y`F3`DB@3 zq54}r^Uw5zW(blN4|S(NBh;0v z@??xlWwYFdTByJiPSp?zSrx=jiln3Y*poKKR)149FGrp4Ea@F)C z7LrYLCIUi{9wHguD%Z@)FgGv2Z?V8H((v;<+^HCiCjlVmiRtBHhUpkE#gC%l)7l&M zzrveX$yvIpeHNoV51z}YTD};2@Uv%_FrX zDA(>FE6XvG57!kDWoc3ns`OKFde|OavbomNXC?__wgWNIN@{WWTrkj zra-sA6dXW{fsX>llrlm&*qC_>(2l#z}gajZdf(k%V z&in0j@3T+{?WVA$7ea$4Pb|;S#Z52efuX8wJAg?X<;W)I=N!C%-EC|_l#7w-Wv8zm z0X={BL>}<{kiDM=X2N7dL()3fJl!l}kaqYHnW$&Iq&cYvyrXr#xF6)+&t3!$*JkyW z9*b6$W=_xVHClkWh4NNeKG`B$M0hLQ&F#2{+J#@k>B-cP>m}h0m>Bizgd0MO{3An_ zOllQ*`2EshK8`N)gN=K4c?4amp51bL*$9=)8acN)_@#L`8P_xb%ZKhl-(qfmtFKk*~>yzXto?jT3vN!iXJ3gN5itUR_koF0mVC9dTC;P>F#O z!;Hbi%$XeGs+Kz7i*@*tpSijP4A<7X9{47A_ZoEL(#XUJCb4bEe&%i{LeUEo15?}? zINqyRwC;tqvX`~Fi%JS9u57o3@$;f}t*m7@2 zmts&yv9)|G6r59=WbgQ3^D)_O1dyZv@oux<^)MPvRH;sdAnI_|C;xbzEO4^zW!9_v zVK1|YzW2=s?cZ9TvuvN79{nAVB>&dbDWnHd!Ry+NKNTN%g41sPJZYt?^ekg*M-*ZzJ-)OP#?95c#N0nB*M!Wug!#K)|;H>tZjc`UX ziP=;r=^G?xb&t1f(16ybh2_w-k=G9P9=I}H9dDZSsRS{km7{WC3W+t? zG=OndmF8^#FrbV9&Z!Oey3L1R{n;m#BCRO84daI)=PT15w#cW_%58!Aq)i0fA(M^L_jGJ2~*WZiPj73x9sI!dP?XiQqU75qB){WRbS z)x}a9LT3%#;d`REd9G^Dexf9kLhaKhw%Cr1V^&0FpdNsj&J7@KgZpNMRK-q-?2aL&|+BCS_@0045a6zbizF1lbg@WranDpx7L|d;(aMCT)uSYJ& z!H;k2=uv|y3Vdx4SXxllINxjp45R%mzCPiX*_X?h7Et|b#MJkA+?;!Ct835RqkP#% zADQw!oZO8jwGs18E4EnKJs9#RS6~^AzpaPlU{_h%zg?eWskTZsO`$I^HWW&{q1 z1PPU&(|EHZslfNeMER8_p^U=Av8#Gx(%P}cQMo-CC6beE=mbC85g+W>))JH-+u6_* zjlQ?{Vb_WBy=ws?SVQKQ1ycp;wPL;orme7UJeq1!JpRaT7WdVOpEX&AX) zE$}cQA9A1WwNHuLyeR2v2ZFA4%!xqQZM9u=>69vQ&IWLcy$btBQm@@aW2>%8Jlp9r zI3#FGxpLik_O6o`zr^~-48N^%th|2Z9)y#JM z)+0wp{DQb|&qkSHOHxl0I6}0u-5fp>VN3#34P~-TgQ(I>RA|JB_KGxKC#~%qw&4kR^OFWj9 z%k9SlAcI7REk4!P-NIhEOwCp*^u{_s#3H{w|6^@or~7KK_%K9o~?pNh(t#XMZfe?kIb* zhpB9mk?*xhQMn75^dg~zzGdvx`x|uGsh()?g)B}yTr1^shC!I6XaK0hvPk>t1CAsi zyx2Q~7)UOczN|Oa*PVWoLq8edd#oS%wR@d2O;*7@jmZx}C;tbiBuuL}_b(bMZz#v{$kge07!`tEsiMH1bCrsM#il5R#SShSJR z;3`reIr)cQ>WVBh4}vkRKLtFbR}sO309nCyDsgl^(0d@U!~3 zbNX0)m%R~OS+k|xhmL2VPq-y5DR1dZTasyd{Xi2%;s$eB+Se=IDGtlqk7?C`Bqux}t?*$|Gl3 zv=Gf!VT~GYX=cOK3}8DbP(H}UOz$8jNUpTawcs`bHA#qnYN-JPjUlds=NZ^>HoBS2 zYzsWtMPn|?z;pBI;#yzq zhUQVj>>g=$93eC-s+4}vt=7%%q-JMC$aay?U&fA9Cl(C5xDIo2ly+;(5wNJG5PZ&< z;j9ooR_+W$3EeETd?%|~KaK-|`}SBnlaL>{W+x*hVQrKnw$I&BK?UQ^cE0cm8cSgA zjVw7B;k%cXGoXaM8&K9WXVZL?z@@oE+S2H)?uY36@0Yn9VzchAFYOeicTf;+6enmr zv|JqRb57H$g+LeK-*tc!ZT6A+29jTzV%QrOy8sd_1A>WBIp(q}ypx7dUT?Qe1dXDa zUSF?^;p6UbP)$745EVDaE%WNeH}RmW6xRj_5j>Hf>*I(9A-a`{aHBgs>UI!vakn>T zWn|)awGxht5e#y5Isx^V?q6H$pGSjkW>tAp5FL=5PfP0yZfx-dx8W z5o`cAz`QMu0;h_9Hmgt)dWEf@7lUFb& zp=``(slQ4wk`F7R{RNfGUn8EY#Gg8nHbvg`e2?dfV~BbY`Y;S_a%zLZJ~v5I^7Is30)f#UW9lEvsq#v6S zB}7!vQ2p}~uH$tgotG$5@?A1Y7KGM#bv;cEfE6J zDabmZI=E)0rDyx@lP;HqNe9b6wsl5I{7dJ(0UW3|m;=%M1_;luhNq!^w7m#~eb%aFFu7E2e#>V?mkd z7OCSdBliav_vSV;)ICvkShpHf#n5^+hu!OXC+$7ooqvCF42I-XPH259&*Z}EG8fA>)Wy6~}Qffs@B+QH4ng?;HcIVaY2qTD`99bO#!7Q?aly>Wyn`=R3lwKxp+n9+V zGvs7Uh#+HROFxHsur^RmzPs}J-di~i;3^tV!AlAv6D0f9&Z^7?>rLGMgv||s`8aX3 z)?AY_DeR8c&F%Z`i5-ZqCyn zC{ha#YX+${XPu*XStU9{2t-v6bDl3@UoQw%)3ruQ;j8qzJ)OZNJL%|BEePr2!id4z zeb_=ak^|XU-h#*;yIJ4Xu?3?UzJ!5T(s^mMiO(2FIW)40w6gpsON#X}K6@VfZad#U zsyCZ-lQ4q)z{Sas;Kv}yTn>^>(##{QqhSOgA8f$QX;%$7IUngqGfg*Rt^%CoEtF*u zkQ@?J#+NZeIey$;E%z-}m)>m}!{18@d4IYK8UxScA!!^5QM#ki*XLvq%Mk1e>QUli zJ_w`uV8|xgnBXfJvi(@#S#Irrgev@ae={kYvS1Q)ydhxeh?u)HQ{A zTCRjB343LN2^^B`TGuW=!QT4}sc-h`${I3f98u3Z%gY%tbA8e?MJ5sGgf)vy(7(_IR zXGOZ7?e%*qG0AuDZQc*|YaV7yp2u_MH&Um}i96b*5S;jdQU(In>ao3P@0|{`c4~ig z(O=E%q?T)Y58_UTe3=XhPNH0rmXh0>I^^~p&V2&^xJT~L+nvCV-J}A>-b}tn|u_FbP5e?J3a(ToTR}{(uy~R4hvkpq16vu^suX+=IY`5W?AKDJNc-9Vh5$m zbDoCHtce0gFJE*-;OBudoJA|t$z5$%B)~nPtYNrj*_iL3&G+QD8!xZ9C>gf-^{~h_ zENQecEJQx?_NOAdP4;)lwS9_i8Zl5szaU326r=K4@-BuoSsE2CquW9ZzbsW3Tm3-# z`gHxFWVxXLnp2^+b_ycjujm}8(<|Ho@XsU=iL#WB@8o9@JpzZ_&F8rvlO|-6Ug5od z%uXiJrnnY(GF^k;15T?+T~P`U55bgf>})yo2TxlnOLJ%pI9a^UsYCXUi^0V0vE%ox zwsV1HISOu==dN##Z?1tU1hUe))8WhacC)gB77tr~Q&AtI&%hi&tmNJR&#IH{k=z`yaqtec2+U*jf+J$Se~ zC3I_!elEnyG_V*IL}M!TP;%B~$&}Ae(a=o>nsGQ-VZ%``h{>>2^ z$PhqM-C_Ds0>GvzNqoIibvk=y9<{O6&!_2AIkK)35cNXv~HJ*}M@+rX1`_PY35IjdQh z?(ouIm(}P7mf)UK0H;>|>}=fEpI=1x|P1iD){ZJQLR{4opJeIe3bZDZHS_$wAaWM; zZ0_40A=lGjIV+@a`VlPS%FZp!#LtZ7HisRSU>2OWFZjb07 z43;9jnc;L7jV+}CHx?gWw1745h!{t{2o{11$^9J)hqPlvb>L)Mj=bV0&k#aLsxMEV zEk1{eO!Gfq3p0y^tw49G`7mjQxh^&|Ta#TZ4Z8&c(|4aAFcP7S6N92mY z@mPPd%wdDuoU^H6I%gt7KPrXg>BQG0c_(-4YlNVJpbIxszqh2HGD5EkbW94QGrC&UERR!7rS&_H}hbC@5aP>jTAWDU@lF-KCpL$S)lwI?*BEoZ3yu>Z@@zsEbS~ z6e-I|bGG#NgJ#pUdnoI--FV;}FPnO+0U-c-}bb)`mSR4uoQ$kOjHwl!2 z8=nZ2jSK9*W%6EG;wvHf*>)*A>JAKKs)aI~CV{WyU8t+PeAAUK{}-{xO1e}muKaH5 z}u?c^Km6Xqh4R?Q)ZooEpHl^Yl0*{RNp~wJhVe4{j>3vZpzm?Yw|l6 zB|Ena_L$Ed_4gfp1n21NjU2&iZGTs@pch|m$k_d{Z4hQOAc7A1Na5yafBv@lRY`*8 z>wSiqV52wfw2I=Sv^Cv`d-kMw=nv_)HT^%9Ox&b=Bc^n;!gh1NYwaS$Uo*5kIoJ2+ zo_L&%20wS3PQ}V;)z1vXfjEI=|4A!>@*_#b4& zGp|T{6;V!Hoes9iMLhA*%O^o+bU8sMG0h(Q>kIlU#|?E*dR zfDiOZb;D^ajpre^G!H8lqE~%kg{;ZrUDfe8pg4kV|?naYc+d|-u|PJtQ~!*>jYHk(GaQ_bKwDl5bGoRH$my_7=Fr9<24Igf7UMSDDs8~bs5S0 zXo$YSL70x&d5{nrR%d<;SqE6s`B*0jORC+5nlLORuzm;eWLn;R>!Kga(RCu5syNV{ zK`k<}UW{qB9U*)pZT~Qymf@nSD}(K>gL&`}Hz4SF>w=pw^mWeW_v>MMI4U=nDzzsG z_+bv=GduU<2zC*Ibb0OP&6QoPm@Kz}+CacCXc1xh&}PoAtpF-P%p}*^s7Kz!;@(oR zC!Fp52ypL(jE~93_>-vXG}&u1R+~P-XF75UCh=D#XlcFoglhAM*%>mlwBE*_4!_4j zdmPO3`U+a&aBtq)s4$FrK>3pxd9)M)Jc;Y;;ono@X%pq~qWrH@(7j+*C^{0Un$j#n zb4c*S23QaU>NZ(0^jRGebvl zt7Bo?ZPM9!iVHLY^f)q=Ai3R^&O@CN7^y~L43^s6w~=j1*H@mt6>z*9&>6&x^T{3- zc9v5W`xVrC5NIFS4BlU|(qRs&S$QSkgsl+R?=ovw>_OBKFdvYmI=eRC05TZ|p3}c} z$644gb(Q8;eU);;Ar2Bu!G2}7^Tmikc9kd(-z0*TyHa>{&=3(~^&@m(|8BzpUr;T# zU9qcS1L8=SV^dz-Am9O|WjA$JIh-RDf@l*5`Cauii-N47IW_rm+Bh&TamDYipk-x< zV$yGX8u~g3eOVkqAd^3z zExGPiOh9Jrtp$`SU4$}O^ap3bx@d4W2&{8+B>&YKdf4s|7s|=9wH`cp69s>Gyu_Iq zgCQcy#E52((<~7t@b>ylLtF(N?nK$Tle)F?mET9`TG*d9zEpS>fJ6lB_Rekj6DyyI z2n9eMp&{?1T-piMDdSmuU2Tvdsu#iiDNrxAWDOWBY&Aps0!-vagC#6wVFp1-nv3y{ zZPco@O{Ngz>9W9FTDXdqS9jekb@adyHL%Bg&&E`f5aBdCkiK??z{YK%9t0a21HmC+ z-?FiQG4%n`M8)Pkz|J2zYdwuq-bZvILtEL{_hRKq9&U_;I7Yz-$(rQHtOPd)AJ8#% zJY*^zT%kiGgXt9yH9)(vNO5=uW_4g_$7wUDm7h1dxGU#xu!#dR)d}8m^K?5&8TIFknuEiaE~perGJ#^X;12&8J5Ew zhRGP|KW9|Q@MNkP7c)3YoThbqF#J?sP80c-jua6hLNAJJz1#I=N@ZCPH`3=bUo#MeDWf$*A!w4{2YsD=06;+F>r z!8x`Iar|x9j?asvzt8eXC#3FjV|3g6Re+M7FkfC< zpE|g+@PT3o^3uF6_uL)c06vLw-|spR@C4!!)EDoTI;vYkkPKyEXgg+viPjo9(~d9WAkkeVHD*DYfb8 zADNS)&3>-?pmj|v%Ty$3ZSMI~JKhW1j;|hgE$3lSWF4Dl)Mc4jWdHf@=<%z(X5%2> zFWq-H9ViYB0j$Y0?BaXzW-K|QXE;mIg{;GpbGCj5RoFcclSiH$uqY{WT6eA3>a+D` zqPl=3=V97HWNqZ|ho+Pr-kQh^sJI#OS&HBe8caEGdTH>Ak}ugD`k>H0Y!l~H%Cpme zHR(29UyuW=X~(__Z`*m~=6<3VWiCrG7_cUVpj_{(GoI;=;Ots_OTWd3fl>P9fDcB&PJ8KK4qt!)kgJ?^(R;Rdiopid^$~_Vhx@)ZMao>+f`w zX};U}hdN4;8aNL7onzscB^OARO8(|Y&d5^mEZK2b+39Eodflnmu}k2b(5|9-?VQKK zJ8w9aM2&?Yx2c>|%+7%sQXSE|lDjn*#Rv*=0-wg|Rv!SD*{u&S4`xcs%f)oQxU_P8 zmX7}~#Qo3_2Wn@Hx0l{636p{Is{6$8(o%b%;k`gE%BpqPHI<&8_Z0nCB5$cpI#G`@d{`W zXNd6SUL^+uxK5e|8LP^xq?Ov)Fw<~zH2sMDi8ijQ?M5k-V_yc!FYu&Nr5LUpy=m=R zwra?j&l0u(nW^2j{b=CTIk;Z#5wt-MlO%mB*SnB;tfN8SSogPrJddNbEvzh)ZW1iGQxJJ7cl^sH4vRD`Twhqxh&!1SkdiSQ$ z4f#}vQ+i*wfJn_KNq;`N_W55j6K{p)905+m?G>0>hDu~GH{<-_)*bUr;R(H_RLA^v zhow+8AEgzp5wIyoj~>STLQaXxhBi$@0#zFrS+9s@#AEaxgK(V!j;&Gy`}?`@ked9p zfl^sPWTw_cO!4~A+llG)+;vBsFGP!FryYW0dx|c&M(p!{yd-eK1>`Q5 zV6D&|nbYO_gtj9(McH0V?W|jVHVa1CXx)3V^bQyK<$nhL?&ja%RGwutM1f83k-GXm z`FE~(n0@ud7N3-NEW*P_u;sZK#F5J|lgNUHkDpv=SL*FGA!V!^33f#BNJcwuwvE`5 zp$xEBR()e_Z}hB2zKH4?c5!>~tp7qw>p-u@2@cHny^hww53_XIwn9l-sXwH=i$2b} zMqC4efh@yShhHvEeCbmLm*iJTc^P3Ys%5O6NxU{(l~u{q4t^%@CFRJP8T^Q=Xy{pK zlU?hyNF42 zM?P21<{%QIVtJ=S-e@TZiU~<8_T63|89hoF*y{IKP?+Fqb1^6+s8W#AUB^@jy1$h? zHKo3otKo$DM84h_dfiVfAkLEWs-LJ_XdHlvM-ar&6nY&K|`n1yy zdnT^_l^TtwuFTLHYt>nQ>F?DZ`zbvupyYO!RaByWUCi|?Dx)OM+zu-qi9@MdYD3$1H8-lH% zyY`K)EeMJ_{*J5cb}Q#LiX0@B;=${B;kpb=|9-f+a2ai z>^D{6<3BL!&&oLS`Zbmf)QqbJL-o275OelVxJz{-z`MP zpUX8S7hTs!{2rr2eZXJ>Sc&s z6@#$B07R4I?fE*{50xiCXNbK~&JteBNVJ;Xe8kN=-TKfQ7P?k!b2kjOi{cg6aVQPc zmX?6Wq=Q`p#&JT{t^2I+^c}TxMtjKF%Hc?Qc9w#5zG4KrlZ|xa>~K(E(~gr2pS7XXO87;Ipe>FN83h+wleS&yxepFUOtS_M&1TW+!c{Z z8$W4Ag=5ZJ*xs{16}jf`j0}_RM?O}t4HUzUOJy}DCz$-*Uh*mUE=tgC#T|gavJzla z8VCWS1S*A(5@Mr7P>1!gOIV{R}B(b=It_ZIu{}LKdTw{S(`f z9uODgY1kclwt52z;HCjZm7)*2za1g%p|ORppnEyqW=ksRCC9uQ#IOyD>r&XM&Vhfi zCV^6rO+6|p)76cO=%S&=4f9(kL4YXl-6u?1dofOWa|cHVk#iU1u0LEf=TEZmP&UNUo@th4q48x*hCF z0b!Jbir$3+6Rr2{xHO@2T@TCyg1r3ML#ryRoqghu`t6=^&}vRbg^eX3ODH}Jq?&<5 zzz`$42&N}|akA2ggG+9|1#+M631Od8&@ESl+Pkjf$W zLQwxeOk#9|(n_$TdBB6ah@1oCC71{#vceyf&i7XSu7IgwAQlHs+;2lTsaE@r&_N?R zgZ)!oV$^~~T6kYV=tTA-F??gT(>BK12m%t=OV>%Bla@*AQucwl=W2|XtR1f#8oZ{jZDEL_hc360zi)MBkg7pu* zGUtQ42VfE9QXgT5fTXnH(5AyvNq_lFJUE0c1uFQfr=ojaXV1{BzY*{YgjMOouKJ4j zhiu6>Z%B+eB$kFyWS&y1GFRZhRBl-YrnS@Uhge1{1hq)e_SmkXDX%>veVWh5+=F15 zOJZpfKtNphoimpT%MzCPY`J|LH%x{eq}%B3^$IY@=Tc=19dF=BQuoM8L3xV5>?NVX zVf&1WT@@VJE3TgaBBr>ooLp};o+h-qdV(jbg(UQYq` z(n#(p+MC=Fb%D_FhPk-DD?rlV_U1=FVPBJJ_bmo+2?NpbLK^P!4Q*E%Bt?0gw?@ZH z1L~vhC{1h0J>2RG)Fs!iSJh2c-aU!{kV+TuB|7}*E3$F&1Rk6kvp#DJ%BW%GqHz+kFEo=4lH zJQPXA+N%;`!XMh{z98Aj2oZ&%3kAO@(|AALnG#Lv(bMQNWv7BAT%s|d8i3iovLmHP z{oCKF;Kb9o3rOnju?d8AR4B&;;UxUyYCFCrYC3AS|OAcTDfEx@*J zCFFxMxojQaEsb95S$PLH%$C}uA*T}s6Z&a9qgnovmY#BM(*<53l!0h-bpboQz7%Kd zTK(lGV)APm`s9;y2hta(L4r~sR^o^^6Zm^4B#5cAj{nVz_JamxYV;XYLkfkuo393F z6cO^(wWFGhmMN)PE@9;erP9GY;PB?(_>$ZRih0#ZbUPE%7t6uN^G2~?12=a^PkL{c zcCz}rI4^-$p-FDeecr> z+y}Z$vxYE4SqNy8%v9K=BqVsFS_F{ODj z{@4KPA7qI}gA*TK<`1VZ5KjgX5nQcESGru+_a2R4#6bo?y+cLcZy$a>QWyLrZSbko z$XFWo$?rNZW2$dW?0*@SI&!h;WsK&F!gnvjG#^Tzd{Gr7`aCE%@^8oz7;yeeXZzo4 zOIDJK5?H~>!=(SJD9Qe>uHgP(YD-D~#R~4fr7hwA^A+6xge;|Adh!1+ZRuYtO4ZDT zOw#cK2Km#qn`<+R?UiAx&_=t1{3HRTsy(MpME?~~(&6XUdYCIc4r!>3UiA-ci3PN! zuKNiXu4y1oq80vQ}Cm* zddJ}lapiUSm(fvYbyFmG>G5zArG7ydWB3a%4OJGGO^GZ@)=t;gZM1s$Z1pDlZ&8mo z20nrZf%9z&TS~RB8~%yb{<(~se5m}=cClmg;EnXVHEwF*M`NBJQMF1>{due;#XaXIgQVzIF?;%Xy5aqNAI3RQjmGi_|Ekpti2@(NKM@BKA+z1xckFeF`qhG zVrAz4Y?sv!9*8fkm7l^oJSXeIp043ych7*l!Ylbgl@8Kzh%$`WUkpuCaJ>K{nCZWMuBIk>20(1LV)mVy0N zCKv|~pav|y$~<-Fhox(NDxnc!%ZAzRmrWOHjg7`LaP!jhL!um4AO{_%x#(XS==HP? zl`mtsXpV@WCe)C0{{?N+9}$jL6J zNh{QlV6E)aP2N$u+3W>pRSvyx?cQ-@6EgJHJm@e*`u-fxaUQrGm<}UmbOo!m2y-?t zn8Xl`Uc)FU@UvW3nLF0IGNJ|TKcK6?sdUkwCb|BYD?z)A!PK*qf0J~W^o#?wOa=Jf zZ?o!)q%0!lk-HICon=OW)tNbZyKqFQwGw6`Jm;NwTUWV_>bl(4F?W@<)ZzQxOobyl zOL(0ZK5O4r{t7V#f)LYm-xG06p)r+@ZuYEGUnP~d!BU{mJgsjUeJj7{O>LdVr%3lW zRV%kkj{eX<$aSiW3C0>(AW-Zsl-CoHYN_M%AI*@!?pOSH>B!B*b zPSN@82WC(KexX>y3)OOgrNZGsq-JgG`qg6@57tHOQ}sQqr8pw$-N2Ss_9%+-U4G~O z=^@?fGL_7?%_3`y$X6CiP~zMV5g~n9&Yl;Q{TkeU*i4L+Trn5g{2DdVx%8yHy+d)2 zDKf@x1;Y_pRf)L#ZIP2u@2rNcg04f=8O7WUQ=x(xX3z4hwaGpT;C~sRzkTcbMtS9U z(aDJ>F)XV7K(4NIh$P^>d@Dio{d6}Watfw@sYWjF{^b7gt2>{7l~f}nQ)$I5mY29& z{ce!ZE8#MGFZ`{>EIT{?^m1#*0eaVyPtDmz$32~_Gcv$BOdVD5;wzZRHTX(qavJ^* z%;Y^fq?el5*#WK6O5X=#qQ9#@3a$)2(z2PkYRvp*MKpr{GBDQ&_sw)+WE^Rqpg~$O zoOdSCsypz;D&LUt0y~$0tM1~)$<}Qr?yjs?tBWtc+C-#0a;#ax6mp?Pmbb$+KPL5S zuU>BW{;N>$T8)M*ZWI4AhoHOUp)tSEo1^$=wr8NU^0q#*&m&p%)~LWcyBX38)}GkJ z6LmeG_y)!bp@s!giSkaIi*noYPyx@r-fV{SndQ%+L%?J+xvy;n!yK`~&lh!_hd7dl z9!;R?>BNXQ_W&h!Fw8g}NN_O-j2T)luc#~_09s^@*)Jp0z3q*@ZY7UrN{~|cE$CFP zTq|;P+j)%`YiXAjQI_(JZOz=V&*sdUKWG|t${jbZY~MPEUSH{x=tXeZ`BX)3Lcd3; z>#L&ewGj9U6&z|e-Nmp8^FC3at0FLjUvXX=8}?c-vUSOS%7jit&FBsx4^1y`_~d*> z67WW)ZkcHe+4MMA3R}h7((HN_9WvYXa&c&l@$B8GhTUm;kG^y0s^ly{i{x-zFZiv)BT45+CD6<%Tq- z1KH5JdAz*q`==+kzQ@be@0kUbG{#yVh|D>SPt$}7l*18L_Zhx3S>tkzw5!`QV&-qD z2dnS{7ljATPSf_pDQxCm{7NU%I`Gdf^i9GgsAc4fbSmN>iH z5AdY~2<1cqR6xd0lH?>)cV)828)NoD1p$7l}sWnc#= zDqU9Ef4NLc92X!nZCvo$xL}7lvhBS7+7*`(H%O_(g}kEO=uQs8jkj(m30g)9ax>72 ztw(&9!>37Yj0L+mfR&t3F2ZftN_aCQ*UtLT%rbNn1is?5wJ!rRPttZX)CjLN2O`s% zEXL7Dr3FTI%^db42^&I!wRA(-H1Cjx!_HP2hlCk79>PynWc#ezED@RLtA35*WO|vO zMF@0#;2w7H&4HXJ37+80qaWQmhzvbL!@E}I&d;SwL?+*r5|PQt<9R7=R)jfN?wm%# zG(hqvkO5cx5&sWuZypYH|M!0nX5Ys;_OS~w$i6go35{K)8e1rpwMa7dT_X`ijU^;? zj-=87>v!MR_qy-vkNZCS?GMK>$Kf-N&*S-ced#N7 zXTq89lhFp+sFr}#8BM(|>n}WnJ=ZG)iEe+B&s}fZ18#m5u>8+L(N7y$V9&U*jSD1v z4&8kD8@9t|Uj!F@7m_+to=OSDI2f9SopB5kL}*6*YZqr3>omCqWzRFssf8Y4Vs7#B zf02(xG@wHm(PK|xPDJdl@stNPmSaF+q7j}8ZFUvWilo72muZd^gq3Eg;=^FyhiE`9 z!rtt*r68B60UstcS2#p`q7*9eA(SD&ey5~eaaM5( zQb+3}(m;s&x4(3Dy(ONZtWnL%Z;(E^i;nB1SV?rGp`r6QHY7XkH3VyfxbE3O;Hs%2jq?=HQ z5S!91dpzI3Rv%t`G_Q0q;ta|Lk;mS!nBeV~G8jm3FZ|hn`T~W}$=+cAx8Te{vmU~a z@sIu(;9fwJ$rtmhV;|!0?#ZK_-@-QzM*?f5js*SRj~; zoUTAJ*~s)vpZ;j4yv~iY>JKQ$12mWm4eGMahI+CuyYQioyw(67JfDJHpyPlDGzjz| zUc@x##?@VNJ?RL1H8hKbnuQ{(1UcKi>z9dFCAUzQh=f%>j>kopun}<__+b`2nu18- z1Md*KNFnHa$AQrrKumpHY)l84N|b90&F2fWb+J0{lo2xEgSOELk3~3!pxjcVhf6X?9!bif;ST)vLJE< zffzGcKhBx?uRDqEgK2%HV)cn|WM9ifE?%=tgs3E>Ed&93wnEMpk%Pa5CAwROkp3$3 zo*PCFyeTLpiVFTBQ38e6wq5wJe`5=$S0NF6;NB(|5fnwJbyO5&o+AaUo^L6DCXM>H zvv1|>r#ui6eIPBsUU|{BL6b%gU%Yf*mKUKqWfl7YO=6xAI^p!KTjcrq zE}~HM&|5=8HAJb+nE;E%Bf|b|5Qtz=akX6m;D?H8TsgQ##6q6CS(N*HN#huvvo|mLq(5*8A0c6cb_?+-4QUil5<3i65*#x?F zombA(XY_8m*9qZ^^xG-F<^Wp>QNVh5p0jbwEn@khtD#pRZ4kh<3jSeq-#wTOaXMg>RlztU{dR zA>w&F)&G6JjhgEUR&bDW8~58F(v~cKI>*nE4hc+roai0cS-KM|Ezh2ohJ-J8vzmDJj z9YqSXgP_kUyWTDt)Gb3p4hBlmGWGx;>64AmqIh+n|`)7e3P4* zP7y&MtP>IhF|+M0iw%1I4+9&phlk%;sW^HtvoXI-FqnPqWI!tBl2y;-P`z-fU>K^gqg z%*Y8(-))x)5BKfFTTQUdcnW_fj7^jWi9URPaV1%7huKl|?2fcUT^rZhJU6bjF}^x# z7KMapnlOaVT?Q0MW+THLOj77BSAJ9>`8;~Q=7_P3#ufeV>%Hy{tsDL84xUFbphzz^ zDAMZh@f%C4k!66^Z8tyD04UP#UFNUr#&G6Ozpvt&U)h2nH^jjHUnk)fzN$s$<_q1z zTYa5Wk+`?i6Fa;&>1g|B23W zZgM&2{;a+L4Z7W0lQR_`d@jqa`rB<=O)YPP)ypll^~n|x+aK>q#dxx8$?qUYC;u9; zvjg^O>mXC4yf=-Ml3+(>Gcvy%!ee$(gek+F_~Sj6$mD1L1OIkOzorpN^KAH8Z}h7 z`8LjG=R~E8mVpTxvXcPQd46VihH!$nv7{4mTxluSZcoQMwW;#jIP2MNv@TL9*}*sr z^u7zOvk^v(Iz)5KZkDomDO*IG)^DbV6%xH0GPUpbl&%&`>H0RNboVch$^K&Wkcyte zG&5!hZ04N0<7KzVXE)9pPrY-ynw#hPHL#}7uAY=dA_yrzFW%%HgDr5jkb2~jP>IPOJ6V6Eqs=p($|Po5s(!9?{v$~ zu5}3)BD@@#!V-75ml;P~{Hs2UOWZ;_D4c-|yxSy1RI@s8hNq;J?OmJa5$vj&B{0?r zNJS@r37UBzk8{$exxwwKAIT-pr0q$Tw||z@k)PFz>%Tg84n{vUZ&!xvaR11S$cfPK zCQWv|``VUn6zP6!6lG{C#M(zrQ|Q|}~nhr7tFARVmDq|7%cWscFO z15Y2lPH(RPeova%O+NH_nO%yC@Dae4PHB`586GwjrgTJQSTuWx_xc=;DL(kBv#Cbv z5J!0J8XpRx(6Z{#5zj>~@i_d7+!tb>sfAM}m6}!*;PC0V&#Twtrwzos`L6_BblkDY zCs*IIo%AJ@5l^emC^9*+l*^Rta+lUlXWyvPEjtH6+6jnv;ktQE?$UuPvKW2X)~2T# zyvCWE7xq9^ZAa-(Zzc5Zm(jN+q9cfEtSLIqisF$te%&Au{i`Ql|3?#YK9_WsjlebK>s6`}fu&X6m{Pw%2Gqi>c|%{uUvC%=P<+X()A8U=N*%Ozf&(#*ID0D*Lek( zrE@2|?3`(O!1ulPR~wC99PKXmOOt>e(%-b%`bgEH<@_F_x8!pJF!g&gwTD6VeYF#j z!RVIHjvF(1qvWV5K7#I4%j}jK%G<|#xfn2FR$Y7-bA3HJIsEqLf--O)DWLeRZg!#! zZ}IT%$(lbcrxQm~h2lIh@)Aex&XDH0_%;n|>s1KMwsFPiDBp+c&FhlV(Vs7D?UKAt zbL_R#i{3{${&m-%4(l51H5bi!Aw|Ek$b@S@{z#`5y?W>P<3&3gxpPIK`Of5>>1-0V z=XJ`NpKz4e(<23tsN24Znowzk4Xt5G`l+bO0+9d?uOENvnMyen*x*Hw#6I31{a76< zoekzH} zA5#B9N_+>!*vwCHnZGCz)1$amA`)E9+8+js;b9`kX-(xJw-5-P)Shef^d>)*!a4+U zCL?9W{RALN6lKbOEST0rilOiD4m+--)H%AGCk9t_8;=W4x|qm?)))Ys1UrlW%*h3% zrQ!+sgiBERGnf+}aVIK-@03;BkLL2>-i);9dV;ops7#+X0uUw2M!VZ$l< zW0q+z8XTq%<3s81V2%ugvdXCf0F_4fq%CPu*ROB=PDNLS+R=f26_pH+$hlgkJ(sa< zfJz7y%Vi4LZS3Osxj9?xdP`gjiP%QQX|-JcJ4B=t?PSz5#Jowii7nwDSBbUa?P28e zRxGrNpWL6of~jHdGm&K>cD_XT1S1_mR-RDV0Ys&*5YLN&22)%@AscG)CLF7Q-FYW( zAqR7ZiFAcHcZ=kl~%@%VptsHu25W}`sVuQxG*jY3x#>p5D$-r@4oEzL>0>x!1vwpV^E+c zxS6dh>dt9eD5Z@RT+TY=LK+wQIqICfC&*yoO5?U&fWbn!$TmUjb$&{77X2<2bCL(! z?(bnwMN~%z3z;Z~f_!)921_a+Zg@h#u^Fe+u61RO)8M78mR~{>@)+O)jLC_2%YxTr zmmT0z(HRuDnf*!csH%7#?!;V$uk9(s61YiC&yAVU<6z?Npe}q1Iv09z(0Xaitne~4f{k4nyHur&7r#toL6Bhw>O-}_ zl{vtbN~48MR~fiGKGc=&E?BM~h_&>QwoHOqdZ@yg9PE3DX_l6XbBr!}36V=dnw+aO zIe^S(YwTGy9j2I_5wk3}YkH%ywWb#4%7E^HoEc$YM_IZl((10aiF7I|gH|6rh)jlH z^(z98ci~qd;7TZb7X^BM)#lK$@m{XIz2J&N7WNSj6ppaHG=*WUlB=h60Y8ePZ%mJ} zXje}1P=SWzC7a!*UgbkXv~?|v4&V_OQSvw=rSRl+P}pYTe?{Q{wE_HTfYsX5C3SZ} zY66fW615`ADUFYQLCHRmTG%$I6)584(}EkPVmqj4f=}#2BF=9{#lIN;2%sV$Br&li z1FFo_7Lu~0Y!Vp1K?dmMtbwghsfh;@4}R*(6r>S60}0>hdMP$HP8Q?(nb=+d_-j#S z93eZ-ZqdsL1x}*6v(je1C{c>Yc+{1VCYi~g&D9n+r+L^%bnreyWU~$8_S~(ymfchI z4MOA_XJslNosT-TBop;v0bef=Q7VR@s3ZkeS>q)`9C6C3>E=R6;gK)as__Mco> z8NfswDTVcq2S4+%T~`#IV<1KRUj9r?iX|kGfwUY%nx7cZdD9acpqd{BBk54UazTx! zJ-GzJH+&Rj=936q!nJ#?!rb9=lLMwO#$N3 z_-t2Utd%3ByIzhY$;93`DEEqEarAdB=_O|%S~Rs6^6*e~2aS8r`KI^l=Z`mTxy@$p zkW<(ABI0G)t*lR~Weosz?Qa(Mvn7$uwu*oIpgG2hL+`WuDE!OkaH#|jIkV-9{>V8` zbu(J0*cwUj2w~pROT7B8D{iwNdchl4~O)BP|@w1qS00T#3=-jN)xFlyQu#ZkIsc> z{-=1v4MfaH-a9n;Ip9T#0FlPN7wz##s(4gPj#u{!ah#5dwU}^t{F3;Iooh9ro%-r@ z;FRB<$(z+vesc0J3_ngePrdx0^xChgUnJ=D`>VVUho+V+{!J|@@!x1i|1)3&)d-e+ zrE*Z(IBsS2=iK`p8atA|-uDoLFBA@?Di+6xOB*bVp02qtI`;m^1*^D^?Nwv#SLJTU zzTzdvo^@CBIk8ZnbljY)_UNqW^Sx(c3#Nt>W_uE~f8eIf;@&>_g|jpT|MRB@6UB}V zUvNLv6ru}z=zS?5tLtOm?%O#1yGIs#lJQo%wuFz>?f7HS_u6jD<9}cGF+klm?s z^j;1-vUsP9D}<3$sH8^EyzPk(p4hREbNWo}?mjmj!94lPt!lf+9XEcAO?&09OMN<| zz4Zid%dLPvndUZD^J`UNexKWx{_0+m8X0-OX>0kLTH+B(xnsgIUTN-rY|b|_-J39F zMxIGnhzveu&0#~&rV3x49SK`~K5;SUuTtk4|5-tIk*wV5uZ3G*))~$e5T9vQ7hZn+ zenfBc-f`4c>;>{HOGPwdHhDg-gmDV*Q9EMx+A?A83_wCErH^L1ktOIm=@Z2cS*UmA zwld#wTf3qn=rVtgJH0LSokhN{e9Mb1JSXyL=9J0F(rxv{C*e&S$)t3UOww7YuLQ^2 z8cV_PHiDzSYK@a)PK-)D`@Hanh=#P>l3`29o4}|52Q`Z2bB$%**T%N5o7e99=&hQs z+06X1T~4CqIj%89_)!Fhn>$xzjBg3b+f+9h*WO3>xGi;bZXK5?Zs*^brS;;g2|OQ)AW0! ztIw#MdRLylP`EYCe_TL4E4l?$klT>uevh4_4+Y2Ds&9)YZ3ktfU8bq9ug6Uk+a>l< ztL*>GaMyr0^X4bzJp!ML;2Bpl<N;2l;Gn!@;3o4N z8;lEISR!QJQV%e6?Ejmos)^-N1z4so9D451*2_27wvy0!d|)_G&sp zC}%LTDk_Jn>IUX+L)zl^F}tt}?_uf*o#Yk&Y2uG%y<;Kiz*g!vp=zF@BdZVZ;a-sF z;$=HBK^?uVM^!W{kKU*(UOx%dq_m(wSt-+ru~)%n02VkOoZY)vWHLL0KNi`ocyu7= zk7xcG9z>z|#ySOga1P#OBd0{m)ZV|5+3u3O&duB$rIf$3Tv?nG(j)sN8#ZS4C%T`p z^K(us{sM2#WOe`?kW<=xWE+}n$5r`S9tEc{XY-24nOYl@xHBaZZKh%7v7LDVZwvxU zAf!1A&h67Eh(67tAD;B!Fd~i?|zP1Xts;tg@AK!_J z2=B3T6UwhPf7WPk)fDnFH_uVkszAY*Q#l`6(m2@o(`?YhpF#Qf-=)IOv#f zd32TYI6U&D*2{wRzlG3Oz}C*bxX_5hM+kbtSn~R*s>nE% ze0Sf08KhB&t;`J);jE93(Le0yRCkn%-1n7q(HneoZT3txySz8@xy$s=7ZVb9A(>K* zOmkgqr^NS!vq!$E;7@E(mH8?-TzOCFR78f*?c=e+N}#pnD$A(6|cHOCp;!t((@<23g>&!Y|PR>1;F|sj!d#PN~(yWxl z+mpJUAx(EDhY2$FT zm8(K^{I+0^d=?h(q7^1;CJZ(F)aViIDzZ*);+{1XPWpoevkXuc|9sDI_c0Qdf$Wxg zR~LIItR>&9hsAW!%wnzU)ckSXRw>s-&U{uVN9m*ASWbC{j{2`~-?|UvE?O3qvl**% zu)I5EMIccQL2o&`!)3uAVI(S=O|fRlM@0z>U4>*h#3}dR=*^_&wHyh=22XddWNOD1 zJ_^`nd;GCVnzH}72~o8WQg>;o#u&pg>8J%*&GBddBJ{IrTo!E}?ktjwxImKg6> zZt+fy=@wg@Lim-NlpZD|HXCol8JJcd_M>&HJGSH(I{8Z6CngSTz5ktoof~~Wl(}h; z4<+6W?0J8I>4{M8ve_z~7FSnhOa{M{^ba*wW{8!6eaxa<9x7@_FDWd*aUxS87; zyWWh0mKIAt=2pIC;~#n&FE)3=Oe|&ytK6{9PO;YM@^4~3s^Gt}5iTtIOLoW`st2WD z*fqyECll-&`>5*_P&Puk(`kEX(DMSiOA0( zCw!cv0FgNkf%Vqy&Sem$>G9ve_U-rdtxbw>WMIdUNy5c4i8Tn?mA+Nv3|x<#liU^< zCWvneg$@u2ei9jVOWQhwi9=K${cbT<4nZ{r|G{|2@*89a%e%6z&=iij%Ruh%-%4l0 z*`ukyqSXyIc5eY$>iJ>Cj>OaWkBnW~lQ4^KC+<(?KPmNQFkF4v&%qWTy<(5xZ?MZpmcLy^K=)|mSqyJ0*irQn;<#!4X2(y z#WZu_F06pLdh}1JGhRU<8&HXtSkkzEr%iO@TXT98;y%mU`+0dQ&;2^M8y8hhjYE8) z?wT}FelJExDPeYb;Z^*xP`2o)*uGD z1^zb!_nga6eP|7C=+!fz@SO5PO!Qrvhs=Vn3j%wV29GN--&&7ND6LSxPV}Rp^O?v} zn(6IL=T<>{+R5I|mu*r&#TeyalFQxClwsOfh^Hk1s0qw6O&_{V#pSd*iUco!fZ-Mr zETeKLxR3PH=ardxG-z#!xgX896qLOnIYSY_9O|Kw+vRz*W8b{Yd*h(Z+|b^`|;Eh)~Fd?#tTwy%BbhhpY#!BR=M45Be6*eI*pr$=?nd z&`zv~!&xv_4#p+tys2_5su(a3q<>RQE(^(|Vr-3dmQx9hG}wOot#u+WS1LT3h%9BI z3qvttXiPP@RwjV!sav6aTwNjXeoBpcgfg(Xf+~o>e$r_|rg3ZX*CEIXj$H6F95@ml zNrBdtI1P!|db1Dgih@T7;1OJS5D{)FV`sh^>Is3xFmPTDmyUedk-;K@7wcJqnq3F3 z{wQh>D#MNWJj5?sa{G zIpy$>8Fbq;1~Qp}>0Br^s9~)V2@@17n~#WL!uM0*!E|^e@QgU90XA+K^sU&q0dDKT z^Vs>fglE|;ebLt7YFrE#S;6+tA!5-HGA}zf-?=Tbm?r-u0YAaUJr&@tE#&~);^i#v zvj95?Tqi1an1}14AbOpB223TL4w9?{A|hODhYgwZ2LCIqVtQ^=rA`s?LoKEcY znxa+8K}b;6eG;idk8;Y}{M-g+qS7DOH15CBKD(%~X|_X(D!skeh^504zhhDdkcziGi{bSslOEI1*bYJ9>}q!?x_irkre5fSxD z(NPR~X;JIqo0PL2d+|EAxu=y&SfXw=olvfDmVWtzON2qbLIlfr`P{KTFd`6Q$6=3w zIGSaY!MS7WvmzyIUZwq_lx~5atjN=3mC{W7P2E&I+ti)CD)jimdJ!a7Pj{)&R|w(iYmf) zmZ(Ha4l0H7D3!JWn3z`vr){lYbA#SBL3G_6Ti@KN`lAN)es3%OV@bd+X^23OwS19IG)9R{;B!3k@3>WH_T=s|GZjY;|YO|Qmgt z|K9kq{{T#hGlmj4wN)%Ert+z~{-osZ7WZLiw>?YR5ASAyZv55JwzW6-c+U7{+|vSq zODs*aie&&^q1+rIPqW*OE4|DWDqH3eEIsfd`QkFT=eEBP?XM8$X=ZBw+d?AdA5Qqs z7PrPxqO04Bv1;{p9VD0;N7DET;Y?90xBe}^Hpb3fZqU=4iHOJJwjIdEj@R0$LnTVn zr{yOX1ESydHUC&hx4#91WAkjUExw^zN^{WliUt=|^X?xthZDz-x0-^01u zVfWgSXMW_)P4Dx6<)1PX0-bXHgsQ_?FGjTvAH(J$6prC+HTRmooUA42Xm9MtI8Bp4 z__+mOA!+@#kUXUNCPfRhrJkp1)<&6YX9q(vWU9 zCzWXUCCBG##x%Kp#QbSn4N@-LKN=t$qEe<9<4m-ZN`JuIAz#Jw7@#MSLrK(HmNNR> z@8KI3V^U`IveDB?%84kHDef20nJKv|02oJ}pt&s;`c=s__`cfa{XkC||E$^grYqCN zz5Rnc(}{7uR`ZhiE&c);4@4M}MkOq3?*T9gPPSu zH==QdB(R*8DqFXa?fk2I`8$IHjU;!*cD6qQjH&l&05v*8=6>9!qW4wD=T1>1c2+*3 z9u(j5FyAaC`;+Cvx@xHS3B>1PQl5-zsDz7uH1xZlseYRj(`zPE!W-M!zhyN+RuJB@Im>Z!K>=3n0PydSNwEhJDA1=pRR}mjD}ewS`{^;YTSu*98bmhf=G0| z22778gf3ubx2?Z<))+Hio1nVj6m-JqK|;tJ&VD{^;f5njE2A2pH))TN7D73>3X5*O z0aew~&)x27ONtQ)i``(tp5G}#GUq4Fw2<}P6m3~ma8^!1<2E5^4rj-g{npNfQirNV z%Lbq->iQ^;j4p{Lu7m2%K#V6yWwSxr2iTlV()g%ni`|yxLF`Be=Q18h)ie)g(M;_s21lLf-MCZ2SXTJIkx;~?(VV6MHQB*tPuHRm_w zGy2BrdR5h3+|2WLW+;or(ko=e%CW~k;?MW&>bD#YBp>yjQ|{tBnVilp4W|W0jgO^? zLu~pS8@n$2Y<_QD>+bZdS3KJB-rq@?I;hLv#943s)UM{K7) zk-WxgvNpN$eArjwVx6-c9^;Z3QK#Y&TFmdz2j4Ew+*szna6Y4n7}w(IuHi z7bdjuut~ItN}pX$=5?d2ZGt&!@2-AX$wu={1F2c}$2T82c4gnMrodYPI`vX|-bM_o1Rbtd0Goj+I*yql{m zRn4mT(8z+ z{SOz>sdU@P&IWgRf07epPQvndt_QYtSS;2-FHIktiV`7<JutbZ8bW#; z`jpK{g=^UVg$`|lYQ`vi4p<9%**|Z5yFdrahAAS z(6?jWzu$;Uw1~e}En3GkEDB4_PeHtTcGK9A%1C~)vvC&VGuB0V$1O6GJim4SMqEjM z+^_1iOt9eMAdiFc9P;X(!}||(bR0blqD(BuOzED(Fk{uosT%$0OZeGcSMqZkEc~QF zQ3<}i&31at?J~9F(APeM%FE8LXrcWSlm&$}hITX{qnW+&_uun9AtZ|8npT68GF?qg3i$sLAD4yGKo zt0Vk*F+#Bi|HSNPa<@WC6!ec^SPB)>?&#V|wH*GD@T4K(E(Ccn#MF_2&XhRO6KG!? zO`K=$y0|1gsjLDfHZ{y}R|cY9aPqu_>+SluUS?=iHrRV%kMKfH+QIs`@fVF%)c0>h zyn9I-AZfWq5fG9-x|Mt;+y;^OmyfHx24=KBBS~#r5Cs+)0t;f}7Wu~{P2~`M>4<2V z^=!i5fFf~I8 zn4XO%u5&PP#8i3-qI)2>J5b#kP$XUes3$cfNS<4vC{3br;II%1df7W)Fdse*L%&uz zLuX1TdTnrwph4QLBWW5+O#nDEGB{*{NXFyXCl)! z$bQ2}`eF)J-EC9tzo?6Wp*zg;|*b27#zjSGUgv|u9o6ghW%9;D(@m|_-ZozdqK z;?yX5SZ?+5@JW7UhbzU{vY!Nfvftz)q+M8t`%LdtdGtxRMZ z9d(^2rD~?Ktp-J77}dU3YfUvnpov19Z$rh|Ur5FhFdv1qP^ z9*n~IG*tTc6OviPcniwHrMrNckO39AXu73xf6E zk2*<*Bh(zy5mVypW4QvJWyXNHVD)=u*70wm!sTVzv8|!aq(2Bf9?K5Jy6UU zc#Hs%OGlNmP^BQ~Ohs6qvuZYUNbiT{MD4m?U0e~f-#3>SNJTNJHF*@IO8Z86Tvjvo zYB9bV0&^FXj`^GvT|WTz=0iWk(LvM*C4T6Mp@lsiev4`|R#77AfRulT%;D92dtRs1 zj>=jJV+RpN=m>WZw{i1DHXS^!M>4zE`}d}(QrcR_w)=> z@d<==1eiEbPm0R+gIGTiv#ygkG#3lAWx`^Zm>~|hSw?6IuN%)LbhC-JR1gYpazBTp zpTl@H6*FxJ3oL9J9lp04sx<~{NQeFX!8~=8=lTXKET9Dti z)tuBqCZEGuhF+@?Qv1jzOj58}5QOR$s0$V9N`Y!%U@jmg#XxllQeIN9kD{s0I* zm+ai#;%T4N| z159i;3;&CS53jCH8Qnlg$votXmo8h>d;Wt%oRM@h%xkyNa>@yGY#=G-0-+IW!h$0g@;{+u7U}q99wr31JJCW!CE=vhtat5q|1p*B z&RKwkZ#BcCDnHgt1EC-wp@<|<&i*4K@qX(u)%8yQyTOEb2t=8Q#gvug2L**wNtZEF zz#Ag7v8Dqp_*+dn$LqHzfqjnka_A+t78Zp zdQaiyA|$a3XD${V>9IG}xy#h({4h&Mha|s=B<#QaQgBdE3`3e-drI`4^_4gnxl;6U z5`0_M-YYj!%9i%Bg}E3J^G8%tNp+7@CH4!oAqCtLVA+%v!=p>?8tHhrLLgm>k|%~l z9(`BGXW@iXk;4(vNvymv*%PzC!s=pmiP%D_S$P!(ZHp8li`J4S=!`5zih1|8y|lJw zbndKd*W*R{DHBR{hy}D8S?q`Bo9%;LdpP6d2dutZa-vH~h%f5O>9Pc<2g(jC-F~Y{ z6G8pK@%UA~h*@PXo+&iO-izzP4ecfd5z)$_@K2raV2hsIH4VH9=D?7+m=NrEklZUS zVQW0mo2wFX7dJ4Jq@E=*ye8R3@xD-uSBGCbWjlg{^MkzaBN zCt0FeQ{smTH#*yHi-ehRi4Ml0MRkR+;#GR{K)^*pbe$P$>Fp-9`}U{FU46 zRPrkKS>@5@f$cUJEZ`uSM6~Pw;U(2OXNAoWkaoC%D3s<= z;*scA(zqur9mqT$ayncZu%p{+1C*&jU|rU*p~;(x2dhN&)b>0-+cC9IUjF6g*He35 zCr`b2lKMJu^K;$K*DtR=5j=kVAzJqTBu69&9+Cil{!Inx_kN8z|L^u|4+}(vu)p_f zKu41KZ*-(mEkq6$<@si`PQm*Mn}T@-*u$K|Dq#7|BH_F9+I}w%0C}t zJUCzLyOBbY&eYFv%>BRWNK&xYd};+FB)g`l54BKvb$ESV%0i+z4XwpS#%4K09u?85 zC>WiX2<%j!c;ArnU8Bh2g=x>=)%u~DY~Uo#AE-Q$r$Vq;8xnbAxd`yl)-RJ{{%8K^ z+Xe6ua)76Py<8M+;JsldJ%sm@?|yCb!Wq=L3L_Qb#;da_MMGU!lco7?e9(g!bmfMk z#M*QhYWN8fg^g{J_^l{SIF=WgEJdClQa_SYogrpRwaE~-H`RxV*#+o3Dpu3G!CU{% zbDtxCr!?-+onf1|sY7lf(EVontH9OB^g&tgaUGb{t|(A5+LJPMQ^Hp+5Gt7nZ5_6J zxlJb;FeGnB-KK&d7hQyv*_Mdcb?YiS%+6QpgWGNifeuo;y;4o3@-$vM%=ks=L&Xn6 z!2!D0jhM@z)g9}hUtM6Erw0d$(#zCb$q~J9vJlXbHtZxn-f*vkA6>~pvbf(m=})?x zjg#Sy3+XxyprDlF5REO#r&7d#qNJA8UugAwO+Q1zKcTqohd(tMCbl;{x>u@QF)&kn zFTHbRZZEkyQ%$9z)ueK2MWtkGw_|0y)sV9Y>9CW<>%dNwFS1+qBPb+OgGdE*d*wAc z!YIQA?aAr-6f%*iO-#kV)Er;3j4w)TyQ2Cis{iQtQ{2fnX&5J(;w-V>%4}^$v;@+t zYS4+?zGYUlaG*zZ-Mj@!YwpB2@w;Yj9iHbrsAL3n~h4xlN!_cK&;jfz98=}J9Vwj92aJq1n4pA>=(l99!RSg4pGHIyN(vOz%069uWa+8| zm0rD$JsSm8H4x&Z%A8^QcQpCN&Y*qBAXzN9Ao>Rrn-qdCo90Z1w^cvLXSCEVHaa2> zYFJQBYeb76Fx`N`iLzCRdcAmcZQ*Kryp|1qfj3+15{}KM3M(#0Nc2LgGqiPz(7C`P zqm5#&?)ugWgB|h}I*@O{!bR^T+v>74d$p_6y(KQgE$m@BiR(1Gqc_Hc#XfLy9p`WU z!Gs-VWLjW+n{AHWD@l{V*G`JP{gWWE)E~3Av?xI*2)U0@CpOI7vHfFLYc=lA@ZKvv zyN3YGfJigHAyV4vg3*wah41&7f|0ewD40$Ff4D{}f!_6r;g2{* z{sUa%LRia*;)ZwX-u` zy_FzPssphd1+C&-VX>9|&Tm(=PbeWY#@#WF^F8iKyDB%#BOuk-iGi@tmzQ&qaIRL^&s9{7seYnyt_(^y^^&|s zj$--jax<96A7gO(I_e~A-ssoK=;~HX+otYuG_WDC$PNY$A9wn$%qDg~9N75vPieOE9R&7wbCihTuQ}a5${H(Z6%%bKgVS}-DOeakR3FrU714dXPQ zZh5jhM08UK>B%99>ecVTSVym44ZQUoPuM-iB0jfHaJA`m zBsUYyG#fibIn*|`MiC~)V(m+3`H6j@ooFhn5aXI7VonKA-8c$|0!QKSs7}N z!qUd0i=`qr-s+G18ajBGw>M)p&HVkH5fOsIEiGjw`LJ~HAPtzlsjwvC*e0Em9^W1j zURI2Tz0-*r&Hd`Q!M*3!CrU37=&Enz&TU6nd<8o+&p=W|kA+SD=3{YJUVayfH&OOX zv{2tt^I9)U=4Y@zGTOY~?odIL@f}ClaSBHCy=N;C+iQ%)z2Ek{!4u$-<6P*gjOaU5 zf}F|8bQ_1_RAOzm413hX5X`FR5ujcZLqp&DvGW4_K+UbgGy7v3Z`cR$vE5S4k6hn+ z7V#rPuE~&)udWPEij8n=+En1MhD2dFhFPC1l@q0L%gvt^mNFVm$|Bh15H-UID|~`? zC*D9*T2F~|6ux`O%CN+wah`eMDaSm-`Cz);M$ur2qf)y_Sip3@OUB*g37~DJ9j-p z-C|TEA5&P4VQU{LLHsh)yisd&~b~@4cd$-2Z;t0O>t+siA|ShK|$_ zs(=_eDoSWl1PM(MK?8(d41x+vT!tb7q6TarAPGef6hl!_Q3EzC%M}!rL7s z-s9|xeR;+?`yMVBgE5k4KJzobcHu=UOo<|t&WCyyf(i@*m}$X=#d!sA%XI5a={{xp z`Y|cy2oubd0;OFiEHTxI25wk~XEV8}tmt*c)w9x!u%&XO-T5WiX|AJx{mVoAtm z?dg=s%mOJMYPsB|Xn#)cuG=~EK$Pu&6 z5tjd8QiKKXBcZ8ueApX9p8^cV33u*9QSL$%p8-`hxAg(G2@50praJ4McNY=ic6`Ts zIouK_=y9y}KUKbH6L9#5ak_p})lt-zd)CUqh!1Y5d$vVf37Z1JfhIym}cEuo!bI?avE*WFnty zrNH!tpqHsTc8!*U3vk~zOHQ}}id4z~ixzZ2(}vnX{0R!Q_mZ_rnq>?~__EL!#F(pM zOg988k3g4`5g#u*ln*&r{!eRP+F2AHY6Tt^at>vkXr*ZM+W`B2r<#EmHmTT z0{GAmdGJIsB87@b5yGQ{lH9a6dxy$qXo3**pK5jDwI2-}L)8OKrvWHYxx9u_5n_-W zc45`h=spACLv&VYvVI541fgk37n=*6Xi1F-v@U%C&1Gou{z*+u@nv&~AiPw}Iul%i z1PQ55mJ+ex&_^*Qi3wehvF!@9?E}$%5Zlv(B~vhWxH!#!j25^AjG&RlXjvEE0?eQr zeEeK(;!F^J?*SN%;~B=Zw)1FJUp~K`d(IDx1A&pl!rta(b{q(oh)7HDpZ~N${y>5e z++ni@I}4!uV9PjgjWn=6v+Q!UOpS-SvtY?gFn___VPR!UvG@7pLo;V}Q}l5isKZ=j zerC(+8)W^`g}G$YFD&*r1AT~$h!h<-@(C8kgD3NlJUZ^>DxdH{h#TZ#N5K9~gnf`l z_(*TFKOmt=u-)g6*n_AAvS*kWTuQkpqZ z5H3{JqV`L8W{bP5ZY@4J8pdLrr)D_byN8RTOG{3wab)`;xi#lh&WB5uZg$7)Xkt=3 z&;Qn2$M?BdBciOFKps?s%vX75Q%>5kV`MqQ{woYPgdufCf3mP ziVLeNIZXSH0rf!5wUA+SRxg{-pZ`OdJb7AFItciI<+|o{K+p0_@!QO19r462Qvt{qV>^ zsZlOr+k5g8GT|MCn9Dm;#79Q5REt@zamLqNuiZP{m*}_)?*=x`4M6zP zgj5Mma!DsLxDpo$1iWVEc3+8t@A@tYO{H;q60V#s^dnAj4YS^i{>V8r#g*D?EK3qd zO^dC7i=;az1TNBdxov+RY+E72vu_LJq;Bry$A5zCAfF=6(=@$SvHG{Vuo`NzgLCqH zK7p<{4X(J+dJLt?brPbXt=~u1C(9gy%;15Gq&2zaOVpB@y88SK-WLJ8g*Q1m5JUfeM5ya4|kXOEMyA=R$>pyJS9tA|ETHwY|@j*Z|*#Bx-IyG zd$yGQ?9I++$LpUh;~u2^PeJYf*PtY$|E*=)|29e*|34_{|3*pi`eWraxe@5a=0DK- zJ~p31pwR15#Q#pdJe;2l%$^1R!c&`>D=U$T4))N*)J-Zo!G2SYBC z4@&H$e`sww(m#NmWT!n;W*3p8s>S%8mFG>4GprvX22ko@3OhXn`SKykf+6De7GIRv z7tYJ_w$BAYcn3F=s9|adRt{}+fs?|~w#X}++w`ffaZJ_58Qf0W$pCiJcF@kA+k0vK z5;1tj1Z(@zW>qyo@Nzb_QoWOBie9@$Wx1(Olx}v{rl(H8mfaOH2@}$G%)^9#$dqqV z3d#anl-n$@{Vt5Pw*kBqIjJzrHbt*%R%UOhhsj)3cbJ?Bhfb32-hnBG(8GTxj^zBP zPFZuwa?kQ*{ggkJj|g|al`PzeD`ggbl*IGtM6KJhnMvZ7H&q^V(X#nSoq8UPOicf72!k~ zkUhRQq-Ppl?CqUPI#lDlrd`Coa%T%Bl=|n|MU&J0i6sf&)&gOvL%jv1ub$q*fULIi zVS2229AFQIWH5RP7$`398bYXcp!9#v<5XtqgcpP`tZ;exmWkMG~i*P=Eg5V6zY&Bw}* zx;Se*W2xl52uJ9L=3xG8lwKq2TkM_1lWnFCZ(vknLf#K3oX>i>HdzbY5Q&gGs4OGb zOEzDd#BE{d&L2CkXSnUrrd zoH`Z2moZe6Lec9|>z)}K`0Q`<4-rKuHjlE^9<{>OQ|58xJL*Tv(toYslqD-TUkB8O z@a#V?(bQ>6PQJ_94a982kdd|bI|m{ZYgx{2g=ay2`gxqDMfo|mK^%M+w47Cipv-w# z8TNu3XVmBoDV`GpvR`<1FPn`mE8#}HxU?`X{KMNg&CWH0+GYHaEbglci&$|=uyUT! z`tXvSoWO=~*T3TYA7k8#d{~loU8eGbzgM|Bzp#>nYxAf11?1i;RRv@?%AFIzD|SuT ziaQw+^fo6pHTALi{Yir{m6)8vEk%yUb=JL|5Fjr`=c>I&mRvj@c;)q$^O?6)CQL&G zDM55;oo`O}ptM+!O)3D{q$7h!wE7YQE}x4qcMTYjed>K7_r$r-l!=BbK1DT(Tn?PE zEqMD1)5Cm`STPg=AUhw!kKDd41Q*#dL#J|!cc1Qaoo0bddu}II< z!V2pZ?A{4sv2^w5bvvB_Kr}L}#Up??n7*OB@CbKB(BS}m-sGxBdua*nmdx#K4XAO$A5zSz+AZFky{aCL`q zTB!GxtRNeNL)RIiyZbq{y5(9iF&P!4_K^3)_$H-5t1LoZRT+i9oOiGisqfNWd5VXy z*IM6@w3w%W@s)2MmMYW<^}+074e5Cwj1RlJpe&#iP=x3AMy)i=5d!l!uC32sZv%E$ ztan%YKSjqI>f&SB_roOV>?}W!&W2VJz|$_aXBJC^8h^>-}=N-vsW2JHgbHcCuhs!eIA^5fZ|n>Ish4*3KZ<-GA^vtokx{ZFST;lLPi`JNyUbDvAgO5s76Y)*cYJpygeqbu`5^v`Q>rx3^veKAw#UT(jAm`INQuw_qf_*>n#B-Rt z5PmH-vd}6`5=#1om1brMTLQITQV3;Ks8SjX#Gd*^=%xcUTmC(tNoBYIHC+S7E4fTS5VGPVuUgPf)4`%%15Y9sK89te@sa@oxPBFq!pX$zq--lFZ zZ_)u|DV~SFL&ZI#TY3f>42YoVW)b!==)Z4P25!Qr)naZiP!~rWlRxD|GB+bW9b*j; z50a5=aHe~ejQv2(FH7Aqz=g`onKP9RW)sl@1}6MWG1m2T$E_^_3Wf_oZ0ACys!zDn z;S==ZJ==b5-LzmQxyS+lR{&q)qTh>?%YCsX=3BluLc=JCy4|LIEHGb;2Zj^?O;-Uv z62q51`Fvp4#*uN3g(ZR%$ptvB7(uuW64S^62=WGy@Ip3L(Qt79eocFU7_}cC8ZCwc zD8hxH8+jH6X^14T4lB_^#t{#JJ8)Fw?h+)Mi)8bWk16$@>G*sa zk`9U7e#?;yh0R1dC492ou~9shG69uxmrsE4^g??#u8$y?KcEC zduN>S=S!A;63gn;w8JSgbCYGWlb=qLbU1z@IAB3o+2)P{0>DaDL}XkEs3{@sGqGn^ zk{_FFZJ{@9K{@Y#>$B0kBoFQBP02ec!j6$~M+Z)AZUsyUSxiJ$t!>qKfw)bNyY{yU8Ds7rdTNrgOwYwljzt{p8Y2g^}^cV zMLrIvg{TE`5{N)uk1HLmb*uFQ3G5XLVVO(-o3?KZ!WJEifaCak4D1;H>LeeVM3Kp$ zAKiXZ_a_U1p9HrCk+ni(1qJ=Gvh@v7(P^8?JHEkrY2)Hjyzc_}8T0ZC9hjL?8^TdK z!Cf5-c=|z-Bbn&Bc`V(YOXt3-%(iXj}L%h{W<+7l@1FAV2YU zG-1}q&=3%^)Kn!OD#nah^%$kd=Nz<8RBn3jrPn@753tWO$$|F%{IGQoe6YQOrHGn8nx@{uY%H5$KzhujA zwt_;az0d)YT>a6kqxR{5Bax2BzwY_+d22sIb*~9YO@w8jjczp^nwbof4(&U9$=)79 znj7yMdIvRh)nBc4?y7{B<_$U>*wMok*w@L*Ej6CZ*ZaaWkP*WUQIXr3YYwi`OJlL7 z;6SJ?M>Y{F3#H093es9Hg8oKH83`8=vm>G2$j_=8zadg86qyj;lTwL{ zO}pu?w)se?gpqAfBk3~-yX=?%A|>&WxkO|c6)`i3_{PES-ZmDjy{C~Y2*pCqm%{g# zsmzIb;TkC|bYT)vi$L)QbbiR{kP(~yBKG7c zmnUfMd4bcTLcC3;tCDB%^|jylc$0|!BQ&>k^3-bYPym2PL_bqnw3q$*`$TDD(j-jw zK0XJ5l(h`*y?ZMS9`={w-rrghdE=_d_4_crgs(Vl{(V&4FOEbZB!(F8tnU(~Q09b^ ztoGhnTnl7!sB|nTd4@|wx6vDa<&sK4S^EMQw25&~xJvCmG?$_Izd6!F3*wFU1JI*W zWx&P+fS75a|6d%*>!4!iY{4y>L`&MVkLYYaWt5FNMn_c%QK`QsZGI+CZW^h(8t7sI zShF(B2g#LFr_0d|iBAje$iFI|{rGrr>93~+JD+{Xz5{~VJ=yHk|o z(*J`ZRTr=C;phCONU_f(b?m2ItLSs*OxtV>*b;aRvVWDamQr^9%QPg?HsYLtC-utKQv z9jHQ`f2Eazw};m7$9=D#z!crG!pH62Tprt3`^#A}f1DuHrF;xk33@Q3)unW%@Q|JI zZecir%rcZlY9E@-Qx!7v*HP*Z>=dg#DPR;O-ELI zS8I7YN|c*-1L4;Qxrc`!|a}|xw~ytx@PBco?=bc>a`8ndcwz$(1maRgT3T*VTVyG!JDC> z(94CI8PaM`AYmKx*W3=lSKS`OZ+es|u0mC9baSbN{) zpi^s|*wcUAK_3F?Y-+tn^Y(pzp4jp>+Bdu~`7JKKpNEijMhzWM{>_%u&QKD%Qqlvs z(rUC0Bz=`H-PCn{&#rXL)J`@H7i0c}^nzZ2ynt4(Zv&^_mW)h6y6G52T5%Lru=%o3 z!E3mEpGD8kGaouhcP;YE_9w!lCK-%p%F{~WyQiq-wo}yQZ_~@SqQ5vjUBNng3y!41-geh>J|I@dTqAa^ zx%6>4zd5;n92>LpXEJlZp&ODP)iT~IFw%5x69^BT(a~Tl4=C9oU^ME0!nM9+kNwHm z@MV=X{bJaLQMg0ug`-p8l{Qw4mPu`qt#?gSuC0nkfR1()BRzkZUJbUG)lG?c8Pyx;&I z$X3VhlKr=_ZE;v%HrC4Ey_9D0p)dP`HskV#1QjL!j$4j0oHu+Y$u_Rm3}1g{gh{Ca zLej=-8{c=Q9GH++@Z51q_AT|V%y;fur6CvFZfFtW%jP2wdOI6zuoE*n2b2apRt6L{ ze27@QeyxctBTqBPx8fchwfckmtFTlbseX_CDD4zjsNH zjhRQAi2fQ+;>g!-PSei^N8lzZsw~d=7KE6RaHpvG{NnTI7XMT8ewuF6uJI)|t&X7g z8ZOlvM1`=mqPl}WPlsLiEja2mkFDYiUwda%dj0W@xqj|}V~G`?)-BfI?HxNLm){(8 zp{gG|&fM=^g6nZfm@po6?T0zvP_fFV*{}JhtX7x3tbHG53Efv0=8+nMz+Q4RcDGw3 zzYW%>DfW!CuWvZ?HC4v>$x`sw4a&*XSGaK5PnH?qayD`~#Mk7IDiFk>I_}~_4^t9? zANYdj^TJC^4iP$P!(mL32{G>2=Cm60k(A~TP8Tpuf zuhM3&MRu~#(+V+heB3Sf+$Z57Kw~O2lkg^yf1-{y-l1!&;TdGP`N7Qnh1+lP>AFDj1CwFtlXLuhcht!oXgTU?f-Dxj!uU^B&x`y>w+-% zjXdI%IDLszWOA(NhcH5tYN8^DmcDLaH^;!7h|RBlfQe(mjH0P*a&BXW&LjB^NCCEf z)WWW#1ei?gtT7u}>;gC_w_}I9Y67+^0vJHcjD!U}FUc`fj#;n(Ceu4$GV#g)Y#KAr zd&7mhP1^<2;ejnVk4ATpl+fWqZ+9~&i%6JvE^yr!^4}WMyIDf$FWz*60lkyz=R-&I zvkre<%_w}k8ZU9;7I^}YT$ z#)R?W8or_kU0Fj#v0*GCc6&zU*T8_QJjArJO{fTZhnkpkKo9o|Hl3E@)M?|F$wPYSI{$qxSece_zY_ybhHOth=@(hv3QjdAS`3}ywlM$XQn0$OjyNCpr4 z3DR&RLV1OV-p+tBIDT@U%{?LZyLs?*1|o}v$R;8Z#jx;rbGVH!D366vupNVEBDUq~ z9*~e9;6;JEaCvVXxe%WanDWZ15Sv1UPF2}wLuqs}%v%KYguqUW74C1e`=hBfje%RH zCP~F!^K$sI_GN|x5Pw3LabFs_ObTTx63fGpwjq|a< zCK~4Baw;vdADKx^CSO#pXG?)6a$P*?UP*jW2OgaLz7K|LQSexKYk<~5Iq>~V)UXg2 zl#Cl)1;B}Q=?=@~J44yaGvhm-m<&N3hMWuVM6$?O)|!T9sdbJrx-WtBM8=MivA4iU zG=|ogpJwzh7F=(;&A9Sd3d1EG9sO4J3pOEvHntRjED#}@_;{BtP5iVH@(o_ki;&P& zR3=c)@zok(UYg=akPt*9{g{V8c;NK8*94$0B|uOWbk{N-=5}E2?(xfwQYsf^*Lfqg zCPe_MA&em;ln4^Ws?N4ij6X=SCll|B@J-wCKZ(_jwi(Z;ghe4@JyDif2^nS)8eev? zoU(4Z%eL>pe}tgNAV*b{`mi*@U8anYmXt)}5y|u=Uj^ag^Q+;q`FSocKfxh9snu;g zH+zf*m7zdO@)pP&kV%a z&(V!3X_g9?H)eL+_`1#E5MWGN>Qy;?yC5loj6~onIi1BR*j5ze;PsgN_fn8y-q|bP z&bm)xLk0&O+_UzJ1|*EBQl>cHsQ@sh`a{o841DkpdO(+ku=?P}Bo6;NvtbL&LmjQy z`B#aPT+|H>HFdcT>0!NUeK2D=AS0sek%;(jXf zpMT{K3d_3Rb;WeTlZ}VedZng_Sz3NUZzx2t9?j*UVvUuG>HX4b4Lul~8gtC=yR47U z0d$l0nh^saO{L)GVeI(6p^-+c{!24BRqdu)0!G_fJ6eGN6+k&e9-_@UtlwOPgAr`tG6d#ZZqot8i8p!YRHyFDv$mAJ+~ z`ShJm#ujQC=e0Y=D>(~i(bl4Y5OpO7d-VJ2T@t{=DFc9M@8Ev`(~TdR_`!nTfa&sj zqEqPosrl*cGpKS7W_#j)dfa;F%8D`+uZ`npe1N9Jj6yCwV$M%HD0&YIR=1wGv3+;eJasQ6RR2i5DTi(_YGjBA+JQ(oUV_DTOko&Bjt z0k@)5I*mrV@%c~6ukGCtvG3XaVwv@SEH4VrdNuBPa6a@}#`5>*b5W)j5|7s?+;4q# zSK~oyK^{WGE;M6)VQ{?o-OUT9Z!mP%2j8gsm#dlf?M0&ViR(RY{%#SRTh(xUq#Ar^ zg&UV}>#5V{+)Uv=wgwl}K0aS5erYqWZn~%bZhSMX_CA`%;_G|Kig#%x? z>=$P)mD_*g=lUK*pqok@xqt0HeOTvXOhj>H@gTu=Z(7Kd)z5?~e7?C`>~pqNo7-u} z{;nclgYV`=4Mi?TLtYfG)K8b^It00tJG{=2(W(gWiHj}|G%Y0PY}xR_XP1YH(e9ck z{DE1k@5t$wPH`)dVaGyt)kfB(9e2KKu}AiDq2tr<(YtHie;O?wdN$fCRVFk8re6C?jg5;mFv-v(-`ct7Zh7rMgB1 z8{XI&qw>RmGimXGvSX@r<>8j*9Ls$^cApmg&somW{mU&5-Elr*|4#Q+40rC^?=f77 z5jg9H(NJ7^$i3iS;d;dGgWaW4?E@{91xn#eU$-^P7gA#zXU!3_R_CYUz$^~jgfMPs zk@cjwZK|FK4TGtQR}qUXRA{3rq_$vZ0LGN*n^%V9^ zlg^dSQfdS8xz`=Ajk_E2e&5I+_HWeu5lYUS_mZIYWIiyMOs*&eG0wwCo@tdxv$!*t z_6S~z5Ys{`ds()`uzxmL67u#>X1s2SylawXxLOar_j|X-NQNne5GP#c^CELr z6x>3W5EdcDnO`e`#^h_*#Mdq{4po7^oNYPtyuyk_cN&@wOm)gv3SdgX6c3w$@!IxY zjh-1l{)Zuj`a0*WR<76HN^0Knqj&39QVN}BmA@J7U!0BfUgK`UvDiAR+%X#M<`L=TcK&Zk2 zz@YXs&jvzw6q4Cu80p4`{c&^`Sm|idmV^QMdhjbzCg{Ta2wC~tE}Bz(=!5PFj2;Gt zMzowuS&YQ#zbTCP@VfPYVFYrkT-|%n=-v_nJ{8M!jG5tJu_mo_Nvvy-s5P<$Z0Qa# z)xQR{LW2S-D_s|=Z99FB#*XGOdOQp5Tuj)eKbMe+AXKDmg7V_!D)g{ie`Sx1FV)^n zYc|_VD)BVV#Rku+gA-oZ>?R)L*^-;x+Ts3g&%`Jo` z&#i+Q+qJH4J@mm}@dtEKKc*f{_m04cbn3p{1h>IL_Gacw+DlSu$+4il6ryzMen*XI z)Tbk!EqQty1Vz?gz}n6w&OEryZ}(a=`I8}o?ycf{Es<7Zld5DYcjWqirgAEcM#-}} zM0e^O?i9Ju%X@%y`qS9}n9V&Fd`7Wl(M3fzvrDUMK;vam_|f|&M|zLtso&!lQC61j zxTOzjj3U=~Jfm)PYoRF`=kNCVJocd4GF7Q<)I~XE1h$SLg=I_{TE8nChg}hCmwc~2 z|CY-hxbB1fk_KH%+k9_g`{&cA&#zrnJ`1a`plP0xU8ndu{MSBi`GCC5Tn<)eH7z_R zcyW;8oAaRW+vjTsU>7{Ya}auvP7GaH#$sVIMB!@bFOx|_r6ozIL-6!aQ*7cDY^kok zRR7sHc4WuB?7c_jqqzfeJyf<2eYs>Hd|q?y0^ya**!8uXyH zqp2c3fJal=?c$+wUPpb3IjXyoQ{%KrU*369`fHu2z{@&UzKfW2z}+~a?X5pH-%L%u z#DuVpHnZcG$)u&12ZoEu+<_05g@xXs5lT1InXJ4yza1|c2v^Uv5|vE|9Tp*Wb7FUO z71Mw%fY?m01WX!SP0$i_PG-**r)=hXpewl;vosGC% z|0HH3+v#oCa_;TOcGC4L>sw29 zL1oqq0D{C>kA=w8D8S(lXR3L{PBtgp9G?K%)N%gbGlRHGk2mbLm3nLPoTfZXyeSct z{2CvfzBD?lSC?U}P0rN_Pc%Dhe5WMeIG!c)bbf%fE%0PXj~@1EU7wXx#xVR>8LxEH zBA zdcWc3#@$PMS!1~h3|{WJH@u3ygV(Il+g!2*hJ^ScDKyWYY2Z?ciE*q_==Zofqytt5 zN|CeuPhgq#KBiV(I%h2+>S+n{s#HLm?yu11FN@d~p?r?a1YH!`YJC!4jzcmge z6?B`;7g7o>Zu8l#;R5U_Ds15VuJ`91>)th8&GbrjLW9aTFCarE z)fpdsxJgTE%HAFOCJ!#|zJTR_=yuqg{b}FVJ|#OsuQ9}?WZ3sFWQKTQa!IG+kXTD= z*4oy3T&qwA(s{Xx>N?PP>sImp?03Xxy{nuKd~xNLa&YbVT~)Gtw5#rm;RP;2bI!=x z7^yv*xq8+(v;O_lv$nMZ*Y@{Ok;m=@)mNuG@DLoG!0_Aiwix#MJpEi z)m`2@x*H2_O||i|*PcQ1$q1XE5I-?yMI0Mzpkci12-mVVS;l=KW3PVl@#DbT$f^Il z-YmF^>E>Y=%?F>S!+oMcb~5+4S?$RQ_c)qET%_nUkyNT*FYK=z% z8@|u@-exW{^I{}4g`=>3^w3WR8YRGwn5f(~HPKH2QWWCYm4IxBr^{?!)GKs9U@D&+ z+$gA)VfMdT_!UtBvQh=q(g;843h&AJ1XHsn2Kbr=i>7*N&lWd)4Q>#p1x|zU5SFkn zank?|$W7I5zvLz)9`=SqHmK8D9apV6Z|bw*d+%(Ra1ktj_>Le8Xr$Ee&2 zOR}1q;Ow4jgdP%Mc$Cy^!w8-TlT6(EFb)2yKIw3-ehla>(ZiZ`%42<9Ejx7&iJ(?P zwp$-EL3f?Cu!VW+gLsTJ&%64wC_%|-46y@@m5U% z43L2pAi)}O+ z$>U*qC|MVH`@dP8{+EsEr=T;LC&kMSqCD&}U6Xao1FW%%g$N+6oDyQoj{83q651Ky z-((LUu6|_rAttJug8_Qet;?7RT}(d$A)LHkhMhg1upuzDf$=@nL>yA$=jCYS-S|~>vgz& z-5Fp?hmw*siGI_km^S2iU|r<`?i&@CL4g)DhIK`Qh7*h-f<=j88tE{1D(slMMZiC> z!+A);7gzl?2JwYN+A0&3!$PuIjT{hDqG0Csxjq}f^C)mPhQ*Is>p7h?kuwa%w$6;J z0ulIF3VNBTJTmG56sNpmVhR`Fs^%Peb14~^Rw$p%9^e?`9GC!+p)@6n3zx#i;@v`~ zVeYK6WlZb@5r@yOaQ!6VP9P+eOKz=^MWh<61AJrxkPx}RRf3)R zcGj5>-I51l@Tfa1{6nxrV@RZd3eAoHitjk3O;LS8GL4K#A|g_l2o?lAK*i0H2%rND#%#BK*-L9>i+hVN4GS_bPRLRS5Vg*+iMUUU zn#fv}>M!7a9pQ%ve<{LniI4wICdAb%MCjD`p2W@@;Y!6aC+J6`F&c7%IGmJAF4)nr zK!_bNAZmQ+d1Sd>ZD`Wy^Sn|4Nf|g+LNPX*FYOhMIrOk=L_k}dBBs+(KV5nD+l%|r zjatF@+dSk(3Q3VHg@?$H&vrsz;B(KB9`Nyn#SDX;KkWPMRyg+0TOK5k#1Q;l3EvLv*>|I6BEHdlpS?)6B%Y9=O-zI!6YZ1^ zQp*Q1VQV{4M&Uz7Qs{5=aP0+LvMjHP4Y+rEh*=Pq3L^4v$s%qd4_kA`04X}xuSvS$%}N;pX>Lvs!WW)K|%5Tj-#w=45L7B*`#1PcEOa1mkbIRaHDnX|Tko+sEFPr;zchkJ}W3>@7cgEy=rQdO}P9U!YG(Nte!YQ3+!Za<4 z@GrF+o5VACfogH`*zTi_vAo_{tgPJpJurt`e+zGVbi&FsWtt`R*LTII=kDXfk+v2( zhYw5%|Ap<(y04b=Kp_W#TJTS<>w7{ajEMT=1k>_PvkHRAA0YeGIW(fI2U#Gnwm{n7 z%OCxH_zhCL=B2_&?!#8`49DV)9ZJl=q}QR31dCGZ^6@kYp%nBYA|os-&|!%WOZ6>O?mU zH0-OelQA{-GHhpmELBsug|2I6CtGc`o1o+t$hsSb18fv4fGMs|P0m;JLuTcxa_M~8sxjQqYQps{|ef3TK1RP{+xBJsGMPGFk?vbBy|7 zg^gQxZF&*R04Lpol#_>bpF%&IjY{To>l^s8o*VY7LG^~34#*K~d9m|Qgi zUYM)e-Bd{v%_B4qEmyj$C9t%zUTtSg^vE4^`O(oG{;|Lj8eVzE;tsj0h%^^bcqFzf z92v$Pc#skUGpKXI7XbjXcCvVLnzZam$+FF)*l}haqp+Mio3bBj=UrkuJ$}?NYJt!X zVH$tQxT#zr%D=sBeouhMpysMRX<)NC2qtw6=~*Th`-C*ea=O@hY8?o3ssL>^_>A;a ze08(o{YW3LcMMhhb2igzZQ11rCYp`$&8U^~1n5?rx zw?yUQGWJr-mKpA6{);)e8B}D13}QVEPrl+&VVkTY z_7ue?W`xchgEA5~k4y_eFpwuShq&uh^+5Ui#{Aldl1RJ@B<}$^Cf_k+LAG=@NFx`poa(X+}bBNzFcFgta*zWI&RQ<`zbF2G2oGQ#CIWN|~ zx*%GGIfqKiRv=-5=No z4gME7g28CFy`*C`Y@JXo%$^kglN+8idq-Z!?EkElAeWY_{7A7~`R$bE3UO|exDtfM z8%_Q|m#H-It=Ca}i2l7$r`vlHmSmO%2OCOs@pc@)<4pSX6AD>^RBwB zttss?s?i+U&zt`g9Nrb77|_=ic*%2ndqkjOgQ1MV?q-<&ZKu$Andf$8;Uu?JQJ%vQ z+K8Q-7JDvT3e5;{(O0P)t5NxSF&CHMoos?}vz9u$PPM?kcitcM=03O_hiDyxs##D4 zS$-|f1}Zrv!sGicH@jX8jLyMqver7hlS0#cF+W@?-K_d^#o6_{pw7(UbxHUjIL{BbvF9DL*t3h)*RW;j0LDgWK{=M} zNrgEWt2|DfAJm%Ux^GntJZ+}@WltD|tw)t1B ze4tDFbeAnnU0+M6s~W7(&4W=AIz}8+RGQnwFx7Ulld*PVLm-}z-Y+2fi*+)izrh`l z9bLC9%;cJR!+!+7$Al|K0yb1Y3F>}pF&?3mZLKk0#z$X%q_jyo%EN++?!Y_{AY)3^ zbo4s{VVc4BN00?3>||{4$&aItqhJ*I4$}#v9MTVZOtY)mjJ+{i{g7!eV@e!hR9#Qv zQj*RGKEZ?!Wh#GBgx@GM!C0uyRC6KgNIxk@Qf6u$p9vA`6gyjBnS<)H)-rO|h54r7 z^jr`Bs#gx_uekknj|Px%4U35q;I3imtDIW-SCk_oK^ed9$;rziHcL~^Kj3M;tp3C?+f00w!;lyRG<^Z_r~|I!}95uZ#dINY*H#54cg~rja`%fNKH=5RM$pC zit?*2f4PU|y1G4S8tTmZ;+;h$0upWOcjM6dq(;@Bi?;*6t!-67YhF*jk#V9o<(r_8 z%@_zQNZ_Lctqu1*$mAJ-8D#)@K%z_q`yx2d}P58te76Pb|qi;S`={hwpv27 zc_B-MI+fA?p-iB-py4msh=EUqP_eTQ8F40nJ%C_c5MmOA2d_1uSIBq^%N+1x0_mIo zWfh1`05nm*-jAehe)i>V65LNh&;*&U4M`%Z~4 z&%PGVwJ<=Tse%t(TU{8;#7^tw%}Z_l4`?C<@P30PzDleJYC64rFVnLR$qv4kbb$=_ z8MgMOBR=wW7F!?qPPYPH)AxJpCW{o!cIza&q6KD7Zem0a(_QqSobv^fM1>Wef!<~n zw1ntYo*{CCgwGxLK!My3At5eb_q`bIL*7)oDg)*^7@qJ*Z&zSHA3+xe?4m;1qCKe1 zx)nfb60RN6CG<(@1z2jm;p6X!L&t|;eoR#HtKzU0v;aIrSvq+$;15KUxR8xE8;EL( zrU5Hv`#Mq1{7sd4u2mvT%&Q~u@a_F##JO~b5I$7EEZS_O|9eU|eeC$>8hj=NI#yi> zT&5xpriX=Ae^Y)f2oXfKd^LkiNZ+>>v8WDvHU3f)gk@BX?cr<0h?LuM0^hlyyRFvTIz{s9$1BRa_~2PU~7s>tZq z2y8bI+eK~Qi_lFBWGV~hC)yYB2}b8abLq_LqKY#ex|>spbS4V;L5=`^Fpzh7f7a)2 zcn#iAaJN-8ZVG!2^&!IJsEC79WDXz{LPQD&ZvGrv{@VJanO&1e6@#urKSZERP(={r zZ|GD8K~`~bk6!vmkqCzxp?e=#)IEpwrT*$BL0WRxmN6P_&CH-lLacB#wXsaWAiWUW znL>h7b|6Jwz-R>y#!V5vHEsjkitvPw45d44=QwWh++@9NQ}uJ_vu($`iSRNGwlKUo zXX?-5Vj>9LCVp$~TZ_!4pg-{C*sP4FvIDyJEz_LJm6vaf3f%8Urp|RzIK50 z9%`rt5TvQ0NLNEgKn;j=G&BJf4NXu)LJ1vAXktM_5m8YiDn&p;s48jz#jXKGQQ7Vw z=*G(VguTBrv(C(!XV&xUIe$Xd%F4=p-Ph}SqhU^TIE#+G%fsF!p0xJRb#g(XX6ug} zJ39gLNklaFuN*d)%n!rWQV{-3Xx8^*rgG+o>!BXv$Rxn*#8T4p+vCjZtc&ZMGSQjH zJ-5#z&LctZs+N*=_`7C$7T!!1S1&=t65(Ey3((h4XTfF=EpO#S%<*tS0d@fRPDI>D zFSwA{{Q8@wrx_M)dbU#S;<3f=h<@=|?73y^UVN(${(%5{gJ&Y!gnh)pf2Eqi{qgr$ z*k6TMn~(T=0{l}wzP{srj48_R!}&em5v4p_!e1@Qwz?XQQ zgAQJTu;QeOdBLhO8u*q9@AvdRoUVOslk? zFb?UKu|Me)g#ghd=ByCKf}@klO5a$R&T_uQEVE1Vo)X~4DY9PP6t7H~VNrs70R9sd z7w4V)R77dK6TrO&N6{cKP#mH_zf;!SG7O9x!H%(eHXK!YAdqnkQ6=>N{IjfHArOG3 zJXA*b@!Zl1_@`%D%vo7evY{k0^I=aI@>VD6$w?7U#$=>NVFWR#Zt!A}N5K8mij~-o z9v99)Hiy#t6|`?Ir{iYn*9k2G0Gfd5n8Z>|gREr@cji68{uw-w90GSs)*&3h%W>f~ z3}i7ARSg16A{Fj%wNn(#uef{0+f{Mt3>=hnrjY8KVXjg@*^q%9cnkDQ23EnLW7M?Y zUeqLGrq-@4|JgRS7Aw&BIZ?<8*nbXijOQ140Zs}1Th&6 z**s6dR+x&Gkx0hOLMdnx_#s9>=5Vv-5@_l^SOy|h>*<4AXN1WT+xNskyFvpf08I%! zcEvgl<`_*AO?4XXh7bNXxSY3<$Xld4wV%F+Q4F+_-1{^GrGy)qUm$*D=I5o2*4Gj0 z1@g@%@SIIpX8WH*^@r`Ae35%*(|i|cT+{dq9E2-|=oXpW2zju>>ZsPYCtKh7ZowLt zgZUOEliGq>HN0Dau$OEamS!BfAkJnDmI<4{`w@uvX>%{Q1-$0dUo_;EsNzo#>m&IN^%PotZP49yD{^U1XQ+cU>J*!?6mCN1For0p;x zf%3OBm?Z5p!Jh1>Upnm8!@d)l--28J66ra6LYn_}Oh{Uk&8OAxHbGN&Nh9FAo#=pw z`531mC09l!OvRruVF?b&ala|~#bkE8t?ax2Q*vtH-myP!^g9}qz$1$c_&F_iG!YK_ zQ(|6$J{2{Ls?Ao3Nzt}c@TF$L6f06dS;`}1qVH+crC)4$uQwwlcJsL7x}tjl&<(5W zip_?V;9(I>A3Cn|B1uP5N^KN<7-0kI2Y!YjwTp?4?#q(-+PR88(;@FH@?d%u4yyBz z(hr4ia2ZIU&hZ7xaj;wlU*+)d0vY@Cscf78tKniy~Hl!^()>oI2L_kIb{Ut z?p3EygM=A4jsWdRC|}tQ)%_%a8MI$WD6^9_d|OM?#lP2>YY*5^<$ZD4At$?dvMhP@ zEliISMyLTOgv>4Q^FkMzLMlb;;W-5)eetlbTL{5;2*+f3BpGUzg+j-byO5`@- zF-qufD6)GW;HFs>U~|`D0#`hpqpRVK@@W?;w+PtMPIt&>`6KOpFcVj9!A3|p_WrKZ z%GE@yrF@)oexUzSEBsAq`1^c>ZVrF&T9_H3YN$^K?EG9N9l6cc(W^!aHYGQXachw< zP+x*>^pU~%^9F3&=N4~`rvB^V9HPYjV?}=L;Ob(Q`N7FK!V$oa9BYR{zmC@3=$c+_ zYJ>@H4_7Q_I+^Lc%dygc*Zu~olf3(~lIgi^NkM})tt7Y!i?e$Zq)!ii79H3;Rzr(B zL(e$p?$582-`lj}$wg+4>wLD~dat|EDtO=jraJMCKI3unyl8du&DAchk8Y2YT;E!M z=X#$iN9DS)wUbukfyVUlo`GI|y_z)I#QR{dSLCE>iJKt3fw;O!%9=P)(UIAUt@Lwga z>-BQ*zFQmAW`@r5Ze$W%obM(2xcBO-k{mD$#gko{`*-T$^1QN^<*O=cut|RY zjkWR|3VT)D`R!`Y+K&{6IRBJDk~4wRalx25_f0EW(t%k>>j*_}eBiOuwOrRKsbh*viF(Aazx43)u~Z=L@$R2+@=z zEy}$1Hd5M|2S9atvFRHw4f{IkWLlIyP220|#Y(P_IslU0#o<34@2S6-GB9{&sXr7J zc|gxwPSvL*IaPVndk(@lR{}Fk%0wNk&M|7*H4)MzOBPzYQj1BS7#gotww}D2oteTm zdoZ{s^rUF(Uwq=eg#zD6L7r}@*hYUbOre>-#x*P~b{nDok^scBk(3mcv%_J-~W0dRgJqCx1(MVq?Rzn%2c>nAt$+o`j-K^7F<7LA(PZw{E4{ zJQH1;zbI!S^euhXPK)G?6+sYLLHvY(Rf#t>A(I6awB>JAb1!aLtv!FOuH_B-MZ6Almlam0&X*JUvP%)q@YXM4&HE1MxNQ#55bzl zGnLnXW;R-G-ZF(q5V|ow)Jbipcap#`8F*E_eK;M}?4L5*hUuVSyNTFVR>p_%hj#;+5w@t^1jHut4W6!(*l@@Td66T>g47_+Hi7dOq|dTlBU6#8ucVX zQ{vv=@%T>?>|e`i+ZH+dd{o$F?)#f1m_v|VKt)OwMC%0Td{fQ`qSJ-kCHw^0`$Bt5 zA}?ipA2gj4mWa&Q)rM(ezzJ_*PGZcgVDlksEeEiv^R}8NNjG(rto%iA^gyt;3Y@&> z@7QWx@Gx(CiwMJFMqkWwZG zQs7K#2mPDzgnUAH$1$9##5f}uUVM0x+y2o7Pv1c#^-9(zKD?H@+g;uR2v3*F?4-g| zOWK(ogaZ<@=sB1x5dj+R=Bh<6Kz<5>0_C8u%VE7dLW2s+D!~Mu8J=TmXkNC;^DHis zxc+D_%tHbvT5VTeEB$D?DCgLN!%5WA41^);tpzwX$IC2kbRk?3?B!)|*hWKcREQomz`TEesh7a- zlpifU3lF_ja#Y?q@HFuvM{`<4d94)Jut-hNhOXZQL4$JkMHc4L{;-(>&mIOkgJEOE zHm5V-PpD>{1rFAxF`$Yw!eqU4vjFU}kq7-3659{i*Q%0%Vf_eFMl( zER6CrrjdxwAR^44W*l^exls`{WAC;C@^=w7g|;>cZCmAJUh>T**~s?C5Og~a+0VcUGHarA@SlmtklKhs z4w9{g%(;%tVjwxJs;6VPc>(?w0}(=nn%{O7)H}tRTYAj{9SrKsfM-y!cfkaXM{X>1 z@CO{q8&OO_UixqjPU$1s0t=0<_1iZEbV23k#O zKd{-4RiL}{fo_S`Mig;QKlHfp^ER^9=h7KdWspglkzhfzD}f4UEHcmDeGLs`!1wWx zJ#<{#{qHqKrortM$7>Rs#r~99!SvP|ImK*)yRs;WY!Fe zFvB3sfUlB|Rr&(BABP>L;tH8^#2)0b743L4GmsDG@Gs>+q$|rmZ5g+}ub3y1(@A8# z7W_joc9es%l90f0HeEihZuasZ$yxD%RCuELwse1?_{dgt2Y^R<^jZLz?w3R=JdLo{zAT~xEX9LBuGwjVE5xVSHMsdS{jdZJ(c#8eMynACX{*CiSJXnSGtA9w7;e%b$=B)%HS*^kZ2b2E|9Z+I9o;Y2tJz>p5*Z|E8i>C)f+Rymzfz zR6=yb2YFxy+p=@+iy`|oRPGw1(W-`WTeBW!hLaIP2b2!^K>FAkq*aittb|BYK%*$# z$9@cW`e5(ck$k#tUKHYNJ`4YLo{E9<#3{vj)j2GOuJh_qn3Z|R$hqyOEH{fNry)5E z0(X*VKM)UkvI}|MQ^E_P-d^8U62ry3_w@P>27|gSxDRUdo9?=@B{qI&efT zRR8wf>TLN(0qL(qk5tm%L5)6CPd1p}cR3XB8R5Fm;KOufGi-6kVQ>XnT1ojrLI!*-H*(acSC?c z38e&TC!UGWz?`1*?^vug-)!40u4T)+0Vzs)2o82Rl9xf4GdaVc7r%CLVZ*0W zOP*8h&n%B?JCIlIj4r_^!tsG)dpjB?prnw1iT>L@Ob6)^InA%*+h`Mgq-12oVW8#) zEdz?vRksxfuq?DuUAuY;Fq{_0VjFX0cHB3OC(HET@t2;23y6tlzb>@^WXlI+!02);G?G4sDgvrX1yvYDgz=8^&;S9U1*y3YauY=)FiDWZfU zDF=tRxsUSJpR`sEAda|MeV+fB$bBivqZrBN2XZE{@T1Pfb-Blq`XW>romr2r)7a(v zwQ(6so)gMFvW|3w*{4q#ac~o7;(Xh)6b;-RR%0h{5BP(hgO2EB^z|(}^zBqlPOaI% zN<79#kfpIG&qaCq){#n?&ia-zXnKyUVhz7fPv6wVxqSjn=bf08R*Rgoqo10O+PpP2 zEi>uWd@iGGI~i8|BCr(Q<|(HO?s?fbIx5!lVa5sIFq|Oka3{V0JxvDSB1fFZklN!L zOsEAtLd!f-Tp?|TS2QdujITPR^S0R7ep7tNbdZ*%H_FXIRIsZ}aoG`r(4fh}%| z&~whjY`r~N$#;%1Q8*w9$`TT{wVxW#C87^NRusPrKx{VgI8_Whr_X3VaG#>^)&9E} zFUYjMvJ86byzGfr^ZH)VMqBn?7b@2VK!5wWvgxi7HE~PZI>JpUa1tQbtCgQk;J;Rj z;>iBl1rDoBZ@H$0i?h>Mw^u+qdzhQsAT_t%UaoHrO~K zw-b*m|ArL0RIh4$fi+Lc(n5 z3W_ZY9~|B8Y#m8ZQfZ`TD;S)C>32E!2rcfBOT7Q~oGyKKT~FrPp~GdcM;Oj4puqvc z@rw4BzUZ!-K$5bMPE2jdG+1Om9e1{ zMYd!@qE}O|eO7@VDYxt!t@uGV0iJmJpvGTmUgje5hG%a)~GO=mDjB#$7c8Lhqh!@vu zZ?Ev-cTJS;=4GN3la3m0ohXE={59ly(a@O1MH)2^qv_RhYm=Veo2C0DV*-uDw@HU1 z+qoEefRo;;%$G`Sqe>Sm*oAlOF$)l{tca$6w7pfp)+iMTbq(rGEOJCxm2mW-)cPCmcnC_qh~2j#lUPM} ziMityv|Vw@b26>ix5aPoL#3ON-ZXP7bo#>mdqR}h@tn-)c(*y;clxYi9|uX-xZZe^ z=1Sd>UL1>&BTuF8Zm)$sT5;clU(fU#il~(Iqs_nXcrE;%F zvXfyZH;C_6X=vjo867E~juV3y8bdZ+7$6&^!i*cV6{gl6xSvw{XRXS%Y2iYfNn9=3 zY+AmE8GtB3^&idwC8wmgXN()Bxi{)9a4WR-d#$-QJDMHxCgxS6iEsSp)x-(B@v^p5 zgX8cVhL!KWRc`9l{3oluWbYQ9>R%n+{b#Q+PWeOkmsPeSDZ`pQgs%(950LasP!CQ5!xST7d+DBM z{kOCN;zYrAh%g^l8~}IAu883UU)InexXW%C4e{HZ5{Xad)=!J^_o;sIuJBs%-W>y5 zV{><8Sp{9NK$pJW981v~i(X!_TosXtpHWn+osCWU46lH@dGV3lfh^sH-OT`{@XSK_ z0U6?emOR~xC^S;W>zEKfOEr71uYrDq6!(HlZ197MESDx02K=Hr*@Q5lH)(`t=9$04 zBAAP*#Iv(FX~qfIPE7V28J~M%s4&szh{R`RMebAhzEU1k2xfIG_>;DDOS0Nul_=zF z>_50EA+Mk7oy2jk>V+opF;_S_tm>S04*Yt~dN)R}JefVdM8ihMp znENr{J!DRnbur`!rk1~^a18Js44(6jGtvBy0RA zummF3IH0u7e;Z!_H+>AFi(w*aRDxAnW%9qYr^O}jDUQ8-R|TS>$~s^kaZ{8fY+~_Q zCW(TyqF$IY9d#qu+sSbQY8HO6&PxiNj0WH*n z?dF7vHQ%^34jk9((hc{OU~|p(hYO=dctkVB za!(y(N1~4p4VDa+m==fFl}Q2`nklFXf9=>x&G<7_w>B5E1e%K8$QylPAY55Cjwo0x z1g-rJy;HwBy49l_47vD05&bYH2I?z6A0NB@H^&zxgLzWxr}m9nmWPiQWh%Uh^c5lM zA=vW`=+^-uFAH{AFMfev?{#D@hZZvn;ufgZmx+7%OI0TdVIF3d<&96GK__%8F2LaX zsW~@TnC7I7ZU&{@d`vqXl|U>jnR5!DLQ5%oiUah~J<__};sd{^c>F2;|>& zC&4<95(ndI!&D)!gY~bDI)fhss{-3SAgrleJ=Ocu(~+J;LGr zL}w8)7jkAV$e8nxxnk97gS4bI+iS&eS22{f54L|z)uX_j`=ek^Oc+3ZLlP`-CpIM? z+mq;(;Nsvooz`dAIHwerpYJJz0052NUhY2s_VMPKd zXu8F~KBbb=%T9#*WTN7sr5t20x|z8XCsI9t=P9h0vMLpm+D>rWjBb9m>=90niyc9<{gy~uPU?kS!{;|p<)L7rS3&BAh-9~W zcF6dq>BR@H%_gj)ka+auNlzyr*wjKG*VEJi6vERH&x@Kt&S}ME)FWepH0MOgYrxn( zeJE>as%bJI^MKVrsn;6^<+4r8tFk-kjp&pVDPbWcoE6 zAeGeXS&o76EY*;z{kFsP6<^@0GriY4Wg|yg70ouQRI95iUyWU~&)gY>(}E0o^>ijt z6RXX9C?T4$0^1<$#fmp@<>y*VuFSGEp}<@E%32{CkH}#O=$8>s+Hc}*PL1+qOeTbC zScsQkg@G{Q-$G6)&y@>!g!Id|9<13MChl#`#QYL$f8Dbl9G&x}qoRKxMBveiwW08Y z@X~wy2uG&1OR>vN?hASMc1NNY1og3ZT?Ys`vD&T}r?@G>Lx1+K$3n6weGNUhk!WJG zIvrV|4sg@Q)*){L{2U+q?gxqE1+L@q4+(KUA^wOk_+BdXZ|!MF!?z*|no)dzwFBI= z3}5l3e!rvi;@rgok(2z+eo0@|qC>YjTGyp(6h14cF}ojU-Qy^^wQi<=EsyYtH-@>4 zmjs>iFfl;4VP4M&Kj%L{PhdJ)43@>|R-Bd_9+vO&e24>-N#;&Qc*Hr$z-W&mRc0LP zjj#rry2-J`GW=(z+$rq9A3fu^Fr?EO-O)!6zRBnwp+R(JMGtBpVZf{|-1mS+&&ojn z#bs0f=*|C|H3`fiWgXFKdYI>gTz+RPuD>!=YCFx*3V`i&*Kuf4I}^<6Zfz-e$;l4I z4Y;pGpQB>FRZ4BAheL!;9kqg4sqHj?qdeR4kL}c5qL`chcvm>1MuhC({p-q{FO4wA zD5=O-z6}CSU{J@3Ldx7Ozc5CBfI3b@e<)FnA!>TxRkV#m@%X4xJ|=+v6l(fp`-x|r znlB*hAYJf1qh;Q1^c?XqpdGo8~TorrZFZCD7D#BK^>! zF2U~m5@_n{J#7EIU3c@Tmt7ubV!@z}yZXw|XUq|$Yfnm=sx9~3v!CzVQexJUROe1P z1T7oV=bIz~dq<=YaF*rhdCKmo#d6ox_0>AJS1tKYzKyR->_0bW59`Ml_bjdIaul4% zGdc26L-Dt$)5GTXuk<=Tt+tn2HP5E<`0{9~Ty;-AMT(rR_n;a#ui-U2z(`);oSbq9 zV+3~Ba#t-|aT8I-MUCehao<)D<!J|D>>$54z2kG-}R60l$o@sGYDy}c0?O?h@?%Yq@DB3$)Ute z2HVNnE-Fh&C%~Pg=92^a?XgF@ZQkx)HsZ2kYFPK)q}vjA%AfQw=qB$WR;1)TDp@x? zqzzT}Z(iG~7(fjJH7ELP|2r_U%Xznr-m_2T2tfv6{_}B7@(D1l^Kwa1tVf&dR0Gqx zX2cGHaeqoYY}y~lQA*)mVQy{t23h%(jK{MB2CD zax&0}2fkBGT4OA6EqMZJ;Ji96l;tS%9+L0rE2~)k*jd+PBHs(F*2>$RDKo@ekQc|q zlxIDu<|7Z}zuu;F#m8##CrKe=ft{K2&C?zd2CWIjr+OJUX;I=)Dz@S5BM_GrjsQPJ z>L`>qIqT{7Ak3|66RM7@k{}c9iIjNvvD@SgRTKD6$Rf=bayjyrd6q_f1VS;yMOU9R zL?3con%Ob9L!o?~eRb|(x?dSK#?3g48zg7#jd(YsN~dMJ3^uG+tY0ig78AD)LUs!uw61 zP^ zLj*dCd#R06*J)7y;rf_+&WK0%;>r7bU+aL7__&cJIiBNi_Rw-C{e!lJ+Z5L{agw7W z3qJUHb0*MLUc1wI$2yZj5*?hc4jHKYg-d4%kw+C`bpm3>ueLnArdo2rB|5Xnb+PMG zVl@=D?nXRacjFzhQW$jIv~DvC+;rRVF-!gf9p%mvUM^2>jy&TTnDSJpe1Q7maRnzg zu3a}}OJRV^xgLBH?t{ks5RCLZ4`!HOOX3VcS1~-dU%S1p{(}XZ+(5L|d6T6z<$ji# zyMV}B$hJwDgRlJnVRLW9;n&u%jq5zaK6s=wH6aJInke1IG*CV-*qJiU#m8Di%KxN! zHQt_h1kQ{lSVrXNI?vvD^tA1U<&CCQZap1$D&y3q6`1jTnTKkiOnh@kX50&&%i7F_l*rD19WeM=#fg=qxJk>AqAF z8t)m{?szXXm%SS6&~@9;p}foGNxCSwm_6i>`O9RlMk&K`_!e2Y_-X<@ZlZAe8%J`7 zgx#?6gy)v7y}R8~o$BHv+t}4QX^4j(*9b&5D`_$~&f^>tN%43f=5OYdtBnnvv~IoP zo~_{fjlGMwacD3eFemLX=vaiRo!m#I$NYkKd%mBzX`g$M9be2KJ3Ufpl|*ixEwW}- z#|5~%=J)PaJO9Z+dq$!le@B}TW>8xj!j#oCsYM6BwXSb_n|u+ru9)%s+oKjv|EljS zdru>6a$IC+hQ}Q=+W?(i>u}7dnrL71QU(BBGuuF!;<%I_&sHp|kH!hs@$+ z=^Y+K_kGp?h@R{UW%bn*6#FPqx_M_g-t2)Ty=d-`z0C+GZbM$1p-|{`Jy~*|^MC$KHFra%tHU;tjqQ6G@sbp0JGuhn9nTb>x}z z9Q~qi6C!jXwf~x%7Ph=??Ub>K&8ls`5l6QiMqT88YZ^3vYeC8B+G9U$^Ck?d$6Uoq zK*FY;*cM$|o&LUi+acF8ClRl2ZbtQ1502YhS|+_$hwK?xO!;%VWWRmy?$LGGChtn) zf+?@RTpEnJlXniiy?x?S%&r0Zb)7#(iUUbV?Rb|lT$I@DmIAz-x_#6t_(wA_Pe?n>7Cm!}GxJ}0ZPrdFfZrO3w?z>na<%!TC;@)3>X-4coBbQoE zU}dMDz5JsXC){^%6CW9^#4bFOdWD0jT4ZJaIcI((Yxi%5$OEawu%$zFTYK;k)0*Ka z`|ic8ggP0^_A3S1qECB3x07TNjh5&(4cycr4Q_e?FX8y zV*!KnU^&^QB4(%{*QzCZ8Udo=+pDbXGm91&`XJ;qAd1%Qho(!CkSWD2FibZDiOaLu zM8SULu}1>H^R5-#6oaS&-SCo_%fU9_&>nb$)n*B%TJ4muGt;@BoP%pv*)b8YO?1Rp zamn0J+M#G7XYucu-Q~l-1pe+>_)ipE4AdS5jYj2hkO)jW4b33>9E-3S5#xKTxFJmh zDQ*&Okm4qt!xL)=4HW2|!~@|HcY}gb3u{b;KHNhOww(g4Wv)qa*BdA!8df{$!bPt*rV?!XY8Kw0;97JUmGdH%lg%`V@lGv7f zJVb!~0e+6moC7L}-{+%vJt@z5gaKNqO+Ud>-J@RKLU%5*z>E(WO;7cl zf(B8r-&u?*)Cz!`{<&Dk^yi?;hIk>YC&laQkxiiDP1(PBIw#5169n-a8ORt4?59%k zcr4cZ?1`wBf8DJEXX^yvGnO^?cyLFWB}LK4jRsE;AZr+&0>GMp+9ar23qwROp~8G8 z>%OR15%!N;$JVqgpGqY9@TJQ-P;~lPkDj4&(XF_2D)hLy?NME@!8;ithJ&imJ`N&D z0*~bE-9#}TY%uqyLDTrSapzi)^8!*6I9uobZ)fZH83+GT`^3Q9K5hRzr+y#_&>E;O z#pb@bO;wVm9ugL`NJGyM32FZ2>r=~N69^zw%81p57{1XxPUQ$rA-0-IuTSzN) z=GkoL1PZs*-9HC&6U3)MFd{%}=s3>zlg}cyf{IhQcx5jC?6IITgA~GB_U`Aid5@^* zBmv9|Vjk^#Vpa|Ya!!^;h&m$ft_Xxrv4bM)-n#ILp=Fb-N+5w15Ro@OoX-*<4+*eq z1CHR#$PVGSD*_}K9afsJzh4iFmB5QBmPcByC=^7|8fFk4XZcOreyBzmL?t z?FoEOQ7-#X51P=!5SRu87%lRaOvX-6waBn`N}P%D&yq2oinp-#$u2_YyEW#)!3NPT=39>1nrHPe@PF{Su$d#uz$1kVDaK?46J&Q*bAT z_DFRmru=c<)+sUmA+P3KedEyA4GkRmF);NDgC5jj8R;loFg89ul(FtW^BhwSB57-z zkiWtg)XZ-f_Hn*Hs=_hu@cKZg;RrX)cCBIhXT8IZL6m^V)cvFTbS;C*?=_rl6Q0(n zcROo3f>kiOjySKw;mH3|m)8^F%6#-Alo8cjdR=sXN-BO8rOTPUPB+B1b=gWNQcyIE%5qH?4yJdc?{>iMVCQ~ zYj}`YQoAsytSBW*!#O@VSc8{;!7etBnp~D$_qW2tH<%eVP;JJNIr2e2+dN-Lr*wKN z4V;poPk-JfaUWuPvVopv<~U+ehM#3%2fD^0@BXu+laKAwtJ7Ie7dkgTp?vflYIg6(_Rksr4!M;v{0pty_tSRaLH(z2=ScjqO5~OAD|Eb87k45>s z@h-1BIWqQc@5!}EGuLazu3yk-OMEU$Pdu_|+17*ai?t8f3iR$AF?i$GXueGIMdF(AN$hrYlAFe z#u_$X`sjBt*#5xpmaS%}Hp@GAP#=BgqW6C65DH{4%33F=@e@;h$q|n>Z>N@3uE^+1 z7ZGgJKeyI8{g=n*Y#r84|Ey8)|I|MFqjy&2{{5T$_RGJi<=#n}9V zx23+YAy1^f-yLyy9iQiWJX5Y|@_zL9Cy!3$|EP4Y3z(Gjma1!%&6liy)?hwSOdL0; zEjfGl-Tl=ow>?0u$DSlla&+ZmC)1~s${C08-u3rwUfQR=uJG~Opj&xoq8C|??#O<` zb;(7&t#(xVid!#a#?sY(KX99>^qWM!J253nEIB6k$HZZ)LzNpExrgBAURljnWS^n@ zHd$yqQM~FyQ{^;ImvAIMLAR0jEpG79!Q-PV?ww|-eS2@OV(Nn`QhCCSsgM8s9v8SU zyg0VmenE@vb}zzQ?l5x(6EsoK5`N}upz2q1{9&G8SU|4d}d$@s1lVVAqG{9 zxEYM`dk-2oZoq5;OzA=< z*oq*<^e9{w|<2U5>|^bS@-- zBXzPXPgu{Uz8)l2I34Ox_HnOuQA?PfMd;+3=peNZifUcSe{3<`KNTvFB|W8;>=(I( zL`mCC-dyA5js(O}Xz?3;y92&*ct`Tf$M^QZTA$RCN+B+Kwj=qT7CH(gkNc1+GWnLQ z31q4Ivpdg^U{7tmN8mQ_0PxNkZ6a;~xa#IEwOEcsIHYwE5|8s7t)Hhkxjq3}kH88KYF zg66z31dmQ?*U_bL!H5p@!okJ4-N0!YZmHt4POl6wE%XY>A~2YzR95~a9e(BM*m`xe zIDmBcYjymO;`#5C9GjCD5;B@{^sXuu0x+Y}EMOZ83^yf|nxA+*d|D9|57(yw2Z`cj zB_gffo;j#K%gnQDomf14Gjw_2Nky+3N7EdiJ@<%5na;Y-+L*x6(JDf>o^!nF2snGE zSnMvRsIlUT?zDsdq^=Yy9e%Y0mE6{I_R7Y&L zu9i|C1DEmuar8_4xDB?qbZ3Y&`R6no=Adg4Y(0TikCfFikwJOpC!WcFcs4x!*y9jL z)_xx_qEpjelh&Afpnf73zfyRMlQo0$$Y1^pU`CJO$*bX~n|Aitjz1iAK!+v;di;Ps z`ngy=vILdhzUC*jJCU75nsc(5!WPS~X9hQZvWdM_NEMXldjvSIpWpceS)1*PKMS{8 zx8`EPP(9v@dRq52ALUvtRF)btW0>*4d0En?{N;+bc_kvKg|*GkY^R@>Pdwfqp(R?7 zRTTP}yISZdUJ5ZuP-+et5bEH(tdB>gXcIpCk!(L!?&_r9bGR3BVN)Z;@oqbWZ50qM z-^^?}5Paw57mo)@Hy3)htDng^Y}VW=AR*SN$>R<<-)ecqM`-@O?XZ5gjzTAcU#8j_ znFKFWTvhINr+*^oyG&xrI7gpsyZDrrLuDjiOaj|A%X*O+tFYRmOZ4mD^LZ z6*LB6`Wm`gH)m%USpVVzhx6B0hUVIx9?r3%$tu1Ip+*E=#sotnR0NE~a?+hb#=HaC z6!ucTF>T@#<%>E-+6yPqHIF-@CMz8^SB-46$o`@tG{~hEn-+)7*WHaf>9We?^2jhr zhB#;aHvMqDfbHva`eEm)RVgmU+HHbxmoR#dB7k|1R zmWoU(c40iMX|+*4WI0`O;jY4abx&Kqrii|24xMzWNQ+~|y%X|6KYciAjS7TjjFgnx zkR2Mgg9DZO96r~4(s{!eY&G4HS#)u=ib^86Zt)@=_dZP3-o`6`@Qh=d4taekVHmTV`Mrd3%eu z4GHhA%j+kb0B?^!v4wl{u=V#I1PC^1`oH{`?9j7&HMN$|DE_|qKGZudt|~V)L-lq)|<{j z_Asc7n0n~20B`(d-+6Fhf<@;2$Afse1!xupKN6?Qverz}kJpZGFAa z1c({d{~w?!{@MmPlva&-~$mJbRPW58r-H%pX3qKyQX%GX<$fBcLg)=#4SUsw;rhVD;(gUT0|l$h*`g0GmSDPuc67&t{E?EwEnnwGM|_m145sSXC~ifWVqTSH z$_K7}PXuXp2i+$yw|V%Bd5qye<={2XE+n>|kEpgRTipv~5)HQ$l-*oxi9mDV3*h~? zWcwk~{!==H5*oG9**-wxpTt15iq=j~p?5Z(!m%+es_0ZA+@$=HX(Hj31OXt@cAj6flXJ2w?0y8)hX>X4 zHRt450-ecK0>3TTAYWM6L`p$w!#Ru0^?)fw9Fs=6M_JjC7XI^8Yy#hm6?MAfo7ssg zpu1J;L4{XxuutgALU-zHO|C}PB8nM}Kv>EGO>i-ym%7&U82+VXxsZYgpg@n?oN-?6 zq*-ledTkAu7-61#)=BDLsVQXS7W`}(lTzOmPI=s<#E1Pgt);d%nwrQ@*u3cf^8Hb z;vw)Y`(Ot>V38d7K?rJyfm@)g8Q@82(trT_M2w#oN7Oyh^Z=cvS-91)dd{)>0toUB z!|TVQnntm<;XG66DfQA4K|0AkOPCW-5?yd0^7Pdf>m80BW)ZBEFP04wu$RGoK;)I6 z^VT1bwWb%C3HcZ|!bb+-6N7Lo5Px1<`BV@7r3fno`V$d%P$CNfk_yM)(0C)bONWhz z)rfeY$Cblc`9OegU2&~emYg4!Hs`&3hKd8aR3TAr8Bmgla(}j;+pxrx)-sSQ9w5t^ zs5pQ2d!jO`sHyuFp_D0S64p_59GRhiETX4PSq3WWfV-Z>`zTVd`cV(c@Qy@zD80+m zLH23S=`6GKhi6Ee4A(wnz*sE)w&S@!oe>IQ9j#nQ4AsG)100_NG>JjL*3%p%q-Gu= zV!m@-l71QlB2UpQC&`lq*g30ev_;zT%fZ-e!VU;TS&VV3Y_poj%}cQAkelF)9KbLR zJi?Z-gnzISbt^U;d4)m9YwEc6MaM~cPwpm|?73dMv93bL%v;NB62CF|#KYseKQpnI z8Rb>8vJPC|>Z^KYBbqy7QqyPWEL^?{69nw@~;rG2w17`{cx;MkOHf_L?iBiFYT;pZV3m)*S|x!7IM z6+a`hkBo$EI#RJQV8ul{QuMGQ5U%VOX(dNM8Jy*MgbU{@^wUo`)vyMiJwwS`X)6@t zWK9vEk+zN^ErVxi3{27prcx{=G@Ov7DCk@&!^?V~dVC-=0R)=_Diyn{fXj81-sksR zkVd^#U_=1sQWo`pvG?ZRQ2+n`|6ulg>}$rpra{@$*j3VykkE`JL^XDani=~(NGNL1 zqEd~NETyrlq#;V%vq1~x*^^SKXFYxI-%{`7NE*iivUDd`AY(T?3g&TkeY@jgcAeOX z$Xoe2LiCb6H9UrH#?$`vUBMdqw%|1Bx1bM5YknB`w5YRv8gb}V*=BC5|AZR$^NdM?cwxC2Y|@LKyKC1^7_#I3(VFbI9%X(#PDM* z8-bkmiM=&4C&c~6B1AC<=NIKu|0YXh*Ok~d6j}$XRsM#G(EWYl5y*aniQIzmUp()i zI^%q6jhwc)`&0OmS=TTqaX-k($p)-HENQvK=k0zCHEg%L`N_P*ezs|5Thmqe{n|bAR_mc= z7l$=Hl;oSAZfg{p4UAlVPMN{z7eXY5)N`#k`IPZv84v9oI5y`%2mFyx^9qoEjH>;w z>t*yf>NnWWxl84*35_((lyijQv4~c5*9{-vsM3MmE=80 z(XixJW%SvZ%JxC_-V)0uVQd!3)n9x84rH2!&EjKW@}8;;XQg~AnTK|T5{B35U?g|X zaf_l34IQUXB58YjyJSBv0xGhwdV*F|9+`iFfZV?W;q?h;JCvbV|Q zjb9`?OWw_0!rfv?8}WP9o5|2pqce??TPXWgmtHrJPR)2)rdoCPO-7x>^~<^Wvs>jN zLhGP%p3tMM3cf$_g?97K)_UR?xQ9!SVmXG=q?);{u1eBR&pcd_o%P^EJi|^lq{(Y= zO(wBES0no;U>^~Y8Zg=VM=ypO=}_0E8S_g<<(5A+kOe}CFgU0TI*E28#+@b5!HY?4eu{33CAz3G9oPVS~?5H(WBIR?{=?MC~v#2OV; zeVCW2bR36u%5}1Q&DdyT@h`$u1+_S^riU*1jys!4`3a;WCTKP@(7Pw4fwq)27}tJZ z913rO^y?~WAPfRE68!XM)E+mh?fCSLGJ6lcxn83rXX;AvJa6CuchExjj035b-lrZ8 z=6awGer4z%ZOL3Ar!YWgncAAlaX=Pw2VY)6tgJcsKWIzV@stlK8HS}pnHHc-RXF6l zHoSXl;QO)qPM|G;D7H_+G~u|Du0kQCa2!=?C9Z=X(JB_N=9Z?1X?^r`xEPE>r!igE|l~lYwdMTRoR`oAI&h!Yoq&Fy2z0lxQ(%Z#CBbFzI zMv>AsY<{#WY^h0cTeQoQi(9?t9nhywR+AuXLTuy>`wvxv|0YbrI*JI?*%lw@l($}Z(N{OsMu(<@%II!4s($EA4$r*rsr*=C9HI< z|5{}nXo|6VUR_@|q>88&!qpYTnWh29*Q}D)WIy%HAztb?noGQ=)wMfN*L9gwTYWvg zk6m$h+B=n>wQq7i|F^|Yjvn15d#XREegK1H`4Q~*o9t4D`_?0eAb+K_^(pfKSJ;;1JpN(~ikSGj6_KI$}wo#5) zhX!@@C=^l7$zP{uy3Y1qIU+v-Dmq=6+WDN9McGd~Pzd+N>ANK>BVfn&a{uweDlgh7 zug^ZY>qVnZ9de>&9(1^TBax=15lcQ>a$ln)ysa?aht;b~>s|=%4H-k1{Gf2A(Cp~z zUA)#c9$2rLAg+h~5EWPT z*cvr#6vHO7*x?4H(YN1Js1EOfZGS5Cy0=lZ_e3)mp1p6e3e&%5v8c7wy++Z^f-!Q8 z*nyG{c{!o0(D6Nc>yYZbJDIjO_Y@aa?NJ$P;aiU++7GVFd8|%cKa>J4i6;4nV#`0j zSF-T>;=kKRUa)NOhG0^t7`mo%dqig0=V(;glI6_ZIgn{0a*Ea;v7|)tBtO-V;jR?3 zHy`FcXIVJI}a_&wTHk zTngI|4uPT0`P5DYNwz8f#axeYus`CO(97SaI)3nsFyTq%)_C2B;v8SGVg!L%CqWZM z_&&YV?-E-|V~M9NlzEFr%ul#aG@NbYu4<~+&72J8q~}gog#TW14?61X*JP<#!Z{Xk zo~~NIXs#)xn|&VPLAC)}R1(X5JCa?z5{WrShHvq;_6En@ml8E|3F#@s#=jSHfH*-i zy)_L46e#L3%##8FN0A5p4=ng)v4uy2>CiYP$01jFqwG2aW8d;ynT?AYUwu`(IH7e7 z(4*ojaaqH;hvMboCg!oO6tsc@=i9&LauZ-KN6hz<%l{=}5Xv|T0}i_^&=v9-SFIQq z$=C!kY{&`bM}{AE$hUJ-2L95{ncdSpG6H`~*K2;y$neoz7)=Pj%{)|G#a8S`chOLJ zl^#xf)K_6>Fj6&Q)nAeV{t~e`Vk$ijY!t|7CkTAd33eD%j)*z)vz|>tOz;fU{7in- z3hl__>rQyhfPYgb$Wy}M4Z3Faw2z_IK76D=m{L^57H+`Aa04tG>{L;x0MA7h)lRTb7A_;Q=%FkDC`@|20c)&^{{BgYCv_zyBI&oclQ~YjEIrDQ21XIAhO^-KF%tP$1gH*`$ZjmhkKHxgzT=n{T?Wi(hno!*S&Lbm_3Xqe0yyU)s4CuRJG&OrA=aH-+7A#uQBQYi!=19X{~o4{eLG#!@N z7-2vJcU-VmI_LHw0(O4|P$!yQj=s~EV~rLt->g`5TWWk?WO z6_xUehz_Acfhl!hpY^E>>jU?!_s`hIiO>%PdI|e9r^$qqc|^v7OWH*wM{pi=oSG=v z4zswAWWqB#s&ocwr|)EzX`%JbURX}|Wj4mr(RW2yk+kA>Mbl*}GWag|To-BRi>V!` z?BV|4y79sBA8er`pm zYiM(27n{(_BRW!09R8KM6Uc@Wm~+qgM_v6}ISLaH+bU6d}1o*EM5m^ z;rjX5B_ha{D`QWVp1DaZfSgSaXyQ(L`hW*2?z^u zSh`*ennc8OmSYjbYlPk+cjjjG#g>;s!UP1NNhATZQ*R_WPTQ7hEng5#vKLB8L2wG2 z6`>t6A8743Bm5EzV*rr`6FHzxF<3hv8{ntir0IG1k1KqvB^UmNS9$R8g>_&hCs<=_ zdh#|R?lQnlkW}!`hus3HjNq~@KhLG$@m_iOiZ)Qw=RV^5Qgd9qh7ZKv?7*fKpa!)U1Dm>pUIMEp&M(Y zpPZEXywD}1Npnt7((w(}U8yN`PR2qtrR%qb>`JWtu^{G44ux$eJa#(Kx(_biMX@C7 z*d-0!-IHX{?5?kDM$EL`NkE5nE%ZS=AaV4*yN{D4B~THUkj}&Mz+6ge?oWN{WXJ6O zpwXea0G!gnOB!OnR0wI$7T)jj*pfegFImT=T_C+;t5m-g>JX(mtW1D@Fk*Av?>Q2y1XcS;HgTY&@Tdc z=}02cN2mo{w&&#Gu1e1Og~4?i1L-2dq=>NfAH>uS+pldPi8j`_Z$OfKA|i}?j6qi< z(A0#$!-ckp*LR*o56i^f4yB6arNo`;lXmOZ^&p|N+a_ux$J?t1=Xm;xYmFEAlJ>vu z$}EoG*Hu5;H{jTNn?-$yzAYPgo0v#BHc!<0cuW7(1n!Yhhw3&`#ARYOWT%;QDt)8o z#`Or|)R=ML6ER{k+d2H=@ti>UOq^u=@A90NtL74waH!b|9PCb-ApGLtD)^FXe+@la zoW!nHn0Uw?L5s$}tFGbq;4XLLHJ*m&*g<4QC#4<60D9$7X<~nAq39>gsE)1pN{CDK zda*JZy6F+Y&I><8q{B7T#(wpsI079L2`&$K{7spBSU3=35+U;=rU>Is;t*3vEAjJ- z-jukP1w3StptO<=*YSG%vQY0)6Os+m#`E>H&pUA<71Nh{_lqDST_$xR{1u^i zA15Ib^WUK9e@lPqXGQNSX!1*EWj{L&4$g&oDIKSTKwXoxpGDU24y}}rSbk~~PviO; zN-lqf%#8s0Wc}{a^m2c(Qv^8!Z4wpGx7V^V|KgnW(qs#M!%$lsN|U`Tk*moQ^$c(L zG^zEF!E?RzF%8frn*KSSS^iptgpdAJHlq~3Qi<3;I@ell&4zO^fWcM~~>wg*) z=+G+bR3(A3{M4jn+)O;4QR0QJUYQ!wmh2AMa;qgb2JGX~LgSdPCLe9n^3xZu;=nXc zzC5(fW!M)KnjW0oU3^HvN6{2+{PAbUmD2z;dEIJcX$~tPHX1A@w|v#|PXS#vkX5f+}N7J@`xOqqXvxIY3Cj0drr{Kx&u~dWrp+jEG*g$&an zyTXlzrqC~pVsyeJ6ucIVvmbw|+q1vXzjq(Tm!*l5yIdp9jlEJQ0ayDU=+cDIMXSeb z{5}tSiJ!ZZo+2>4hOXCGZ8Hv0*u5ieZx1Fw|D^3JR;AU*zV$C=>s+WxJC&Yh5Z$=D z*4%;gZ{hXG2X9;Jzth(D>IjGEjjWYF#>b?s$lkvkRg?2KT{?d%2qPt%0HW>--O?3E z7fq$ZJKh?$HebojkT#ozX$d9N%sA(wgbc$RpA5AK?LDGL_b(c1Wp2 z&?V=tFTlP`YxY>AUtgD`feoCOtmO_EnCxYDwH#t2)9G$W?ZfzkX?r!!2^gCmPT?bH z-CeZEUTtdK{pB$$g&tzIX|`8k;FExXunk#?!M}TMP#t(U-~~XF>6nDVT7_g?H95Z0 z4ug#NM}x!xQw{^W|J}1^7Qe%k`yRvea@oqC6hCEGb|A9&4cpuH59_B^&e(@>=yx8)>6l-6?s?6bj*imafX zee8GmLNf^Rt&*}yb%fNi6FI16mxIE|Dp#Qj#v78UPurTX8`|(hg3xA~q*1^bY*#o! zOLEAJ;A?^J#3OBooxQLyXi z83~P78wW?;O`)}_zI7!j_MiCj`?Eg1m#=_cVT4|X+4b5HzjuxP`rnEMe&#l)r%{m> zM{Xp(^PdzPq`9n|yPt;%472_6)C6wq@$f~^u_?6gBweYAL`a-j+X7}XM_;|iM^UfF z(O7V&cPZCir}Yb>J02h8k0)FYbFb$|`ir0k1^5Ys7%PbtChFmb<2VBsn`7pv5z8Y_ z-l7GfjbKb9Iv3R{L_X4i1yi88L;}+%9ymd6@x+1eyET#ot?R`+JtIz`b z1U8YK3AOSCQSn>|tVj0f6S|LYvije%xG|B~VyejXshA{u)zdi0g!&~x<7h|f6^lz+ zF;R+66f0-}HABT$YdOpc-i=+~XldtAuuRmiMq)PkTYK=3w;`Br_uM~pFu?99i`X;D zQrO|H8qp(Gm?QvDq8CLls6{>a{dD@BWLU>SIrr{>NYX zJV}V(pc|SEdKsDFD+1ceY>H$xsy5zw!43Y5XdoAeE>KvksF z(I`l6_?yy(wzM`PI*_=_d_A;_;$xwxF<3^_v`{S7)T;NvUup()AQq(Dqp0qGAq!os zFkN)iTiC`$ODLO~=#r-%Dvv{(#y9D&dHM(&L@x%a8iNu{XYfkpUjY0M#DMa0{YCV?@Y1kg{p#>W3Azom@=Yf_R{2w&DzH>n<@3M*8$yNpYz|y^9vVSGu&zhlS!GIhh+C^! z$b&?`_NDVuE{0ADA^`#z+zz9E#%rDg_$QWSneUVT&VSoPuy-TDynYc?zJx zH26U>;t&&&LPi__@8syyLY6i)Rw3UIYls1wKxabLK`U6RSP8_CSU?n#Qwi|?P2^Qa zwJX1F@j&M2K%*U~eS;8F*`xD&%{O~PK!|Ap^I3#Xs;rXXB%?}^*;M55_viAsNEQWi z98vehfiMP11{=3JsbjoyYsP!)^`S6V5sXE~j?)z*QpJ2JyP8-DT(i_o%nl@ri@INT zO12FDm5XJu^4;jc$JU>Ua0*vG zy%)Pom?y*Jg0;B&$aE2Qj-T}ct#PSYZM{1f#}VeK1mayil8o|40dTOe zLI|#wB_%V3Xq9OZaPWXHsZ z?nMV)443GH{(7p_0_mi%Z16*b^i9mR*gL}*Nb!Qt#ChsXKk2TW#!EaTWI<9W@_4az z-_y^MtyA(SresWe@jw2O;Et>e?irZ#V%iJhb&qnTJv7t+p4yCBTTm{BOEK;E7jDfK zZJh=X$n_6`@0}74MOHF>n|Eu<5Wah@!PcR}5K#UtEmi3UAD}ijO;VR-cb&&^RQk_p zD83|0T3{6(oWv}#HZbdBVn(s%3Vnlz)8nYUP-&96po?9$3y`Hy`3qN7T0U*YX>g@+ z#w0ekQ--tMIz>tIakqWvQM+Ssk&2oOL-IK#M{fnlOFZnyQaD>>uY(Ks70g;#DZgNPzf>gKENy;X$ z@f;sTIJDfRV2x&l`%uJTl0&BnpY7Fyo8L`jE_lOx09-N-DU5mY4!XDS!S@0LuMa1d zmq^f!t9Rx)(~^IHioPwW@|MH|4gZ&@Aq51NxcZIO4=y!OH_?VB?MU7t!p2)-d1=$q z?zvkGm#-MX@EYTlW{EqO#!$`p)`=GKMqPzADNR*15<|%<{U5SKs9k5b9{n+9&^c%v z0pumdy{hTl^;C${?R(oaCeU7pb$9WmnsJa0yxO!>kd^@#N46sHoosDGyf365Vyh;dBN{r+4 zLe2=b4E(St&l5{Qb1dDMxIVpK{kMf7p`KU`F|7m+qxaR?+^hto9j6>}iAa37;Q`mQHm_r2LCHO}+T$k~pzew*W zIPJ-Q;Y@$3viMTvHuCbXXP@>HlQv3!uYDEu^3|`R2M~LaB#HFD2UF_*?@iqQw2Awr zVWGa~0^~l}hchRe4D-^3|D@mKQdYi&`c2A7{=6nCwdU=#Nj1IpF$L}K7YeUk<DlbrVwgN!MHvtsBy_u#-Pb1!8TjiZ;i`kU9$%a2_ z;s8#%h3YoFdt6Ge5(2!X;d-&RG&9#eSh{b!c^swN`9VM+J4=qcoAh1ocqr-6>+)oF zmW=E86xRMrtw)IUSASWwaU(0lLjkdIb8O0Q%O~=lFiyXOz1c$R&XlJm#JVVe(o&yX zcMhn2?;*0YbUy!dv8({zQlZPWWoax~jFYAZ4uzgqb&9O(fBo*LeUftAk_1qeD30#r zRAFhhf+sCDOaAzt()ihD%)x_#LG^>nPDE2+EH%lWIxw4|6iJp;6uyNS(Aenxf($KP ziTurBJ)~-SpALBxMKGBrM9p%f`}SH)nbu*)iK3;8eDv%LTy!a#QSl3{?bO=TDRV5O^$|$K4MBJEDcloI9beh zox!DROC8hCWz2Lydk5CbaNV7ixq7WHy*!oYX*2W6 zKKS&eI_+QXg+kXQ+##A4)|0qK{tES;tq&OSv7B{%G%$hJz2#e2S!?MATX%ubQXAbx z-y}BAHnJ|Jtd}Euk6x6xv^j@u?a}eiCN4U&!nR{EJ8SLs_-uZrj-mwGd%j1mZ9&VZ zr@A0Ezr3btS<3`S@1~TxQa@&o$_vxY|G6u-l2f=ox?I1(O*5O==M})f7V@FmWYc`V zfw<#@vpUYvN?w6HP1$_1lx&;8MT;V--fZ*KCPni4_pnUm4{cAdo8J_N_?t)gFL0#w zOi{ar>T70)=d6?Sclgb7xt zV13EPZB5p4mv;1zgb@6BoTmaZ)Mr>rt-No3weuZT#(LwAu((Ht{T1tQN^978m)^Z+ z%_nZ$pl9`~Tu-q#TshXQ!g1JpWGJ#QKP|z2)Opa(T?4wV5Qk$GAdFaw_wnuYtD ztb>%$CnU;I4Wb;&`fBAVU(op`%LR^h!}aI4S0&CmYx$#|Kj~<_eYpY@e->=-nNHzm zA+ve=#G$27>o2eCC}((f#%YX`^=(lJr;T31|G2JDPt1@V`r5mfujT(mcF<-_qbM63 zmSZ^Y4OKLSPDQa%32n|gffBF2b)?*o&dORh3u&oRt0R#ot{(X(wB!{q7co`}H*&Y& zbK0EsQ=94UY})S%Z)B~tnS!<)nnE7bMqoBK#g)3ZzqN0qm3 z=(Jp^-#e*q&`iNeyiY1zHI}G08sA*jbdn?KCDfeFO(WfTJNr%IGztTMhHz;InhaT{ zIhZ(EbenK6$$YqY+qyp4XA_Iet~!FNqCT>4unbi##Q}a2rMR>pP%{<0Ze4V) zQ!GF!jqpQgB(?oB=zMFJG3ADBexrpNXe-Dv63yeCTt6_74X>J$!msR##(0kpAI;o5 zc-}ck(YwV_BQGF%-?g!9xqUma9zW-9#!3`MM?9Z-d?m?7Ywbv2<23e( z5)P@2ySuBJ9eQ^sr5F2Sh9f&HLhcxLd}UD!6XXO(GunRKu==JBF8Q2IkpduTd0jFp zt7yGdcbgx%SI3n->E5Clrasu(+Oi+Z^xWO-Yk5U(n5&wXd_G$YlBT!Ko6{WPX;!`3 zWl0HvKTggbwfrF%41izW*NxhjJ5ie#e-0GAFC0*RVEG#p+8i~7si0;JJUlhBzd-Hv zAn|+oXf?*CO5>R8UZ?xkIOUOZ5*nhQwz)o1$-wUq(ZMvR@e%u!D5+3IHX+TFS^BoS zcT7~ZgP|tcIRARJt_0tBvj(3G2|+UcwHfGjnrXq$C!Ijoh7DWo0pS%5k55c525lfnNmrOHGPp(CM=3bpQq(fDwO*HqIKUk$b8a@Tfb@`VLejiWx!!_wf3< ziXkyja@eZ{I_7uj&?0A;FBjP@NUyKrVD@6#1jsEk2a`ywX2f8Jm^*aDhU~-6T;!-!);BM4(EGCFwod|;?bF!@y-i+F;NK#`-H6Ce7Um+c4F9&G zn~yjy@4tl$e@Y}gsVY0?WsH&t5s%|~nBWv)4-fjY*Bb1=B!)sblgZFrgnyR3KLplK zClodoW_baH3x_6Um=CGV0r!Orl?e;4n?c`Up?Ox>qZ>SLF2TdwZQb~&U%UfHj%xt{ z15I+mU8s6TPuF?8DS&yrQiN%S72e47?G$3lDR7s~=FVg!b~1O+%gL*P$fpt#U`FOv z^6vzQ<9QZ)cu;>TV$a>MV5Q@GqA=YMbb<(4x-#MD$AqR)2+d_D%mGuHg6EClYJE)Z zDF)1n5KaQGlMUuUOvFjy$(sX#F>p*v{{Ea(h@>JNe|LZ7Gxsijz8Q`K`(skC5kGVFa-HV}}C$)<|( z)xXtgN7aMYGm^zZIv65{=@Hl*)t(y|m0WYjJ}+;k9riOkiHSHwMSz$P9Rdrq*%Efn zk-^8Dk*dqToAOhLKzAd-DK=oR=YufH8V_aYQYIBJR z{jtkO)^!WWosF;XkG#**Vm>)m1Rkq^tprRdE;3P@TBH~N28+>D;F_J@e$o1`(2F%r z)^Fn*qJ*gXJUNn$m?jlh6Zdx@4;UibE+S(BaEp*_fEVn4jcXOay(!Rd3eE!)jIHBxZka7=#d%(i}$j6E*RIgT_S(ad9Bv35DrOu0&0DTiu2+?_$pR)-mY-}A1aS#IM zgxi(wghz`I)qL!80b$=RF^RfQ$ByuEBy&RJT$~ssEh2yo_A39vLJKl&Mf%cTv5GU( zMo(9zsJnb{NDxFVa#PdJU=+*#(I5Kp7a@*gYQaB&kn1JGl&=Sz5?{DxpmDc$jxz8d5 zg)0qC%N?`D_?4E0Hs4gxfJ%Ycp+Rt%53Y9U>YG%vcaV5+ehx2?1u1S*DuE}-pI%7Q zme4w_VNyYsFr(tI1((f-c6oClC~EtGl~M?}A9r-&*nyj?Oo>%hT>!RuCzjal_~ly+ zNav_2Nr#Jzcc;RaQgzsbY$L)sqNE+fRB-XO<73<}ItDPMW0&CRt*%P#;*|G}FDj$u z+XV$JY)$-Es+4NC>{vHRo{wFmP@PtpQoOb4$Jt^l3G`Q$uC-HAB+HEzeU_H5jl&G@ z#+*QFj7O=>%?m~Vuroyt-fyjS}J5{ ztJ2jEh{|Zqnm49#-Bm{SkIVUQ&Zgf1G--_}Q#oJxPi=OaM2Je@Icr5_1FrNo327M; z{P49sKUvt1E2Z#jGkphcZBL;L%9xVm$=DN*smpY~a4xEVhybe6I#iXn??iy$_(9U}RTVS|+y80do)j06&AU*@ z8vxv?dVDab&>$cQr$te6x+QBwp<2Atk#c|^7p$#d!N=JL=9nGZjbm%Rz^9Gw61(AJ z_i?$qh=7O`3pR>{CFaPZd6vHyPL2Cu8%bJ8g#E-5VA?%Kz&)ivDynwtS$_=?%CV_P33-Ts%V zG-YrEt5Y~B21;p8PjojO1A!)}{~THR^}tdLlo||pysxWkxCA#{R#=!@ebK;$0LwYi ziY#H%=Y<)3(yzYwoxaa+tg@uOT*|qhJ@;H@7p2Bu0>z$rm+EHv?`C>6k&Y7YCBqb{i zu!{>E%~CB;ZNY7tJ0tU^CT?{S_j^db{+XpQm~8*N^sqj<|A)%CKl57f8=qx<%9eH0 zXJqw&yKycG8(tM=$!$^X27H3%wB0U!?e2OI@xCV1?&fpu8%yyW(S|%^Ieay@bldz& z#?pq9X`}HV;>{3KB?s8EeJw#>pL$RjSsKCxEzheZBmQ`MSA&&fgW8$M*Ps!_3)#8` zVbD`@UjKP=vF*nyZ#c=9-rX-}8x1yae#|3Tawp=Cd>;v9dO{V7iK%Ao+Tz?2_cdpW z{*WTbEgf>2HQo@{_v`BOAggY3d0OCKi*g?1hb~W}b}VMeZsC9HGr0uN(WWK1E=iY)jY3}380K(EXpmDDN{s;s*Qky zHnh6^z9J5hxY+jo&4|N4ktOI`gxY6jA8{qdwZn)iflZrbhVh`L4%Vvwm;2wQy01&!L!HHuny&0erAk*5ZBRSM zxp{NN^D~%nD#_h{s925%foYqtb4>N?Fwx~b3YkJg0%a%_XP9IEm{xW~`&^;RzG3}r zA#Avxhz=(Lt7;VK-gIBSMUZ8@R|2yeM3!2PxtN5p^YzW@ah^!}Q}FKNWhI>T=h(l? z-IKziy3IMZ+(mbrRDcg6o%NQH=-rBDTu&)Iay-d1Zdy{lQ_)3Vmyu)ZI)-tiWjtw`JS&G&=T{i zay6uqiSO}hc6EaX`$|dsni_(aw2R7qaP4jcnU{bwYx;rB1#!<3YAod<$Uzzy+Cq12 zSh=JMrM)J+c3TLx$gHOG5v0}fm=DnS{sbA{owP*EbMVX^f z-N=)ILCc>g#jPVVs@V*;4JMk{BMDL`UL5Krk>_A~$295+saYoR`#fvqzw#|{St=Kw zKB3T@*2qN5esS%^sRi_v&&YUKzhz*wj7#Eum!;4*p6%psS-O6?C_*Tmt2!Ujdp*%xv)gGf^S*Gumo3JxKGVIczB+-6?~NSD zAUdT4D;%TdTsl#I4*Xi-R9_0*4c_K(Tj0ocFrn7Rq^_Rbz?KD{V{u3B) zZe3G_QO5a{`+u8B0J2S{o}M_v81Y5+YK}Gq`->zM2NYdRGZ}?+$XGu;(PiB;>MX?G zX-$~jIY|ZYqVlhP;j@j|Z*+$F4?OSxIyHAY33+q^STaxn;>hArX52| zF{8-Oq{#alkC?P{H|Gu4&CFwdlU1Oj?6t5P&I}M)LWVy6tE;uE9gW!okwp8uw@Ldm zN^bnNtn$Ok*HJoas;jR-(OL9?G|ykFee|SUE8peD)!O}K(a*cbR&>v2s5Se&Lutr< z<^}gZYR2!=*2bT@{)gp4Ge#!{oRs8C=|7%-yQ@u7v3J2zu=4UC10p3ab^5GP+9=YX z?+KF2J6M@l&UKluygBj-MuHAQH-=3Qp&uKVBsKqD7W({I4|TvqX!85{{gUX&&pkw4 z)9s$`C>pJ^4~iPz7c4QR&_0b)*JFdW`v2t2Z8?}~nk|9#qx^RAHocG9%*@=}STX)f z>?^SeMthP^xQZ@GzvWFI1Bc_7$%k7@*q=7rwvpDJ)*cQ&bwKFzbsu8%V;glvA$GV| z>GY!-T8YY+Y_s&a786&B$+|Clernu$Z!2lM;I(I3%2oB3NNUBAKUEwN+}=33z>(LT z&s^^xGB)GmvTl0K;kG|}o<|`pP2N*KO04UBdD~67;w%!`ocL`D-tA-EsD&AiNaz$K zG+RV>LK0nawt_opQg7_WMfevJ;eQKDAqg=JQ@9^|#9gV)enJHDYwV)Jffu^iml;P5 z&Z9et=sh$$Upj0bEq1!p2}Hc7%Oi>$&}YW2J&6d}NtUcWCi?i^NL@@P7daPi;Yvjw zObpGa6Z0j_Y-OJ5KG_-EXCXFFXtzNNeT{{=f;eh2guWwy`!FqhMbH+ypS`|v1&A-1 zy7q$j5;6V{U)K){@JTm2Fjm`&%#zEEUcUlESAVwNBU;;gKFfL_2O*IyPA`ES99c`e zBO{_E29E3#W}8&y!2-v|1^V}x#eu+YNa@HT^au(#^uJ5wH`(@k_!AEb{`A~c$ zCe^;5LHNrMSZtrpRi-39rzZ-i3UyAT8{f?>ByLE|B*Re27H)jZu1FRqR`=EF!ML&U zqKG=*B29w=vRkxyPA(bS$SQ8sx9t+5tQ#%%P@!=wIqg|;#ouJ98Seuw#es-7(?$1f z94?e*r`!)aDa4Q?xDTGBTnmLO!fg67uuH=90Hopxpe+duCsyZgk8kL|WNGxwczclH zJP1~+I)Bc}vr&j?dHfn%napWRJCh4Y}7T`X!tz4yzOoQ@Tb zdeF^mwW^2{I({K6CPX_hfx6?jgk$&{d*cTY)SLDv;z7_IyF}SNW~FJ}=Yy2MEb-O8 zXjV4#;DwYh6Bn2_1YXEYh;BqDoDXah)$&(}pva62XVr3@EdqE@0lnlRn7=g>cUCI^ zWHK+Py1w)DLkfJZ+^a7S&ZcK{iRgS$X3XA0twM}UBQlz7hq++?Q3`ua=cH~A@tzR% z%o(k#Q&7j2n-IXw%1=elK-aBDfEh(p9;OwJZC}7#q@wdh>p({7GR(lCH_X!<9u(a7I~Qi|CphB|hHn%^5(|+`MI4~RKj>K|?A;Q! zgE2uN3@KG)^bpc{#6&uZBS3z20m(I~jq5~7f;)=y4kbF9R51A}gdZ#)5nGgwNp>@}-w{N* z;z9W-zXdyhn1acOYXa;D89Twm@2<{ypG{zwgGXj$CjG*(eHQ=)>!*j-bf|@75}t_A zi4eFO(fkh?n_8KmEj*|z3t(IHLlIUyP2&R7iF$ML3hgWbGlc-f^IIL43dmrrf-Rf7 zjMFq-1gHLJxE?Mti4MP!XXgrqhmsLMZF|UX{<;7@7JDBAxxrkl-M47vUc)j4i>ZSH zp!P2H0s(`3#5{d1U%e&V%$>In)Kx*G?4IcYA$l^Xkp zk`X{mbS^3zf^<9qZpy>r*^e8c-~>#V3Pc)8M89%x|CWWo*Fm$n zs3MkOEvv{vJO4AWQt?9u`ZYF8AR)dM$Ln0j#jD!L=Nu+Ei=?^*_~#o`KaxRay=d>2 z4q`HjEFj^D(i$2P5COtkuSleKL|H=XQXU~~1p?6(V84<(_y4K?icEOC0M>UB2N&g4 zS-ADdF%?h6XXCyyEzxJB)FsgCcU>RT4*}=cfOj;8f$ZVyRiC8_+@w1;7=EN+O^NVR zNnLX1H`Do@^QF?#Ac-%E+VuDapiG{L_?CJ?#paG{9r4{lS(B!2TTz7TDqlKuL9WNJ zw#IjtJzeDh<96MGpr~FfEXhB;Vo_z(-e zKv>%jo$o#cZHtWNl?wxKfBa7f+F)@&lZ5@Qq6wDU{h~Edw4vR`1!L>M=jfI8l6s}M zW=jtvfwp!JQ|a(R5u~OM4MnL=^=&1Q3VDJ7#`akXB${Q&0T&ZigG&Lo27ezvd5xrHAmqfwItno)mUGYj8HbdE2AM*3>iaAjh>QzNDLd9T%k!q z=(p=*ZkyB+UpcCyKcrhP!HE(h+hUY#gNR)all-_*@US~e$F=?0rMiFIZJQV?>1;EJ zD1%$x7FKvoAiWS4Vo&LjjCAA(S0ZTRgo(ssBm?QHqec7vXyw@U5YVNXn%Fk=7zM~u znNMm{Z}eHYH^RI+uJpZO>9otMaB1P#3cGzqN+-Fz{5id73pgZqd(z$zyZHk_Z$gf5 zR!v$T0v2!|g?YabGohuE^d?;vbS(@tkPh_b@F87x}<_!z`9bhGCwZJmO z5g{Ux)~EY#tRyI^0a%HCT6`VOg%^%vJe=>=dGHdEzJQ1nt(n^|?Y!-NU_ByT0Dj*- zt=UhEsg+KVeqKO%{$(xk!~@x151x9zl$Hp7l?o!>YZTo6PxH4VNHPS1T!A2vs_uMV zcLq|%FmQ-p2aHUJ6>FAX-(R3;t_-EJ{*&*%TOcig&8#w;?t|)uO25#GR~yXk$W*cX>SS0DNMMPd4gcCr3(tDpRtY_@j#%tMPg4}Go7^;`Ty_kI5U8B?H; z*h9$B<>;TubvmA+Zu3%msKIG`Hon-B@Jv7an9qpSo494lwKI+%Md8||^dkm)x!LKx zC6wLD$Fetl*%lREVcBI6VZ9Vs{+4=pd8TMjSn;l~)2#R3w%NUTVUW8C)1maPKHnlh z$7Xh@BB(%-PTsh;+H=>n{L`Rm#*dXKz7f4I3FT^+EVp5}GpFiEPjZD)A z&XNDI-&@3F2_{z)50c&|X6E}yQBZJIZ`#ftNJ~E2NJ>*72kYo*V;CB_Jmj5C3<|u` z`ji&PXqRa?Dv>4c;a>-pXI{eHl=C5y+%3MQwA{>CjV&DoTS0jQ!>RGZx7wBwn@oL1 zi(K7q223`vO2cgp3wh05GaE9EP>Wgak;{K#Jr-1qjH1Ks1HLs85A~{ZtnO+Dk8ePo z)lz%K&5#xjShSitV8Vq`nigJpo}j&5$j{U=lR(M%_7LKPJwH1H76xe!sGv#Mrt9ZB z7ZQ5a^%mXstSDF6C)1s9TZWW=-h*dtfb>XL@}0F*K><8WQkI8=$*+se+w5O2UC8TI zu&=Vl+py(+(CHoXptBU?p>==gWDWT`Ui)la$^if+dWgB3V>qOWNN0UVQ_RlSfa`}_TVu5+&6S$^kto$H+IoPYf7a=mcP?RC4~ z9+sGWZ;hp^+PYQmQ`3#Fo<{d@GZnq!|StE zUSg(8CI!Rx9-bg@LPfEs#|J)3o|T)@a@??Qh~}z}>uLBv`pDqdT~E_lT+X+k*yaDR zx7d1tlQ9rF3S0TXuQ)3Y8yUSa7{+3>}BEO$5(CV5sNCN8~vXWXcDSX@NmH zMS-78)yuU0O^0TlawCxLvD8dlJPRTg8x*%)*6O9F4-~m!hUth4)bxVbfxjV>fjV}l zCuLK@o?cSuRVRytXsN4o&0TVsk@HrijRj2A*9|<@mYFVp*B)VLn^<>FmgF_TIVY9# z(XSipwDuCL~=4`YJ3l5%HOt$E&)|1l5Z`$E*L-HiazOFefj-NYdDw>0fna98gVveXz8|e_^Phg*rntr2 zN}K7Q`5N;Cs7g4Is+7rJZx?CX`}E?3WIjE8gU^?@OHJ~%O{3}Rm1KKET|azm_XfXi z@YWFAgrluokDId1QtN*L?#Xm%+D)Jln~%5CmOdFe8o_nzo`gK7I^`J;j9D3UU*+ue zQLGbKw&-fI|4@*-W zK)Y&a$hU8Sx2CIM51YJ{X+ox@bnsYajI>yVVCT}scUVc&%BTxl)lyu07B zlF+#?y(0V6W1m@n{B}(h8O}t(ulqlhkv`qY&uk8#7!^a~N>b&Ce&}sA<1)7m+bJWb zuzt(_mAYOq$_%IPR+yiH?ZgU!yaBT-1{6cB9GK zTh2UH`6(T{YQAiQ)-fGHdzGc>4@89RpPhWA@$?T0?d={fE?AVZ?c~lt5Ro30rj-|w z2vRUhETNwofP=vz$ms08BW)irzk{)@y+`$XW7=5GB^*Y17c_~p>x8zv2re;*)4W*D zJkCf9?x_v)o`bmthgp~G;0rLFT+Dr1*fqJdb_nuXZ`gL&;fUX@_jBb)*?$J0>{j&)GqWPHTe8{SS@>p=ZwFsF6Q1U58>Vi z1IEdBhM`wqz==>|@Y;nq4?aG$ZDTmqrmqFjBH>q$%%qki!Y-MCLeqUF!Fn-y>lqYc z0!Nl7Y#EYTr=F#0r&B{Yh6~zP(wo)meEh~7<^-3e9Vf49Auk%iF^I#IonQoae%a&v zD51kiOV=A02!S2sBs*~tx6Y)^WaaFVKtF0WtI|eOmy>Hqv@8B=!jjnDy8tdR^sM2i zw9A$r4Ahs{yxjU@ZF6vBKWsN0{z{Mu)s+ukFoyzRsRaLxlOK{onDEj_9m3HWFy$DS zA2;Sxea^=ZF}~aO^lG60A}87+6)V%%v?TzSRsmfS5E7?k_{j!KV^ zrNqFuew>1f%N7ah3CMYPgSY{3mfUJKmfyl3rw0~m!5DKGX#DBYk1@qu>(E*=Hz77E zJ=5LJ010d*F+HQ2Lz6_%fq^duP-zfEEA9BO)A8N%lo>DT0Sc5uCzQ$;G39WmBAbO7 zl{Xv$k7CZ!f`!t;S|Ra~@*V(HwbBxe&zOxoM<{(PB`p-Uv55d%-iDR#T(whUrX%qxQL{%lgm!i0EKYGX}6RRr@7v0#XZ#;6pp6)M- z1yT*hAtLiQTUk70(j2D$<9Q&jy%7Kv&iWA9CaTyBRMdBKFMtu8YF%>J6_-P+LMV*^ ze*|G|`D|actvH3Z71&B;ipajW3o9_iMJ_g)0Z!9h+M#K+=kTGR4<;@#P(KdxAszR+ z=u(+FpuNfmLO-#%VVp)PV=3 z3lI;8xB+nAjg9Rk<5Jz%$>pf3)e}Q_$SlFNyLUjT2*h>+$I-rD0`>}s=oBH`F&3uS z2R$Hw9bs4Tz>k>iI6%WbW{BjaaWD}gI~AYP>{{gzx6)8d+Kpee0PJDsg;!Ae@>xar zd8YmsHg1?Jf=~l<*cXCbi+~jITA!G?0gd=29zM2W_k|+-lT<}O#5#$%r#vKuNU9MieY+Ae!^7bsQLp@wXV(Lo zh)obnl|@&OJE=)U`^l;J=K}0AAreSOfGp_FDczs3+6s1Xk?Z$Dk@-yQGgHMCp;zXK z#sEJ;9T?WBiAmZ*P=LpOC=IA?ll6nzaWR82`^7y`Ja$NnRm+S32Kq+8R#7J6WbTBF zPoGqnR|lweWt9g9k?~H3k6i9K3qBIU>xdwUvQ3`s&0;SUHB+#USa`xBkeAS5bvNw4 zsOO1t+$zvtm`5$qgbyb)C-y7J;_TT7IggIa6I@ln{aITH`4{%b?_jkXQJ#M&#SIZk zD=v+D!69@puu$7~Tjy!2x{>=jqfUkI^Q}c=xb#*rJwK(p9pV+;y65Y(j3SHtH+Lq_ z+YfKPGnCTFnB$*ZbC#T{V_z}un_91*6=3mnrLQN%hGkzI@8l2J4O~)P zd!1%*f3YQQf`yrySTEzjTY;7YANi^VNlj8HmATE!yH7pdSym~jJ0P*hZhPcG3@Jsf zZQpK>{K|`wyfdPta`!cAiEJ6ad(BW{4=OC#pQZEnHHiNv*1>?D#MHf<`)ELuKoNG_ z7?4&bL8VR-Ib;VD>xN9seKv2fCrL@|DDexI`bWx;cL{#ODqB(oCrKF^hLds^*t+QJ zx?+DI^uNkl<%~ww=z(-sw5k3+I;rQ#mj<4HMgGivg zNur5{Zbm7iJF8zG*JUDN=udOc$A{*l`5@Z{K@@)COiss@rkha zi+g|lbw=5n+p&|@X|gIS(VvDcy^Pg=xnZ46^4R)v)()kbDOT*&AI-P_@SS+agdq@a z2?=vilXn`wT;3?Z{n3u9x7ss^sx8M~3##6_-RTJXSAAFJ>QZZo>XuN&{a52DCpqh4 zeh+5rhum#DIq_%q`*(-D$GwvW0-hPk7Xup|}Q*oOR!)nL2uF99|H?BiY!_r>XzIqfh{k$o&C-!z27Z z@aUol9tHld;E^nVM~nXsk1qW?Jo+etM|A)mq5mBoefS$5O@{WJO{y5wDY%&Y@y}1z zvT9M;%JO3=y0wf`x2HK@W>!rITfYgV2wNBCK>zxr?Wg+6Q;qLwh8<=81FEvu$8hxn z_&7Jq8&8^dnzS-cBgrR`{{5PD^7c5Z@8m4s=93~V343t@)V8xuKZb;bpGMjz8jgOx z_clha(4=-G1ujiPR(BKKuzV=rF{#l}y*X5)(B{M=1#kckS}#y+FH_IaYZmxn^_w~6 zpq=zXA=q+iMq|)0nr_RIqyb+Cl)6DX$#{=iI?09U*Ka)E{eAYLrsx11Ml1lM--$Hd zq1(V(z+7G9Mt=^rg;>wBhkJ>;ohN!^4vM(ZfwKJ8R|jZDt+MvswwcDW{qJ$tjMv&p zdaK4L6^S-~v|inZ-D{EV{D&*q&4bpxEq+ibvj9I}B+*4z;Akn9vR;Dlc3JQ6Z{QCS zEsYRReLj5Gwm75-M!$#r;loYSID3M5Hc<^WcKF1ErIe>`HB5${fCss5Uo}9j;(;Dz z&+&z1FE-&-+d1NktA=MSbrNjxx!i7T z@&wWmxJXqZElDiLHQZmaq`q5Ad;$*f_lwbYu-}B7>RPD`SSS0e-*~)Q1tTW=Luu>asMG zL7hQ;8)CHtyrUAP*>JKq|7Vz+xk?H;zF2wozHu!Hia@ZY%;hvks zdM>NWa>$6d)ufzArlklTA(Q%b&T+OoS<4!+Hr^GWLPH&7K*1yu@8?fU0|ks*~H^n3Viqk&G4^>UvBn%u{%b#gDoLt)(6vAv|WenK8i2e zwsC5lV){maSYJuxjh6aJ<%M31F8?_Wv-gs@-w%}=acn+Zr*Sc1KhTo+Yg$s}ANiXX z87$c-F?3SBgZB7i|D~%-)uIDorQrG=XR@|mI?rN`&khwxxV+kcd)P9OE@ow0aTdAF zP;np-zPY`!jn|{zpl7DOSe;>ezhNu>GW&9dx4{w-F2!9BGpif!X}EsTfH*d}H0i%8 zP0#wO`JWJ-%gQ;=PIgy>p?+ct#&32~u7SI)IQ~)2 zq52fGVRxr7`O?ez1V^y1Np{Qg@op|nm62l^islYj-0{-$TuZK`UIuqx^>4TIwHHR zle)%^&7{eoY&|Y-`wsS`_Sl$iQ$@4tz=#fixzX0R{+kDm`qg*xb5@sNx~Yd@I^$xh z)Pj%cS5nv(4CB5u{v%UoFNe8mb)o2PUGSS@KC2Zk_*4^zkd&Op^l!*mMqjh@26>i2 zr|R#jHuDdp{Ef6fuO5M<>tS;jA`|z2c&^>vpE(g36`Y543$2zG5($ZJ)|tpg*fECw z-m9GyCXLpmMK3y%>h=2FZ^Mk?D4X2oQxlCYoUS`R4CU8|QNJNW{~*qoYMbC?A)yQX zG=DJf*P_-|%iBKHQKg&32;~=+Lnsv)X$kS4&&XjE>zS|(&ehmrX3xDoG=?s(GT+pi zKD@socZaiWw1YE?8;O^X1e3S-(V1`lay7OhRv)c60$tUw%Xjnk*!)$^$p|6oOH_y(P;O?!IN@ ztm^_7+Zc2(h!HA2eULSczNN`*S&ZaRteT(0JK{=9 z3?v4zR(oyUHla2ftT{UecVq5#qahwpStrYKZM}Dd%q2auhn7-ypP6R;B|xri+wk+k zEa$1LzbI*Y)qR^Np&?zc5+UaO?QH!S`Wy@iO*f;>!G_6cP3DR#b%?z{LMrmO4mc6j z^pg;Gm}tU03+Hxcc8nf`%Ar4MnK-hM*V2+p`UpwDKw`#z65^kLt8d(s=KiJ)lwfu& z^u(OY>$cQQQ>o9oP8?w3dRZBlQ+$x%-Wx@=u}R8ih|n8o4BV-Oi-&!MP?iAG#4Jol z0C)yLxCu@qZ-Q3S30dx1+9+izJ3n(YEiV<79A){b^EqIq=7MrmB^OI9C=FvKQS!cV^~ zVy6mshf3H0rR^RE?QzBXDqX~J!q_Dn17S2eW`$v{m?he?p=@#AXr-2;K3^F4Xeu-y zz|xlo($i=jZAW-((ybOz7wTYN@u5Iym4Kb-qii`MGLST;^mkl|o#*1BXuh&_&_is* zjSrao@_c-&X*(VBfPoq?qi&S8zcTYLTti6{?OI!U0}Y%S1nAf&)kSJ}+=j zp-4NfB{S9%#D$K41`%}!kBQ;2G272#YUrpqHXOQScjP@RKpVX>r|@P>WxKjDY65wZ zh-5-QgByJz>byT6SXyWgVtnVw7AuorKOQ`ifrw`#V&~u?5cqB(bmWh17wcf)q*_0x z0MQAv< zLXe}7=(+^0@^s>fRSq)i?|IwWJnjkoe8+M8JR4ujfZyL^;_YH}uB*7l-l0ya*o_Cj zD#YeCR+M$df>B)-u#p&-T3nDUU<;k8e;sskl!6We?_DS^g*rCOAX`sbgDbaz!9@*n zvHe19?DQp4lLw1KEF~k0tgaMYMW(P()I`++lid&I5a<6i4$uy%cyGNq017s#dB9#0 zV*6<~AF^?nRAccm)fFx=pSd-cdM)JYh7#U2$pxH|zy4d0Z3pwVIoLreJvk8;!~q}m z(St<#JO|gw6&-%-n!~=O%e)HViYnY(VgV63zWxf(n39F)vXzVKO%|V4DTGDJ?lB_n z30SoWupB*c5A$bI4(T%5qav2?*!@ycIu9Fc(5ltB{UcMUZ-Oq-`s{!B(=LPAG4pdd!j9 zA!jBIXD#z2^oB%PZ4+{eWh?cTljQv=3;H~~iYm)|c+c_-GNO?Op|!IZn@O74kLh3( z(4IVz)poYcQaAk#T^uTqUjE4k6>rLE{x-mjY}XkzDLm-8hp03@4$jDN*WLI638tU9 ze%g4l+5WLz^OkVs>LQ#5TXG1Tl;dDwuXHw8;+!I5Us12q22@rS;qNOXO|Ve0U+moV zQcoa8UDx=jMtfff#Xyfp$_Tvz@h6|Q_xLU?Xu9Vf&fRelj{7AWR|zqs7D%T06fl%j zweN0KJ|_^zDNz*EevuwOMj%&F%5SLzsU)Q^2p^%`*E~%)z`eWIx=W3QOEgf-Z@>X4 zSp`9sHX@!{JVoP*+)Iq>som=Lo>558U=x^SG9kNWI8WTroZMx4m$&68@lJ}o*#Sq)8I&?< zc)4Q)%-b3}2ltFV&S{F>FgFq zPjQyRJ{y(>n;+hLS2K}^NS=ED?!6_nOZ`PAa8l$CUzcmHk{1{g{`Qc5l@K@Yd~U6d zh@&AQ!O5!s@{scK|83sp`+`WXlC(A+kEJ0JOo{NXfF!921bmHX!J8-nwJ4u>@-NB# zQLnDtdwc&t@39T<7+;4;e(%26kXMerlT!QtI7sq-cu}zTe-I=&C^&yb)&0K_B3eq9^aT!DTXgNMJ4-9%Zwu)m+3GEK^;wzqU)^cDtbYmD6OMgKC@!dtS^@p- z&e2q~@lo%VVDr)ptFpLH-L+4xo`d6RTG`8D&g9&{(~phE8ltPbFPJHbuDx{$*0q6X zv)&~v4`IMbXk?$q+`0NM^G}?vUFHud>P~W=*uQBKtJB_B%uyxZ;QP+4$tRy(&71C* z;@F++PtDP7$Xdvx)YTj3+5NQ=7nYqiyl1CY7{!kz=|$(mWDkT!Mi2V>My5+TQYIXA zUkKh8Tplb~vycL>>vwhg?a;l!8pf!smAF^-p}e;a8`OaFZZVPRqJ7&oIbb2h$$2D1 zE|G$E+2OXgiIYX*bNI zJ-3fwiWuWB7;q%`{8}W|F z>X7jFsncg@a7*1(5{K)cqa2y-7}&`wo`Gses%0AMR!1w0j1$dBggEMUH{qv@t!|Tr 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 z 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�k6uOT)<3X1nVC?!hWjIb5YfU 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

ECQ_VvS;?~p53>_ESI$tyWr~i)Pexu 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 Jawul~e*jP}mVy8P literal 0 HcmV?d00001 From 539b218a35426f3b60ce3f3584a60d51e45ae43a Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 21:59:11 +0300 Subject: [PATCH 44/78] implement no coin found screen --- .../components/success/NoCoinsFound.kt | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt new file mode 100644 index 0000000..ca95567 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt @@ -0,0 +1,56 @@ +package com.ryankoech.krypto.feature_coin_list.presentation.components.success + +import androidx.compose.foundation.layout.* +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.ryankoech.krypto.common.presentation.components.GifImage +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +import com.ryankoech.krypto.common.R + +@Composable +fun NoCoinsFound( + modifier: Modifier = Modifier, +) { + + Column( + modifier = modifier + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + + Box(modifier = Modifier.size(112.dp)) { + GifImage( + modifier = Modifier.fillMaxSize(), + res = R.drawable.icon_gif_search + ) + } + + Spacer(modifier = Modifier.height(20.dp)) + + Text( + text = "No coins to show.", + style = MaterialTheme.typography.body1 + ) + + } + +} + +@Preview +@Composable +fun NoCoinsFoundPreview() { + KryptoTheme { + Surface( + modifier = Modifier.fillMaxSize() + ) { + NoCoinsFound() + } + } +} \ No newline at end of file From cc1cb59db4dadd32ceb868d5be68c418288ffe19 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 22:05:09 +0300 Subject: [PATCH 45/78] update to make more flexible --- .../krypto/common/presentation/ErrorScreen.kt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/ryankoech/krypto/common/presentation/ErrorScreen.kt b/common/src/main/java/com/ryankoech/krypto/common/presentation/ErrorScreen.kt index 802f864..5d42d58 100644 --- a/common/src/main/java/com/ryankoech/krypto/common/presentation/ErrorScreen.kt +++ b/common/src/main/java/com/ryankoech/krypto/common/presentation/ErrorScreen.kt @@ -14,9 +14,10 @@ import com.ryankoech.krypto.common.presentation.components.KryptoButton @Composable fun ErrorScreen( modifier : Modifier = Modifier, - onButtonClick : () -> Unit, + onButtonClick : () -> Unit = {}, messageText : String, - buttonText : String, + buttonText : String = "Try Again", + showButton : Boolean = true, @DrawableRes res : Int, ) { @@ -27,7 +28,7 @@ fun ErrorScreen( horizontalAlignment = Alignment.CenterHorizontally ) { - Box(modifier = Modifier.size(40.dp)) { + Box(modifier = Modifier.size(80.dp)) { GifImage( modifier = Modifier.fillMaxSize(), res = res @@ -41,12 +42,14 @@ fun ErrorScreen( style = MaterialTheme.typography.body1 ) - Spacer(modifier = Modifier.height(24.dp)) + if(showButton){ + Spacer(modifier = Modifier.height(24.dp)) - KryptoButton( - text = buttonText, - onClick = onButtonClick - ) + KryptoButton( + text = buttonText, + onClick = onButtonClick + ) + } } From 17255cf483614cf8061b4fe4d613a209e97f08a6 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 22:05:32 +0300 Subject: [PATCH 46/78] refactored to utli error component --- .../components/success/NoCoinsFound.kt | 34 ++++--------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt index ca95567..a3ac3fc 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt @@ -1,45 +1,25 @@ package com.ryankoech.krypto.feature_coin_list.presentation.components.success import androidx.compose.foundation.layout.* -import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface -import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.ryankoech.krypto.common.presentation.components.GifImage import com.ryankoech.krypto.common.presentation.theme.KryptoTheme import com.ryankoech.krypto.common.R +import com.ryankoech.krypto.common.presentation.ErrorScreen @Composable fun NoCoinsFound( modifier: Modifier = Modifier, ) { - Column( - modifier = modifier - .fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - - Box(modifier = Modifier.size(112.dp)) { - GifImage( - modifier = Modifier.fillMaxSize(), - res = R.drawable.icon_gif_search - ) - } - - Spacer(modifier = Modifier.height(20.dp)) - - Text( - text = "No coins to show.", - style = MaterialTheme.typography.body1 - ) - - } + ErrorScreen( + modifier = modifier, + messageText = "No coins to show.", + res = R.drawable.icon_gif_search, + showButton = false, + ) } From 34fce7e841e5cb2cf4668074dc4d86db8e6c5244 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 22:05:59 +0300 Subject: [PATCH 47/78] implement error screen --- .../presentation/CoinListScreenError.kt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenError.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenError.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenError.kt new file mode 100644 index 0000000..6e86a66 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenError.kt @@ -0,0 +1,31 @@ +package com.ryankoech.krypto.feature_coin_list.presentation + +import androidx.compose.material.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import com.ryankoech.krypto.common.presentation.ErrorScreen +import com.ryankoech.krypto.common.R +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme + +@Composable +fun CoinListScreenError( + onButtonClick: () -> Unit, + modifier: Modifier = Modifier, +){ + + ErrorScreen(onButtonClick = onButtonClick, messageText = "Hmm, can't seem to find any coins", buttonText = "Try Again", res = R.drawable.icon_gif_caution) + +} + +@Preview +@Composable +fun CoinListScreenErrorPreview(){ + + KryptoTheme { + Surface { + CoinListScreenError(onButtonClick = {}) + } + } + +} \ No newline at end of file From e91d28971b8226447af7c2040f74e761cf693f69 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Tue, 10 Jan 2023 22:07:12 +0300 Subject: [PATCH 48/78] add logic to display fallback error screens --- .../krypto/feature_coin_list/presentation/CoinListScreen.kt | 4 +--- .../feature_coin_list/presentation/CoinListScreenSuccess.kt | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index 6a62208..f1732af 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -12,7 +12,6 @@ import com.ryankoech.krypto.feature_coin_list.domain.entity.Order import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel -import timber.log.Timber @Composable fun CoinListScreen( @@ -67,8 +66,7 @@ fun CoinListScreen( ) { if(viewState.screenState == ScreenState.ERROR) { - //TODO : Show Error Screen - Timber.d("Display Coin List Error Screen") + CoinListScreenError(onButtonClick = { viewModel.getCoins(sortInfoState, filterStringState) }) }else { CoinListScreenSuccess( screenState = viewState.screenState, diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt index d306a44..f06da54 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -18,6 +18,7 @@ import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.presentation.components.success.CoinItem import com.ryankoech.krypto.feature_coin_list.presentation.components.success.CoinListLoading +import com.ryankoech.krypto.feature_coin_list.presentation.components.success.NoCoinsFound import com.ryankoech.krypto.feature_coin_list.presentation.components.success.SearchTag import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.DEFAULT_SORT_INFO import timber.log.Timber @@ -83,8 +84,7 @@ fun CoinListScreenSuccess( } else { if( coins.isEmpty() ) { - // TODO: Show No Coins Screen - Timber.d("Display Coin List Empty List") + NoCoinsFound() }else { LazyColumn( From 163cf52001a403188a64b7e3a085896fddd274e8 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:10:32 +0300 Subject: [PATCH 49/78] add room dependencies --- feature_coin_list/build.gradle | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/feature_coin_list/build.gradle b/feature_coin_list/build.gradle index 6b31427..f0a1c7e 100644 --- a/feature_coin_list/build.gradle +++ b/feature_coin_list/build.gradle @@ -70,6 +70,12 @@ dependencies { implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" implementation "androidx.activity:activity-compose:$compose_activity_version" + // room - for storing data locally + implementation "androidx.room:room-ktx:$room_version" + implementation "androidx.room:room-runtime:$room_version" + annotationProcessor "androidx.room:room-compiler:$room_version" + kapt "androidx.room:room-compiler:$room_version" + // junit4 testImplementation "junit:junit:$junit_version" From 0fc8d2633004b3cedbe59f32c81fb50771bb2e28 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:12:32 +0300 Subject: [PATCH 50/78] add local coin dto --- .../data/dto/CoinLocalDto.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinLocalDto.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinLocalDto.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinLocalDto.kt new file mode 100644 index 0000000..f542b3b --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinLocalDto.kt @@ -0,0 +1,40 @@ +package com.ryankoech.krypto.feature_coin_list.data.dto + +import androidx.room.Entity +import androidx.room.PrimaryKey +import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin + +const val TANLENAME_COIN_DTO = "table_coin_dto" + +@Entity(tableName = TANLENAME_COIN_DTO) +data class CoinLocalDto( + val id : String, + val name : String, + val symbol : String, + @PrimaryKey(autoGenerate = false) + val marketCapRank : Int, + val image : String, + val change : Float, + val price : Double, + val marketCap : Long, + val allTimeHigh : Double, + val high24Hr : Double, + val totalVolume : Double, +) + + +fun List.toCoinEntity() : List = map { + Coin( + id = it.id, + name = it.name, + symbol = it.symbol, + price = it.price, + marketCapRank = it.marketCapRank, + image = it.image, + change = it.change, + marketCap = it.marketCap, + allTimeHigh = it.allTimeHigh, + high24Hr = it.high24Hr, + totalVolume = it.totalVolume + ) +} \ No newline at end of file From 5631043492a198c7da552f01d0efb5bb360b9f8e Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:14:28 +0300 Subject: [PATCH 51/78] implement database and dao --- .../data/data_source/local/db/CoinDao.kt | 18 ++++++++++++++++++ .../data/data_source/local/db/CoinDatabase.kt | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDao.kt create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDatabase.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDao.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDao.kt new file mode 100644 index 0000000..f316a1a --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDao.kt @@ -0,0 +1,18 @@ +package com.ryankoech.krypto.feature_coin_list.data.data_source.local.db + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinLocalDto +import com.ryankoech.krypto.feature_coin_list.data.dto.TANLENAME_COIN_DTO + +@Dao +interface CoinDao { + + @Insert + suspend fun insertCoins(coins : List) + + @Query("SELECT * FROM $TANLENAME_COIN_DTO") + suspend fun getCoins() : List + +} \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDatabase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDatabase.kt new file mode 100644 index 0000000..4bfdbd1 --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDatabase.kt @@ -0,0 +1,18 @@ +package com.ryankoech.krypto.feature_coin_list.data.data_source.local.db + +import androidx.room.Database +import androidx.room.RoomDatabase +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinLocalDto + +const val DB_NAME = "coin_db" + +@Database( + entities = [CoinLocalDto::class], + version = 1, + exportSchema = false +) +abstract class CoinDatabase : RoomDatabase() { + + abstract fun getCoinDao() : CoinDao + +} \ No newline at end of file From 39039301d574cd92f406419efbcd5e0d8f9edf83 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:15:26 +0300 Subject: [PATCH 52/78] implement local coin databse di mobule --- .../core/di/CoinListDatabaseModule.kt | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinListDatabaseModule.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinListDatabaseModule.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinListDatabaseModule.kt new file mode 100644 index 0000000..262196b --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinListDatabaseModule.kt @@ -0,0 +1,33 @@ +package com.ryankoech.krypto.feature_coin_list.core.di + +import android.content.Context +import androidx.room.Room +import com.ryankoech.krypto.feature_coin_list.data.data_source.local.db.CoinDao +import com.ryankoech.krypto.feature_coin_list.data.data_source.local.db.CoinDatabase +import com.ryankoech.krypto.feature_coin_list.data.data_source.local.db.DB_NAME +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object CoinListDatabaseModule { + + @Provides + @Singleton + fun getCoinDatabase(@ApplicationContext context: Context) : CoinDatabase { + return Room.databaseBuilder( + context, + CoinDatabase::class.java, + DB_NAME, + ).fallbackToDestructiveMigration().build() + } + + @Provides + @Singleton + fun getCoinDao(coinDatabase: CoinDatabase) : CoinDao = coinDatabase.getCoinDao() + +} \ No newline at end of file From 399bca8a9e2e9cfe30de0fbf136462767db123dc Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:19:19 +0300 Subject: [PATCH 53/78] implement type converter --- .../feature_coin_list/data/dto/CoinDto.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt index 0b860a3..554c023 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/dto/CoinDto.kt @@ -46,4 +46,21 @@ fun List.toCoinEntity() : List = high24Hr = it.high_24h, totalVolume = it.total_volume ) + } + +fun List.toLocalCoinDto() : List = + map { + CoinLocalDto( + id = it.id, + name = it.name, + symbol = it.symbol, + price = it.current_price, + marketCapRank = it.market_cap_rank, + image = it.image, + change = it.price_change_24h.toFloat(), + marketCap = it.market_cap, + allTimeHigh = it.ath, + high24Hr = it.high_24h, + totalVolume = it.total_volume + ) } \ No newline at end of file From 91135c44ece9e564665a1281a3206a271304ee74 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:20:28 +0300 Subject: [PATCH 54/78] implement repositories to interact with dao --- .../data/repository/CoinRepositoryImpl.kt | 11 ++++++++++- .../data/repository/FakeCoinRepositoryImpl.kt | 9 +++++++++ .../domain/repository/CoinRepository.kt | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt index 1c89cdb..a0a4983 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt @@ -1,15 +1,24 @@ package com.ryankoech.krypto.feature_coin_list.data.repository +import com.ryankoech.krypto.feature_coin_list.data.data_source.local.db.CoinDao import com.ryankoech.krypto.feature_coin_list.data.data_source.remote.CoinServiceApi import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinLocalDto import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository import retrofit2.Response import javax.inject.Inject class CoinRepositoryImpl @Inject constructor( - private val api : CoinServiceApi + private val api : CoinServiceApi, + private val dao : CoinDao ) : CoinRepository { override suspend fun getCoins(): Response> = api.getCoins() + override suspend fun getLocalCoins(): List = dao.getCoins() + + override suspend fun saveCoins(coins: List) { + dao.insertCoins(coins) + } + } \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt index 7cef8fa..4660107 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt @@ -1,9 +1,12 @@ package com.ryankoech.krypto.feature_coin_list.data.repository import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinLocalDto import com.ryankoech.krypto.feature_coin_list.data.dto.Roi +import com.ryankoech.krypto.feature_coin_list.data.dto.toLocalCoinDto import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository import retrofit2.Response +import timber.log.Timber import javax.inject.Inject val FAKE_COIN_LIST = listOf( @@ -213,4 +216,10 @@ class FakeCoinRepositoryImpl @Inject constructor() : CoinRepository { override suspend fun getCoins(): Response> { return Response.success(FAKE_COIN_LIST) } + + override suspend fun getLocalCoins(): List = FAKE_COIN_LIST.toLocalCoinDto() + + override suspend fun saveCoins(coins: List) { + Timber.d("Saved Coins Successfully") + } } \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt index 19236f1..d196128 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt @@ -1,10 +1,14 @@ package com.ryankoech.krypto.feature_coin_list.domain.repository import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto +import com.ryankoech.krypto.feature_coin_list.data.dto.CoinLocalDto import retrofit2.Response interface CoinRepository { suspend fun getCoins() : Response> + suspend fun getLocalCoins() : List + + suspend fun saveCoins(coins : List) } \ No newline at end of file From 16dc0a6a65596463c305e961695f76e624b78d48 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:23:47 +0300 Subject: [PATCH 55/78] implement usecase to fetch local coins --- .../domain/usecase/GetLocalCoinsUseCase.kt | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetLocalCoinsUseCase.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetLocalCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetLocalCoinsUseCase.kt new file mode 100644 index 0000000..83f361a --- /dev/null +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetLocalCoinsUseCase.kt @@ -0,0 +1,29 @@ +package com.ryankoech.krypto.feature_coin_list.domain.usecase + +import com.ryankoech.krypto.common.core.util.Resource +import com.ryankoech.krypto.feature_coin_list.core.di.HILT_NAMED_REPO +import com.ryankoech.krypto.feature_coin_list.core.di.HILT_NAME_REPO_FOR_ALL +import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity +import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin +import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onStart +import timber.log.Timber +import javax.inject.Inject +import javax.inject.Named + +class GetLocalCoinsUseCase @Inject constructor( + @Named(HILT_NAME_REPO_FOR_ALL) private val repository: CoinRepository, +) { + + operator fun invoke() = flow>> { + emit(Resource.Success(repository.getLocalCoins().toCoinEntity())) + }.onStart { + emit(Resource.Loading()) + }.catch { e -> + Timber.e(e) + emit(Resource.Error(e.localizedMessage ?: "An unexpected error occurred.")) + } + +} \ No newline at end of file From e0c50967e10d929433da99487bece52604c8d630 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:41:45 +0300 Subject: [PATCH 56/78] implement logic to save remote coins to db --- .../feature_coin_list/domain/usecase/GetCoinsUseCase.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt index d28bf04..91a0008 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -4,6 +4,7 @@ import com.ryankoech.krypto.common.core.util.Resource import com.ryankoech.krypto.feature_coin_list.core.di.HILT_NAME_REPO_FOR_ALL import com.ryankoech.krypto.feature_coin_list.data.dto.CoinDto import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity +import com.ryankoech.krypto.feature_coin_list.data.dto.toLocalCoinDto import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin import com.ryankoech.krypto.feature_coin_list.domain.entity.Order import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy @@ -14,6 +15,7 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onStart import retrofit2.Response import timber.log.Timber +import java.util.* import javax.inject.Inject import javax.inject.Named @@ -22,13 +24,18 @@ class GetCoinsUseCase @Inject constructor( ) { // Basic Cache - var cacheCoin : List? = null + private var cacheCoin : List? = null operator fun invoke(sortInfo: SortInfo, filterString : String = "") = flow { val response : Response> = if(cacheCoin.isNullOrEmpty()) { val response = repository.getCoins() cacheCoin = response.body() + + // Save to local + if(!cacheCoin.isNullOrEmpty()) { + repository.saveCoins(cacheCoin!!.toLocalCoinDto()) + } response } else { Response.success(cacheCoin) From af349461efe602b6cc478c661f9d236438fb68e1 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:43:44 +0300 Subject: [PATCH 57/78] implement local fallback when remote coin fetching fails --- .../viewmodel/CoinListScreenViewModel.kt | 50 ++++++++++++++++--- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt index 35357fb..5ce9d46 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt @@ -10,11 +10,11 @@ import com.ryankoech.krypto.feature_coin_list.domain.entity.Order import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.domain.usecase.GetCoinsUseCase +import com.ryankoech.krypto.feature_coin_list.domain.usecase.GetLocalCoinsUseCase import com.ryankoech.krypto.feature_coin_list.presentation.viewstate.CoinListScreenviewState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import timber.log.Timber import javax.inject.Inject val DEFAULT_SORT_INFO = SortInfo( @@ -24,7 +24,8 @@ val DEFAULT_SORT_INFO = SortInfo( @HiltViewModel class CoinListScreenViewModel @Inject constructor( - private val getCoinsUseCase: GetCoinsUseCase + private val getCoinsUseCase: GetCoinsUseCase, + private val getLocalCoinsUseCase : GetLocalCoinsUseCase ) : ViewModel() { private val _viewState = mutableStateOf(CoinListScreenviewState()) @@ -40,19 +41,14 @@ class CoinListScreenViewModel @Inject constructor( .onEach { res -> when(res){ is Resource.Error -> { - Timber.d("VM Error") - _viewState.value = _viewState.value.copy( - screenState = ScreenState.ERROR - ) + getLocalCoins() } is Resource.Loading -> { - Timber.d("VM Loading") _viewState.value = _viewState.value.copy( screenState = ScreenState.LOADING ) } is Resource.Success -> { - Timber.d("VM Success") _viewState.value = _viewState.value.copy( screenState = ScreenState.SUCCESS, coins = res.data!! @@ -69,4 +65,42 @@ class CoinListScreenViewModel @Inject constructor( } + + private fun getLocalCoins() { + + getLocalCoinsUseCase() + .onEach { res -> + when(res) { + is Resource.Error -> { + _viewState.value = _viewState.value.copy( + screenState = ScreenState.ERROR + ) + } + is Resource.Loading -> { + _viewState.value = _viewState.value.copy( + screenState = ScreenState.LOADING + ) + } + is Resource.Success -> { + if(res.data.isNullOrEmpty()){ + _viewState.value = _viewState.value.copy( + screenState = ScreenState.ERROR + ) + }else{ + _viewState.value = _viewState.value.copy( + screenState = ScreenState.SUCCESS, + coins = res.data!! + ) + } + } + else -> { + _viewState.value = _viewState.value.copy( + screenState = ScreenState.ERROR + ) + } + } + }.launchIn(viewModelScope) + + } + } \ No newline at end of file From 088bb189e1412e9f3020e2e5b7434b8cfde3f9c5 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 09:45:52 +0300 Subject: [PATCH 58/78] clear cache after period --- .../feature_coin_list/domain/usecase/GetCoinsUseCase.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt index 91a0008..f49472f 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -32,6 +32,13 @@ class GetCoinsUseCase @Inject constructor( val response = repository.getCoins() cacheCoin = response.body() + // Clear cache after 1 minute + Timer().schedule(object : TimerTask() { + override fun run() { + cacheCoin = null + } + }, 60_000) + // Save to local if(!cacheCoin.isNullOrEmpty()) { repository.saveCoins(cacheCoin!!.toLocalCoinDto()) From c652736509c2bfadcf8a85122c8c9698a3af96a5 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 12:12:30 +0300 Subject: [PATCH 59/78] implement pull to refresh --- .../presentation/CoinListScreen.kt | 59 ++++++++++++++++--- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index f1732af..123ba76 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -1,8 +1,14 @@ package com.ryankoech.krypto.feature_coin_list.presentation +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Surface +import androidx.compose.material.pullrefresh.PullRefreshIndicator +import androidx.compose.material.pullrefresh.pullRefresh +import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel @@ -12,7 +18,11 @@ import com.ryankoech.krypto.feature_coin_list.domain.entity.Order import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import timber.log.Timber +@OptIn(ExperimentalMaterialApi::class) @Composable fun CoinListScreen( viewModel: CoinListScreenViewModel = hiltViewModel(), @@ -20,6 +30,8 @@ fun CoinListScreen( ) { val viewState = viewModel.viewState.value + val refreshScope = rememberCoroutineScope() + var sortInfoState by remember { mutableStateOf( SortInfo( @@ -38,6 +50,22 @@ fun CoinListScreen( filterStringState = subString } + var isRefreshingState by remember { + mutableStateOf(false) + } + + fun refresh() = refreshScope.launch { + isRefreshingState = true + viewModel.getCoins(sortInfoState, filterStringState) + delay(500) + isRefreshingState = false + } + + val pullRefreshState = rememberPullRefreshState( + refreshing = isRefreshingState, + onRefresh = ::refresh + ) + fun editSortingInfo(sortCoinBy: SortCoinBy) { val newSortInfo = if(sortCoinBy == sortInfoState.sortBy){ @@ -68,14 +96,29 @@ fun CoinListScreen( if(viewState.screenState == ScreenState.ERROR) { CoinListScreenError(onButtonClick = { viewModel.getCoins(sortInfoState, filterStringState) }) }else { - CoinListScreenSuccess( - screenState = viewState.screenState, - editSortInfo = ::editSortingInfo, - sortInfoState = sortInfoState, - coins = viewState.coins, - filterStringState = filterStringState, - editFilterStringState = ::editFilterStringState - ) + + Box( + modifier = Modifier + .pullRefresh(pullRefreshState) + ){ + + CoinListScreenSuccess( + screenState = viewState.screenState, + editSortInfo = ::editSortingInfo, + sortInfoState = sortInfoState, + coins = viewState.coins, + filterStringState = filterStringState, + editFilterStringState = ::editFilterStringState + ) + + PullRefreshIndicator( + modifier = Modifier + .align(Alignment.TopCenter), + refreshing = isRefreshingState, + state = pullRefreshState, + ) + + } } } } From 093b1f16416c71b086f8a38e4362c81eda22b171 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 12:14:26 +0300 Subject: [PATCH 60/78] fix indentation --- .../viewmodel/CoinListScreenViewModel.kt | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt index 5ce9d46..a64b7a1 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt @@ -39,29 +39,29 @@ class CoinListScreenViewModel @Inject constructor( getCoinsUseCase(sortInfo, filterString) .onEach { res -> - when(res){ - is Resource.Error -> { - getLocalCoins() - } - is Resource.Loading -> { - _viewState.value = _viewState.value.copy( - screenState = ScreenState.LOADING - ) - } - is Resource.Success -> { - _viewState.value = _viewState.value.copy( - screenState = ScreenState.SUCCESS, - coins = res.data!! - ) - } - else -> { - _viewState.value = _viewState.value.copy( - screenState = ScreenState.ERROR - ) + when(res){ + is Resource.Error -> { + getLocalCoins() + } + is Resource.Loading -> { + _viewState.value = _viewState.value.copy( + screenState = ScreenState.LOADING + ) + } + is Resource.Success -> { + _viewState.value = _viewState.value.copy( + screenState = ScreenState.SUCCESS, + coins = res.data!! + ) + } + else -> { + _viewState.value = _viewState.value.copy( + screenState = ScreenState.ERROR + ) + } } - } - }.launchIn(viewModelScope) + }.launchIn(viewModelScope) } From 171653f86c52fc340c2fbe24ab37e6f851c69885 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 12:40:17 +0300 Subject: [PATCH 61/78] add coinItemCallbackOnClick callback --- .../krypto/feature_coin_list/presentation/CoinListScreen.kt | 4 +++- .../feature_coin_list/presentation/CoinListScreenSuccess.kt | 4 +++- .../presentation/components/success/CoinItem.kt | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index 123ba76..e4cc1fb 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -25,6 +25,7 @@ import timber.log.Timber @OptIn(ExperimentalMaterialApi::class) @Composable fun CoinListScreen( + coinItemOnClick : (String) -> Unit, viewModel: CoinListScreenViewModel = hiltViewModel(), modifier: Modifier = Modifier ) { @@ -103,6 +104,7 @@ fun CoinListScreen( ){ CoinListScreenSuccess( + coinItemOnClick = coinItemOnClick, screenState = viewState.screenState, editSortInfo = ::editSortingInfo, sortInfoState = sortInfoState, @@ -128,6 +130,6 @@ fun CoinListScreen( fun CoinListScreenPreview() { KryptoTheme { - CoinListScreen() + CoinListScreen({}) } } \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt index f06da54..c25eb55 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -25,6 +25,7 @@ import timber.log.Timber @Composable fun CoinListScreenSuccess( + coinItemOnClick : (String) -> Unit, screenState : ScreenState, editSortInfo : (SortCoinBy) -> Unit, sortInfoState : SortInfo, @@ -98,7 +99,7 @@ fun CoinListScreenSuccess( items = coins, key = { it.id } ){ coin -> - CoinItem(onClick = {}, coin = coin) + CoinItem(onClick = coinItemOnClick, coin = coin) Spacer(modifier = Modifier.height(24.dp)) } } @@ -117,6 +118,7 @@ fun CoinListSuccessScreenPreview(){ ) { CoinListScreenSuccess( + coinItemOnClick = {}, screenState = ScreenState.SUCCESS, editSortInfo = {}, sortInfoState = DEFAULT_SORT_INFO, diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinItem.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinItem.kt index ea455d0..23f408f 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinItem.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinItem.kt @@ -29,7 +29,7 @@ import com.ryankoech.krypto.feature_coin_list.presentation.theme.black200 @Composable fun CoinItem( - onClick : () -> Unit, + onClick : (String) -> Unit, coin: Coin, modifier: Modifier = Modifier ) { @@ -45,7 +45,7 @@ fun CoinItem( shape = RoundedCornerShape(10.dp) ) .clickable { - onClick() + onClick(coin.id) }, ) { CoinImage(coin.image, coin.id) From 576eab6fe2e3ddbdf5e7e96d1e1410682e49e9e8 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 13:22:26 +0300 Subject: [PATCH 62/78] add logic to get coin from db --- .../feature_coin_list/data/data_source/local/db/CoinDao.kt | 3 +++ .../feature_coin_list/data/repository/CoinRepositoryImpl.kt | 3 +++ .../data/repository/FakeCoinRepositoryImpl.kt | 2 ++ .../feature_coin_list/domain/repository/CoinRepository.kt | 2 ++ 4 files changed, 10 insertions(+) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDao.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDao.kt index f316a1a..f4cac38 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDao.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDao.kt @@ -15,4 +15,7 @@ interface CoinDao { @Query("SELECT * FROM $TANLENAME_COIN_DTO") suspend fun getCoins() : List + @Query("SELECT * FROM $TANLENAME_COIN_DTO WHERE id = :coinId") + suspend fun getCoin(coinId : String) : CoinLocalDto + } \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt index a0a4983..1536968 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/CoinRepositoryImpl.kt @@ -21,4 +21,7 @@ class CoinRepositoryImpl @Inject constructor( dao.insertCoins(coins) } + override suspend fun getCoin(coinId: String): CoinLocalDto = dao.getCoin(coinId) + + } \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt index 4660107..fd41d1f 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/data/repository/FakeCoinRepositoryImpl.kt @@ -222,4 +222,6 @@ class FakeCoinRepositoryImpl @Inject constructor() : CoinRepository { override suspend fun saveCoins(coins: List) { Timber.d("Saved Coins Successfully") } + + override suspend fun getCoin(coinId: String): CoinLocalDto = FAKE_COIN_LIST.toLocalCoinDto().first() } \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt index d196128..7f61d12 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/repository/CoinRepository.kt @@ -11,4 +11,6 @@ interface CoinRepository { suspend fun getLocalCoins() : List suspend fun saveCoins(coins : List) + + suspend fun getCoin(coinId : String) : CoinLocalDto } \ No newline at end of file From 65351e7c1d0feb0cdf15c446be2b4e0d92bce43e Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 13:40:28 +0300 Subject: [PATCH 63/78] update name to use real repository --- .../krypto/feature_coin_list/core/di/CoinRepositoryModule.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinRepositoryModule.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinRepositoryModule.kt index 3a981e8..1f2e6f7 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinRepositoryModule.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/core/di/CoinRepositoryModule.kt @@ -12,7 +12,7 @@ import javax.inject.Singleton const val HILT_NAMED_REPO_FAKE = "FakeRepo" const val HILT_NAMED_REPO = "Repo" -const val HILT_NAME_REPO_FOR_ALL = HILT_NAMED_REPO_FAKE +const val HILT_NAME_REPO_FOR_ALL = HILT_NAMED_REPO @Module @InstallIn(SingletonComponent::class) From a5adad33f67db82931efa8cf5e7887d4bee668a2 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 13:41:12 +0300 Subject: [PATCH 64/78] update theme font size --- .../java/com/ryankoech/krypto/common/presentation/theme/Type.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/ryankoech/krypto/common/presentation/theme/Type.kt b/common/src/main/java/com/ryankoech/krypto/common/presentation/theme/Type.kt index defd285..4d10722 100644 --- a/common/src/main/java/com/ryankoech/krypto/common/presentation/theme/Type.kt +++ b/common/src/main/java/com/ryankoech/krypto/common/presentation/theme/Type.kt @@ -42,7 +42,7 @@ val Typography = Typography( caption = TextStyle( fontFamily = CircularStd, fontWeight = FontWeight.Medium, - fontSize = 12.sp, + fontSize = 14.sp, ), button = TextStyle( fontFamily = CircularStd, From 20309dc50e9d02df695ffffdd4124db4a6a0a6ac Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 18:27:34 +0300 Subject: [PATCH 65/78] refactor varaible into companion object --- .../presentation/CoinListScreenSuccess.kt | 2 +- .../presentation/components/success/SearchTag.kt | 2 +- .../viewmodel/CoinListScreenViewModel.kt | 13 ++++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt index c25eb55..61702b8 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -20,7 +20,7 @@ import com.ryankoech.krypto.feature_coin_list.presentation.components.success.Co import com.ryankoech.krypto.feature_coin_list.presentation.components.success.CoinListLoading import com.ryankoech.krypto.feature_coin_list.presentation.components.success.NoCoinsFound import com.ryankoech.krypto.feature_coin_list.presentation.components.success.SearchTag -import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.DEFAULT_SORT_INFO +import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel.Companion.DEFAULT_SORT_INFO import timber.log.Timber @Composable diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt index e73a7e0..ef6191e 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/SearchTag.kt @@ -19,7 +19,7 @@ import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.presentation.theme.black100 import com.ryankoech.krypto.feature_coin_list.presentation.theme.limeGreenYellow400 -import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.DEFAULT_SORT_INFO +import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel.Companion.DEFAULT_SORT_INFO @Composable fun SearchTag( diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt index a64b7a1..e4a6735 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt @@ -17,17 +17,20 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import javax.inject.Inject -val DEFAULT_SORT_INFO = SortInfo( - sortBy = SortCoinBy.MARKET_CAP, - order = Order.DESC -) - @HiltViewModel class CoinListScreenViewModel @Inject constructor( private val getCoinsUseCase: GetCoinsUseCase, private val getLocalCoinsUseCase : GetLocalCoinsUseCase ) : ViewModel() { + companion object{ + + val DEFAULT_SORT_INFO = SortInfo( + sortBy = SortCoinBy.MARKET_CAP, + order = Order.DESC + ) + } + private val _viewState = mutableStateOf(CoinListScreenviewState()) val viewState : State = _viewState From 53f9e0b60d16cd57b9f3bb761effe2330349ab0a Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 18:33:36 +0300 Subject: [PATCH 66/78] cleaned up code --- .../domain/usecase/GetCoinsUseCaseTest.kt | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt index 8cfcb38..a3e3576 100644 --- a/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt +++ b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt @@ -6,33 +6,27 @@ import com.ryankoech.krypto.common.core.util.Resource import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST import com.ryankoech.krypto.feature_coin_list.data.repository.FakeCoinRepositoryImpl +import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel.Companion.DEFAULT_SORT_INFO import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository import io.mockk.coEvery import io.mockk.mockk import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest -import org.junit.After -import org.junit.Before import org.junit.Test import retrofit2.Response @ExperimentalCoroutinesApi class GetCoinsUseCaseTest { - @Before - fun setUp() { - } - - @After - fun tearDown() { - } + private lateinit var repository: CoinRepository + private lateinit var getCoinsUseCase: GetCoinsUseCase @Test fun `response successful, return Resource type Success with data`() = runTest { - val getCoinsUseCase = GetCoinsUseCase(FakeCoinRepositoryImpl()) + getCoinsUseCase = GetCoinsUseCase(FakeCoinRepositoryImpl()) - getCoinsUseCase().test { + getCoinsUseCase(DEFAULT_SORT_INFO).test { awaitItem() val resource = awaitItem() @@ -45,9 +39,9 @@ class GetCoinsUseCaseTest { @Test fun `call flow onStart, return Resource type Loading`() = runTest{ - val getCoinsUseCase = GetCoinsUseCase(FakeCoinRepositoryImpl()) + getCoinsUseCase = GetCoinsUseCase(FakeCoinRepositoryImpl()) - getCoinsUseCase().test { + getCoinsUseCase(DEFAULT_SORT_INFO).test { assertThat(awaitItem()).isInstanceOf(Resource.Loading::class.java) awaitItem() @@ -58,11 +52,11 @@ class GetCoinsUseCaseTest { @Test fun `repository return null data, return Resource type Error`() = runTest { - val repository = mockk() + repository = mockk() coEvery { repository.getCoins() } returns Response.success(null) - val getCoinsUseCase = GetCoinsUseCase(repository) + getCoinsUseCase = GetCoinsUseCase(repository) - getCoinsUseCase().test { + getCoinsUseCase(DEFAULT_SORT_INFO).test { awaitItem() assertThat(awaitItem()).isInstanceOf(Resource.Error::class.java) @@ -73,11 +67,11 @@ class GetCoinsUseCaseTest { @Test fun `repository return empty list, return Resource type Error`() = runTest { - val repository = mockk() + repository = mockk() coEvery { repository.getCoins() } returns Response.success(listOf()) - val getCoinsUseCase = GetCoinsUseCase(repository) + getCoinsUseCase = GetCoinsUseCase(repository) - getCoinsUseCase().test { + getCoinsUseCase(DEFAULT_SORT_INFO).test { awaitItem() assertThat(awaitItem()).isInstanceOf(Resource.Error::class.java) @@ -89,11 +83,11 @@ class GetCoinsUseCaseTest { @Test fun `repository throws exception, return Resource type Error`() = runTest { val exceptionMessage = "Mock Exception Message" - val repository = mockk() + repository = mockk() coEvery { repository.getCoins() } throws Exception(exceptionMessage) - val getCoinsUseCase = GetCoinsUseCase(repository) + getCoinsUseCase = GetCoinsUseCase(repository) - getCoinsUseCase().test { + getCoinsUseCase(DEFAULT_SORT_INFO).test { awaitItem() val resource = awaitItem() From 0b11c5673597a3f0c1cb5f9df222cfd06bc0142e Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 19:48:29 +0300 Subject: [PATCH 67/78] moved logic to handle remote failure to usecase --- .../domain/usecase/GetCoinsUseCase.kt | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt index f49472f..e54e6ca 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -26,7 +26,7 @@ class GetCoinsUseCase @Inject constructor( // Basic Cache private var cacheCoin : List? = null - operator fun invoke(sortInfo: SortInfo, filterString : String = "") = flow { + operator fun invoke(sortInfo: SortInfo, filterString : String = "") = flow>> { val response : Response> = if(cacheCoin.isNullOrEmpty()) { val response = repository.getCoins() @@ -49,59 +49,73 @@ class GetCoinsUseCase @Inject constructor( } if(response.isSuccessful && !response.body().isNullOrEmpty()){ - val filteredCoins = response.body()!!.toCoinEntity().filter { - it.name.contains( - filterString, - true - ) || it.symbol.contains( - filterString, - true - ) - } - val sortedData = sortData(sortInfo, filteredCoins) - emit(Resource.Success(data = sortedData)) + val processedCoins = response.body()!!.toCoinEntity().processCoins(filterString, sortInfo) + emit(Resource.Success(processedCoins)) }else{ - emit(Resource.Error("Response not Successful.")) + throw Exception("Response not Successful.") } }.onStart { emit(Resource.Loading()) }.catch { e -> Timber.e(e) - emit(Resource.Error(e.localizedMessage ?: "Unexpected Error Occurred.")) + try{ + val coins = repository.getLocalCoins().toCoinEntity() + if(coins.isEmpty()){ + emit(Resource.Error(e.localizedMessage ?: "Unexpected Error Occurred.")) + }else { + val processedCoins = coins.processCoins(filterString, sortInfo) + emit(Resource.Success(processedCoins)) + } + }catch(e : Throwable) { + Timber.e(e) + emit(Resource.Error(e.localizedMessage ?: "Unexpected Error Occurred.")) + } } - private fun sortData(sortInfo: SortInfo, unsortedData : List) : List { + private fun List.sortData(sortInfo: SortInfo) : List { return when(sortInfo.sortBy){ SortCoinBy.MARKET_CAP -> { when(sortInfo.order){ Order.ASC -> { - unsortedData.sortedBy { it.marketCap } + sortedBy { it.marketCap } } Order.DESC -> { - unsortedData.sortedByDescending { it.marketCap } + sortedByDescending { it.marketCap } } } } SortCoinBy.TOTAL_VOLUME -> { when(sortInfo.order){ Order.ASC -> { - unsortedData.sortedBy { it.totalVolume } + sortedBy { it.totalVolume } } Order.DESC -> { - unsortedData.sortedByDescending { it.totalVolume } + sortedByDescending { it.totalVolume } } } } SortCoinBy.PRICE -> { when(sortInfo.order){ Order.ASC -> { - unsortedData.sortedBy { it.price } + sortedBy { it.price } } Order.DESC -> { - unsortedData.sortedByDescending { it.price} + sortedByDescending { it.price} } } } } } + + private fun List.processCoins(filterString: String, sortInfo: SortInfo) : List = + filter { + it.name.contains( + filterString, + true + ) || it.symbol.contains( + filterString, + true + ) + }.sortData(sortInfo) + } \ No newline at end of file From c59f4a0379631673192f21231b0c343a4cfeffa5 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 19:48:56 +0300 Subject: [PATCH 68/78] implement tests --- .../domain/usecase/GetCoinsUseCaseTest.kt | 82 +++++++++++++++++-- 1 file changed, 75 insertions(+), 7 deletions(-) diff --git a/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt index a3e3576..8d84e15 100644 --- a/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt +++ b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt @@ -4,6 +4,7 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import com.ryankoech.krypto.common.core.util.Resource import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity +import com.ryankoech.krypto.feature_coin_list.data.dto.toLocalCoinDto import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST import com.ryankoech.krypto.feature_coin_list.data.repository.FakeCoinRepositoryImpl import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel.Companion.DEFAULT_SORT_INFO @@ -12,6 +13,7 @@ import io.mockk.coEvery import io.mockk.mockk import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest +import okhttp3.ResponseBody import org.junit.Test import retrofit2.Response @@ -21,9 +23,10 @@ class GetCoinsUseCaseTest { private lateinit var repository: CoinRepository private lateinit var getCoinsUseCase: GetCoinsUseCase + private val exceptionMessage = "Mock Exception Message" @Test - fun `response successful, return Resource type Success with data`() = runTest { + fun `remote response successful, return Resource type Success with data`() = runTest { getCoinsUseCase = GetCoinsUseCase(FakeCoinRepositoryImpl()) getCoinsUseCase(DEFAULT_SORT_INFO).test { @@ -37,6 +40,27 @@ class GetCoinsUseCaseTest { } } + @Test + fun `remote response unsuccessful local successful, return Resource type Success with data`() = runTest { + repository = mockk() + val responseBody = mockk( + relaxed = true + ) + coEvery { repository.getCoins() } returns Response.error(400, responseBody) + coEvery { repository.getLocalCoins() } returns FAKE_COIN_LIST.toLocalCoinDto() + getCoinsUseCase = GetCoinsUseCase(repository) + + getCoinsUseCase(DEFAULT_SORT_INFO).test { + + awaitItem() + val resource = awaitItem() + assertThat(resource).isInstanceOf(Resource.Success::class.java) + assertThat(resource.data).isEqualTo(FAKE_COIN_LIST.toCoinEntity()) + awaitComplete() + + } + } + @Test fun `call flow onStart, return Resource type Loading`() = runTest{ getCoinsUseCase = GetCoinsUseCase(FakeCoinRepositoryImpl()) @@ -51,40 +75,67 @@ class GetCoinsUseCaseTest { } @Test - fun `repository return null data, return Resource type Error`() = runTest { + fun `remote return null data local return list, return Resource type Success with data`() = runTest { repository = mockk() coEvery { repository.getCoins() } returns Response.success(null) + coEvery { repository.getLocalCoins() } returns FAKE_COIN_LIST.toLocalCoinDto() getCoinsUseCase = GetCoinsUseCase(repository) getCoinsUseCase(DEFAULT_SORT_INFO).test { awaitItem() - assertThat(awaitItem()).isInstanceOf(Resource.Error::class.java) + val resource = awaitItem() + assertThat(resource).isInstanceOf(Resource.Success::class.java) + assertThat(resource.data).isEqualTo(FAKE_COIN_LIST.toCoinEntity()) awaitComplete() } } @Test - fun `repository return empty list, return Resource type Error`() = runTest { + fun `remote return empty list local return list, return Resource type Success with data`() = runTest { repository = mockk() coEvery { repository.getCoins() } returns Response.success(listOf()) + coEvery { repository.getLocalCoins() } returns FAKE_COIN_LIST.toLocalCoinDto() getCoinsUseCase = GetCoinsUseCase(repository) getCoinsUseCase(DEFAULT_SORT_INFO).test { awaitItem() - assertThat(awaitItem()).isInstanceOf(Resource.Error::class.java) + val resource = awaitItem() + assertThat(resource).isInstanceOf(Resource.Success::class.java) + assertThat(resource.data).isEqualTo(FAKE_COIN_LIST.toCoinEntity()) awaitComplete() } } @Test - fun `repository throws exception, return Resource type Error`() = runTest { - val exceptionMessage = "Mock Exception Message" + fun `remote throws exception list local return list, return Resource type Success with data`() = runTest { repository = mockk() coEvery { repository.getCoins() } throws Exception(exceptionMessage) + coEvery { repository.getLocalCoins() } returns FAKE_COIN_LIST.toLocalCoinDto() + getCoinsUseCase = GetCoinsUseCase(repository) + + getCoinsUseCase(DEFAULT_SORT_INFO).test { + + awaitItem() + val resource = awaitItem() + assertThat(resource).isInstanceOf(Resource.Success::class.java) + assertThat(resource.data).isEqualTo(FAKE_COIN_LIST.toCoinEntity()) + awaitComplete() + + } + } + + @Test + fun `remote unsuccessful local throw Exception, return Resource type Error`() = runTest { + repository = mockk() + val responseBody = mockk( + relaxed = true + ) + coEvery { repository.getCoins() } returns Response.error(400, responseBody) + coEvery { repository.getLocalCoins() } throws Exception(exceptionMessage) getCoinsUseCase = GetCoinsUseCase(repository) getCoinsUseCase(DEFAULT_SORT_INFO).test { @@ -98,4 +149,21 @@ class GetCoinsUseCaseTest { } } + @Test + fun `remote unsuccessful local return empty list, return Resource type Error`() = runTest { + repository = mockk() + coEvery { repository.getCoins() } throws Exception(exceptionMessage) + coEvery { repository.getLocalCoins() } returns listOf() + getCoinsUseCase = GetCoinsUseCase(repository) + + getCoinsUseCase(DEFAULT_SORT_INFO).test { + + awaitItem() + val resource = awaitItem() + assertThat(resource).isInstanceOf(Resource.Error::class.java) + assertThat(resource.message).isEqualTo(exceptionMessage) + awaitComplete() + + } + } } \ No newline at end of file From 7491ba682708aa9336d6270d6d80b755ced10e3a Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 19:49:26 +0300 Subject: [PATCH 69/78] refactored usecase deletion --- .../domain/usecase/GetLocalCoinsUseCase.kt | 29 ------------ .../viewmodel/CoinListScreenViewModel.kt | 44 ++----------------- 2 files changed, 3 insertions(+), 70 deletions(-) delete mode 100644 feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetLocalCoinsUseCase.kt diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetLocalCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetLocalCoinsUseCase.kt deleted file mode 100644 index 83f361a..0000000 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetLocalCoinsUseCase.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.ryankoech.krypto.feature_coin_list.domain.usecase - -import com.ryankoech.krypto.common.core.util.Resource -import com.ryankoech.krypto.feature_coin_list.core.di.HILT_NAMED_REPO -import com.ryankoech.krypto.feature_coin_list.core.di.HILT_NAME_REPO_FOR_ALL -import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity -import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin -import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.onStart -import timber.log.Timber -import javax.inject.Inject -import javax.inject.Named - -class GetLocalCoinsUseCase @Inject constructor( - @Named(HILT_NAME_REPO_FOR_ALL) private val repository: CoinRepository, -) { - - operator fun invoke() = flow>> { - emit(Resource.Success(repository.getLocalCoins().toCoinEntity())) - }.onStart { - emit(Resource.Loading()) - }.catch { e -> - Timber.e(e) - emit(Resource.Error(e.localizedMessage ?: "An unexpected error occurred.")) - } - -} \ No newline at end of file diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt index e4a6735..d79b462 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/viewmodel/CoinListScreenViewModel.kt @@ -10,7 +10,6 @@ import com.ryankoech.krypto.feature_coin_list.domain.entity.Order import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.domain.usecase.GetCoinsUseCase -import com.ryankoech.krypto.feature_coin_list.domain.usecase.GetLocalCoinsUseCase import com.ryankoech.krypto.feature_coin_list.presentation.viewstate.CoinListScreenviewState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.launchIn @@ -20,7 +19,6 @@ import javax.inject.Inject @HiltViewModel class CoinListScreenViewModel @Inject constructor( private val getCoinsUseCase: GetCoinsUseCase, - private val getLocalCoinsUseCase : GetLocalCoinsUseCase ) : ViewModel() { companion object{ @@ -44,7 +42,9 @@ class CoinListScreenViewModel @Inject constructor( .onEach { res -> when(res){ is Resource.Error -> { - getLocalCoins() + _viewState.value = _viewState.value.copy( + screenState = ScreenState.ERROR + ) } is Resource.Loading -> { _viewState.value = _viewState.value.copy( @@ -68,42 +68,4 @@ class CoinListScreenViewModel @Inject constructor( } - - private fun getLocalCoins() { - - getLocalCoinsUseCase() - .onEach { res -> - when(res) { - is Resource.Error -> { - _viewState.value = _viewState.value.copy( - screenState = ScreenState.ERROR - ) - } - is Resource.Loading -> { - _viewState.value = _viewState.value.copy( - screenState = ScreenState.LOADING - ) - } - is Resource.Success -> { - if(res.data.isNullOrEmpty()){ - _viewState.value = _viewState.value.copy( - screenState = ScreenState.ERROR - ) - }else{ - _viewState.value = _viewState.value.copy( - screenState = ScreenState.SUCCESS, - coins = res.data!! - ) - } - } - else -> { - _viewState.value = _viewState.value.copy( - screenState = ScreenState.ERROR - ) - } - } - }.launchIn(viewModelScope) - - } - } \ No newline at end of file From cef4cc26a80924deb635a1fefa98415a66492671 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 20:00:27 +0300 Subject: [PATCH 70/78] android test truth dependency --- feature_coin_list/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/feature_coin_list/build.gradle b/feature_coin_list/build.gradle index f0a1c7e..de4f685 100644 --- a/feature_coin_list/build.gradle +++ b/feature_coin_list/build.gradle @@ -102,4 +102,7 @@ dependencies { androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version" + + // google truth + androidTestImplementation "com.google.truth:truth:$google_truth_version" } \ No newline at end of file From dae494c1c3ae2d8d3808a18572ebd4eb6bfa75f3 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Thu, 12 Jan 2023 20:00:49 +0300 Subject: [PATCH 71/78] implement dao tests --- .../data/data_source/local/db/CoinDaoTest.kt | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDaoTest.kt diff --git a/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDaoTest.kt b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDaoTest.kt new file mode 100644 index 0000000..10b2b24 --- /dev/null +++ b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/data/data_source/local/db/CoinDaoTest.kt @@ -0,0 +1,66 @@ +package com.ryankoech.krypto.feature_coin_list.data.data_source.local.db + +import android.content.Context +import androidx.room.Room +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import com.ryankoech.krypto.feature_coin_list.data.dto.toLocalCoinDto +import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@ExperimentalCoroutinesApi +@RunWith(AndroidJUnit4::class) +class CoinDaoTest { + + + private lateinit var database: CoinDatabase + private lateinit var dao : CoinDao + + @Before + fun setUp() { + database = Room.inMemoryDatabaseBuilder( + ApplicationProvider.getApplicationContext().applicationContext, + CoinDatabase::class.java + ) + .allowMainThreadQueries() + .build() + dao = database.getCoinDao() + } + + @After + fun tearDown() { + database.close() + } + + @Test + fun insert_into_and_fetch_list_from_Db__both_lists_equal() = runTest{ + + dao.insertCoins(FAKE_COIN_LIST.toLocalCoinDto()) + + runBlocking{ + val listOfCoins = dao.getCoins() + assertThat(listOfCoins).isEqualTo(FAKE_COIN_LIST.toLocalCoinDto()) + } + } + + + @Test + fun insert_into_and_fetch_from_Db__contain_element_in_list() = runTest{ + + dao.insertCoins(FAKE_COIN_LIST.toLocalCoinDto()) + + runBlocking{ + val coin = dao.getCoin(FAKE_COIN_LIST.toLocalCoinDto().first().id) + assertThat(coin).isEqualTo(FAKE_COIN_LIST.toLocalCoinDto().first()) + } + } + + +} \ No newline at end of file From 2fa1963c355a09a32bdeb10b8dc6bf7017655c8b Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Fri, 13 Jan 2023 12:09:23 +0300 Subject: [PATCH 72/78] add test tags --- .../presentation/CoinListScreen.kt | 9 ++++++++- .../presentation/CoinListScreenError.kt | 4 +++- .../presentation/CoinListScreenSuccess.kt | 13 ++++++++----- .../components/success/CoinListLoading.kt | 2 ++ 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt index e4cc1fb..fbc2501 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import com.ryankoech.krypto.common.presentation.theme.KryptoTheme @@ -95,7 +96,11 @@ fun CoinListScreen( ) { if(viewState.screenState == ScreenState.ERROR) { - CoinListScreenError(onButtonClick = { viewModel.getCoins(sortInfoState, filterStringState) }) + CoinListScreenError( + modifier = Modifier + .testTag(TEST_TAG_COIN_LIST_SCREEN_ERROR), + onButtonClick = { viewModel.getCoins(sortInfoState, filterStringState) } + ) }else { Box( @@ -104,6 +109,8 @@ fun CoinListScreen( ){ CoinListScreenSuccess( + modifier = Modifier + .testTag(TEST_TAG_COIN_LIST_SCREEN_SUCCESS), coinItemOnClick = coinItemOnClick, screenState = viewState.screenState, editSortInfo = ::editSortingInfo, diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenError.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenError.kt index 6e86a66..f43787e 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenError.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenError.kt @@ -8,13 +8,15 @@ import com.ryankoech.krypto.common.presentation.ErrorScreen import com.ryankoech.krypto.common.R import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +const val TEST_TAG_COIN_LIST_SCREEN_ERROR = "test tag coin list screen error" + @Composable fun CoinListScreenError( onButtonClick: () -> Unit, modifier: Modifier = Modifier, ){ - ErrorScreen(onButtonClick = onButtonClick, messageText = "Hmm, can't seem to find any coins", buttonText = "Try Again", res = R.drawable.icon_gif_caution) + ErrorScreen(modifier = modifier, onButtonClick = onButtonClick, messageText = "Hmm, can't seem to find any coins", buttonText = "Try Again", res = R.drawable.icon_gif_caution) } diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt index 61702b8..42ae98b 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material.Surface import androidx.compose.runtime.* import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.ryankoech.krypto.common.presentation.components.SearchBar @@ -16,13 +17,12 @@ import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo -import com.ryankoech.krypto.feature_coin_list.presentation.components.success.CoinItem -import com.ryankoech.krypto.feature_coin_list.presentation.components.success.CoinListLoading -import com.ryankoech.krypto.feature_coin_list.presentation.components.success.NoCoinsFound -import com.ryankoech.krypto.feature_coin_list.presentation.components.success.SearchTag +import com.ryankoech.krypto.feature_coin_list.presentation.components.success.* import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel.Companion.DEFAULT_SORT_INFO import timber.log.Timber +const val TEST_TAG_COIN_LIST_SCREEN_SUCCESS = "test tag coin list screen success" + @Composable fun CoinListScreenSuccess( coinItemOnClick : (String) -> Unit, @@ -81,7 +81,10 @@ fun CoinListScreenSuccess( } if(screenState == ScreenState.LOADING) { - CoinListLoading() + CoinListLoading( + modifier = Modifier + .testTag(TEST_TAG_COIN_LIST_LOADING) + ) } else { if( coins.isEmpty() ) { diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinListLoading.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinListLoading.kt index 70a73eb..fe2a4e3 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinListLoading.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/CoinListLoading.kt @@ -11,6 +11,8 @@ import com.ryankoech.krypto.common.presentation.components.loading.CoinCardLoadi import com.ryankoech.krypto.common.presentation.components.loading.loadingEffect import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +const val TEST_TAG_COIN_LIST_LOADING = "test tag coin list loading" + @Composable fun CoinListLoading( modifier: Modifier = Modifier From 812accd36210ead56552886d327d8416e0738dbc Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Fri, 13 Jan 2023 12:12:43 +0300 Subject: [PATCH 73/78] update dependencies --- feature_coin_list/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/feature_coin_list/build.gradle b/feature_coin_list/build.gradle index de4f685..39b5259 100644 --- a/feature_coin_list/build.gradle +++ b/feature_coin_list/build.gradle @@ -36,6 +36,9 @@ android { composeOptions { kotlinCompilerExtensionVersion compose_version } + packagingOptions { + resources.excludes.add("META-INF/*") + } } dependencies { @@ -105,4 +108,8 @@ dependencies { // google truth androidTestImplementation "com.google.truth:truth:$google_truth_version" + + // mockk + androidTestImplementation "io.mockk:mockk-android:$mockk_version" + androidTestImplementation "io.mockk:mockk-agent:$mockk_version" } \ No newline at end of file From b7b4275e55efd6b79de0edb77af4889d3db8e2a7 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Fri, 13 Jan 2023 12:18:47 +0300 Subject: [PATCH 74/78] implement tests --- .../feature_coin_list/core/util/Util.kt | 9 ++ .../presentation/CoinListScreenTest.kt | 101 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/core/util/Util.kt create mode 100644 feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenTest.kt diff --git a/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/core/util/Util.kt b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/core/util/Util.kt new file mode 100644 index 0000000..8452a2a --- /dev/null +++ b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/core/util/Util.kt @@ -0,0 +1,9 @@ +package com.ryankoech.krypto.feature_coin_list.core.util + +class Util { + + companion object { + const val MOCK_EXCEPTION_MESSAGE = "mock exception message" + } + +} \ No newline at end of file diff --git a/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenTest.kt b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenTest.kt new file mode 100644 index 0000000..7216cc9 --- /dev/null +++ b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenTest.kt @@ -0,0 +1,101 @@ +package com.ryankoech.krypto.feature_coin_list.presentation + +import androidx.activity.ComponentActivity +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithTag +import com.ryankoech.krypto.common.core.util.Resource +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +import com.ryankoech.krypto.feature_coin_list.core.util.Util.Companion.MOCK_EXCEPTION_MESSAGE +import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin +import com.ryankoech.krypto.feature_coin_list.domain.usecase.GetCoinsUseCase +import com.ryankoech.krypto.feature_coin_list.presentation.components.success.TEST_TAG_COIN_LIST_LOADING +import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel +import io.mockk.coEvery +import io.mockk.impl.annotations.MockK +import io.mockk.junit4.MockKRule +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow + +import org.junit.Rule +import org.junit.Test + +class CoinListScreenTest { + + + @get:Rule + val composeTestRule = createAndroidComposeRule() + + @get:Rule + val mockkRule = MockKRule(this) + + @MockK + private lateinit var getCoinsUseCase: GetCoinsUseCase + + private lateinit var coinFlow : Flow>> + + private lateinit var viewModel: CoinListScreenViewModel + + @Test + fun fetchCoinsError_displayErrorScreen() { + coinFlow = flow { + emit(Resource.Error(MOCK_EXCEPTION_MESSAGE)) + } + + coEvery { getCoinsUseCase(any()) } returns coinFlow + viewModel = CoinListScreenViewModel(getCoinsUseCase) + + composeTestRule.setContent { + KryptoTheme { + CoinListScreen( + coinItemOnClick = {}, + viewModel = viewModel + ) + } + } + + composeTestRule.onNodeWithTag(TEST_TAG_COIN_LIST_SCREEN_ERROR).assertIsDisplayed() + } + + @Test + fun fetchCoinsLoading_displayCoinListLoading() { + coinFlow = flow { + emit(Resource.Loading()) + } + + coEvery { getCoinsUseCase(any()) } returns coinFlow + viewModel = CoinListScreenViewModel(getCoinsUseCase) + + composeTestRule.setContent { + KryptoTheme { + CoinListScreen( + coinItemOnClick = {}, + viewModel = viewModel + ) + } + } + + composeTestRule.onNodeWithTag(TEST_TAG_COIN_LIST_LOADING).assertIsDisplayed() + } + + @Test + fun fetchCoinsSuccess_displayCoinListScreenSuccess() { + coinFlow = flow { + emit(Resource.Success(listOf())) + } + + coEvery { getCoinsUseCase(any()) } returns coinFlow + viewModel = CoinListScreenViewModel(getCoinsUseCase) + + composeTestRule.setContent { + KryptoTheme { + CoinListScreen( + coinItemOnClick = {}, + viewModel = viewModel + ) + } + } + + composeTestRule.onNodeWithTag(TEST_TAG_COIN_LIST_SCREEN_SUCCESS).assertIsDisplayed() + } +} \ No newline at end of file From 55c7628ca31140e3714991079674df7b0fda9fb9 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Fri, 13 Jan 2023 13:32:07 +0300 Subject: [PATCH 75/78] add test tags --- .../presentation/CoinListScreenSuccess.kt | 9 +++++++-- .../presentation/components/success/NoCoinsFound.kt | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt index 42ae98b..86e5bdc 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccess.kt @@ -22,6 +22,7 @@ import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScr import timber.log.Timber const val TEST_TAG_COIN_LIST_SCREEN_SUCCESS = "test tag coin list screen success" +const val TEST_TAG_COIN_LIST_SCREEN_SUCCESS_COINS_LAZY_COLUMN = "test tag coin list screen success coins lazy column" @Composable fun CoinListScreenSuccess( @@ -88,12 +89,16 @@ fun CoinListScreenSuccess( } else { if( coins.isEmpty() ) { - NoCoinsFound() + NoCoinsFound( + modifier = Modifier + .testTag(TEST_TAG_NO_COINS_FOUND) + ) }else { LazyColumn( modifier = Modifier - .weight(1f), + .weight(1f) + .testTag(TEST_TAG_COIN_LIST_SCREEN_SUCCESS_COINS_LAZY_COLUMN), contentPadding = PaddingValues( top = 12.dp, start = 12.dp, end = 12.dp ) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt index a3ac3fc..64fbe99 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/presentation/components/success/NoCoinsFound.kt @@ -9,6 +9,8 @@ import com.ryankoech.krypto.common.presentation.theme.KryptoTheme import com.ryankoech.krypto.common.R import com.ryankoech.krypto.common.presentation.ErrorScreen +const val TEST_TAG_NO_COINS_FOUND = "test tag no coins found" + @Composable fun NoCoinsFound( modifier: Modifier = Modifier, From 0126a0a0142e39b0d50aa77891c5319d2578787d Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Fri, 13 Jan 2023 13:32:28 +0300 Subject: [PATCH 76/78] implement tests --- .../presentation/CoinListScreenSuccessTest.kt | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccessTest.kt diff --git a/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccessTest.kt b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccessTest.kt new file mode 100644 index 0000000..82114aa --- /dev/null +++ b/feature_coin_list/src/androidTest/java/com/ryankoech/krypto/feature_coin_list/presentation/CoinListScreenSuccessTest.kt @@ -0,0 +1,66 @@ +package com.ryankoech.krypto.feature_coin_list.presentation + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import com.ryankoech.krypto.common.presentation.theme.KryptoTheme +import com.ryankoech.krypto.common.presentation.util.ScreenState +import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity +import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST +import com.ryankoech.krypto.feature_coin_list.domain.usecase.GetCoinsUseCase +import com.ryankoech.krypto.feature_coin_list.presentation.components.success.TEST_TAG_NO_COINS_FOUND +import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel +import org.junit.Assert.* +import org.junit.Rule +import org.junit.Test + +class CoinListScreenSuccessTest { + + @get:Rule + val composeTest = createComposeRule() + + @Test + fun receivesEmptyCoinList_displayNoCoinFallback() { + + composeTest.setContent { + KryptoTheme { + CoinListScreenSuccess( + coinItemOnClick = {}, + screenState = ScreenState.SUCCESS, + editSortInfo = {}, + sortInfoState = CoinListScreenViewModel.DEFAULT_SORT_INFO, + coins = listOf(), + filterStringState = "", + editFilterStringState = {} + ) + } + } + + composeTest.onNodeWithTag(TEST_TAG_NO_COINS_FOUND).assertIsDisplayed() + + } + + @Test + fun receivesCoinList_displayCoinsList() { + + composeTest.setContent { + KryptoTheme { + CoinListScreenSuccess( + coinItemOnClick = {}, + screenState = ScreenState.SUCCESS, + editSortInfo = {}, + sortInfoState = CoinListScreenViewModel.DEFAULT_SORT_INFO, + coins = FAKE_COIN_LIST.toCoinEntity(), + filterStringState = "", + editFilterStringState = {} + ) + } + } + + composeTest.onNodeWithTag(TEST_TAG_COIN_LIST_SCREEN_SUCCESS_COINS_LAZY_COLUMN).assertIsDisplayed() + composeTest.onNodeWithText(FAKE_COIN_LIST.toCoinEntity().first().name).assertIsDisplayed() + + } + +} \ No newline at end of file From 8015d7b37b189f83e7f0a27f5a5647405b6ecd8f Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Fri, 13 Jan 2023 13:36:30 +0300 Subject: [PATCH 77/78] implement sorting tests --- .../domain/usecase/GetCoinsUseCase.kt | 78 +++++----- .../domain/usecase/GetCoinsUseCaseTest.kt | 147 +++++++++++++++++- 2 files changed, 187 insertions(+), 38 deletions(-) diff --git a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt index e54e6ca..9e6c955 100644 --- a/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt +++ b/feature_coin_list/src/main/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCase.kt @@ -13,6 +13,7 @@ import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.onStart +import org.jetbrains.annotations.VisibleForTesting import retrofit2.Response import timber.log.Timber import java.util.* @@ -71,51 +72,54 @@ class GetCoinsUseCase @Inject constructor( emit(Resource.Error(e.localizedMessage ?: "Unexpected Error Occurred.")) } } - - private fun List.sortData(sortInfo: SortInfo) : List { - return when(sortInfo.sortBy){ - SortCoinBy.MARKET_CAP -> { - when(sortInfo.order){ - Order.ASC -> { - sortedBy { it.marketCap } - } - Order.DESC -> { - sortedByDescending { it.marketCap } + companion object{ + @VisibleForTesting + fun List.sortData(sortInfo: SortInfo): List { + return when (sortInfo.sortBy) { + SortCoinBy.MARKET_CAP -> { + when (sortInfo.order) { + Order.ASC -> { + sortedBy { it.marketCap } + } + Order.DESC -> { + sortedByDescending { it.marketCap } + } } } - } - SortCoinBy.TOTAL_VOLUME -> { - when(sortInfo.order){ - Order.ASC -> { - sortedBy { it.totalVolume } - } - Order.DESC -> { - sortedByDescending { it.totalVolume } + SortCoinBy.TOTAL_VOLUME -> { + when (sortInfo.order) { + Order.ASC -> { + sortedBy { it.totalVolume } + } + Order.DESC -> { + sortedByDescending { it.totalVolume } + } } } - } - SortCoinBy.PRICE -> { - when(sortInfo.order){ - Order.ASC -> { - sortedBy { it.price } - } - Order.DESC -> { - sortedByDescending { it.price} + SortCoinBy.PRICE -> { + when (sortInfo.order) { + Order.ASC -> { + sortedBy { it.price } + } + Order.DESC -> { + sortedByDescending { it.price } + } } } } } - } - private fun List.processCoins(filterString: String, sortInfo: SortInfo) : List = - filter { - it.name.contains( - filterString, - true - ) || it.symbol.contains( - filterString, - true - ) - }.sortData(sortInfo) + @VisibleForTesting + fun List.processCoins(filterString: String, sortInfo: SortInfo): List = + filter { + it.name.contains( + filterString, + true + ) || it.symbol.contains( + filterString, + true + ) + }.sortData(sortInfo) + } } \ No newline at end of file diff --git a/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt index 8d84e15..cf0e605 100644 --- a/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt +++ b/feature_coin_list/src/test/java/com/ryankoech/krypto/feature_coin_list/domain/usecase/GetCoinsUseCaseTest.kt @@ -7,13 +7,19 @@ import com.ryankoech.krypto.feature_coin_list.data.dto.toCoinEntity import com.ryankoech.krypto.feature_coin_list.data.dto.toLocalCoinDto import com.ryankoech.krypto.feature_coin_list.data.repository.FAKE_COIN_LIST import com.ryankoech.krypto.feature_coin_list.data.repository.FakeCoinRepositoryImpl +import com.ryankoech.krypto.feature_coin_list.domain.entity.Coin +import com.ryankoech.krypto.feature_coin_list.domain.entity.Order +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortCoinBy +import com.ryankoech.krypto.feature_coin_list.domain.entity.SortInfo import com.ryankoech.krypto.feature_coin_list.presentation.viewmodel.CoinListScreenViewModel.Companion.DEFAULT_SORT_INFO import com.ryankoech.krypto.feature_coin_list.domain.repository.CoinRepository +import com.ryankoech.krypto.feature_coin_list.domain.usecase.GetCoinsUseCase.Companion.sortData import io.mockk.coEvery import io.mockk.mockk import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import okhttp3.ResponseBody +import org.junit.Before import org.junit.Test import retrofit2.Response @@ -21,9 +27,60 @@ import retrofit2.Response @ExperimentalCoroutinesApi class GetCoinsUseCaseTest { + private val sortByPrice = "price" + private val sortByTotalVolume = "totalVolume" + private val sortByMarketCap = "marketCap" + private val rank1 = "#1" + private val rank3 = "#3" + private val exceptionMessage = "Mock Exception Message" private lateinit var repository: CoinRepository private lateinit var getCoinsUseCase: GetCoinsUseCase - private val exceptionMessage = "Mock Exception Message" + private lateinit var testCoinsList : List + + @Before + fun setUp() { + testCoinsList = listOf( + Coin( + id = "$sortByPrice$rank1,$sortByMarketCap$rank3", + name = "coin1", + marketCap = 0, + marketCapRank = 3, + symbol = "", + image = "", + change = 0f, + price = 3.0, + allTimeHigh = 0.0, + high24Hr = 0.0, + totalVolume = 2.0, + ), + Coin( + id = "$sortByTotalVolume$rank1", + name = "coin2", + marketCap = 0, + marketCapRank = 2, + symbol = "", + image = "", + change = 0f, + price = 2.0, + allTimeHigh = 0.0, + high24Hr = 0.0, + totalVolume = 3.0, + ), + Coin( + id = "$sortByPrice$rank3,$sortByTotalVolume$rank3,$sortByMarketCap$rank1", + name = "coin3", + marketCap = 0, + marketCapRank = 1, + symbol = "", + image = "", + change = 0f, + price = 1.0, + allTimeHigh = 0.0, + high24Hr = 0.0, + totalVolume = 1.0, + ) + ) + } @Test fun `remote response successful, return Resource type Success with data`() = runTest { @@ -166,4 +223,92 @@ class GetCoinsUseCaseTest { } } + + @Test + fun `coin list sorting function sort by market cap descending`() { + + testCoinsList.sortData( + SortInfo( + sortBy = SortCoinBy.MARKET_CAP, + order = Order.DESC + ) + ).apply { + this.first().id.contains("$sortByMarketCap$rank1") + this.last().id.contains("$sortByMarketCap$rank3") + } + } + + @Test + fun `coin list sorting function sort by market cap ascending`() { + + testCoinsList.sortData( + SortInfo( + sortBy = SortCoinBy.MARKET_CAP, + order = Order.ASC + ) + ).apply { + this.first().id.contains("$sortByMarketCap$rank3") + this.last().id.contains("$sortByMarketCap$rank1") + } + } + + + @Test + fun `coin list sorting function sort by price descending`() { + + testCoinsList.sortData( + SortInfo( + sortBy = SortCoinBy.PRICE, + order = Order.DESC + ) + ).apply { + this.first().id.contains("$sortByPrice$rank1") + this.last().id.contains("$sortByPrice$rank3") + } + } + + + @Test + fun `coin list sorting function sort by price ascending`() { + + testCoinsList.sortData( + SortInfo( + sortBy = SortCoinBy.PRICE, + order = Order.ASC + ) + ).apply { + this.first().id.contains("$sortByMarketCap$rank3") + this.last().id.contains("$sortByMarketCap$rank1") + } + } + + @Test + fun `coin list sorting function sort by total volume descending`() { + + testCoinsList.sortData( + SortInfo( + sortBy = SortCoinBy.TOTAL_VOLUME, + order = Order.DESC + ) + ).apply { + this.first().id.contains("$sortByTotalVolume$rank1") + this.last().id.contains("$sortByPrice$rank3") + } + } + + + @Test + fun `coin list sorting function sort by total volume ascending`() { + + testCoinsList.sortData( + SortInfo( + sortBy = SortCoinBy.TOTAL_VOLUME, + order = Order.ASC + ) + ).apply { + this.first().id.contains("$sortByTotalVolume$rank3") + this.last().id.contains("$sortByPrice$rank1") + } + } + } \ No newline at end of file From 78bbe90b9ad2a181cadf43d26be52befd2ac27d4 Mon Sep 17 00:00:00 2001 From: RyanKoech Date: Fri, 13 Jan 2023 13:36:48 +0300 Subject: [PATCH 78/78] added internet permission --- feature_coin_list/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature_coin_list/src/main/AndroidManifest.xml b/feature_coin_list/src/main/AndroidManifest.xml index a5918e6..ecebd57 100644 --- a/feature_coin_list/src/main/AndroidManifest.xml +++ b/feature_coin_list/src/main/AndroidManifest.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file