From 02dcf9af2d33d444ac3797071db43423346a22d4 Mon Sep 17 00:00:00 2001 From: arvifox Date: Wed, 21 Feb 2024 12:02:42 +0300 Subject: [PATCH 01/43] release soralution v3.8.3.1 137 --- app/build.gradle.kts | 8 ++++---- gradle/libs.versions.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fe7fa7b30..e77ed885d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,7 +19,7 @@ kotlin { jvmToolchain(11) } -// soralution 136 3.8.3.0 2024.02.20 +// soralution 137 3.8.3.1 2024.02.21 // sora dae 108 3.8.0.0 2023.12.04 android { @@ -30,8 +30,8 @@ android { applicationId = "jp.co.soramitsu.sora" minSdk = 26 targetSdk = 34 - versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 136 - versionName = "3.8.3.0" + versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 137 + versionName = "3.8.3.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true // resConfigs "en", "ru", "es", "fr", "de", "nb", "in", "tr", "ar" @@ -167,7 +167,7 @@ play { serviceAccountCredentials = file(System.getenv("CI_PLAY_KEY") ?: "../key/fake.json") track = "internal" releaseStatus = ReleaseStatus.DRAFT - releaseName = "3.8.3.0 - SORA Card Improvements" + releaseName = "3.8.3.1 - SORA Card Improvements" defaultToAppBundles = true } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0dee608d7..c213b662b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,7 +39,7 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.0.3" +soracard = "1.0.4" xnetworking = "0.2.9" xsubstrate = "1.1.4" uicore = "0.2.21" From 83656052e98712bdcf0926c300fcd955d6eec64d Mon Sep 17 00:00:00 2001 From: arvifox Date: Wed, 13 Mar 2024 10:01:16 +0300 Subject: [PATCH 02/43] scd-21 --- android-foundation | 2 +- app/src/main/AndroidManifest.xml | 5 ++ .../common/domain/OptionsProvider.kt | 4 +- .../jp/co/soramitsu/common/util/BuildUtils.kt | 3 +- .../NodeManagerImpl.kt | 1 - .../details/SoraCardDetailsFragment.kt | 55 ++++++++++++- .../details/SoraCardDetailsScreen.kt | 11 ++- .../details/SoraCardDetailsViewModel.kt | 24 ++++++ .../presentation/details/SoraCardIBANCard.kt | 2 +- .../details/SoraCardMainSoraContentCard.kt | 78 ++++++++++++------- .../presentation/cardshub/SoraCard.kt | 37 ++++++--- gradle/libs.versions.toml | 23 +++--- gradle/wrapper/gradle-wrapper.properties | 2 +- .../substrate/ExtrinsicBuilderFactory.kt | 2 +- 14 files changed, 188 insertions(+), 61 deletions(-) diff --git a/android-foundation b/android-foundation index 01a106d07..9e8db2045 160000 --- a/android-foundation +++ b/android-foundation @@ -1 +1 @@ -Subproject commit 01a106d0777a41baa713a1bfe5342f3b86c25c80 +Subproject commit 9e8db204523e6273d85a4eddad7734822369707d diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 997b33f0d..e9f09cfbd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,11 @@ + + + + + () { viewModel.telegramChat.observe { openSoraTelegramSupportChat(context) } + viewModel.fiatWallet.observe { + this@SoraCardDetailsFragment.context?.getIntentForPackage(it)?.let { intent -> + startActivity(intent) + } + } + viewModel.fiatWalletMarket.observe { + this.context?.openGooglePlay(it) + } } override fun NavGraphBuilder.content( @@ -98,7 +108,8 @@ class SoraCardDetailsFragment : SoraBaseFragment() { onRecentActivityClick = viewModel::onRecentActivityClick, onIbanCardShareClick = viewModel::onIbanCardShareClick, onIbanCardClick = viewModel::onIbanCardClick, - onSettingsOptionClick = viewModel::onSettingsOptionClick + onSettingsOptionClick = viewModel::onSettingsOptionClick, + onFiatWallet = { viewModel.onFiatWalletClick(this@SoraCardDetailsFragment.context) }, ) if (state.value.logoutDialog) { AlertDialog( @@ -142,6 +153,48 @@ class SoraCardDetailsFragment : SoraBaseFragment() { }, ) } + if (state.value.fiatWalletDialog) { + AlertDialog( + backgroundColor = MaterialTheme.customColors.bgSurfaceVariant, + onDismissRequest = viewModel::onFiatWalletDismiss, + buttons = { + Row( + Modifier + .fillMaxWidth() + .wrapContentHeight() + .padding(Dimens.x1), + horizontalArrangement = Arrangement.spacedBy(Dimens.x2), + ) { + TextButton( + modifier = Modifier.weight(1f), + size = Size.Small, + order = Order.TERTIARY, + text = stringResource(id = R.string.common_cancel), + onClick = viewModel::onFiatWalletDismiss, + ) + TextButton( + modifier = Modifier.weight(1f), + size = Size.Small, + order = Order.PRIMARY, + text = stringResource(id = R.string.common_ok), + onClick = viewModel::onOpenFiatWalletMarket, + ) + } + }, + title = { + Text( + color = MaterialTheme.customColors.fgPrimary, + text = stringResource(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_card_alert_title) + ) + }, + text = { + Text( + color = MaterialTheme.customColors.fgPrimary, + text = stringResource(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_google_play) + ) + }, + ) + } } } } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt index b546cb4ac..6fd4462a9 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt @@ -62,6 +62,7 @@ data class SoraCardDetailsScreenState( val soraCardIBANCardState: SoraCardIBANCardState? = null, val soraCardSettingsCard: SoraCardSettingsCardState? = null, val logoutDialog: Boolean, + val fiatWalletDialog: Boolean, ) @Composable @@ -76,7 +77,8 @@ fun SoraCardDetailsScreen( onShowMoreRecentActivitiesClick: () -> Unit, onIbanCardShareClick: () -> Unit, onIbanCardClick: () -> Unit, - onSettingsOptionClick: (position: Int) -> Unit + onSettingsOptionClick: (position: Int) -> Unit, + onFiatWallet: () -> Unit, ) { Column( modifier = Modifier @@ -91,7 +93,8 @@ fun SoraCardDetailsScreen( SoraCardMainSoraContentCard( soraCardMainSoraContentCardState = soraCardDetailsScreenState.soraCardMainSoraContentCardState, onShowMoreClick = onShowSoraCardDetailsClick, - onIconButtonClick = onSoraCardMenuActionClick + onIconButtonClick = onSoraCardMenuActionClick, + onFiatWallet = onFiatWallet, ) if (soraCardDetailsScreenState.soraCardReferralBannerCardState) { BasicBannerCard( @@ -163,6 +166,7 @@ private fun PreviewSoraCardDetailsScreen() { soraCardSettingsOptions = SoraCardSettingsOption.entries ), logoutDialog = false, + fiatWalletDialog = false, ), onShowSoraCardDetailsClick = {}, onSoraCardMenuActionClick = { _ -> }, @@ -172,7 +176,8 @@ private fun PreviewSoraCardDetailsScreen() { onRecentActivityClick = { _ -> }, onIbanCardShareClick = {}, onIbanCardClick = {}, - onSettingsOptionClick = { _ -> } + onSettingsOptionClick = { _ -> }, + onFiatWallet = {}, ) } } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index 1b55a8d61..e60c0a20d 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -32,15 +32,18 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_sora_card_impl.presentation.details +import android.content.Context import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.intent.isAppAvailableCompat import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.SingleLiveEvent import jp.co.soramitsu.common.presentation.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel +import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.oauth.base.sdk.contract.IbanInfo import jp.co.soramitsu.ui_core.component.toolbar.BasicToolbarState @@ -60,6 +63,8 @@ class SoraCardDetailsViewModel @Inject constructor( val shareLinkEvent: LiveData = _shareLinkEvent val telegramChat = SingleLiveEvent() + val fiatWallet = SingleLiveEvent() + val fiatWalletMarket = SingleLiveEvent() private var ibanCache: IbanInfo? = null @@ -73,6 +78,7 @@ class SoraCardDetailsViewModel @Inject constructor( soraCardSettingsOptions = SoraCardSettingsOption.entries, ), logoutDialog = false, + fiatWalletDialog = false, ) ) val soraCardDetailsScreenState = _soraCardDetailsScreenState.asStateFlow() @@ -141,6 +147,16 @@ class SoraCardDetailsViewModel @Inject constructor( } } + fun onFiatWalletClick(context: Context?) { + if (context == null) return + val fiat = BuildUtils.fiatPackageName() + if (context.isAppAvailableCompat(fiat)) { + fiatWallet.value = fiat + } else { + _soraCardDetailsScreenState.value = _soraCardDetailsScreenState.value.copy(fiatWalletDialog = true) + } + } + fun onSettingsOptionClick(position: Int) { val settings = soraCardDetailsScreenState.value.soraCardSettingsCard ?.soraCardSettingsOptions ?: return @@ -160,6 +176,14 @@ class SoraCardDetailsViewModel @Inject constructor( _soraCardDetailsScreenState.value.copy(logoutDialog = false) } + fun onFiatWalletDismiss() { + _soraCardDetailsScreenState.value = _soraCardDetailsScreenState.value.copy(fiatWalletDialog = false) + } + + fun onOpenFiatWalletMarket() { + fiatWalletMarket.value = BuildUtils.fiatPackageName() + } + fun onSoraCardLogOutClick() { viewModelScope.launch { tryCatch { diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt index ef2723cfb..093bd8035 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt @@ -115,7 +115,7 @@ fun SoraCardIBANCard( if (soraCardIBANCardState.active.not()) { Text( modifier = Modifier.fillMaxWidth().padding(all = Dimens.x1), - text = underlineSubstring(stringResource(id = jp.co.soramitsu.oauth.R.string.iban_suspended_description, ClientsFacade.TECH_SUPPORT), ClientsFacade.TECH_SUPPORT), + text = underlineSubstring(stringResource(id = jp.co.soramitsu.oauth.R.string.iban_frozen_description, ClientsFacade.TECH_SUPPORT), ClientsFacade.TECH_SUPPORT), style = MaterialTheme.customTypography.textS, color = MaterialTheme.customColors.fgSecondary, ) diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt index 4e9c56eae..fdc6eb342 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt @@ -35,7 +35,6 @@ package jp.co.soramitsu.feature_sora_card_impl.presentation.details import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentHeight @@ -52,6 +51,10 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.SoraCardImage import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text +import jp.co.soramitsu.ui_core.component.button.BleachedButton +import jp.co.soramitsu.ui_core.component.button.TonalButton +import jp.co.soramitsu.ui_core.component.button.properties.Order +import jp.co.soramitsu.ui_core.component.button.properties.Size import jp.co.soramitsu.ui_core.component.card.ContentCard import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors @@ -112,7 +115,8 @@ data class SoraCardMainSoraContentCardState( fun SoraCardMainSoraContentCard( soraCardMainSoraContentCardState: SoraCardMainSoraContentCardState, onShowMoreClick: () -> Unit, - onIconButtonClick: (Int) -> Unit + onIconButtonClick: (Int) -> Unit, + onFiatWallet: () -> Unit, ) { ContentCard( cornerRadius = Dimens.x4, @@ -143,28 +147,17 @@ fun SoraCardMainSoraContentCard( // text = stringResource(id = R.string.show_more), // onClick = onShowMoreClick, // ) - } - if (soraCardMainSoraContentCardState.balance != null) - Row( + BleachedButton( modifier = Modifier - .fillMaxWidth() - .padding( - horizontal = Dimens.x2 - ), - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text( - text = stringResource(id = R.string.more_menu_sora_card_title), - style = MaterialTheme.customTypography.headline2, - color = MaterialTheme.customColors.fgPrimary - ) - Text( - text = soraCardMainSoraContentCardState.balance, - style = MaterialTheme.customTypography.headline2, - color = MaterialTheme.customColors.fgPrimary - ) - } - else + .padding(end = Dimens.x1) + .align(Alignment.BottomEnd), + size = Size.ExtraSmall, + order = Order.SECONDARY, + text = soraCardMainSoraContentCardState.balance ?: "--", + onClick = {}, + ) + } + if (soraCardMainSoraContentCardState.balance == null) { Text( modifier = Modifier.fillMaxWidth(), text = stringResource(id = R.string.sora_card_details_card_management_coming_soon), @@ -172,15 +165,24 @@ fun SoraCardMainSoraContentCard( color = MaterialTheme.customColors.fgSecondary, textAlign = TextAlign.Center ) - IconButtonMenu( - iconButtonMenuStates = soraCardMainSoraContentCardState.menuState, - onButtonClick = onIconButtonClick - ) + IconButtonMenu( + iconButtonMenuStates = soraCardMainSoraContentCardState.menuState, + onButtonClick = onIconButtonClick + ) + } else { + TonalButton( + modifier = Modifier.padding(horizontal = Dimens.x1).fillMaxWidth(), + size = Size.Large, + order = Order.PRIMARY, + onClick = onFiatWallet, + text = stringResource(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_card), + ) + } } } } -@Preview(locale = "ru") +@Preview(locale = "en") @Composable private fun PreviewMainSoraContentCard() { SoraCardMainSoraContentCard( @@ -189,7 +191,8 @@ private fun PreviewMainSoraContentCard() { soraCardMenuActions = SoraCardMenuAction.entries ), onShowMoreClick = {}, - onIconButtonClick = { _ -> } + onIconButtonClick = { _ -> }, + onFiatWallet = {}, ) } @@ -202,6 +205,21 @@ private fun PreviewMainSoraContentCard2() { soraCardMenuActions = SoraCardMenuAction.entries ), onShowMoreClick = {}, - onIconButtonClick = { _ -> } + onIconButtonClick = { _ -> }, + onFiatWallet = {}, + ) +} + +@Preview(locale = "en") +@Composable +private fun PreviewMainSoraContentCard3() { + SoraCardMainSoraContentCard( + soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( + balance = null, + soraCardMenuActions = SoraCardMenuAction.entries + ), + onShowMoreClick = {}, + onIconButtonClick = { _ -> }, + onFiatWallet = {}, ) } diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt index 4e18d82ce..b3f1269ca 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt @@ -199,15 +199,14 @@ private fun CardStateButton( text = stringResource(R.string.get_sora_card_title), ) } else { - if (success.not()) - TonalButton( - modifier = modifier - .testTagAsId("SoraCardButton"), - size = Size.Large, - order = Order.TERTIARY, - onClick = onCardStateClicked, - text = kycStatus, - ) + TonalButton( + modifier = modifier + .testTagAsId("SoraCardButton"), + size = Size.Large, + order = Order.TERTIARY, + onClick = onCardStateClicked, + text = if (success) "--" else kycStatus, + ) } } @@ -311,3 +310,23 @@ private fun PreviewSoraCard4() { ) } } + +@Composable +@Preview(locale = "en", uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun PreviewSoraCard6() { + SoraAppTheme { + SoraCard( + modifier = Modifier.fillMaxWidth(), + state = SoraCardState( + kycStatus = null, + ibanBalance = IbanInfo(iban = "abcderr", active = true, balance = "45.5"), + loading = false, + success = false, + needUpdate = false, + ), + onCloseClicked = {}, + onCardStateClicked = {}, + onNeedUpdate = {}, + ) + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c213b662b..87b8057f2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.2.2" +agp = "8.3.0" kotlin = "1.9.22" appcompat = "1.6.1" coroutines = "1.7.3" @@ -28,7 +28,7 @@ activityCompose = "1.8.2" material = "1.11.0" fragmentKtx = "1.6.2" permission = "1.7.1" -compose = "1.6.1" +compose = "1.6.3" composeViewModel = "2.7.0" composeLifecycle = "2.7.0" composeConstraintLayout = "1.1.0-alpha05" @@ -39,17 +39,18 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.0.4" +soracard = "1.0.7" xnetworking = "0.2.9" -xsubstrate = "1.1.4" -uicore = "0.2.21" -xbackup = "1.1.4" -xcrypto = "1.1.4" +xsubstrate = "1.2.0" +uicore = "0.2.22" +xbackup = "1.2.0" +xcrypto = "1.2.0" ed = "2.0.1" xerces = "2.9.0" -dagger = "2.48" -hiltCompose = "1.1.0" -hiltWorkManager = "1.0.0" +dagger = "2.49" +daggerKapt = "2.49" +hiltCompose = "1.2.0" +hiltWorkManager = "1.2.0" webSocketLib = "2.14" web3j = "4.6.0-android" zXing = "3.3.3" @@ -80,7 +81,7 @@ coroutineDep = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", versi coroutineAndroidDep = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" } coroutineTestDep = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } daggerDep = { module = "com.google.dagger:hilt-android", version.ref = "dagger" } -daggerKaptDep = { module = "com.google.dagger:hilt-compiler", version.ref = "dagger" } +daggerKaptDep = { module = "com.google.dagger:hilt-compiler", version.ref = "daggerKapt" } hiltUiTestDep = { module = "com.google.dagger:hilt-android-testing", version.ref = "dagger" } hiltNavComposeDep = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltCompose" } hiltWorkManagerDep = { module = "androidx.hilt:hilt-work", version.ref = "hiltWorkManager" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 047e874db..dbb0a111f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Jan 13 13:13:48 MSK 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/ExtrinsicBuilderFactory.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/ExtrinsicBuilderFactory.kt index 6fde68101..0ab3e2725 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/ExtrinsicBuilderFactory.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/ExtrinsicBuilderFactory.kt @@ -105,7 +105,7 @@ class ExtrinsicBuilderFactory @Inject constructor( } private suspend fun genesisBytes(): ByteArray = - if (BuildUtils.isFlavors(Flavor.DEVELOP, Flavor.TESTING, Flavor.SORALUTION)) { + if (BuildUtils.isFlavors(Flavor.DEVELOP, Flavor.SORALUTION)) { val result = calls.getBlockHash() result.removeHexPrefix().fromHex() } else { From 9b4fb201c17f2f58326fc515ef47a77600bf2dab Mon Sep 17 00:00:00 2001 From: arvifox Date: Wed, 13 Mar 2024 15:19:23 +0300 Subject: [PATCH 03/43] sa-405 --- .../soramitsu/common/data/network/dto/SwapFeeDto.kt | 11 +++++++++++ .../java/jp/co/soramitsu/common/view/ViewHelper.kt | 2 +- .../repository/PolkaswapSubscriptionRepositoryImpl.kt | 6 +++--- .../presentation/get/card/GetSoraCardViewModelTest.kt | 1 - 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/jp/co/soramitsu/common/data/network/dto/SwapFeeDto.kt b/common/src/main/java/jp/co/soramitsu/common/data/network/dto/SwapFeeDto.kt index 396c1aa7f..939dc58d7 100644 --- a/common/src/main/java/jp/co/soramitsu/common/data/network/dto/SwapFeeDto.kt +++ b/common/src/main/java/jp/co/soramitsu/common/data/network/dto/SwapFeeDto.kt @@ -40,3 +40,14 @@ data class SwapFeeDto( val fee: BigInteger, val route: List? = null, ) : ParseModel() + +data class SwapFeeDtoV2( + val amount: BigInteger, + val fee: Map, + val route: List? = null, +) : ParseModel() + +data class SwapFeeDtoV3( + val amount: BigInteger, + val route: List? = null, +) : ParseModel() diff --git a/common/src/main/java/jp/co/soramitsu/common/view/ViewHelper.kt b/common/src/main/java/jp/co/soramitsu/common/view/ViewHelper.kt index 26bbf4052..c33866c68 100644 --- a/common/src/main/java/jp/co/soramitsu/common/view/ViewHelper.kt +++ b/common/src/main/java/jp/co/soramitsu/common/view/ViewHelper.kt @@ -33,5 +33,5 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.view object ViewHelper { - const val debounce = 700L + const val debounce = 900L } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt index 94ad9c532..f935cee2f 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt @@ -36,7 +36,7 @@ import androidx.room.withTransaction import java.math.BigDecimal import java.math.BigInteger import javax.inject.Inject -import jp.co.soramitsu.common.data.network.dto.SwapFeeDto +import jp.co.soramitsu.common.data.network.dto.SwapFeeDtoV3 import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.logger.FirebaseWrapper @@ -275,12 +275,12 @@ class PolkaswapSubscriptionRepositoryImpl @Inject constructor( marketMapper.mapMarketsToFilter(markets), ) ), - mapper = pojo(), + mapper = pojo(), ).result return response?.let { SwapQuote( mapBalance(it.amount, feeToken.precision), - mapBalance(it.fee, feeToken.precision), + BigDecimal.ZERO, it.route, ) } diff --git a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt index b68364bc7..2a4fb1f14 100644 --- a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt +++ b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt @@ -99,7 +99,6 @@ class GetSoraCardViewModelTest { @Mock private lateinit var resourceManager: ResourceManager - @Mock private lateinit var viewModel: GetSoraCardViewModel @Mock From c6d4907ca10636617bf2659768eb579805807e26 Mon Sep 17 00:00:00 2001 From: arvifox Date: Thu, 14 Mar 2024 12:26:54 +0300 Subject: [PATCH 04/43] sa-405 --- .../soramitsu/common/data/network/dto/SwapFeeDto.kt | 12 ------------ .../presentation/txhistory/TransactionBuilder.kt | 1 - .../presentation/txhistory/TransactionModel.kt | 1 - .../data/TransactionMapper.kt | 10 +++------- .../domain/TransactionBuilderImpl.kt | 2 -- .../testdata/TestTransactions.kt | 1 - .../domain/interfaces/SwapInteractor.kt | 1 - .../domain/model/SwapDetails.kt | 2 -- .../PolkaswapSubscriptionRepositoryImpl.kt | 5 ++--- .../domain/SwapInteractorImpl.kt | 3 --- .../components/compose/SwapMainScreen.kt | 8 -------- .../presentation/screens/swap/SwapViewModel.kt | 6 ------ .../presentation/states/SwapMainState.kt | 2 -- .../presentation/polkaswap/SwapViewModelTest.kt | 1 - 14 files changed, 5 insertions(+), 50 deletions(-) diff --git a/common/src/main/java/jp/co/soramitsu/common/data/network/dto/SwapFeeDto.kt b/common/src/main/java/jp/co/soramitsu/common/data/network/dto/SwapFeeDto.kt index 939dc58d7..34c116ae2 100644 --- a/common/src/main/java/jp/co/soramitsu/common/data/network/dto/SwapFeeDto.kt +++ b/common/src/main/java/jp/co/soramitsu/common/data/network/dto/SwapFeeDto.kt @@ -36,18 +36,6 @@ import java.math.BigInteger import jp.co.soramitsu.common.util.ParseModel data class SwapFeeDto( - val amount: BigInteger, - val fee: BigInteger, - val route: List? = null, -) : ParseModel() - -data class SwapFeeDtoV2( - val amount: BigInteger, - val fee: Map, - val route: List? = null, -) : ParseModel() - -data class SwapFeeDtoV3( val amount: BigInteger, val route: List? = null, ) : ParseModel() diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txhistory/TransactionBuilder.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txhistory/TransactionBuilder.kt index 6fab99570..cb394a905 100644 --- a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txhistory/TransactionBuilder.kt +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txhistory/TransactionBuilder.kt @@ -61,7 +61,6 @@ interface TransactionBuilder { amountFrom: BigDecimal, amountTo: BigDecimal, market: Market, - liquidityFee: BigDecimal, ): Transaction.Swap fun buildTransfer( diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txhistory/TransactionModel.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txhistory/TransactionModel.kt index a97a102e8..910657360 100644 --- a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txhistory/TransactionModel.kt +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txhistory/TransactionModel.kt @@ -117,7 +117,6 @@ sealed class Transaction( val amountFrom: BigDecimal, val amountTo: BigDecimal, val market: Market, - val lpFee: BigDecimal, ) : Transaction(base) class Liquidity( diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionMapper.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionMapper.kt index f3175ab45..6879db463 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionMapper.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionMapper.kt @@ -126,15 +126,14 @@ private fun mapHistoryItemToTransaction( ) } } else if (tx.isMatch(Pallete.LIQUIDITY_PROXY, Method.SWAP)) { - tx.data?.toSwap { selectedMarket, liquidityProviderFee, baseTokenId, targetTokenId, baseTokenAmount, targetTokenAmount -> + tx.data?.toSwap { selectedMarket, baseTokenId, targetTokenId, baseTokenAmount, targetTokenAmount -> Transaction.Swap( base = transactionBase, tokenFrom = tokens.getByIdOrEmpty(baseTokenId), tokenTo = tokens.getByIdOrEmpty(targetTokenId), amountFrom = baseTokenAmount.toBigDecimalOrDefault(), amountTo = targetTokenAmount.toBigDecimalOrDefault(), - market = Market.values().find { m -> m.backString == selectedMarket } ?: Market.SMART, - lpFee = liquidityProviderFee.toBigDecimalOrDefault(), + market = Market.entries.find { m -> m.backString == selectedMarket } ?: Market.SMART, ) } } else if (tx.isMatch( @@ -324,7 +323,6 @@ private fun List.toEthTransfer(block: (amount: String, token private fun List.toSwap( block: ( selectedMarket: String, - liquidityProviderFee: String, baseTokenId: String, targetTokenId: String, baseTokenAmount: String, @@ -332,17 +330,15 @@ private fun List.toSwap( ) -> Transaction.Swap, ): Transaction.Swap? { val selectedMarket = this.firstOrNull { it.paramName == "selectedMarket" } - val liquidityProviderFee = this.firstOrNull { it.paramName == "liquidityProviderFee" } val baseTokenId = this.firstOrNull { it.paramName == "baseAssetId" } val targetTokenId = this.firstOrNull { it.paramName == "targetAssetId" } val baseTokenAmount = this.firstOrNull { it.paramName == "baseAssetAmount" } val targetTokenAmount = this.firstOrNull { it.paramName == "targetAssetAmount" } - return if (selectedMarket != null && liquidityProviderFee != null && + return if (selectedMarket != null && baseTokenId != null && targetTokenId != null && baseTokenAmount != null && targetTokenAmount != null ) block.invoke( selectedMarket.paramValue, - liquidityProviderFee.paramValue, baseTokenId.paramValue, targetTokenId.paramValue, baseTokenAmount.paramValue, diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionBuilderImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionBuilderImpl.kt index a78958b71..a825e7a5d 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionBuilderImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionBuilderImpl.kt @@ -85,7 +85,6 @@ class TransactionBuilderImpl @Inject constructor() : TransactionBuilder { amountFrom: BigDecimal, amountTo: BigDecimal, market: Market, - liquidityFee: BigDecimal, ): Transaction.Swap = Transaction.Swap( base = buildBase( @@ -100,7 +99,6 @@ class TransactionBuilderImpl @Inject constructor() : TransactionBuilder { amountFrom = amountFrom, amountTo = amountTo, market = market, - lpFee = liquidityFee, ) override fun buildTransfer( diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/testdata/TestTransactions.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/testdata/TestTransactions.kt index 2cd73dded..4ea0e0eae 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/testdata/TestTransactions.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/testdata/TestTransactions.kt @@ -162,7 +162,6 @@ object TestTransactions { BigDecimal.TEN, BigDecimal.ONE, Market.XYK, - BigDecimal.ONE ) val addLiquidityTx = Transaction.Liquidity( diff --git a/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/SwapInteractor.kt b/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/SwapInteractor.kt index 8bed439fd..19e7fb2aa 100644 --- a/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/SwapInteractor.kt +++ b/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/SwapInteractor.kt @@ -54,7 +54,6 @@ interface SwapInteractor { amount: BigDecimal, limit: BigDecimal, networkFee: BigDecimal, - liquidityFee: BigDecimal, dexId: Int, amount2: BigDecimal, ): String diff --git a/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/model/SwapDetails.kt b/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/model/SwapDetails.kt index 29600ebf8..f8ff7a862 100644 --- a/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/model/SwapDetails.kt +++ b/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/model/SwapDetails.kt @@ -40,7 +40,6 @@ data class SwapDetails( val per1: BigDecimal, val per2: BigDecimal, val minmax: BigDecimal, - val liquidityFee: BigDecimal, val networkFee: BigDecimal, val dex: PoolDex, val swapRoute: List? = null, @@ -48,6 +47,5 @@ data class SwapDetails( data class SwapQuote( val amount: BigDecimal, - val fee: BigDecimal, val route: List? = null, ) diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt index f935cee2f..3d720c522 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt @@ -36,7 +36,7 @@ import androidx.room.withTransaction import java.math.BigDecimal import java.math.BigInteger import javax.inject.Inject -import jp.co.soramitsu.common.data.network.dto.SwapFeeDtoV3 +import jp.co.soramitsu.common.data.network.dto.SwapFeeDto import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.logger.FirebaseWrapper @@ -275,12 +275,11 @@ class PolkaswapSubscriptionRepositoryImpl @Inject constructor( marketMapper.mapMarketsToFilter(markets), ) ), - mapper = pojo(), + mapper = pojo(), ).result return response?.let { SwapQuote( mapBalance(it.amount, feeToken.precision), - BigDecimal.ZERO, it.route, ) } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt index bcd834197..e452e6755 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt @@ -140,7 +140,6 @@ class SwapInteractorImpl( amount.divide(swapQuote.first.amount, scale, RoundingMode.HALF_EVEN), swapQuote.first.amount.divide(amount, scale, RoundingMode.HALF_EVEN), minMax, - swapQuote.first.fee, networkFee, swapQuote.second, swapQuote.first.route?.mapNotNull { @@ -287,7 +286,6 @@ class SwapInteractorImpl( amount: BigDecimal, limit: BigDecimal, networkFee: BigDecimal, - liquidityFee: BigDecimal, dexId: Int, amount2: BigDecimal, ): String { @@ -318,7 +316,6 @@ class SwapInteractorImpl( amountFrom = if (desired == WithDesired.INPUT) amount else amount2, amountTo = if (desired == WithDesired.INPUT) amount2 else amount, market = selectedSwapMarket.value, - liquidityFee = liquidityFee, ) ) } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMainScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMainScreen.kt index 3cb6685d0..60b2780b5 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMainScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMainScreen.kt @@ -216,14 +216,6 @@ internal fun SwapMainScreen( value1 = state.details.route, ) } - if (state.details.lpFee.isNotEmpty()) { - Spacer(modifier = Modifier.size(Dimens.x2)) - DetailsItem( - text = stringResource(id = R.string.polkaswap_liquidity_total_fee), - hint = stringResource(id = R.string.polkaswap_liquidity_total_fee_desc), - value1 = state.details.lpFee, - ) - } } } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt index 6e1591845..13419ef00 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt @@ -792,11 +792,6 @@ class SwapViewModel @AssistedInject constructor( minmaxToken?.symbol.orEmpty(), maxMinToken?.symbol.orEmpty(), ), - lpFee = feeToken().printBalance( - details.liquidityFee, - numbersFormatter, - AssetHolder.ROUNDING, - ), minmaxTitle = minmaxTitle, minmaxHint = minmaxHint, minmaxValue = minmaxToken?.printBalance( @@ -932,7 +927,6 @@ class SwapViewModel @AssistedInject constructor( if (desired == WithDesired.INPUT) fromState.amount.orZero() else toState.amount.orZero(), details.minmax, details.networkFee, - details.liquidityFee, details.dex.dexId, if (desired == WithDesired.OUTPUT) fromState.amount.orZero() else toState.amount.orZero(), ) diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/SwapMainState.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/SwapMainState.kt index 98ca187ed..ab07df0fc 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/SwapMainState.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/SwapMainState.kt @@ -63,7 +63,6 @@ data class SwapDetailsState( val priceFromTo: String, val priceToFromTitle: String, val priceToFrom: String, - val lpFee: String, val route: String, val shouldTransactionReminderInsufficientWarningBeShown: Boolean, ) @@ -80,7 +79,6 @@ fun defaultSwapDetailsState() = priceFromTo = "", priceToFromTitle = "", priceToFrom = "", - lpFee = "", route = "", shouldTransactionReminderInsufficientWarningBeShown = false, ) diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt index 8eea20325..ee6d8671d 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt @@ -255,7 +255,6 @@ class SwapViewModelTest { ) ).willReturn( SwapDetails( - BigDecimal("0.2"), BigDecimal("0.02"), BigDecimal("12.2"), BigDecimal("18.3"), From 3e231044ae80521c95fbbaaa538d4fd86a9c00af Mon Sep 17 00:00:00 2001 From: arvifox Date: Thu, 14 Mar 2024 12:28:41 +0300 Subject: [PATCH 05/43] release soralution v3.8.4.0 138 --- app/build.gradle.kts | 8 ++++---- gradle.properties | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e77ed885d..2ed694d71 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,7 +19,7 @@ kotlin { jvmToolchain(11) } -// soralution 137 3.8.3.1 2024.02.21 +// soralution 138 3.8.4.0 2024.03.14 // sora dae 108 3.8.0.0 2023.12.04 android { @@ -30,8 +30,8 @@ android { applicationId = "jp.co.soramitsu.sora" minSdk = 26 targetSdk = 34 - versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 137 - versionName = "3.8.3.1" + versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 138 + versionName = "3.8.4.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true // resConfigs "en", "ru", "es", "fr", "de", "nb", "in", "tr", "ar" @@ -167,7 +167,7 @@ play { serviceAccountCredentials = file(System.getenv("CI_PLAY_KEY") ?: "../key/fake.json") track = "internal" releaseStatus = ReleaseStatus.DRAFT - releaseName = "3.8.3.1 - SORA Card Improvements" + releaseName = "3.8.4.0 - SORA Card Improvements" defaultToAppBundles = true } diff --git a/gradle.properties b/gradle.properties index 9d0b75054..bc80a1b1f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -30,7 +30,10 @@ android.useAndroidX=true # absolute paths, which breaks cache relocatability. # You can instruct the plugin to instead generate the test config using # relative paths, which allows the AndroidUnitTest task to be fully cacheable -android.testConfig.useRelativePath=true +# The option 'android.testConfig.useRelativePath' is deprecated. +# The current default is 'true'. +# It was removed in version 8.0 of the Android Gradle plugin. +#android.testConfig.useRelativePath=true # Enable rudimentary R class namespacing where each library only contains # references to the resources it declares instead of declarations plus all # transitive dependency references. From 979efebbd464212723fe36c471693d7cc2917fe5 Mon Sep 17 00:00:00 2001 From: arvifox Date: Mon, 25 Mar 2024 12:37:51 +0300 Subject: [PATCH 06/43] sca-183 --- .../repository/CredentialsRepositoryImpl.kt | 4 +- .../repository/CredentialsRepositoryTest.kt | 4 +- .../details/SoraCardDetailsViewModel.kt | 1 + .../details/SoraCardMainSoraContentCard.kt | 48 +++++++++---------- gradle/libs.versions.toml | 12 ++--- .../substrate/substrate/FearlessLibExt.kt | 2 +- 6 files changed, 35 insertions(+), 36 deletions(-) diff --git a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryImpl.kt b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryImpl.kt index 2bfafe312..1b65f8215 100644 --- a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryImpl.kt +++ b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryImpl.kt @@ -49,12 +49,12 @@ import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import jp.co.soramitsu.sora.substrate.substrate.deriveSeed32 +import jp.co.soramitsu.xcrypto.seed.Mnemonic +import jp.co.soramitsu.xcrypto.seed.MnemonicCreator import jp.co.soramitsu.xcrypto.util.fromHex import jp.co.soramitsu.xcrypto.util.toHexString import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.SubstrateKeypairFactory -import jp.co.soramitsu.xsubstrate.encrypt.mnemonic.Mnemonic -import jp.co.soramitsu.xsubstrate.encrypt.mnemonic.MnemonicCreator import jp.co.soramitsu.xsubstrate.encrypt.seed.substrate.SubstrateSeedFactory class CredentialsRepositoryImpl constructor( diff --git a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryTest.kt b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryTest.kt index 50da59fb1..721ec5812 100644 --- a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryTest.kt +++ b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryTest.kt @@ -44,10 +44,10 @@ import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsDatasour import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager import jp.co.soramitsu.test_shared.MainCoroutineRule +import jp.co.soramitsu.xcrypto.seed.Mnemonic +import jp.co.soramitsu.xcrypto.seed.MnemonicCreator import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.SubstrateKeypairFactory -import jp.co.soramitsu.xsubstrate.encrypt.mnemonic.Mnemonic -import jp.co.soramitsu.xsubstrate.encrypt.mnemonic.MnemonicCreator import jp.co.soramitsu.xsubstrate.encrypt.seed.SeedFactory import jp.co.soramitsu.xsubstrate.encrypt.seed.substrate.SubstrateSeedFactory import kotlinx.coroutines.ExperimentalCoroutinesApi diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index e60c0a20d..4864c82d3 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -77,6 +77,7 @@ class SoraCardDetailsViewModel @Inject constructor( soraCardSettingsCard = SoraCardSettingsCardState( soraCardSettingsOptions = SoraCardSettingsOption.entries, ), + soraCardIBANCardState = SoraCardIBANCardState(iban = "", active = true), logoutDialog = false, fiatWalletDialog = false, ) diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt index fdc6eb342..584acc41f 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt @@ -39,13 +39,11 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.SoraCardImage @@ -57,8 +55,6 @@ import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size import jp.co.soramitsu.ui_core.component.card.ContentCard import jp.co.soramitsu.ui_core.resources.Dimens -import jp.co.soramitsu.ui_core.theme.customColors -import jp.co.soramitsu.ui_core.theme.customTypography enum class SoraCardMenuAction { TOP_UP, @@ -157,27 +153,29 @@ fun SoraCardMainSoraContentCard( onClick = {}, ) } - if (soraCardMainSoraContentCardState.balance == null) { - Text( - modifier = Modifier.fillMaxWidth(), - text = stringResource(id = R.string.sora_card_details_card_management_coming_soon), - style = MaterialTheme.customTypography.textS, - color = MaterialTheme.customColors.fgSecondary, - textAlign = TextAlign.Center - ) - IconButtonMenu( - iconButtonMenuStates = soraCardMainSoraContentCardState.menuState, - onButtonClick = onIconButtonClick - ) - } else { - TonalButton( - modifier = Modifier.padding(horizontal = Dimens.x1).fillMaxWidth(), - size = Size.Large, - order = Order.PRIMARY, - onClick = onFiatWallet, - text = stringResource(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_card), - ) - } +// if (soraCardMainSoraContentCardState.balance == null) { +// Text( +// modifier = Modifier.fillMaxWidth(), +// text = stringResource(id = R.string.sora_card_details_card_management_coming_soon), +// style = MaterialTheme.customTypography.textS, +// color = MaterialTheme.customColors.fgSecondary, +// textAlign = TextAlign.Center +// ) +// IconButtonMenu( +// iconButtonMenuStates = soraCardMainSoraContentCardState.menuState, +// onButtonClick = onIconButtonClick +// ) +// } + TonalButton( + modifier = Modifier + .padding(horizontal = Dimens.x1) + .fillMaxWidth(), + size = Size.Large, + enabled = soraCardMainSoraContentCardState.balance != null, + order = Order.PRIMARY, + onClick = onFiatWallet, + text = stringResource(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_card), + ) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 87b8057f2..95cc75f84 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.3.0" +agp = "8.3.1" kotlin = "1.9.22" appcompat = "1.6.1" coroutines = "1.7.3" @@ -28,7 +28,7 @@ activityCompose = "1.8.2" material = "1.11.0" fragmentKtx = "1.6.2" permission = "1.7.1" -compose = "1.6.3" +compose = "1.6.4" composeViewModel = "2.7.0" composeLifecycle = "2.7.0" composeConstraintLayout = "1.1.0-alpha05" @@ -39,12 +39,12 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.0.7" +soracard = "1.0.8" xnetworking = "0.2.9" -xsubstrate = "1.2.0" -uicore = "0.2.22" +xsubstrate = "1.2.1" +uicore = "0.2.23" xbackup = "1.2.0" -xcrypto = "1.2.0" +xcrypto = "1.2.1" ed = "2.0.1" xerces = "2.9.0" dagger = "2.49" diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/FearlessLibExt.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/FearlessLibExt.kt index d65f0e529..2b8a1f9fc 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/FearlessLibExt.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/FearlessLibExt.kt @@ -36,10 +36,10 @@ import io.emeraldpay.polkaj.scale.ScaleCodecReader import io.emeraldpay.polkaj.scale.ScaleCodecWriter import java.io.ByteArrayOutputStream import jp.co.soramitsu.xcrypto.hash.blake2.blake2b256 +import jp.co.soramitsu.xcrypto.seed.Mnemonic import jp.co.soramitsu.xcrypto.util.fromHex import jp.co.soramitsu.xcrypto.util.toHexString import jp.co.soramitsu.xsubstrate.encrypt.junction.BIP32JunctionDecoder -import jp.co.soramitsu.xsubstrate.encrypt.mnemonic.Mnemonic import jp.co.soramitsu.xsubstrate.encrypt.seed.SeedFactory import jp.co.soramitsu.xsubstrate.encrypt.seed.ethereum.EthereumSeedFactory import jp.co.soramitsu.xsubstrate.encrypt.seed.substrate.SubstrateSeedFactory From 9d5adee9d1e5ba1d85c8728951ca8cef99d709a4 Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 16 Apr 2024 18:23:01 +0300 Subject: [PATCH 07/43] sc-36 --- android-foundation | 2 +- app/build.gradle.kts | 4 +- common/src/main/AndroidManifest.xml | 2 + .../soramitsu/common/base/SoraBaseFragment.kt | 2 +- .../connection/NetworkStateListener.kt | 2 +- .../compose/components/AlertDialogContent.kt | 6 +- .../compose/webview/WebViewFragment.kt | 2 - .../co/soramitsu/common/util/ext/CastExt.kt | 42 ------------ .../soramitsu/common/util/ext/ContextExt.kt | 1 + .../co/soramitsu/common/util/ext/StringExt.kt | 6 +- .../co/soramitsu/common/util/ext/ViewExt.kt | 1 + common/src/main/res/drawable/ic_options.xml | 9 +++ common/src/main/res/values-az/strings.xml | 2 +- common/src/main/res/values-de/strings.xml | 2 +- common/src/main/res/values-fa/strings.xml | 2 +- common/src/main/res/values-fi/strings.xml | 2 +- common/src/main/res/values-in/strings.xml | 2 +- common/src/main/res/values-nb/strings.xml | 2 +- common/src/main/res/values-nl/strings.xml | 2 +- common/src/main/res/values-pt/strings.xml | 2 +- common/src/main/res/values-sr/strings.xml | 2 +- common/src/main/res/values-tr/strings.xml | 2 +- common/src/main/res/values-vi/strings.xml | 16 ++--- common/src/main/res/values-zh-rCN/strings.xml | 16 ++--- common/src/main/res/values-zh-rTW/strings.xml | 2 +- common/src/main/res/values/strings.xml | 2 +- common_wallet/build.gradle.kts | 1 + demeter/build.gradle.kts | 1 + .../demeter/data/DemeterFarmingRepository.kt | 2 +- .../assetdetails/AssetDetailsViewModel.kt | 3 +- .../screens/scan/QRCodeScannerActivity.kt | 6 +- feature_blockexplorer_api/build.gradle.kts | 1 + .../screen/TxHistoryListScreen.kt | 2 +- .../domain/TransactionHistoryHandlerImpl.kt | 2 +- .../domain/TransactionHistoryHandlerTest.kt | 4 +- .../presentation/explore/ExploreFragment.kt | 2 +- .../presentation/OnboardingActivity.kt | 2 +- .../PolkaswapSubscriptionRepositoryImpl.kt | 2 +- .../data/ReferralRepositoryImpl.kt | 2 +- .../domain/SoraCardAvailabilityInfo.kt | 3 +- .../util/SoraCardContractUtil.kt | 24 ++++--- .../domain/SoraCardClientProxy.kt | 2 + .../domain/SoraCardInteractorImpl.kt | 44 ++++--------- .../presentation/GetSoraCardFragment.kt | 9 +-- .../presentation/GetSoraCardScreen.kt | 50 ++++++-------- .../presentation/GetSoraCardViewModel.kt | 24 ++++--- .../presentation/details/ListTile.kt | 35 ++++------ .../details/SoraCardDetailsFragment.kt | 9 ++- .../details/SoraCardDetailsScreen.kt | 11 ++-- .../details/SoraCardDetailsViewModel.kt | 28 ++++---- .../details/SoraCardMainSoraContentCard.kt | 53 +++++++++++---- .../details/SoraCardSettingsCard.kt | 25 +++++-- .../get/card/GetSoraCardViewModelTest.kt | 12 +--- .../data/repository/WalletRepositoryImpl.kt | 3 +- .../buycrypto/BuyCryptoFragment.kt | 2 - .../cardshub/CardsHubViewModel.kt | 8 ++- .../wallet/CardsHubViewModelTest.kt | 14 +++- gradle/libs.versions.toml | 14 ++-- settings.gradle.kts | 1 + .../substrate/substrate/SubstrateCalls.kt | 2 +- .../jp/co/soramitsu/test_data/SoraCard.kt | 66 +++++++++++-------- 61 files changed, 308 insertions(+), 296 deletions(-) delete mode 100644 common/src/main/java/jp/co/soramitsu/common/util/ext/CastExt.kt create mode 100644 common/src/main/res/drawable/ic_options.xml diff --git a/android-foundation b/android-foundation index 9e8db2045..00af5dcbf 160000 --- a/android-foundation +++ b/android-foundation @@ -1 +1 @@ -Subproject commit 9e8db204523e6273d85a4eddad7734822369707d +Subproject commit 00af5dcbf5f461662a26d3f881dbd9989fc7cf07 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2ed694d71..2fad01d7f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -119,7 +119,7 @@ android { create("develop") { dimension = "default" applicationIdSuffix = ".develop" - resValue("string", "app_name", "Sora Develop") + resValue("string", "app_name", "SORA Develop") manifestPlaceholders["pathPrefix"] = "/dev/#/referral" manifestPlaceholders["appIcon"] = "@mipmap/ic_dev_launcher" manifestPlaceholders["roundedIcon"] = "@mipmap/ic_dev_launcher" @@ -136,7 +136,7 @@ android { create("production") { dimension = "default" - resValue("string", "app_name", "Sora") + resValue("string", "app_name", "SORA") manifestPlaceholders["pathPrefix"] = "/#/referral" manifestPlaceholders["appIcon"] = "@mipmap/ic_prod_launcher" manifestPlaceholders["roundedIcon"] = "@mipmap/ic_prod_launcher_rounded" diff --git a/common/src/main/AndroidManifest.xml b/common/src/main/AndroidManifest.xml index 972c3a837..668f10c71 100644 --- a/common/src/main/AndroidManifest.xml +++ b/common/src/main/AndroidManifest.xml @@ -1,3 +1,5 @@ + + \ No newline at end of file diff --git a/common/src/main/java/jp/co/soramitsu/common/base/SoraBaseFragment.kt b/common/src/main/java/jp/co/soramitsu/common/base/SoraBaseFragment.kt index b825f28cd..6875e78ba 100644 --- a/common/src/main/java/jp/co/soramitsu/common/base/SoraBaseFragment.kt +++ b/common/src/main/java/jp/co/soramitsu/common/base/SoraBaseFragment.kt @@ -67,6 +67,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import androidx.navigation.findNavController import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.BarsColorHandler import jp.co.soramitsu.common.domain.DarkThemeManager @@ -76,7 +77,6 @@ import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.common.util.DebounceClickHandler -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.ui_core.theme.customColors import kotlinx.coroutines.launch diff --git a/common/src/main/java/jp/co/soramitsu/common/data/network/connection/NetworkStateListener.kt b/common/src/main/java/jp/co/soramitsu/common/data/network/connection/NetworkStateListener.kt index ed864a402..cf271ed7d 100644 --- a/common/src/main/java/jp/co/soramitsu/common/data/network/connection/NetworkStateListener.kt +++ b/common/src/main/java/jp/co/soramitsu/common/data/network/connection/NetworkStateListener.kt @@ -36,7 +36,7 @@ import android.content.Context import android.net.ConnectivityManager import android.net.Network import android.net.NetworkRequest -import jp.co.soramitsu.common.util.ext.safeCast +import jp.co.soramitsu.androidfoundation.format.safeCast import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AlertDialogContent.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AlertDialogContent.kt index 436c5cc80..817ef7625 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AlertDialogContent.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AlertDialogContent.kt @@ -39,9 +39,9 @@ import androidx.compose.material.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.ui.res.stringResource +import jp.co.soramitsu.androidfoundation.compose.toTitle import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.AlertDialogData -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.ui_core.theme.customColors @Composable @@ -72,6 +72,4 @@ fun AlertDialogContent(openAlertDialog: MutableState) { } @Composable -private fun Any?.message() = this.safeCast()?.let { - stringResource(id = it) -} ?: this.safeCast() +private fun Any?.message() = this?.toTitle() diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/webview/WebViewFragment.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/webview/WebViewFragment.kt index 09cebdf3e..e44403895 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/webview/WebViewFragment.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/webview/WebViewFragment.kt @@ -32,7 +32,6 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.presentation.compose.webview -import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.ScrollState import androidx.fragment.app.viewModels import androidx.navigation.NavGraphBuilder @@ -57,7 +56,6 @@ class WebViewFragment : SoraBaseFragment() { ) } - @OptIn(ExperimentalAnimationApi::class) override fun NavGraphBuilder.content( scrollState: ScrollState, navController: NavHostController diff --git a/common/src/main/java/jp/co/soramitsu/common/util/ext/CastExt.kt b/common/src/main/java/jp/co/soramitsu/common/util/ext/CastExt.kt deleted file mode 100644 index 318da4897..000000000 --- a/common/src/main/java/jp/co/soramitsu/common/util/ext/CastExt.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.common.util.ext - -fun Any.unsafeCast(): T { - @Suppress("UNCHECKED_CAST") - return this as T -} - -inline fun Any?.safeCast(): T? { - return if (this != null && this is T) this else null -} diff --git a/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt b/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt index 0e2aff1eb..66f047a8d 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt @@ -47,6 +47,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource import androidx.core.content.res.use +import jp.co.soramitsu.androidfoundation.format.safeCast @ColorInt fun Context?.attrColor(@AttrRes attr: Int): Int = diff --git a/common/src/main/java/jp/co/soramitsu/common/util/ext/StringExt.kt b/common/src/main/java/jp/co/soramitsu/common/util/ext/StringExt.kt index e7c34acbb..798d35c58 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/ext/StringExt.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/ext/StringExt.kt @@ -46,7 +46,7 @@ import java.nio.charset.CodingErrorAction import java.nio.charset.StandardCharsets import java.util.Locale import java.util.regex.Pattern -import jp.co.soramitsu.androidfoundation.format.hexPrefix +import jp.co.soramitsu.androidfoundation.format.HEX_PREFIX import jp.co.soramitsu.common.util.SoraColoredClickableSpan fun String.parseOtpCode(): String { @@ -73,14 +73,14 @@ fun String.getInitials(): String { fun String.splitVersions() = split(".").map { it.toInt() } fun String.isErc20Address(): Boolean { - return this.split(" ").size == 1 && this.startsWith(hexPrefix) + return this.split(" ").size == 1 && this.startsWith(HEX_PREFIX) } fun String.didToAccountId(): String { return this.replace(":", "_") + "@sora" } -fun String.addHexPrefix(): String = "${hexPrefix}$this" +fun String.addHexPrefix(): String = "${HEX_PREFIX}$this" fun String.removeWebPrefix(): String = this.removePrefix("http://").removePrefix("https://").removePrefix("www.") diff --git a/common/src/main/java/jp/co/soramitsu/common/util/ext/ViewExt.kt b/common/src/main/java/jp/co/soramitsu/common/util/ext/ViewExt.kt index 075400401..6eddc4a5f 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/ext/ViewExt.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/ext/ViewExt.kt @@ -55,6 +55,7 @@ import androidx.lifecycle.findViewTreeLifecycleOwner import com.google.android.material.behavior.HideBottomViewOnScrollBehavior import com.google.android.material.color.MaterialColors import com.google.android.material.floatingactionbutton.FloatingActionButton +import jp.co.soramitsu.androidfoundation.format.safeCast import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi diff --git a/common/src/main/res/drawable/ic_options.xml b/common/src/main/res/drawable/ic_options.xml new file mode 100644 index 000000000..99752c682 --- /dev/null +++ b/common/src/main/res/drawable/ic_options.xml @@ -0,0 +1,9 @@ + + + diff --git a/common/src/main/res/values-az/strings.xml b/common/src/main/res/values-az/strings.xml index cb74507e9..ab5a3591c 100644 --- a/common/src/main/res/values-az/strings.xml +++ b/common/src/main/res/values-az/strings.xml @@ -50,7 +50,7 @@ Doğrulayın Qarışığı blok edin Buy XOR token - Buy or sell XOR token with euro + Nağd avro ilə XOR tokenini alın və ya satın Buy XOR with fiat Balansı yükləmək mümkün deyil Change language diff --git a/common/src/main/res/values-de/strings.xml b/common/src/main/res/values-de/strings.xml index 1498d8514..ba702aea6 100644 --- a/common/src/main/res/values-de/strings.xml +++ b/common/src/main/res/values-de/strings.xml @@ -50,7 +50,7 @@ Authentifizieren Block-Hash Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common/src/main/res/values-fa/strings.xml b/common/src/main/res/values-fa/strings.xml index db8d25074..22de760ef 100644 --- a/common/src/main/res/values-fa/strings.xml +++ b/common/src/main/res/values-fa/strings.xml @@ -50,7 +50,7 @@ تایید بلاک هش Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common/src/main/res/values-fi/strings.xml b/common/src/main/res/values-fi/strings.xml index a4d326332..e77442258 100644 --- a/common/src/main/res/values-fi/strings.xml +++ b/common/src/main/res/values-fi/strings.xml @@ -50,7 +50,7 @@ Varmenna Lohkon tarkiste Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common/src/main/res/values-in/strings.xml b/common/src/main/res/values-in/strings.xml index 4699405e1..e10778a43 100644 --- a/common/src/main/res/values-in/strings.xml +++ b/common/src/main/res/values-in/strings.xml @@ -50,7 +50,7 @@ Otentikasi Blokir hash Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common/src/main/res/values-nb/strings.xml b/common/src/main/res/values-nb/strings.xml index 5cf4c13cd..651418c02 100644 --- a/common/src/main/res/values-nb/strings.xml +++ b/common/src/main/res/values-nb/strings.xml @@ -50,7 +50,7 @@ Autentiser Blokk emne Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common/src/main/res/values-nl/strings.xml b/common/src/main/res/values-nl/strings.xml index 926ba266e..612891f83 100644 --- a/common/src/main/res/values-nl/strings.xml +++ b/common/src/main/res/values-nl/strings.xml @@ -50,7 +50,7 @@ Authenticeren Blok hash Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Taal veranderen diff --git a/common/src/main/res/values-pt/strings.xml b/common/src/main/res/values-pt/strings.xml index 31c288dc3..694b95def 100644 --- a/common/src/main/res/values-pt/strings.xml +++ b/common/src/main/res/values-pt/strings.xml @@ -50,7 +50,7 @@ Autenticar Hash do bloco Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common/src/main/res/values-sr/strings.xml b/common/src/main/res/values-sr/strings.xml index 7e07e341b..5b1970f81 100644 --- a/common/src/main/res/values-sr/strings.xml +++ b/common/src/main/res/values-sr/strings.xml @@ -50,7 +50,7 @@ Потврдите идентитет Блокирај хеш Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common/src/main/res/values-tr/strings.xml b/common/src/main/res/values-tr/strings.xml index 3bc3d3895..ffd3a0e73 100644 --- a/common/src/main/res/values-tr/strings.xml +++ b/common/src/main/res/values-tr/strings.xml @@ -50,7 +50,7 @@ Doğrulama Blok Id Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common/src/main/res/values-vi/strings.xml b/common/src/main/res/values-vi/strings.xml index ef8c970c4..87c2e4d0a 100644 --- a/common/src/main/res/values-vi/strings.xml +++ b/common/src/main/res/values-vi/strings.xml @@ -78,7 +78,7 @@ Sao lưu Số dư Tiếng Bashkir - Bridged + Cầu nối Mua Mua XOR Huỷ bỏ @@ -142,7 +142,7 @@ Mở rộng Khám phá Thất bại - h\nFarming + Farming Farms Phí Tiếng Philippines @@ -252,8 +252,8 @@ Mật khẩu không chính xác Nhập mật khẩu Không đủ tiền cho phí giao dịch - Ethereum account address - Ethereum transaction hash + Địa chỉ tài khoản Ethereum + Mã giao dịch Ethereum Tạo pool Stake phần pool của bạn và kiếm thêm phần thưởng Demeter Farming @@ -418,7 +418,7 @@ Mã QR Từ bộ sưu tập Nhận token - Received from ADAR + Đã nhận từ ADAR Người nhận gần đây Địa chỉ người nhận Nhập cụm mật khẩu ví gốc (Raw seed) @@ -461,14 +461,14 @@ Bạn có thực sự muốn xóa node này không? Kết quả chỉ là ước lượng. Nếu giá biến động hơn %s%% thì giao dịch của bạn sẽ bị hoàn tác. Xác nhận Rút - Bạn cần cung cấp tính thanh khoản cho một cặp nhóm tương ứng để bắt đầu đặt cược để nhận thêm phần thưởng: + Bạn cần cung cấp thanh khoản cho pool của một cặp token tương ứng để bắt đầu staking nhận thêm phần thưởng: Yêu cầu khởi động lại Kiểm tra lại Route Hiển thị mã QR của tôi Tìm kiếm tài sản Không có kết quả tìm kiếm - Tìm kiếm theo ID nội dung, tên hoặc ký hiệu mã + Tìm kiếm theo ID nội dung, tên hoặc mã token Tìm kiếm địa chỉ tài khoản Tìm kiếm hoặc thêm địa chỉ mới Chọn tài khoản để nhập @@ -501,7 +501,7 @@ Mã PIN và xác thực sinh trắc học Đăng nhập & Bảo mật Node - Xm nhiều hơn + Xem thêm Hiển thị số dư bằng không Trượt giá Đã xảy ra sự cố diff --git a/common/src/main/res/values-zh-rCN/strings.xml b/common/src/main/res/values-zh-rCN/strings.xml index d1ab4d948..04d035f19 100644 --- a/common/src/main/res/values-zh-rCN/strings.xml +++ b/common/src/main/res/values-zh-rCN/strings.xml @@ -78,7 +78,7 @@ 备份 余额 巴什基尔语 - Bridged + 跨链 购买 购买XOR 取消 @@ -143,7 +143,7 @@ 探索 失败了 农业 - Farms + 农场 费用 菲律宾语 芬兰语 @@ -169,7 +169,7 @@ 更多 挪威语 没有可用的 - Nothing found + 未找到任何内容 好的 助记词 注意! @@ -235,7 +235,7 @@ 如果您删除了Google备份,您只能通过手动备份助记词来恢复您的钱包。 你确定吗? 领取的奖励 - Deposit fee is applied to your amount to stake + 存款费用将被应用于您的质押金额。 质押流动性 未质押的流动性 已被冻结 @@ -252,8 +252,8 @@ 密码错误 输入密码 网络费用不足 - Ethereum account address - Ethereum transaction hash + 以太坊账户地址 + 以太坊交易哈希 创建池子 质押您的流动池份额并赚取额外奖励 Demeter农业 @@ -352,7 +352,7 @@ 由Demeter农业提供技术支持 您的一部分流动池份额已被质押。要访问它,您需要先解除质押。 您质押的流动池份额 - Your pool share staked will be + 您质押的池份额将是 质押了%s 要撤出流动性,您需要先解除质押 Polkaswap 是由 SORA 社区维护。在使用 Polkaswap 功能之前,请查看%% Polkaswap FAQ %% 和文档,其中包括有关 Polkaswap 操作原理%% 的详细说明、 Polkaswap %%备忘录和服务条款以%%及隐私政策。%%这些文档对于安全和积极的用户体验至关重要。通过使用 Polkaswap,您承认您已阅读并理解这些文件。 @@ -418,7 +418,7 @@ QR 代码 从相册 接收代币 - Received from ADAR + 从 ADAR 收到 最近的接收人 接收人地址 输入您的私密密码短语 diff --git a/common/src/main/res/values-zh-rTW/strings.xml b/common/src/main/res/values-zh-rTW/strings.xml index b6c5ceeca..bbbe0847c 100644 --- a/common/src/main/res/values-zh-rTW/strings.xml +++ b/common/src/main/res/values-zh-rTW/strings.xml @@ -50,7 +50,7 @@ 認證 區塊哈希 Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 14aa961b2..065f737be 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -50,7 +50,7 @@ Authenticate Block hash Buy XOR token - Buy or sell XOR token with euro + Buy or sell XOR token with euro cash Buy XOR with fiat Can\'t load balance Change language diff --git a/common_wallet/build.gradle.kts b/common_wallet/build.gradle.kts index ce9cabbf2..1b58908d3 100644 --- a/common_wallet/build.gradle.kts +++ b/common_wallet/build.gradle.kts @@ -98,6 +98,7 @@ dependencies { api(libs.soraCardDep) { exclude(group = "com.paywings.onboarding.kyc.android-libs", module = "java-websocket-lib") + exclude(module = "android-foundation") } implementation(libs.daggerDep) diff --git a/demeter/build.gradle.kts b/demeter/build.gradle.kts index ac402e81b..6511527f3 100644 --- a/demeter/build.gradle.kts +++ b/demeter/build.gradle.kts @@ -66,6 +66,7 @@ android { } dependencies { + implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":core_db")) diff --git a/demeter/src/main/java/jp/co/soramitsu/demeter/data/DemeterFarmingRepository.kt b/demeter/src/main/java/jp/co/soramitsu/demeter/data/DemeterFarmingRepository.kt index 60197784b..5b7afd8b0 100644 --- a/demeter/src/main/java/jp/co/soramitsu/demeter/data/DemeterFarmingRepository.kt +++ b/demeter/src/main/java/jp/co/soramitsu/demeter/data/DemeterFarmingRepository.kt @@ -35,9 +35,9 @@ package jp.co.soramitsu.demeter.data import java.math.BigDecimal import java.math.BigInteger import java.util.concurrent.ConcurrentHashMap +import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.util.ext.isZero -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.common_wallet.data.AssetLocalToAssetMapper import jp.co.soramitsu.core_db.AppDatabase diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt index d96c55bdc..30f70327c 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt @@ -179,8 +179,7 @@ class AssetDetailsViewModel @AssistedInject constructor( null }, isTransferableBalanceAvailable = asset.balance.transferable > BigDecimal.ZERO, - buyCryptoAvailable = false, -// buyCryptoAvailable = soraCard && (asset.token.id == SubstrateOptionsProvider.feeAssetId), + buyCryptoAvailable = soraCard && (asset.token.id == SubstrateOptionsProvider.feeAssetId), ) ) } diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt index 8fcf8aff6..2e647f6d3 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt @@ -78,7 +78,11 @@ class QRCodeScannerActivity : AppCompatActivity() { } } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) capture?.onRequestPermissionsResult(requestCode, permissions, grantResults) } diff --git a/feature_blockexplorer_api/build.gradle.kts b/feature_blockexplorer_api/build.gradle.kts index 823df56cf..e8a7fe0e1 100644 --- a/feature_blockexplorer_api/build.gradle.kts +++ b/feature_blockexplorer_api/build.gradle.kts @@ -66,6 +66,7 @@ android { } dependencies { + implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":core_db")) implementation(project(":network")) diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/screen/TxHistoryListScreen.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/screen/TxHistoryListScreen.kt index b7bf66a86..ba662cf26 100644 --- a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/screen/TxHistoryListScreen.kt +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/screen/TxHistoryListScreen.kt @@ -56,8 +56,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.common.view.LoadMoreHandler import jp.co.soramitsu.feature_blockexplorer_api.domain.HistoryState import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.EventUiModel diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt index 3a508de4b..899ab967a 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt @@ -34,12 +34,12 @@ package jp.co.soramitsu.feature_blockexplorer_impl.domain import java.util.Date import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.R import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.resourses.ResourceManager import jp.co.soramitsu.common.util.DateTimeUtils -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository import jp.co.soramitsu.feature_blockexplorer_api.data.TransactionHistoryRepository diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt index b79cce156..bb0880066 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt @@ -32,14 +32,14 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_blockexplorer_impl.domain +import jp.co.soramitsu.androidfoundation.format.safeCast +import jp.co.soramitsu.androidfoundation.format.unsafeCast import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.resourses.LanguagesHolder import jp.co.soramitsu.common.resourses.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter -import jp.co.soramitsu.common.util.ext.safeCast -import jp.co.soramitsu.common.util.ext.unsafeCast import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository import jp.co.soramitsu.feature_blockexplorer_api.data.TransactionHistoryRepository diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt index 614622b3f..5a46a36a8 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt @@ -68,11 +68,11 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint +import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.compose.components.keyboardState -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.common_wallet.presentation.compose.BasicFarmListItem import jp.co.soramitsu.common_wallet.presentation.compose.BasicPoolListItem import jp.co.soramitsu.common_wallet.presentation.compose.components.AssetItemEnumerated diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingActivity.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingActivity.kt index 15624bed8..057b96014 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingActivity.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingActivity.kt @@ -514,7 +514,7 @@ class OnboardingActivity : SoraBaseActivity() { private lateinit var navController: NavController - override fun onNewIntent(intent: Intent?) { + override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) intent?.let { diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt index 3d720c522..6fd6d848f 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt @@ -36,11 +36,11 @@ import androidx.room.withTransaction import java.math.BigDecimal import java.math.BigInteger import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.data.network.dto.SwapFeeDto import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.logger.FirebaseWrapper -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.common_wallet.domain.model.LiquidityData import jp.co.soramitsu.common_wallet.domain.model.WithDesired diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryImpl.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryImpl.kt index 87854083d..c6d4b6ed6 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryImpl.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryImpl.kt @@ -36,8 +36,8 @@ import java.math.BigDecimal import java.math.BigInteger import java.util.Date import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.domain.Token -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.core_db.AppDatabase import jp.co.soramitsu.feature_blockexplorer_api.data.BlockExplorerManager diff --git a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/domain/SoraCardAvailabilityInfo.kt b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/domain/SoraCardAvailabilityInfo.kt index 697fe6463..b580b658b 100644 --- a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/domain/SoraCardAvailabilityInfo.kt +++ b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/domain/SoraCardAvailabilityInfo.kt @@ -38,7 +38,7 @@ import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification data class SoraCardAvailabilityInfo( val xorBalance: BigDecimal = BigDecimal.ZERO, - val enoughXor: Boolean = false, + val enoughXor: Boolean = true, val percent: BigDecimal = BigDecimal.ZERO, val needInXor: String = "", val needInEur: String = "", @@ -53,4 +53,5 @@ data class SoraCardBasicStatus( val needInstallUpdate: Boolean, val applicationFee: String?, val ibanInfo: IbanInfo?, + val phone: String?, ) diff --git a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt index 147bb6f88..94c70420d 100644 --- a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt +++ b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt @@ -42,6 +42,7 @@ import jp.co.soramitsu.oauth.base.sdk.SoraCardEnvironmentType import jp.co.soramitsu.oauth.base.sdk.SoraCardKycCredentials import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardBasicContractData import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow fun createSoraCardBasicContract() = SoraCardBasicContractData( apiKey = BuildConfig.SORA_CARD_API_KEY, @@ -61,18 +62,21 @@ fun createSoraCardContract( return SoraCardContractData( basic = createSoraCardBasicContract(), locale = Locale.ENGLISH, - kycCredentials = SoraCardKycCredentials( - endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, - username = BuildConfig.SORA_CARD_KYC_USERNAME, - password = BuildConfig.SORA_CARD_KYC_PASSWORD, - ), + soraBackEndUrl = BuildConfigWrapper.getSoraCardBackEndUrl(), client = OptionsProvider.header, - userAvailableXorAmount = userAvailableXorAmount, + flow = SoraCardFlow.SoraCardKycFlow( + kycCredentials = SoraCardKycCredentials( + endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, + username = BuildConfig.SORA_CARD_KYC_USERNAME, + password = BuildConfig.SORA_CARD_KYC_PASSWORD, + ), + userAvailableXorAmount = userAvailableXorAmount, // will be available in Phase 2 - areAttemptsPaidSuccessfully = false, - isEnoughXorAvailable = isEnoughXorAvailable, + areAttemptsPaidSuccessfully = false, + isEnoughXorAvailable = isEnoughXorAvailable, // will be available in Phase 2 - isIssuancePaid = false, - soraBackEndUrl = BuildConfigWrapper.getSoraCardBackEndUrl(), + isIssuancePaid = false, + logIn = false, + ), ) } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardClientProxy.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardClientProxy.kt index 31919ae17..d40ee1492 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardClientProxy.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardClientProxy.kt @@ -70,6 +70,8 @@ internal class SoraCardClientProxy @Inject constructor( return clientsFacade.getIBAN() } + suspend fun getPhone() = clientsFacade.getPhoneNumber() + suspend fun logout() { clientsFacade.logout() } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt index fb3ff0684..b47719c12 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt @@ -38,8 +38,6 @@ import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.compareByTotal import jp.co.soramitsu.common.util.NumbersFormatter -import jp.co.soramitsu.common.util.ext.greaterThan -import jp.co.soramitsu.common.util.ext.safeDivide import jp.co.soramitsu.common.util.ext.splitVersions import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor @@ -50,7 +48,6 @@ import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardBasicStatus import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.oauth.base.sdk.contract.IbanInfo import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification -import jp.co.soramitsu.oauth.common.domain.PriceInteractor import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import kotlin.math.min import kotlinx.coroutines.delay @@ -83,6 +80,7 @@ internal class SoraCardInteractorImpl @Inject constructor( needInstallUpdate = false, applicationFee = null, ibanInfo = null, + phone = null, ) ) @@ -95,6 +93,7 @@ internal class SoraCardInteractorImpl @Inject constructor( fetchUserIbanAccount(), subscribeToSoraCardAvailabilityFlow(), checkSoraCardPending(), + fetchUserPhone(), ) { flows -> val init = flows[0] as Pair val needUpdate = flows[1] as Boolean @@ -102,6 +101,7 @@ internal class SoraCardInteractorImpl @Inject constructor( val ibanInfo = flows[3] as IbanInfo? val availability = flows[4] as SoraCardAvailabilityInfo val verification = flows[5] as SoraCardCommonVerification + val phone = flows[6] as String SoraCardBasicStatus( initialized = init.first, initError = init.second, @@ -110,6 +110,7 @@ internal class SoraCardInteractorImpl @Inject constructor( needInstallUpdate = needUpdate, applicationFee = fee, ibanInfo = ibanInfo, + phone = phone, ) } .debounce(1000) @@ -168,8 +169,7 @@ internal class SoraCardInteractorImpl @Inject constructor( assetsInteractor.subscribeAssetOfCurAccount(SubstrateOptionsProvider.feeAssetId) .distinctUntilChanged(::compareByTotal) .map { asset -> - val xorEuroLocal = getXorEuro() - if (asset != null && xorEuroLocal != null) { + if (asset != null) { val pools = poolsInteractor.getPoolsCacheOfCurAccount() .filter { poolData -> poolData.basic.baseToken.id == SubstrateOptionsProvider.feeAssetId @@ -183,42 +183,24 @@ internal class SoraCardInteractorImpl @Inject constructor( ) val totalTokenBalance = asset.balance.total.plus(poolsSum).plus(demeterStakedFarmed) - try { - val sufficient = PriceInteractor.calcSufficient( - balance = totalTokenBalance, - ratio = xorEuroLocal, - ) - SoraCardAvailabilityInfo( - xorBalance = totalTokenBalance, - enoughXor = totalTokenBalance.greaterThan(sufficient.realRequiredBalance), - percent = totalTokenBalance.safeDivide(sufficient.realRequiredBalance), - needInXor = formatter.formatBigDecimal(sufficient.needToken, 5), - needInEur = formatter.formatBigDecimal(sufficient.needEuro, 2), - xorRatioAvailable = true, - ) - } catch (t: Throwable) { - errorInfoState(totalTokenBalance) - } + SoraCardAvailabilityInfo( + xorBalance = totalTokenBalance, + xorRatioAvailable = true, + ) } else { - errorInfoState(BigDecimal.ZERO) + errorInfoState() } }.flowOn(coroutineManager.io) - private fun errorInfoState(balance: BigDecimal) = SoraCardAvailabilityInfo( + private fun errorInfoState(balance: BigDecimal = BigDecimal.ZERO) = SoraCardAvailabilityInfo( xorBalance = balance, - enoughXor = false, xorRatioAvailable = false, ) - private var xorToEuro: Double? = null - - private suspend fun getXorEuro(): Double? = - xorToEuro ?: blockExplorerManager.getXorPerEurRatio().also { - xorToEuro = it - } - private fun fetchUserIbanAccount() = flow { emit(fetchIbanItem()) } + private fun fetchUserPhone() = flow { emit(soraCardClientProxy.getPhone()) } + private suspend fun fetchIbanItem(): IbanInfo? = soraCardClientProxy.getIBAN().getOrNull() diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt index 0b32ac8e2..8bd8408d4 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt @@ -34,7 +34,6 @@ package jp.co.soramitsu.feature_sora_card_impl.presentation import android.os.Bundle import android.view.View -import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.ScrollState import androidx.fragment.app.viewModels import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -46,6 +45,8 @@ import javax.inject.Inject import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController +import jp.co.soramitsu.common.domain.OptionsProvider +import jp.co.soramitsu.common.util.ShareUtil import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContract @@ -77,7 +78,6 @@ class GetSoraCardFragment : SoraBaseFragment() { } } - @OptIn(ExperimentalAnimationApi::class) override fun NavGraphBuilder.content( scrollState: ScrollState, navController: NavHostController @@ -89,8 +89,9 @@ class GetSoraCardFragment : SoraBaseFragment() { GetSoraCardScreen( scrollState = scrollState, state = state, - viewModel::onSeeBlacklist, - viewModel::onEnableCard, + { ShareUtil.shareInBrowser(this@GetSoraCardFragment, OptionsProvider.soraCardBlackList) }, + viewModel::onSignUp, + viewModel::onLogIn, ) } } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardScreen.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardScreen.kt index 534d63c26..838705ff7 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardScreen.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardScreen.kt @@ -54,6 +54,7 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.SoraCardImage import jp.co.soramitsu.common.util.ext.testTagAsId import jp.co.soramitsu.ui_core.component.button.FilledButton +import jp.co.soramitsu.ui_core.component.button.TextButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size import jp.co.soramitsu.ui_core.component.card.ContentCard @@ -66,7 +67,8 @@ fun GetSoraCardScreen( scrollState: ScrollState, state: GetSoraCardState, onBlackList: () -> Unit, - onEnableCard: () -> Unit, + onSignUp: () -> Unit, + onLogIn: () -> Unit, ) { Box( modifier = Modifier @@ -107,7 +109,7 @@ fun GetSoraCardScreen( AnnualFee() - FreeCardIssuance(state.applicationFee) + FreeCardIssuance() Text( modifier = Modifier @@ -133,13 +135,24 @@ fun GetSoraCardScreen( FilledButton( modifier = Modifier .fillMaxWidth() - .testTagAsId("SoraCardLogInOrSignUp") + .testTagAsId("SoraCardSignUp") .padding(vertical = Dimens.x2, horizontal = Dimens.x1), - text = stringResource(R.string.sora_card_log_in_or_sign_up), + text = "Sign up for SORA Card", size = Size.Large, enabled = state.xorRatioAvailable && state.connection, order = Order.PRIMARY, - onClick = onEnableCard, + onClick = onSignUp, + ) + TextButton( + modifier = Modifier + .fillMaxWidth() + .testTagAsId("SoraCardHaveCard") + .padding(horizontal = Dimens.x1), + size = Size.Large, + enabled = state.xorRatioAvailable && state.connection, + order = Order.PRIMARY, + text = stringResource(id = jp.co.soramitsu.oauth.R.string.details_already_have_card), + onClick = onLogIn, ) } } @@ -168,9 +181,7 @@ private fun AnnualFee() { } @Composable -private fun FreeCardIssuance( - applicationFee: String, -) { +private fun FreeCardIssuance() { ContentCard( modifier = Modifier .fillMaxWidth() @@ -189,25 +200,6 @@ private fun FreeCardIssuance( color = MaterialTheme.customColors.fgPrimary, style = MaterialTheme.customTypography.textL, ) - - Text( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .padding(top = Dimens.x2), - text = stringResource(R.string.sora_card_free_card_issuance_conditions_xor), - style = MaterialTheme.customTypography.paragraphS, - color = MaterialTheme.customColors.fgPrimary, - ) - Text( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .padding(vertical = Dimens.x2), - text = stringResource(jp.co.soramitsu.oauth.R.string.details_free_card_issuance_conditions_euro, applicationFee), - style = MaterialTheme.customTypography.paragraphM, - color = MaterialTheme.customColors.fgSecondary, - ) } } } @@ -217,7 +209,7 @@ private fun FreeCardIssuance( private fun PreviewGetSoraCardScreen() { GetSoraCardScreen( scrollState = rememberScrollState(), - state = GetSoraCardState(applicationFee = "29"), - {}, {}, + state = GetSoraCardState(applicationFee = "29", connection = true, xorRatioAvailable = true), + {}, {}, {}, ) } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt index 1a8ddf017..dab15e9dc 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt @@ -37,8 +37,8 @@ import androidx.lifecycle.viewModelScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import jp.co.soramitsu.androidfoundation.format.unsafeCast import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.presentation.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel @@ -51,6 +51,7 @@ import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardContract import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.oauth.base.sdk.contract.OutwardsScreen import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardResult import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager @@ -153,9 +154,19 @@ class GetSoraCardViewModel @AssistedInject constructor( } } - fun onEnableCard() { + fun onSignUp() { currentSoraCardContractData?.let { - _launchSoraCardRegistration.value = it + _launchSoraCardRegistration.value = it.copy( + flow = it.flow.unsafeCast().copy(logIn = false) + ) + } + } + + fun onLogIn() { + currentSoraCardContractData?.let { + _launchSoraCardRegistration.value = it.copy( + flow = it.flow.unsafeCast().copy(logIn = true) + ) } } @@ -166,11 +177,4 @@ class GetSoraCardViewModel @AssistedInject constructor( fun onSwap() { polkaswapRouter.showSwap(tokenToId = SubstrateOptionsProvider.feeAssetId) } - - fun onSeeBlacklist() { - mainRouter.showWebView( - title = resourceManager.getString(R.string.sora_card_blacklisted_countires_title), - url = OptionsProvider.soraCardBlackList, - ) - } } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt index 9cf17a510..518cb1c15 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt @@ -69,28 +69,19 @@ data class ListTileState( val testTagId: String? = null, val variant: ListTileVariant, val flag: ListTileFlag, - private val title: Text, - private val subtitle: Text? = null, + val title: Text, + val subtitle: Text? = null, + val clickEnabled: Boolean = true, private val body: Text? = null, private val icon: Image? = null ) { - val titleText: Text = title - - val isSubtitleVisible = variant === ListTileVariant.TITLE_SUBTITLE_BODY - - val subtitleText: Text? - get() = if (variant === ListTileVariant.TITLE_SUBTITLE_BODY) - subtitle else null - val isBodyVisible = variant === ListTileVariant.TITLE_SUBTITLE_BODY val bodyText: Text? get() = if (variant === ListTileVariant.TITLE_SUBTITLE_BODY) body else null - val isNavigationHintVisible = variant === ListTileVariant.TITLE_NAVIGATION_HINT - val navigationIcon: Image? get() = if (variant === ListTileVariant.TITLE_NAVIGATION_HINT) icon else null @@ -101,8 +92,6 @@ fun ListTileView( listTileState: ListTileState, onItemClick: () -> Unit ) { - // TODO Extract to UI lib - val colorInUse = if (listTileState.variant === ListTileVariant.TITLE_NAVIGATION_HINT && listTileState.flag === ListTileFlag.WARNING) { MaterialTheme.customColors.statusError } else { @@ -112,11 +101,11 @@ fun ListTileView( Row( modifier = Modifier .run { if (listTileState.testTagId == null) this else testTagAsId(listTileState.testTagId) } - .clickable { onItemClick.invoke() } + .clickable(onClick = onItemClick, enabled = listTileState.clickEnabled) .fillMaxWidth() .padding( vertical = Dimens.x1, - horizontal = Dimens.x1 + horizontal = Dimens.x1, ), horizontalArrangement = Arrangement.SpaceBetween ) { @@ -124,29 +113,27 @@ fun ListTileView( modifier = Modifier.align(Alignment.CenterVertically) ) { Text( - text = listTileState.titleText.retrieveString(), + text = listTileState.title.retrieveString(), style = MaterialTheme.customTypography.textM, color = colorInUse ) - if (listTileState.isSubtitleVisible) { - // TODO remove !! + if (listTileState.subtitle != null) { Text( - text = listTileState.subtitleText!!.retrieveString(), + text = listTileState.subtitle.retrieveString(), style = MaterialTheme.customTypography.textXSBold, color = MaterialTheme.customColors.fgSecondary, ) } } Column { - if (listTileState.isSubtitleVisible) { - // TODO remove !! + if (listTileState.isBodyVisible) { Text( - text = listTileState.bodyText!!.retrieveString(), + text = listTileState.bodyText?.retrieveString().orEmpty(), style = MaterialTheme.customTypography.textM, color = colorInUse, ) } - if (listTileState.isNavigationHintVisible) { + if (listTileState.variant == ListTileVariant.TITLE_NAVIGATION_HINT) { Icon( painter = listTileState.navigationIcon!!.retrievePainter(), contentDescription = "", diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt index ce751cc75..34d79d9fe 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt @@ -108,8 +108,13 @@ class SoraCardDetailsFragment : SoraBaseFragment() { onRecentActivityClick = viewModel::onRecentActivityClick, onIbanCardShareClick = viewModel::onIbanCardShareClick, onIbanCardClick = viewModel::onIbanCardClick, - onSettingsOptionClick = viewModel::onSettingsOptionClick, - onFiatWallet = { viewModel.onFiatWalletClick(this@SoraCardDetailsFragment.context) }, + onSettingsOptionClick = { + if (it == 0) { + viewModel.onFiatWalletClick(this@SoraCardDetailsFragment.context) + } else { + viewModel.onSettingsOptionClick(it) + } + }, ) if (state.value.logoutDialog) { AlertDialog( diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt index 6fd4462a9..5d4e8df77 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt @@ -78,7 +78,6 @@ fun SoraCardDetailsScreen( onIbanCardShareClick: () -> Unit, onIbanCardClick: () -> Unit, onSettingsOptionClick: (position: Int) -> Unit, - onFiatWallet: () -> Unit, ) { Column( modifier = Modifier @@ -94,7 +93,8 @@ fun SoraCardDetailsScreen( soraCardMainSoraContentCardState = soraCardDetailsScreenState.soraCardMainSoraContentCardState, onShowMoreClick = onShowSoraCardDetailsClick, onIconButtonClick = onSoraCardMenuActionClick, - onFiatWallet = onFiatWallet, + onExchangeXor = {}, + onOptionsClick = {}, ) if (soraCardDetailsScreenState.soraCardReferralBannerCardState) { BasicBannerCard( @@ -126,7 +126,8 @@ fun SoraCardDetailsScreen( if (state.settings.isNotEmpty()) SoraCardSettingsCard( state = state, - onItemClick = onSettingsOptionClick + main = soraCardDetailsScreenState.soraCardMainSoraContentCardState, + onItemClick = onSettingsOptionClick, ) } Spacer( @@ -152,7 +153,8 @@ private fun PreviewSoraCardDetailsScreen() { soraCardDetailsScreenState = SoraCardDetailsScreenState( soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( balance = "3665.50", - soraCardMenuActions = SoraCardMenuAction.entries + phone = "+987654", + soraCardMenuActions = SoraCardMenuAction.entries, ), soraCardReferralBannerCardState = true, soraCardRecentActivitiesCardState = SoraCardRecentActivitiesCardState( @@ -177,7 +179,6 @@ private fun PreviewSoraCardDetailsScreen() { onIbanCardShareClick = {}, onIbanCardClick = {}, onSettingsOptionClick = { _ -> }, - onFiatWallet = {}, ) } } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index 4864c82d3..736d2134f 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -72,6 +72,7 @@ class SoraCardDetailsViewModel @Inject constructor( SoraCardDetailsScreenState( soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( balance = null, + phone = null, soraCardMenuActions = SoraCardMenuAction.entries, ), soraCardSettingsCard = SoraCardSettingsCardState( @@ -95,15 +96,18 @@ class SoraCardDetailsViewModel @Inject constructor( viewModelScope.launch { tryCatch { - soraCardInteractor.basicStatus.value.ibanInfo?.let { iban -> - val local = _soraCardDetailsScreenState.value - ibanCache = iban - _soraCardDetailsScreenState.value = local.copy( - soraCardIBANCardState = SoraCardIBANCardState(iban.iban, iban.active), - soraCardMainSoraContentCardState = local.soraCardMainSoraContentCardState.copy( - balance = iban.balance, - ), - ) + soraCardInteractor.basicStatus.value.let { basicStatus -> + basicStatus.ibanInfo?.let { iban -> + val local = _soraCardDetailsScreenState.value + ibanCache = iban + _soraCardDetailsScreenState.value = local.copy( + soraCardIBANCardState = SoraCardIBANCardState(iban.iban, iban.active), + soraCardMainSoraContentCardState = local.soraCardMainSoraContentCardState.copy( + balance = iban.balance, + phone = basicStatus.phone, + ), + ) + } } } } @@ -154,7 +158,8 @@ class SoraCardDetailsViewModel @Inject constructor( if (context.isAppAvailableCompat(fiat)) { fiatWallet.value = fiat } else { - _soraCardDetailsScreenState.value = _soraCardDetailsScreenState.value.copy(fiatWalletDialog = true) + _soraCardDetailsScreenState.value = + _soraCardDetailsScreenState.value.copy(fiatWalletDialog = true) } } @@ -178,7 +183,8 @@ class SoraCardDetailsViewModel @Inject constructor( } fun onFiatWalletDismiss() { - _soraCardDetailsScreenState.value = _soraCardDetailsScreenState.value.copy(fiatWalletDialog = false) + _soraCardDetailsScreenState.value = + _soraCardDetailsScreenState.value.copy(fiatWalletDialog = false) } fun onOpenFiatWalletMarket() { diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt index 584acc41f..e6388fb88 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt @@ -35,14 +35,16 @@ package jp.co.soramitsu.feature_sora_card_impl.presentation.details import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R @@ -65,6 +67,7 @@ enum class SoraCardMenuAction { data class SoraCardMainSoraContentCardState( val balance: String?, + val phone: String?, val actionsEnabled: Boolean = false, val soraCardMenuActions: List, ) { @@ -112,7 +115,8 @@ fun SoraCardMainSoraContentCard( soraCardMainSoraContentCardState: SoraCardMainSoraContentCardState, onShowMoreClick: () -> Unit, onIconButtonClick: (Int) -> Unit, - onFiatWallet: () -> Unit, + onExchangeXor: () -> Unit, + onOptionsClick: () -> Unit, ) { ContentCard( cornerRadius = Dimens.x4, @@ -166,16 +170,31 @@ fun SoraCardMainSoraContentCard( // onButtonClick = onIconButtonClick // ) // } - TonalButton( + Row( modifier = Modifier - .padding(horizontal = Dimens.x1) - .fillMaxWidth(), - size = Size.Large, - enabled = soraCardMainSoraContentCardState.balance != null, - order = Order.PRIMARY, - onClick = onFiatWallet, - text = stringResource(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_card), - ) + .fillMaxWidth() + .wrapContentHeight(), + ) { + TonalButton( + modifier = Modifier + .padding(horizontal = Dimens.x1) + .weight(1f), + size = Size.Large, + enabled = true, + order = Order.PRIMARY, + onClick = onExchangeXor, + text = stringResource(id = jp.co.soramitsu.oauth.R.string.exchange_xor), + ) + TonalButton( + modifier = Modifier + .size(Dimens.x7), + size = Size.Large, + leftIcon = painterResource(id = R.drawable.ic_options), + enabled = true, + order = Order.PRIMARY, + onClick = onOptionsClick, + ) + } } } } @@ -186,11 +205,13 @@ private fun PreviewMainSoraContentCard() { SoraCardMainSoraContentCard( soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( balance = "3644.50", + phone = "", soraCardMenuActions = SoraCardMenuAction.entries ), onShowMoreClick = {}, onIconButtonClick = { _ -> }, - onFiatWallet = {}, + onExchangeXor = {}, + onOptionsClick = {}, ) } @@ -200,11 +221,13 @@ private fun PreviewMainSoraContentCard2() { SoraCardMainSoraContentCard( soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( balance = "3644.50", + phone = "", soraCardMenuActions = SoraCardMenuAction.entries ), onShowMoreClick = {}, onIconButtonClick = { _ -> }, - onFiatWallet = {}, + onExchangeXor = {}, + onOptionsClick = {}, ) } @@ -214,10 +237,12 @@ private fun PreviewMainSoraContentCard3() { SoraCardMainSoraContentCard( soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( balance = null, + phone = "", soraCardMenuActions = SoraCardMenuAction.entries ), onShowMoreClick = {}, onIconButtonClick = { _ -> }, - onFiatWallet = {}, + onExchangeXor = {}, + onOptionsClick = {}, ) } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt index 5643d67d3..4bea8fe03 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt @@ -52,7 +52,7 @@ import jp.co.soramitsu.ui_core.theme.customTypography enum class SoraCardSettingsOption { SUPPORT_CHAT, - LOG_OUT + LOG_OUT, } data class SoraCardSettingsCardState( @@ -85,7 +85,8 @@ data class SoraCardSettingsCardState( @Composable fun SoraCardSettingsCard( state: SoraCardSettingsCardState, - onItemClick: (position: Int) -> Unit + main: SoraCardMainSoraContentCardState, + onItemClick: (position: Int) -> Unit, ) { ContentCard( cornerRadius = Dimens.x4, @@ -104,10 +105,23 @@ fun SoraCardSettingsCard( style = MaterialTheme.customTypography.headline2, color = MaterialTheme.customColors.fgPrimary, ) - repeat(state.settings.size) { + buildList { + add( + ListTileState( + testTagId = "ManageSoraCard", + variant = ListTileVariant.TITLE_NAVIGATION_HINT, + flag = ListTileFlag.NORMAL, + title = Text.StringRes(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_card), + icon = Image.ResImage(id = R.drawable.ic_arrow_right), + subtitle = Text.SimpleText(text = main.phone.orEmpty()), + clickEnabled = main.balance != null, + ) + ) + addAll(state.settings) + }.forEachIndexed { i, s -> ListTileView( - listTileState = state.settings[it], - onItemClick = { onItemClick.invoke(it) }, + listTileState = s, + onItemClick = { onItemClick.invoke(i) }, ) } } @@ -121,6 +135,7 @@ private fun PreviewSoraCardSettingsCard() { state = SoraCardSettingsCardState( soraCardSettingsOptions = SoraCardSettingsOption.entries ), + main = SoraCardMainSoraContentCardState("$34 775.88", "+123123", false, emptyList()), onItemClick = { _ -> } ) } diff --git a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt index 2a4fb1f14..37b0cee1c 100644 --- a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt +++ b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt @@ -146,7 +146,7 @@ class GetSoraCardViewModelTest { fun `enable sora card EXPECT set up launcher`() = runTest { advanceUntilIdle() - viewModel.onEnableCard() + viewModel.onLogIn() assertNotNull(viewModel.launchSoraCardRegistration.value) } @@ -164,14 +164,4 @@ class GetSoraCardViewModelTest { verify(polkaswapRouter).showSwap(tokenToId = SubstrateOptionsProvider.feeAssetId) } - - @Test - fun `onSeeBlacklist EXPECT open web view`() = runTest { - given(resourceManager.getString(R.string.sora_card_blacklisted_countires_title)) - .willReturn("Title") - - viewModel.onSeeBlacklist() - - verify(mainRouter).showWebView("Title", "https://soracard.com/blacklist/") - } } diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt index 39a1e9f57..60966ff07 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt @@ -129,8 +129,7 @@ class WalletRepositoryImpl @Inject constructor( val card = CardsHubMapper.map(cardLocal) when (card?.cardType) { CardHubType.GET_SORA_CARD -> if (soraCard) card else null -// CardHubType.BUY_XOR_TOKEN -> if (soraCard) card else null - CardHubType.BUY_XOR_TOKEN -> null + CardHubType.BUY_XOR_TOKEN -> if (soraCard) card else null else -> card } } diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt index 1f402c213..d978d5a15 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt @@ -34,7 +34,6 @@ package jp.co.soramitsu.feature_wallet_impl.presentation.buycrypto import android.os.Bundle import android.view.View -import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.ScrollState import androidx.fragment.app.viewModels import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -68,7 +67,6 @@ class BuyCryptoFragment : SoraBaseFragment() { (activity as BottomBarController).hideBottomBar() } - @OptIn(ExperimentalAnimationApi::class) override fun NavGraphBuilder.content( scrollState: ScrollState, navController: NavHostController diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt index 3da1cdf80..7d22d3c2c 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt @@ -36,6 +36,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.CardHub @@ -51,7 +52,6 @@ import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.resourses.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.common_wallet.domain.model.CommonUserPoolData import jp.co.soramitsu.common_wallet.domain.model.fiatSymbol import jp.co.soramitsu.common_wallet.presentation.compose.states.AssetCardState @@ -81,6 +81,7 @@ import jp.co.soramitsu.feature_wallet_impl.domain.CardsHubInteractorImpl import jp.co.soramitsu.oauth.base.sdk.contract.OutwardsScreen import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardResult import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager @@ -445,6 +446,9 @@ class CardsHubViewModel @Inject constructor( fun onBuyCrypto() { if (!connectionManager.isConnected) return - assetsRouter.showBuyCrypto() +// assetsRouter.showBuyCrypto() + currentSoraCardContractData?.let { contract -> + _launchSoraCardSignIn.value = contract.copy(flow = SoraCardFlow.SoraCardGateHubFlow) + } } } diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt index 508e97b34..3caa937c8 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt @@ -59,21 +59,25 @@ import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter import jp.co.soramitsu.feature_referral_api.ReferralRouter +import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardAvailabilityInfo import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.feature_wallet_impl.domain.CardsHubInteractorImpl import jp.co.soramitsu.feature_wallet_impl.presentation.cardshub.CardsHubViewModel +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager import jp.co.soramitsu.test_data.PolkaswapTestData.POOL_DATA import jp.co.soramitsu.test_data.SoraCardTestData.soraCardBasicStatusTest import jp.co.soramitsu.test_data.TestAssets import jp.co.soramitsu.test_shared.MainCoroutineRule +import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test @@ -187,7 +191,12 @@ class CardsHubViewModelTest { every { coroutineManager.io } returns this.coroutineContext[CoroutineDispatcher]!! every { soraCardInteractor.basicStatus - } returns MutableStateFlow(soraCardBasicStatusTest.copy(initialized = true)) + } returns MutableStateFlow( + soraCardBasicStatusTest.copy( + initialized = true, + availabilityInfo = SoraCardAvailabilityInfo(), + ) + ) every { assetsRouter.showBuyCrypto(any()) } returns Unit every { mainRouter.showGetSoraCard(any()) } just Runs every { mainRouter.showSoraCardDetails() } just Runs @@ -218,7 +227,8 @@ class CardsHubViewModelTest { @Test fun `connection buy`() = runTest { cardsHubViewModel.onBuyCrypto() - verify { assetsRouter.showBuyCrypto(any()) } + val live = cardsHubViewModel.launchSoraCardSignIn.getOrAwaitValue() + assertTrue(live.flow is SoraCardFlow.SoraCardGateHubFlow) } @Test diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 95cc75f84..287d860d3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,9 @@ [versions] -agp = "8.3.1" +agp = "8.3.2" kotlin = "1.9.22" appcompat = "1.6.1" coroutines = "1.7.3" -coreKtx = "1.12.0" +coreKtx = "1.13.0" constraint = "2.2.0-alpha05" biometric = "1.1.0" navigation = "2.7.7" @@ -24,11 +24,11 @@ androidxTestExtJunit = "1.1.5" androidxTestEspressoCore = "3.5.1" archCoreTest = "2.2.0" archComponents = "2.7.0" -activityCompose = "1.8.2" +activityCompose = "1.9.0" material = "1.11.0" fragmentKtx = "1.6.2" permission = "1.7.1" -compose = "1.6.4" +compose = "1.6.6" composeViewModel = "2.7.0" composeLifecycle = "2.7.0" composeConstraintLayout = "1.1.0-alpha05" @@ -39,10 +39,10 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.0.8" +soracard = "1.1.0" xnetworking = "0.2.9" xsubstrate = "1.2.1" -uicore = "0.2.23" +uicore = "0.2.26" xbackup = "1.2.0" xcrypto = "1.2.1" ed = "2.0.1" @@ -55,7 +55,7 @@ webSocketLib = "2.14" web3j = "4.6.0-android" zXing = "3.3.3" zXingEmbedded = "4.3.0" -activityKtx = "1.8.2" +activityKtx = "1.9.0" xserializationjson = "1.6.0" gson = "2.10.1" datastore = "1.0.0" diff --git a/settings.gradle.kts b/settings.gradle.kts index 4c174b77e..27e6391e9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -38,6 +38,7 @@ dependencyResolutionManagement { password = secret("PAY_WINGS_PASSWORD") } } + mavenLocal() } } diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateCalls.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateCalls.kt index 700c9ac67..ffbfef51f 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateCalls.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateCalls.kt @@ -37,9 +37,9 @@ import java.math.BigInteger import javax.inject.Inject import javax.inject.Singleton import jp.co.soramitsu.androidfoundation.format.removeHexPrefix +import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.data.network.dto.TokenInfoDto import jp.co.soramitsu.common.logger.FirebaseWrapper -import jp.co.soramitsu.common.util.ext.safeCast import jp.co.soramitsu.common.util.ext.sumByBigInteger import jp.co.soramitsu.common_wallet.data.XorBalanceDto import jp.co.soramitsu.sora.substrate.models.BlockEvent diff --git a/test_data/src/main/java/jp/co/soramitsu/test_data/SoraCard.kt b/test_data/src/main/java/jp/co/soramitsu/test_data/SoraCard.kt index c9a40ec33..7914c3057 100644 --- a/test_data/src/main/java/jp/co/soramitsu/test_data/SoraCard.kt +++ b/test_data/src/main/java/jp/co/soramitsu/test_data/SoraCard.kt @@ -40,6 +40,7 @@ import jp.co.soramitsu.oauth.base.sdk.SoraCardKycCredentials import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardBasicContractData import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow object SoraCardTestData { @@ -51,6 +52,7 @@ object SoraCardTestData { needInstallUpdate = false, applicationFee = null, ibanInfo = null, + phone = null, ) private val SORA_CARD_BASIC_CONTRACT = SoraCardBasicContractData( @@ -65,47 +67,57 @@ object SoraCardTestData { basic = SORA_CARD_BASIC_CONTRACT, locale = Locale.ENGLISH, client = "test android client", - kycCredentials = SoraCardKycCredentials( - endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, - username = BuildConfig.SORA_CARD_KYC_USERNAME, - password = BuildConfig.SORA_CARD_KYC_PASSWORD, - ), - areAttemptsPaidSuccessfully = false, - isEnoughXorAvailable = false, - isIssuancePaid = false, - userAvailableXorAmount = 0.0, soraBackEndUrl = "soracard backend", + flow = SoraCardFlow.SoraCardKycFlow( + kycCredentials = SoraCardKycCredentials( + endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, + username = BuildConfig.SORA_CARD_KYC_USERNAME, + password = BuildConfig.SORA_CARD_KYC_PASSWORD, + ), + areAttemptsPaidSuccessfully = false, + isEnoughXorAvailable = false, + isIssuancePaid = false, + userAvailableXorAmount = 0.0, + logIn = false, + ), ) val registrationLauncher = SoraCardContractData( basic = SORA_CARD_BASIC_CONTRACT, locale = Locale.ENGLISH, - kycCredentials = SoraCardKycCredentials( - endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, - username = BuildConfig.SORA_CARD_KYC_USERNAME, - password = BuildConfig.SORA_CARD_KYC_PASSWORD, - ), - areAttemptsPaidSuccessfully = false, - isEnoughXorAvailable = false, - isIssuancePaid = false, client = "test android client", - userAvailableXorAmount = 0.0, soraBackEndUrl = "soracard backend", + flow = SoraCardFlow.SoraCardKycFlow( + kycCredentials = SoraCardKycCredentials( + endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, + username = BuildConfig.SORA_CARD_KYC_USERNAME, + password = BuildConfig.SORA_CARD_KYC_PASSWORD, + ), + areAttemptsPaidSuccessfully = false, + isEnoughXorAvailable = false, + isIssuancePaid = false, + userAvailableXorAmount = 0.0, + logIn = false, + ), ) val signInLauncher = SoraCardContractData( basic = SORA_CARD_BASIC_CONTRACT, locale = Locale.ENGLISH, - areAttemptsPaidSuccessfully = false, - isEnoughXorAvailable = false, - isIssuancePaid = false, client = "test android client", - kycCredentials = SoraCardKycCredentials( - endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, - username = BuildConfig.SORA_CARD_KYC_USERNAME, - password = BuildConfig.SORA_CARD_KYC_PASSWORD, - ), - userAvailableXorAmount = 0.0, soraBackEndUrl = "soracard backend", + flow = SoraCardFlow.SoraCardKycFlow( + areAttemptsPaidSuccessfully = false, + isEnoughXorAvailable = false, + isIssuancePaid = false, + kycCredentials = SoraCardKycCredentials( + endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, + username = BuildConfig.SORA_CARD_KYC_USERNAME, + password = BuildConfig.SORA_CARD_KYC_PASSWORD, + ), + userAvailableXorAmount = 0.0, + logIn = false, + ), + ) } From 64338bc94fcfc6a701088637df605c0cbefee819 Mon Sep 17 00:00:00 2001 From: arvifox Date: Thu, 2 May 2024 16:58:07 +0300 Subject: [PATCH 08/43] sca-193 --- .../soramitsu/common/presentation/compose/webview/WebView.kt | 2 +- .../presentation/details/SoraCardDetailsViewModel.kt | 2 +- gradle/libs.versions.toml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/webview/WebView.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/webview/WebView.kt index b325148ce..95974998e 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/webview/WebView.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/webview/WebView.kt @@ -68,7 +68,7 @@ fun WebView( onPageFinished() } } - + settings.domStorageEnabled = true settings.javaScriptEnabled = state.javaScriptEnabled loadUrl(state.url) } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index 736d2134f..32f4c5c48 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -167,7 +167,7 @@ class SoraCardDetailsViewModel @Inject constructor( val settings = soraCardDetailsScreenState.value.soraCardSettingsCard ?.soraCardSettingsOptions ?: return - when (settings[position]) { + when (settings[position - 1]) { SoraCardSettingsOption.LOG_OUT -> _soraCardDetailsScreenState.value = _soraCardDetailsScreenState.value.copy(logoutDialog = true) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 287d860d3..c4f9ab40c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,10 +39,10 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.1.0" +soracard = "1.1.1" xnetworking = "0.2.9" xsubstrate = "1.2.1" -uicore = "0.2.26" +uicore = "0.2.28" xbackup = "1.2.0" xcrypto = "1.2.1" ed = "2.0.1" From 52ae871a9369f2264ae4c433175e7008c0bd2da6 Mon Sep 17 00:00:00 2001 From: arvifox Date: Fri, 24 May 2024 18:54:26 +0300 Subject: [PATCH 09/43] sc-29 --- android-foundation | 2 +- common/build.gradle.kts | 1 + common_wallet/build.gradle.kts | 1 + feature_assets_api/build.gradle.kts | 1 + feature_assets_impl/build.gradle.kts | 1 + feature_blockexplorer_api/build.gradle.kts | 1 + feature_blockexplorer_impl/build.gradle.kts | 1 + feature_ecosystem_impl/build.gradle.kts | 1 + feature_main_impl/build.gradle.kts | 1 + .../presentation/profile/ProfileScreen.kt | 18 ++++---- .../presentation/profile/ProfileViewModel.kt | 8 ++-- .../profile/ProfileViewModelTest.kt | 8 +++- feature_multiaccount_impl/build.gradle.kts | 1 + feature_polkaswap_impl/build.gradle.kts | 1 + feature_referral_impl/build.gradle.kts | 1 + feature_select_node_impl/build.gradle.kts | 1 + .../util/SoraCardContractUtil.kt | 10 +++++ feature_sora_card_impl/build.gradle.kts | 1 + .../details/SoraCardDetailsFragment.kt | 9 ++++ .../details/SoraCardDetailsScreen.kt | 8 ++-- .../details/SoraCardDetailsViewModel.kt | 18 ++++++-- .../presentation/details/SoraCardIBANCard.kt | 12 +++--- feature_wallet_impl/build.gradle.kts | 1 + .../cardshub/CardsHubViewModel.kt | 40 ++++++++++------- .../presentation/cardshub/SoraCard.kt | 5 ++- .../wallet/CardsHubViewModelTest.kt | 5 ++- gradle/libs.versions.toml | 43 ++++++++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- 28 files changed, 135 insertions(+), 67 deletions(-) diff --git a/android-foundation b/android-foundation index 00af5dcbf..5fd8dd684 160000 --- a/android-foundation +++ b/android-foundation @@ -1 +1 @@ -Subproject commit 00af5dcbf5f461662a26d3f881dbd9989fc7cf07 +Subproject commit 5fd8dd6841793dffc89f7c68dd7621302cd67097 diff --git a/common/build.gradle.kts b/common/build.gradle.kts index d438141eb..cce065e90 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -205,6 +205,7 @@ dependencies { implementation(libs.coilComposeDep) implementation(libs.composeActivityDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeLiveDataDep) implementation(libs.composeFoundationDep) diff --git a/common_wallet/build.gradle.kts b/common_wallet/build.gradle.kts index 1b58908d3..81591dea0 100644 --- a/common_wallet/build.gradle.kts +++ b/common_wallet/build.gradle.kts @@ -113,6 +113,7 @@ dependencies { implementation(libs.coilComposeDep) implementation(libs.composeActivityDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeLiveDataDep) implementation(libs.composeFoundationDep) diff --git a/feature_assets_api/build.gradle.kts b/feature_assets_api/build.gradle.kts index 31d2117d3..c7487e56c 100644 --- a/feature_assets_api/build.gradle.kts +++ b/feature_assets_api/build.gradle.kts @@ -79,6 +79,7 @@ dependencies { implementation(libs.uiCoreDep) implementation(libs.hiltNavComposeDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) diff --git a/feature_assets_impl/build.gradle.kts b/feature_assets_impl/build.gradle.kts index bbcd8a95c..64660192c 100644 --- a/feature_assets_impl/build.gradle.kts +++ b/feature_assets_impl/build.gradle.kts @@ -121,6 +121,7 @@ dependencies { implementation(libs.uiCoreDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) diff --git a/feature_blockexplorer_api/build.gradle.kts b/feature_blockexplorer_api/build.gradle.kts index e8a7fe0e1..e88aff6e3 100644 --- a/feature_blockexplorer_api/build.gradle.kts +++ b/feature_blockexplorer_api/build.gradle.kts @@ -85,6 +85,7 @@ dependencies { implementation(libs.uiCoreDep) implementation(libs.navigationComposeDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeConstraintLayoutDep) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) diff --git a/feature_blockexplorer_impl/build.gradle.kts b/feature_blockexplorer_impl/build.gradle.kts index 66e68e984..6dd441f93 100644 --- a/feature_blockexplorer_impl/build.gradle.kts +++ b/feature_blockexplorer_impl/build.gradle.kts @@ -92,6 +92,7 @@ dependencies { implementation(libs.uiCoreDep) implementation(libs.navigationComposeDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeConstraintLayoutDep) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) diff --git a/feature_ecosystem_impl/build.gradle.kts b/feature_ecosystem_impl/build.gradle.kts index 878b579c8..7997903e1 100644 --- a/feature_ecosystem_impl/build.gradle.kts +++ b/feature_ecosystem_impl/build.gradle.kts @@ -111,6 +111,7 @@ dependencies { implementation(libs.uiCoreDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) diff --git a/feature_main_impl/build.gradle.kts b/feature_main_impl/build.gradle.kts index 41a2786b2..3107a6367 100644 --- a/feature_main_impl/build.gradle.kts +++ b/feature_main_impl/build.gradle.kts @@ -98,6 +98,7 @@ dependencies { implementation(libs.xbackupDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt index 56a8d68fe..49811a5e9 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt @@ -85,15 +85,15 @@ internal fun ProfileItems( icon = R.drawable.ic_buy_crypto, onClick = onSoraCardClick, ) -// CategoryItem( -// modifier = Modifier -// .testTagAsId("BuyXor") -// .padding(top = Dimens.x2), -// title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), -// subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), -// icon = R.drawable.ic_settings_buy_crypto, -// onClick = onBuyCrypto, -// ) + CategoryItem( + modifier = Modifier + .testTagAsId("BuyXor") + .padding(top = Dimens.x2), + title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), + subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), + icon = R.drawable.ic_settings_buy_crypto, + onClick = onBuyCrypto, + ) } CategoryItem( modifier = Modifier diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt index ba6c9bfa7..b035a3292 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt @@ -51,7 +51,9 @@ import jp.co.soramitsu.feature_select_node_api.NodeManager import jp.co.soramitsu.feature_select_node_api.SelectNodeRouter import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardContract +import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardGateHubContract import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter +import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus import jp.co.soramitsu.oauth.base.sdk.contract.OutwardsScreen import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData @@ -133,7 +135,7 @@ class ProfileViewModel @Inject constructor( _state.value = _state.value.copy( soraCardStatusStringRes = soraCardStatusStringRes, - soraCardIbanError = if (it.ibanInfo?.active == false) it.ibanInfo?.iban else null, + soraCardIbanError = if (it.ibanInfo?.ibanStatus == IbanStatus.OTHER) it.ibanInfo?.statusDescription else null, soraCardStatusIconDrawableRes = soraCardStatusIconDrawableRes, soraCardEnabled = soraConfigManager.getSoraCard(), soraCardNeedUpdate = it.needInstallUpdate, @@ -148,7 +150,7 @@ class ProfileViewModel @Inject constructor( fun showSoraCard() { if (soraCardInteractor.basicStatus.value.initialized) { - if (soraCardInteractor.basicStatus.value.ibanInfo?.active == true) + if (soraCardInteractor.basicStatus.value.ibanInfo != null && soraCardInteractor.basicStatus.value.ibanInfo?.ibanStatus != IbanStatus.OTHER) router.showSoraCardDetails() else when (soraCardInteractor.basicStatus.value.verification) { SoraCardCommonVerification.NotFound -> { @@ -200,7 +202,7 @@ class ProfileViewModel @Inject constructor( } fun showBuyCrypto() { - assetsRouter.showBuyCrypto() + _launchSoraCardSignIn.value = createSoraCardGateHubContract() } fun showSelectNode() { diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt index b85b0fec0..d878700f3 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt @@ -37,6 +37,8 @@ import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule +import io.mockk.just +import io.mockk.runs import io.mockk.verify import java.math.BigDecimal import jp.co.soramitsu.common.domain.ChainNode @@ -52,8 +54,10 @@ import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardAvailabilityInfo import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow import jp.co.soramitsu.test_data.SoraCardTestData.soraCardBasicStatusTest import jp.co.soramitsu.test_shared.MainCoroutineRule +import jp.co.soramitsu.test_shared.getOrAwaitValue import junit.framework.TestCase.assertEquals import junit.framework.TestCase.assertNotNull import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -151,6 +155,7 @@ class ProfileViewModelTest { coEvery { soraConfigManager.getSoraCard() } returns true every { nodeManager.connectionState } returns flowOf(true) every { router.showGetSoraCard(any(), any()) } returns Unit + every { router.showSoraCardDetails() } just runs every { assetsRouter.showBuyCrypto(any()) } returns Unit } @@ -192,6 +197,7 @@ class ProfileViewModelTest { fun `call showBuyCrypto EXPECT navigate to buy crypto screen`() { initViewModel() profileViewModel.showBuyCrypto() - verify { assetsRouter.showBuyCrypto(any()) } + val launch = profileViewModel.launchSoraCardSignIn.getOrAwaitValue() + assertEquals(SoraCardFlow.SoraCardGateHubFlow, launch.flow) } } diff --git a/feature_multiaccount_impl/build.gradle.kts b/feature_multiaccount_impl/build.gradle.kts index 2bdf9f531..daa0ba923 100644 --- a/feature_multiaccount_impl/build.gradle.kts +++ b/feature_multiaccount_impl/build.gradle.kts @@ -109,6 +109,7 @@ dependencies { implementation(libs.uiCoreDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) diff --git a/feature_polkaswap_impl/build.gradle.kts b/feature_polkaswap_impl/build.gradle.kts index e6bfe0f16..7cd599469 100644 --- a/feature_polkaswap_impl/build.gradle.kts +++ b/feature_polkaswap_impl/build.gradle.kts @@ -120,6 +120,7 @@ dependencies { implementation(libs.uiCoreDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) diff --git a/feature_referral_impl/build.gradle.kts b/feature_referral_impl/build.gradle.kts index e11437da6..1c83df8ea 100644 --- a/feature_referral_impl/build.gradle.kts +++ b/feature_referral_impl/build.gradle.kts @@ -90,6 +90,7 @@ dependencies { implementation(libs.uiCoreDep) implementation(libs.navigationComposeDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeConstraintLayoutDep) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) diff --git a/feature_select_node_impl/build.gradle.kts b/feature_select_node_impl/build.gradle.kts index c47ea0371..5344c9f7c 100644 --- a/feature_select_node_impl/build.gradle.kts +++ b/feature_select_node_impl/build.gradle.kts @@ -98,6 +98,7 @@ dependencies { implementation(libs.uiCoreDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) diff --git a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt index 94c70420d..28babb8bb 100644 --- a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt +++ b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt @@ -55,6 +55,16 @@ fun createSoraCardBasicContract() = SoraCardBasicContractData( recaptcha = BuildConfig.SORA_CARD_RECAPTCHA, ) +fun createSoraCardGateHubContract(): SoraCardContractData { + return SoraCardContractData( + basic = createSoraCardBasicContract(), + locale = Locale.ENGLISH, + soraBackEndUrl = BuildConfigWrapper.getSoraCardBackEndUrl(), + client = OptionsProvider.header, + flow = SoraCardFlow.SoraCardGateHubFlow, + ) +} + fun createSoraCardContract( userAvailableXorAmount: Double, isEnoughXorAvailable: Boolean, diff --git a/feature_sora_card_impl/build.gradle.kts b/feature_sora_card_impl/build.gradle.kts index d165d65e6..eafef2b60 100644 --- a/feature_sora_card_impl/build.gradle.kts +++ b/feature_sora_card_impl/build.gradle.kts @@ -100,6 +100,7 @@ dependencies { implementation(libs.timberDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt index 34d79d9fe..76d8b833e 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt @@ -59,6 +59,7 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContract import jp.co.soramitsu.ui_core.component.button.TextButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size @@ -70,9 +71,16 @@ class SoraCardDetailsFragment : SoraBaseFragment() { override val viewModel: SoraCardDetailsViewModel by viewModels() + private val soraCardLauncher = registerForActivityResult( + SoraCardContract() + ) { } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { (activity as BottomBarController).hideBottomBar() super.onViewCreated(view, savedInstanceState) + viewModel.launchSoraCard.observe { contract -> + soraCardLauncher.launch(contract) + } viewModel.shareLinkEvent.observe { share -> context?.let { c -> shareText(c, getString(R.string.common_share), share) @@ -115,6 +123,7 @@ class SoraCardDetailsFragment : SoraBaseFragment() { viewModel.onSettingsOptionClick(it) } }, + onExchangeXorClick = viewModel::onExchangeXorClick, ) if (state.value.logoutDialog) { AlertDialog( diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt index 5d4e8df77..f9ce6ab40 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt @@ -78,6 +78,7 @@ fun SoraCardDetailsScreen( onIbanCardShareClick: () -> Unit, onIbanCardClick: () -> Unit, onSettingsOptionClick: (position: Int) -> Unit, + onExchangeXorClick: () -> Unit, ) { Column( modifier = Modifier @@ -93,8 +94,8 @@ fun SoraCardDetailsScreen( soraCardMainSoraContentCardState = soraCardDetailsScreenState.soraCardMainSoraContentCardState, onShowMoreClick = onShowSoraCardDetailsClick, onIconButtonClick = onSoraCardMenuActionClick, - onExchangeXor = {}, - onOptionsClick = {}, + onExchangeXor = onExchangeXorClick, + onOptionsClick = { onSettingsOptionClick.invoke(0) }, ) if (soraCardDetailsScreenState.soraCardReferralBannerCardState) { BasicBannerCard( @@ -162,7 +163,7 @@ private fun PreviewSoraCardDetailsScreen() { ), soraCardIBANCardState = SoraCardIBANCardState( iban = "LT61 3250 0467 7252 5583", - active = true, + closed = false, ), soraCardSettingsCard = SoraCardSettingsCardState( soraCardSettingsOptions = SoraCardSettingsOption.entries @@ -179,6 +180,7 @@ private fun PreviewSoraCardDetailsScreen() { onIbanCardShareClick = {}, onIbanCardClick = {}, onSettingsOptionClick = { _ -> }, + onExchangeXorClick = {}, ) } } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index 32f4c5c48..110620bc3 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -45,7 +45,10 @@ import jp.co.soramitsu.common.presentation.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor +import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardGateHubContract import jp.co.soramitsu.oauth.base.sdk.contract.IbanInfo +import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData import jp.co.soramitsu.ui_core.component.toolbar.BasicToolbarState import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbarState import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbarType @@ -68,6 +71,9 @@ class SoraCardDetailsViewModel @Inject constructor( private var ibanCache: IbanInfo? = null + private val _launchSoraCard = SingleLiveEvent() + val launchSoraCard: LiveData = _launchSoraCard + private val _soraCardDetailsScreenState = MutableStateFlow( SoraCardDetailsScreenState( soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( @@ -78,7 +84,7 @@ class SoraCardDetailsViewModel @Inject constructor( soraCardSettingsCard = SoraCardSettingsCardState( soraCardSettingsOptions = SoraCardSettingsOption.entries, ), - soraCardIBANCardState = SoraCardIBANCardState(iban = "", active = true), + soraCardIBANCardState = SoraCardIBANCardState(iban = "", closed = false), logoutDialog = false, fiatWalletDialog = false, ) @@ -101,7 +107,7 @@ class SoraCardDetailsViewModel @Inject constructor( val local = _soraCardDetailsScreenState.value ibanCache = iban _soraCardDetailsScreenState.value = local.copy( - soraCardIBANCardState = SoraCardIBANCardState(iban.iban, iban.active), + soraCardIBANCardState = SoraCardIBANCardState(iban.iban, iban.ibanStatus == IbanStatus.CLOSED), soraCardMainSoraContentCardState = local.soraCardMainSoraContentCardState.copy( balance = iban.balance, phone = basicStatus.phone, @@ -139,13 +145,13 @@ class SoraCardDetailsViewModel @Inject constructor( fun onIbanCardShareClick() { ibanCache?.let { - if (it.active && it.iban.isNotEmpty()) _shareLinkEvent.value = it.iban + if (it.ibanStatus != IbanStatus.CLOSED && it.iban.isNotEmpty()) _shareLinkEvent.value = it.iban } } fun onIbanCardClick() { ibanCache?.let { - if (it.active && it.iban.isNotEmpty()) { + if (it.ibanStatus != IbanStatus.CLOSED && it.iban.isNotEmpty()) { clipboardManager.addToClipboard(it.iban) copiedToast.trigger() } @@ -163,6 +169,10 @@ class SoraCardDetailsViewModel @Inject constructor( } } + fun onExchangeXorClick() { + _launchSoraCard.value = createSoraCardGateHubContract() + } + fun onSettingsOptionClick(position: Int) { val settings = soraCardDetailsScreenState.value.soraCardSettingsCard ?.soraCardSettingsOptions ?: return diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt index 093bd8035..a2291d29d 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt @@ -64,7 +64,7 @@ import jp.co.soramitsu.ui_core.theme.customTypography data class SoraCardIBANCardState( val iban: String, - val active: Boolean, + val closed: Boolean, ) @Composable @@ -101,7 +101,7 @@ fun SoraCardIBANCard( color = MaterialTheme.customColors.fgPrimary, textAlign = TextAlign.Center ) - if (soraCardIBANCardState.iban.isNotEmpty() && soraCardIBANCardState.active) + if (soraCardIBANCardState.iban.isNotEmpty() && soraCardIBANCardState.closed.not()) Icon( modifier = Modifier .testTagAsId("IbanCardShareClick") @@ -112,7 +112,7 @@ fun SoraCardIBANCard( tint = MaterialTheme.customColors.fgSecondary ) } - if (soraCardIBANCardState.active.not()) { + if (soraCardIBANCardState.closed) { Text( modifier = Modifier.fillMaxWidth().padding(all = Dimens.x1), text = underlineSubstring(stringResource(id = jp.co.soramitsu.oauth.R.string.iban_frozen_description, ClientsFacade.TECH_SUPPORT), ClientsFacade.TECH_SUPPORT), @@ -147,7 +147,7 @@ private fun PreviewSoraCardIBANCard01() { SoraCardIBANCard( soraCardIBANCardState = SoraCardIBANCardState( iban = "LT61 3250 0467 7252 5583", - active = true, + closed = false, ), onShareClick = {}, onCardClick = {}, @@ -160,7 +160,7 @@ private fun PreviewSoraCardIBANCard02() { SoraCardIBANCard( soraCardIBANCardState = SoraCardIBANCardState( iban = "", - active = true, + closed = false, ), onShareClick = {}, onCardClick = {}, @@ -173,7 +173,7 @@ private fun PreviewSoraCardIBANCard03() { SoraCardIBANCard( soraCardIBANCardState = SoraCardIBANCardState( iban = "", - active = false, + closed = true, ), onShareClick = {}, onCardClick = {}, diff --git a/feature_wallet_impl/build.gradle.kts b/feature_wallet_impl/build.gradle.kts index 641a39e7b..0abece6bf 100644 --- a/feature_wallet_impl/build.gradle.kts +++ b/feature_wallet_impl/build.gradle.kts @@ -128,6 +128,7 @@ dependencies { implementation(libs.uiCoreDep) + implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt index 7d22d3c2c..8d9abdf24 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt @@ -76,12 +76,13 @@ import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter import jp.co.soramitsu.feature_referral_api.ReferralRouter import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardContract +import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardGateHubContract import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.feature_wallet_impl.domain.CardsHubInteractorImpl +import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus import jp.co.soramitsu.oauth.base.sdk.contract.OutwardsScreen import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData -import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardResult import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager @@ -158,17 +159,20 @@ class CardsHubViewModel @Inject constructor( } CardHubType.POOLS -> { - val poolsFlow = poolsInteractor.subscribePoolsCacheOfAccount(data.first) - .onStart { - if (indexed.index == 0) this.emit(emptyList()) - } - val demeterFlow = demeterFarmingInteractor.subscribeFarms(data.first.substrateAddress) - .onStart { - this.emit("") - } + val poolsFlow = + poolsInteractor.subscribePoolsCacheOfAccount(data.first) + .onStart { + if (indexed.index == 0) this.emit(emptyList()) + } + val demeterFlow = + demeterFarmingInteractor.subscribeFarms(data.first.substrateAddress) + .onStart { + this.emit("") + } poolsFlow.combine(demeterFlow) { f1, _ -> f1 } .map { list -> - val farms = demeterFarmingInteractor.getFarmedPools() ?: emptyList() + val farms = + demeterFarmingInteractor.getFarmedPools() ?: emptyList() cardHub to ((list.filter { it.user.favorite }) to farms) } } @@ -341,7 +345,10 @@ class CardsHubViewModel @Inject constructor( ) } - private fun mapPoolsCard(collapsed: Boolean, pools: Pair, List>): CardState { + private fun mapPoolsCard( + collapsed: Boolean, + pools: Pair, List> + ): CardState { val rewardTokensList = pools.first.map { pool -> pools.second.filter { it.tokenBase.id == pool.basic.baseToken.id && it.tokenTarget.id == pool.basic.targetToken.id @@ -387,7 +394,7 @@ class CardsHubViewModel @Inject constructor( fun onCardStateClicked() { if (soraCardInteractor.basicStatus.value.initialized) { _state.value.cards.filterIsInstance().firstOrNull()?.let { card -> - if (card.ibanBalance?.active == true) { + if (card.ibanBalance?.ibanStatus != IbanStatus.OTHER) { mainRouter.showSoraCardDetails() } else if (card.kycStatus == null) { if (!connectionManager.isConnected) return @@ -446,9 +453,12 @@ class CardsHubViewModel @Inject constructor( fun onBuyCrypto() { if (!connectionManager.isConnected) return -// assetsRouter.showBuyCrypto() - currentSoraCardContractData?.let { contract -> - _launchSoraCardSignIn.value = contract.copy(flow = SoraCardFlow.SoraCardGateHubFlow) + if (soraCardInteractor.basicStatus.value.initialized) { + _state.value.cards.filterIsInstance().firstOrNull()?.let { card -> + if (card.ibanBalance?.ibanStatus == IbanStatus.ACTIVE) { + _launchSoraCardSignIn.value = createSoraCardGateHubContract() + } + } } } } diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt index b3f1269ca..2fdaed746 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt @@ -64,6 +64,7 @@ import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme import jp.co.soramitsu.common.util.ext.testTagAsId import jp.co.soramitsu.common_wallet.presentation.compose.states.SoraCardState import jp.co.soramitsu.oauth.base.sdk.contract.IbanInfo +import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus import jp.co.soramitsu.ui_core.component.button.BleachedButton import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.TonalButton @@ -187,7 +188,7 @@ private fun CardStateButton( size = Size.ExtraSmall, order = Order.SECONDARY, onClick = onCardStateClicked, - text = if (ibanInfo.active) ibanInfo.balance else ibanInfo.iban, + text = if (ibanInfo.ibanStatus != IbanStatus.CLOSED) ibanInfo.balance else ibanInfo.statusDescription, ) } else if (kycStatus == null) { FilledButton( @@ -319,7 +320,7 @@ private fun PreviewSoraCard6() { modifier = Modifier.fillMaxWidth(), state = SoraCardState( kycStatus = null, - ibanBalance = IbanInfo(iban = "abcderr", active = true, balance = "45.5"), + ibanBalance = IbanInfo(iban = "abcderr", ibanStatus = IbanStatus.ACTIVE, balance = "45.5", ""), loading = false, success = false, needUpdate = false, diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt index 3caa937c8..546648f58 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt @@ -64,6 +64,8 @@ import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.feature_wallet_impl.domain.CardsHubInteractorImpl import jp.co.soramitsu.feature_wallet_impl.presentation.cardshub.CardsHubViewModel +import jp.co.soramitsu.oauth.base.sdk.contract.IbanInfo +import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager import jp.co.soramitsu.test_data.PolkaswapTestData.POOL_DATA @@ -195,6 +197,7 @@ class CardsHubViewModelTest { soraCardBasicStatusTest.copy( initialized = true, availabilityInfo = SoraCardAvailabilityInfo(), + ibanInfo = IbanInfo("iban", IbanStatus.ACTIVE, "123", "empty") ) ) every { assetsRouter.showBuyCrypto(any()) } returns Unit @@ -260,6 +263,6 @@ class CardsHubViewModelTest { advanceUntilIdle() cardsHubViewModel.onCardStateClicked() advanceUntilIdle() - verify { mainRouter.showGetSoraCard(any(), any()) } + verify { mainRouter.showSoraCardDetails() } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c4f9ab40c..8c2f8dd86 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,9 @@ [versions] -agp = "8.3.2" +agp = "8.4.1" kotlin = "1.9.22" appcompat = "1.6.1" coroutines = "1.7.3" -coreKtx = "1.13.0" +coreKtx = "1.13.1" constraint = "2.2.0-alpha05" biometric = "1.1.0" navigation = "2.7.7" @@ -14,10 +14,10 @@ workManager = "2.9.0" coil = "2.2.2" svg = "1.4" jdenticon = "1.1" -archFragmentTest = "1.6.2" +archFragmentTest = "1.7.1" mockk = "1.13.8" truth = "1.1.5" -mockitoKotlin = "5.1.0" +mockitoKotlin = "5.2.1" mockito = "5.2.0" junit = "4.13.2" androidxTestExtJunit = "1.1.5" @@ -25,10 +25,10 @@ androidxTestEspressoCore = "3.5.1" archCoreTest = "2.2.0" archComponents = "2.7.0" activityCompose = "1.9.0" -material = "1.11.0" -fragmentKtx = "1.6.2" +material = "1.12.0" +fragmentKtx = "1.7.1" permission = "1.7.1" -compose = "1.6.6" +compose-bom = "2024.05.00" composeViewModel = "2.7.0" composeLifecycle = "2.7.0" composeConstraintLayout = "1.1.0-alpha05" @@ -39,10 +39,10 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.1.1" +soracard = "1.1.6" xnetworking = "0.2.9" xsubstrate = "1.2.1" -uicore = "0.2.28" +uicore = "0.2.30" xbackup = "1.2.0" xcrypto = "1.2.1" ed = "2.0.1" @@ -56,7 +56,7 @@ web3j = "4.6.0-android" zXing = "3.3.3" zXingEmbedded = "4.3.0" activityKtx = "1.9.0" -xserializationjson = "1.6.0" +xserializationjson = "1.6.3" gson = "2.10.1" datastore = "1.0.0" room = "2.6.1" @@ -129,19 +129,20 @@ androidxTestEspressoCoreDep = { module = "androidx.test.espresso:espresso-core", archCoreTestDep = { module = "androidx.arch.core:core-testing", version.ref = "archCoreTest" } composeActivityDep = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" } materialDep = { group = "com.google.android.material", name = "material", version.ref = "material" } -composeRuntimeDep = { group = "androidx.compose.runtime", name = "runtime", version.ref = "compose" } -composeUiDep = { group = "androidx.compose.ui", name = "ui", version.ref = "compose" } -composeViewModelDep = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "composeViewModel" } +compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } +composeRuntimeDep = { group = "androidx.compose.runtime", name = "runtime" } +composeUiDep = { group = "androidx.compose.ui", name = "ui" } +composeViewModelDep = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose" } composeLifecycleDep = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "composeLifecycle" } -composeLiveDataDep = { group = "androidx.compose.runtime", name = "runtime-livedata", version.ref = "compose" } -composeFoundationDep = { group = "androidx.compose.foundation", name = "foundation", version.ref = "compose" } -composeToolingDep = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "compose" } -composeToolingPreviewDep = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "compose" } -composeMaterialDep = { group = "androidx.compose.material", name = "material", version.ref = "compose" } -composeAnimationDep = { group = "androidx.compose.animation", name = "animation", version.ref = "compose" } -composeAnimationGraphicsDep = { group = "androidx.compose.animation", name = "animation-graphics", version.ref = "compose" } +composeLiveDataDep = { group = "androidx.compose.runtime", name = "runtime-livedata" } +composeFoundationDep = { group = "androidx.compose.foundation", name = "foundation" } +composeToolingDep = { group = "androidx.compose.ui", name = "ui-tooling" } +composeToolingPreviewDep = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +composeMaterialDep = { group = "androidx.compose.material", name = "material" } +composeAnimationDep = { group = "androidx.compose.animation", name = "animation" } +composeAnimationGraphicsDep = { group = "androidx.compose.animation", name = "animation-graphics" } composeConstraintLayoutDep = { group = "androidx.constraintlayout", name = "constraintlayout-compose", version.ref = "composeConstraintLayout" } -composeUiGraphicsDep = { group = "androidx.compose.ui", name = "ui-graphics", version.ref = "compose" } +composeUiGraphicsDep = { group = "androidx.compose.ui", name = "ui-graphics" } #ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } #ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } #androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dbb0a111f..c32cb774b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Jan 13 13:13:48 MSK 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From a4577ba0bdc26d470b9ab35606d6d02198426a62 Mon Sep 17 00:00:00 2001 From: arvifox Date: Mon, 27 May 2024 14:37:47 +0300 Subject: [PATCH 10/43] sc-29 to check CI --- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8c2f8dd86..4ef15018e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.4.1" +agp = "8.3.2" kotlin = "1.9.22" appcompat = "1.6.1" coroutines = "1.7.3" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c32cb774b..dbb0a111f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Jan 13 13:13:48 MSK 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From ac0c859941390f573f3d356a6edbf61437bd46ff Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 28 May 2024 10:21:28 +0300 Subject: [PATCH 11/43] sc-29 --- android-foundation | 2 +- app/build.gradle.kts | 1 - .../main/java/jp/co/soramitsu/sora/SoraApp.kt | 2 +- .../splash/presentation/SplashActivity.kt | 4 - .../splash/presentation/SplashViewModel.kt | 18 +-- .../presentation/SplashViewModelTest.kt | 28 ----- build.gradle.kts | 2 +- common/build.gradle.kts | 2 +- .../common/account/AccountAvatarGenerator.kt | 2 +- .../common/date/DateTimeFormatter.kt | 2 +- .../common/di/modules/CommonModule.kt | 2 +- .../soramitsu/common/domain/SoraException.kt | 2 +- .../common/domain/SuspendableProperty.kt | 58 --------- .../common/presentation/SingleLiveEvent.kt | 91 -------------- .../compose/components/AssetAmount.kt | 2 +- .../compose/components/BasicBannerCard.kt | 2 +- .../compose/components/PolkaswapDisclaimer.kt | 2 +- .../compose/components/Toolbar.kt | 2 +- .../presentation/viewmodel/BaseViewModel.kt | 4 +- .../common/resourses/ResourceManager.kt | 112 ----------------- .../soramitsu/common/util/TestTagCompose.kt | 8 ++ .../soramitsu/common/util/ext/ContextExt.kt | 8 -- .../co/soramitsu/common/util/ext/Modifier.kt | 22 ---- .../soramitsu/common/view/AmountCardIcon.kt | 2 +- .../common/date/DateFormatterTest.kt | 2 +- .../common/domain/SoraExceptionTest.kt | 2 +- common_wallet/build.gradle.kts | 2 +- .../compose/components/AssetItem.kt | 2 +- core_db/build.gradle.kts | 2 +- core_di/.gitignore | 1 - core_di/build.gradle.kts | 56 --------- core_di/src/main/AndroidManifest.xml | 1 - .../viewmodel/CustomViewModelFactory.kt | 46 ------- demeter/build.gradle.kts | 2 +- .../co/soramitsu/demeter/di/DemeterModule.kt | 2 +- feature_account_api/build.gradle.kts | 2 +- feature_account_impl/build.gradle.kts | 2 +- feature_assets_api/build.gradle.kts | 2 +- feature_assets_impl/build.gradle.kts | 3 +- .../assetdetails/AssetDetailsBalanceCard.kt | 2 +- .../compose/send/SendConfirmScreen.kt | 2 +- .../components/compose/send/SendScreen.kt | 2 +- .../assetdetails/AssetDetailsFragment.kt | 2 +- .../assetdetails/AssetDetailsViewModel.kt | 4 +- .../receiverequest/QRCodeFlowViewModel.kt | 4 +- .../screens/send/TransferAmountFragment.kt | 2 +- .../screens/send/TransferAmountViewModel.kt | 6 +- .../screens/txlist/TxListFragment.kt | 2 +- .../qr/QrCodeFlowViewModelTest.kt | 2 +- .../send/TransferAmountViewModelTest.kt | 2 +- .../txlist/AssetSettingsViewModelTest.kt | 2 +- feature_blockexplorer_api/build.gradle.kts | 2 +- .../presentation/txdetails/BasicTxDetails.kt | 2 +- feature_blockexplorer_impl/build.gradle.kts | 3 +- .../data/TransactionHistoryRepositoryImpl.kt | 2 +- .../domain/TransactionHistoryHandlerImpl.kt | 2 +- .../txdetails/TxDetailsFragment.kt | 2 +- .../txdetails/TxDetailsViewModel.kt | 4 +- .../txhistory/TransactionMappersImpl.kt | 2 +- .../TransactionMappersTest.kt | 2 +- .../domain/TransactionHistoryHandlerTest.kt | 2 +- .../txdetails/TxDetailsViewModelTest.kt | 2 +- feature_ecosystem_impl/build.gradle.kts | 3 +- .../alldemeter/AllDemeterViewModel.kt | 2 +- .../claimdemeter/ClaimDemeterFragment.kt | 2 +- .../claimdemeter/ClaimDemeterViewModel.kt | 2 +- .../presentation/editfarm/EditFarmFragment.kt | 2 +- .../editfarm/EditFarmViewModel.kt | 2 +- .../presentation/explore/ExploreViewModel.kt | 2 +- .../farmdetails/FarmDetailsFragment.kt | 2 +- .../farmdetails/FarmDetailsScreen.kt | 2 +- .../farmdetails/FarmDetailsViewModel.kt | 2 +- .../explore/ExploreViewModelTest.kt | 2 +- feature_ethereum_api/build.gradle.kts | 2 +- feature_ethereum_impl/build.gradle.kts | 2 +- feature_main_api/build.gradle.kts | 2 +- feature_main_impl/build.gradle.kts | 2 +- .../consumer-rules.pro | 0 .../proguard-rules.pro | 0 .../presentation/MainViewModel.kt | 2 +- .../language/SelectLanguageViewModel.kt | 4 +- .../presentation/pincode/PinCodeViewModel.kt | 6 +- .../presentation/pincode/PincodeFragment.kt | 2 +- .../presentation/pincode/PincodeScreen.kt | 2 +- .../presentation/profile/ProfileScreen.kt | 2 +- .../presentation/profile/ProfileViewModel.kt | 2 +- .../profile/debugmenu/DebugMenuFragment.kt | 22 ---- .../profile/debugmenu/DebugMenuViewModel.kt | 4 +- .../debugmenu/NewHistoryEventsWorker.kt | 114 ------------------ .../information/InformationViewModel.kt | 2 +- .../language/SelectLanguageViewModelTest.kt | 2 +- .../pincode/PinCodeViewModelTest.kt | 2 +- feature_multiaccount_api/build.gradle.kts | 2 +- .../MultiaccountStarter.kt | 2 - feature_multiaccount_impl/build.gradle.kts | 3 +- feature_multiaccount_impl/consumer-rules.pro | 0 feature_multiaccount_impl/proguard-rules.pro | 21 ++++ .../MultiaccountStarterImpl.kt | 4 - .../presentation/OnboardingActivity.kt | 22 ---- .../presentation/OnboardingViewModel.kt | 4 +- .../account_details/AccountDetailsFragment.kt | 2 +- .../account_details/AccountDetailsScreen.kt | 2 +- .../AccountDetailsScreenBasic.kt | 2 +- .../AccountDetailsViewModel.kt | 6 +- .../account_list/AccountListFragment.kt | 2 +- .../account_list/AccountListMenu.kt | 2 +- .../account_list/AccountListScreen.kt | 2 +- .../account_list/AccountListViewModel.kt | 4 +- .../export_account/backup/BackupFragment.kt | 2 +- .../export_account/backup/BackupScreen.kt | 2 +- .../export_account/backup/BackupViewModel.kt | 4 +- .../backup/json/BackupJsonFragment.kt | 2 +- .../protection/ExportProtectionFragment.kt | 2 +- .../presentation/tutorial/TutorialScreen.kt | 2 +- .../OnboardingViewModelTest.kt | 2 +- .../AccountDetailsViewModelTest.kt | 2 +- .../export/backup/BackupViewModelTest.kt | 2 +- feature_polkaswap_api/build.gradle.kts | 2 +- feature_polkaswap_impl/build.gradle.kts | 3 +- .../domain/SwapInteractorImpl.kt | 2 +- .../components/compose/LiquidityAddScreen.kt | 2 +- .../compose/LiquidityRemoveScreen.kt | 2 +- .../components/compose/SwapMainScreen.kt | 2 +- .../compose/SwapMarketSlippageSelector.kt | 2 +- .../components/compose/SwapMarketsScreen.kt | 2 +- .../liquidityadd/LiquidityAddFragment.kt | 2 +- .../liquidityadd/LiquidityAddViewModel.kt | 4 +- .../LiquidityRemoveFragment.kt | 2 +- .../LiquidityRemoveViewModel.kt | 2 +- .../pooldetails/PoolDetailsFragment.kt | 2 +- .../pooldetails/PoolDetailsViewModel.kt | 2 +- .../presentation/screens/swap/SwapFragment.kt | 2 +- .../screens/swap/SwapViewModel.kt | 8 +- .../polkaswap/SwapViewModelTest.kt | 2 +- .../add/AddLiquidityViewModelTest.kt | 2 +- .../remove/RemoveLiquidityViewModelTest.kt | 2 +- feature_referral_api/build.gradle.kts | 2 +- feature_referral_impl/build.gradle.kts | 2 +- .../ReferralAvailableInvitations.kt | 2 +- .../presentation/ReferralBondUnbondXor.kt | 2 +- .../presentation/ReferralButtons.kt | 2 +- .../presentation/ReferralViewModel.kt | 4 +- .../presentation/ReferrerFilled.kt | 2 +- .../presentation/ReferrerInput.kt | 2 +- .../presentation/YourReferrerCard.kt | 2 +- .../presentation/ReferralViewModelTest.kt | 2 +- feature_select_node_api/build.gradle.kts | 2 +- feature_select_node_impl/build.gradle.kts | 3 +- .../details/NodeDetailsFragment.kt | 2 +- .../details/NodeDetailsViewModel.kt | 2 +- .../select/SelectNodeViewModel.kt | 2 +- .../details/NodeDetailsViewModelTest.kt | 2 +- .../select/SelectNodeViewModelTest.kt | 2 +- feature_sora_card_api/build.gradle.kts | 2 +- feature_sora_card_impl/build.gradle.kts | 3 +- .../presentation/GetSoraCardFragment.kt | 2 +- .../presentation/GetSoraCardScreen.kt | 2 +- .../presentation/GetSoraCardViewModel.kt | 4 +- .../presentation/details/ListTile.kt | 2 +- .../details/SoraCardDetailsViewModel.kt | 4 +- .../presentation/details/SoraCardIBANCard.kt | 2 +- .../get/card/GetSoraCardViewModelTest.kt | 2 +- feature_wallet_api/build.gradle.kts | 2 +- feature_wallet_impl/build.gradle.kts | 3 +- feature_wallet_impl/consumer-rules.pro | 0 feature_wallet_impl/proguard-rules.pro | 21 ++++ .../buycrypto/BuyCryptoFragment.kt | 2 +- .../cardshub/CardsHubViewModel.kt | 4 +- .../presentation/cardshub/SoraCard.kt | 2 +- .../presentation/claim/ClaimViewModel.kt | 2 +- .../presentation/contacts/ContactsScreen.kt | 2 +- .../contacts/ContactsViewModel.kt | 2 +- .../presentation/claim/ClaimViewModelTest.kt | 2 +- .../contacts/ContactsViewModelTest.kt | 2 +- .../wallet/CardsHubViewModelTest.kt | 2 +- gradle.properties | 2 +- gradle/libs.versions.toml | 10 +- gradle/wrapper/gradle-wrapper.properties | 2 +- network/build.gradle.kts | 2 +- settings.gradle.kts | 1 - sorasubstrate/build.gradle.kts | 2 +- .../substrate/substrate/RequestExecutor.kt | 2 +- test_data/build.gradle.kts | 2 +- test_shared/build.gradle.kts | 2 +- .../jp/co/soramitsu/test_shared/Resources.kt | 47 -------- 185 files changed, 237 insertions(+), 849 deletions(-) delete mode 100644 common/src/main/java/jp/co/soramitsu/common/domain/SuspendableProperty.kt delete mode 100644 common/src/main/java/jp/co/soramitsu/common/presentation/SingleLiveEvent.kt delete mode 100644 common/src/main/java/jp/co/soramitsu/common/resourses/ResourceManager.kt create mode 100644 common/src/main/java/jp/co/soramitsu/common/util/TestTagCompose.kt delete mode 100644 core_di/.gitignore delete mode 100644 core_di/build.gradle.kts delete mode 100644 core_di/src/main/AndroidManifest.xml delete mode 100644 core_di/src/main/java/jp/co/soramitsu/core_di/viewmodel/CustomViewModelFactory.kt rename {core_di => feature_main_impl}/consumer-rules.pro (100%) rename {core_di => feature_main_impl}/proguard-rules.pro (100%) delete mode 100644 feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/NewHistoryEventsWorker.kt create mode 100644 feature_multiaccount_impl/consumer-rules.pro create mode 100644 feature_multiaccount_impl/proguard-rules.pro create mode 100644 feature_wallet_impl/consumer-rules.pro create mode 100644 feature_wallet_impl/proguard-rules.pro delete mode 100644 test_shared/src/main/java/jp/co/soramitsu/test_shared/Resources.kt diff --git a/android-foundation b/android-foundation index 5fd8dd684..cc69d1432 160000 --- a/android-foundation +++ b/android-foundation @@ -1 +1 @@ -Subproject commit 5fd8dd6841793dffc89f7c68dd7621302cd67097 +Subproject commit cc69d1432498c87b92b362480b0bbcb75925a8a7 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2fad01d7f..808b81fa9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -241,7 +241,6 @@ dependencies { kover(project(":common")) kover(project(":common_wallet")) kover(project(":core_db")) - kover(project(":core_di")) kover(project(":demeter")) kover(project(":feature_account_api")) kover(project(":feature_account_impl")) diff --git a/app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt b/app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt index c23840356..8db074497 100644 --- a/app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt +++ b/app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt @@ -44,7 +44,7 @@ import javax.inject.Inject import jp.co.soramitsu.common.domain.DarkThemeManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.io.FileManager -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.BuildType import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.common.util.Flavor diff --git a/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashActivity.kt b/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashActivity.kt index 4212639fb..218ff087f 100644 --- a/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashActivity.kt +++ b/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashActivity.kt @@ -102,10 +102,6 @@ class SplashActivity : AppCompatActivity() { splashViewModel.showOnBoardingScreen.observe(this) { multiaccStarter.startOnboardingFlow(this) } - splashViewModel.showOnBoardingScreenViaInviteLink.observe(this) { - multiaccStarter.startOnboardingFlowWithInviteLink(this) - finish() - } splashViewModel.showMainScreenFromInviteLink.observe(this) { mainStarter.startWithInvite(this) finish() diff --git a/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt b/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt index dd6533390..e0e7b0f22 100644 --- a/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt +++ b/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt @@ -38,8 +38,8 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import jp.co.soramitsu.common.logger.FirebaseWrapper -import jp.co.soramitsu.common.presentation.SingleLiveEvent -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_account_api.domain.model.OnboardingState import jp.co.soramitsu.sora.splash.domain.SplashInteractor @@ -58,7 +58,6 @@ class SplashViewModel @Inject constructor( val showMainScreen = SingleLiveEvent() val showOnBoardingScreen = SingleLiveEvent() - val showOnBoardingScreenViaInviteLink = SingleLiveEvent() val showMainScreenFromInviteLink = SingleLiveEvent() init { @@ -93,17 +92,4 @@ class SplashViewModel @Inject constructor( } } } - - fun handleDeepLink(invitationCode: String) { - viewModelScope.launch { - val state = interactor.getRegistrationState() - interactor.saveInviteCode(invitationCode) - - if (OnboardingState.INITIAL == state) { - showOnBoardingScreenViaInviteLink.trigger() - } else { - showMainScreenFromInviteLink.trigger() - } - } - } } diff --git a/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt b/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt index e64c4c980..b6e1d7114 100644 --- a/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt +++ b/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt @@ -100,32 +100,4 @@ class SplashViewModelTest { val r = splashViewModel.showOnBoardingScreen.getOrAwaitValue() assertEquals(OnboardingState.INITIAL, r) } - - @Test - fun `handleDeepLink before registration called`() = runTest { - val state = OnboardingState.INITIAL - val invitationCode = "INVITATION_CODE" - - given(interactor.getRegistrationState()).willReturn(state) - - splashViewModel.handleDeepLink(invitationCode) - advanceUntilIdle() - verify(interactor).saveInviteCode(invitationCode) - val r = splashViewModel.showOnBoardingScreenViaInviteLink.getOrAwaitValue() - assertEquals(Unit, r) - } - - @Test - fun `handleDeepLink after registration called`() = runTest { - val state = OnboardingState.REGISTRATION_FINISHED - val invitationCode = "INVITATION_CODE" - - given(interactor.getRegistrationState()).willReturn(state) - - splashViewModel.handleDeepLink(invitationCode) - advanceUntilIdle() - verify(interactor).saveInviteCode(invitationCode) - val r = splashViewModel.showMainScreenFromInviteLink.getOrAwaitValue() - assertEquals(Unit, r) - } } diff --git a/build.gradle.kts b/build.gradle.kts index 736222178..be00f5677 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { alias(libs.plugins.firebaseCrashlyticsPlugin) apply false alias(libs.plugins.firebaseAppDistributionPlugin) apply false alias(libs.plugins.triplet) apply false - id("com.google.devtools.ksp") version "1.9.22-1.0.17" apply false + id("com.google.devtools.ksp") version "1.9.24-1.0.20" apply false id("org.jetbrains.kotlinx.kover") version "0.7.5" } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index cce065e90..2de1eec91 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -50,7 +50,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/common/src/main/java/jp/co/soramitsu/common/account/AccountAvatarGenerator.kt b/common/src/main/java/jp/co/soramitsu/common/account/AccountAvatarGenerator.kt index ac600e8cc..8c5b48267 100644 --- a/common/src/main/java/jp/co/soramitsu/common/account/AccountAvatarGenerator.kt +++ b/common/src/main/java/jp/co/soramitsu/common/account/AccountAvatarGenerator.kt @@ -36,7 +36,7 @@ import android.graphics.drawable.PictureDrawable import com.caverock.androidsvg.SVG import javax.inject.Singleton import jdenticon.Jdenticon -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.xcrypto.util.toHexString import jp.co.soramitsu.xsubstrate.ss58.SS58Encoder.toAccountId diff --git a/common/src/main/java/jp/co/soramitsu/common/date/DateTimeFormatter.kt b/common/src/main/java/jp/co/soramitsu/common/date/DateTimeFormatter.kt index 91847344d..c7105790c 100644 --- a/common/src/main/java/jp/co/soramitsu/common/date/DateTimeFormatter.kt +++ b/common/src/main/java/jp/co/soramitsu/common/date/DateTimeFormatter.kt @@ -34,13 +34,13 @@ package jp.co.soramitsu.common.date import android.content.Context import android.text.format.DateUtils +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date import java.util.concurrent.TimeUnit import jp.co.soramitsu.common.R import jp.co.soramitsu.common.resourses.LanguagesHolder -import jp.co.soramitsu.common.resourses.ResourceManager class DateTimeFormatter( private val languagesHolder: LanguagesHolder, diff --git a/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt b/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt index fd74473e3..9cfa97e8e 100644 --- a/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt +++ b/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt @@ -53,6 +53,7 @@ import java.util.Locale import java.util.TimeZone import javax.inject.Singleton import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.BuildConfig import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.data.AppStateProviderImpl @@ -71,7 +72,6 @@ import jp.co.soramitsu.common.interfaces.WithProgress import jp.co.soramitsu.common.io.FileManager import jp.co.soramitsu.common.io.FileManagerImpl import jp.co.soramitsu.common.resourses.LanguagesHolder -import jp.co.soramitsu.common.resourses.ResourceManager import jp.co.soramitsu.common.util.CryptoAssistant import jp.co.soramitsu.common.util.DeviceParamsProvider import jp.co.soramitsu.common.util.EncryptionUtil diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/SoraException.kt b/common/src/main/java/jp/co/soramitsu/common/domain/SoraException.kt index 7796e88c0..88bebc35f 100644 --- a/common/src/main/java/jp/co/soramitsu/common/domain/SoraException.kt +++ b/common/src/main/java/jp/co/soramitsu/common/domain/SoraException.kt @@ -32,8 +32,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.domain +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.resourses.ResourceManager class SoraException( val kind: Kind, diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/SuspendableProperty.kt b/common/src/main/java/jp/co/soramitsu/common/domain/SuspendableProperty.kt deleted file mode 100644 index 820a30ef5..000000000 --- a/common/src/main/java/jp/co/soramitsu/common/domain/SuspendableProperty.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.common.domain - -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.channels.BufferOverflow -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.flow.first - -@ExperimentalCoroutinesApi -class SuspendableProperty(r: Int) { - private val value = - MutableSharedFlow(replay = r, onBufferOverflow = BufferOverflow.DROP_OLDEST) - - fun invalidate() { - value.resetReplayCache() - } - - fun set(new: T) { - value.tryEmit(new) // always successful, since BufferOverflow.DROP_OLDEST is used - } - - suspend fun get(): T = value.first() - - fun observe(): Flow = value.asSharedFlow() -} diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/SingleLiveEvent.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/SingleLiveEvent.kt deleted file mode 100644 index f1c4393b7..000000000 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/SingleLiveEvent.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.common.presentation - -import androidx.annotation.MainThread -import androidx.annotation.Nullable -import androidx.annotation.UiThread -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.Observer -import java.util.concurrent.atomic.AtomicBoolean - -/** - * A lifecycle-aware observable that sends only new updates after subscription, used for events like - * navigation and Snackbar messages. - *

- * This avoids a common problem with events: on configuration change (like rotation) an update - * can be emitted if the observer is active. This LiveData only calls the observable if there's an - * explicit call to setValue() or call(). - *

- * Note that only one observer is going to be notified of changes. - * [https://github.com/googlesamples/android-architecture/blob/dev-todo-mvvm-live/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/SingleLiveEvent.java] - */ -class SingleLiveEvent : MutableLiveData { - - private val mPending = AtomicBoolean(false) - - constructor(value: T) : super(value) - constructor() : super() - - @MainThread - override fun observe(owner: LifecycleOwner, observer: Observer) { - // Observe the internal MutableLiveData - super.observe( - owner - ) { t -> - if (mPending.compareAndSet(true, false)) { - observer.onChanged(t) - } - } - } - - @MainThread - override fun setValue(@Nullable t: T?) { - mPending.set(true) - super.setValue(t) - } - - /** - * Used for cases where T is Void, to make calls cleaner. - */ - @MainThread - fun call() { - value = null - } -} - -@UiThread -fun SingleLiveEvent.trigger() { - value = Unit -} diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AssetAmount.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AssetAmount.kt index af7ca89f3..a17c14621 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AssetAmount.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AssetAmount.kt @@ -71,7 +71,7 @@ import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.presentation.compose.TokenIcon import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme import jp.co.soramitsu.common.util.ext.orZero -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.properties.Size import jp.co.soramitsu.ui_core.component.input.number.BasicNumberInput import jp.co.soramitsu.ui_core.component.input.number.DefaultCursorPosition diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/BasicBannerCard.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/BasicBannerCard.kt index eea45faa7..a397f0d47 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/BasicBannerCard.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/BasicBannerCard.kt @@ -55,7 +55,7 @@ import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.BleachedButton import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.properties.Order diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/PolkaswapDisclaimer.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/PolkaswapDisclaimer.kt index 7f9f1f5eb..d25d80ae0 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/PolkaswapDisclaimer.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/PolkaswapDisclaimer.kt @@ -49,7 +49,7 @@ import androidx.compose.ui.viewinterop.AndroidView import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme import jp.co.soramitsu.common.presentation.view.PolkaswapDisclaimerView -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.TonalButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/Toolbar.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/Toolbar.kt index e5403f104..11a70ce74 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/Toolbar.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/Toolbar.kt @@ -40,7 +40,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.PACKAGE_ID +import jp.co.soramitsu.common.util.PACKAGE_ID import jp.co.soramitsu.ui_core.component.toolbar.Action import jp.co.soramitsu.ui_core.component.toolbar.BasicToolbarState import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbar diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/viewmodel/BaseViewModel.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/viewmodel/BaseViewModel.kt index fd3cd8c10..e8ea55b57 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/viewmodel/BaseViewModel.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/viewmodel/BaseViewModel.kt @@ -36,13 +36,13 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.navigation.NavOptionsBuilder +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.SoraException import jp.co.soramitsu.common.logger.FirebaseWrapper -import jp.co.soramitsu.common.presentation.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.SnackBarState -import jp.co.soramitsu.common.presentation.trigger import jp.co.soramitsu.ui_core.component.toolbar.Action import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbarState diff --git a/common/src/main/java/jp/co/soramitsu/common/resourses/ResourceManager.kt b/common/src/main/java/jp/co/soramitsu/common/resourses/ResourceManager.kt deleted file mode 100644 index b805026bd..000000000 --- a/common/src/main/java/jp/co/soramitsu/common/resourses/ResourceManager.kt +++ /dev/null @@ -1,112 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.common.resourses - -import android.app.Activity -import android.app.Application -import android.content.Context -import android.content.res.Resources -import android.os.Bundle -import android.util.TypedValue -import androidx.core.content.ContextCompat -import java.lang.ref.WeakReference - -class ResourceManager : Application.ActivityLifecycleCallbacks { - - private var resourcesNullable: Resources? = null - private val resources: Resources - get() { - return resourcesNullable ?: throw IllegalStateException("ResourceManager: no resources") - } - - private var contextNullable: WeakReference? = null - private val context: Context? - get() { - return contextNullable?.get() - } - - fun getString(resource: Int): String { - return resources.getString(resource) - } - - fun getString(resource: Int, vararg formatArgs: Any): String { - return resources.getString(resource, *formatArgs) - } - -// @DrawableRes -// fun getResByName(drawableName: String): Int { -// return context.resources.getIdentifier( -// drawableName, -// "drawable", -// context.packageName, -// ) -// } - - fun getColor(res: Int): Int { - return context?.let { - ContextCompat.getColor(it, res) - } ?: 0xffffff - } - - fun getQuantityString(id: Int, quantity: Int): String { - return resources.getQuantityString(id, quantity) - } - - fun getQuantityString(id: Int, quantity: Int, value: String): String { - return resources.getQuantityString(id, quantity).format(value) - } - - fun dp2px(dp: Int): Int = - TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, - dp.toFloat(), - resources.displayMetrics - ).toInt() - - override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { - resourcesNullable = activity.resources - contextNullable = WeakReference(activity) - } - - override fun onActivityStarted(activity: Activity) {} - - override fun onActivityResumed(activity: Activity) {} - - override fun onActivityPaused(activity: Activity) {} - - override fun onActivityStopped(activity: Activity) {} - - override fun onActivityDestroyed(activity: Activity) {} - - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} -} diff --git a/common/src/main/java/jp/co/soramitsu/common/util/TestTagCompose.kt b/common/src/main/java/jp/co/soramitsu/common/util/TestTagCompose.kt new file mode 100644 index 000000000..1e8a9e7c4 --- /dev/null +++ b/common/src/main/java/jp/co/soramitsu/common/util/TestTagCompose.kt @@ -0,0 +1,8 @@ +package jp.co.soramitsu.common.util + +import androidx.compose.ui.Modifier +import jp.co.soramitsu.androidfoundation.compose.testTagAsId + +const val PACKAGE_ID = "jp.co.soramitsu.sora.develop" + +fun Modifier.testTagAsId(tag: String): Modifier = this.testTagAsId(PACKAGE_ID, tag) diff --git a/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt b/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt index 66f047a8d..a14af2e54 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt @@ -83,14 +83,6 @@ fun Context.getColorFromAttrs(attr: Int): TypedValue { fun Context.dpRes2px(@DimenRes res: Int): Int = this.resources.getDimensionPixelSize(res) -fun Context.restartApplication() { - val intent = packageManager.getLaunchIntentForPackage(packageName) - val componentName = intent?.component - val mainIntent = Intent.makeRestartActivityTask(componentName) - startActivity(mainIntent) - Runtime.getRuntime().exit(0) -} - // todo remove fun Context.hideSoftKeyboard() { val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager diff --git a/common/src/main/java/jp/co/soramitsu/common/util/ext/Modifier.kt b/common/src/main/java/jp/co/soramitsu/common/util/ext/Modifier.kt index 059754d50..63a3f9512 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/ext/Modifier.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/ext/Modifier.kt @@ -32,7 +32,6 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.util.ext -import android.annotation.SuppressLint import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.RepeatMode import androidx.compose.animation.core.animateFloatAsState @@ -40,33 +39,12 @@ import androidx.compose.animation.core.repeatable import androidx.compose.animation.core.tween import androidx.compose.foundation.clickable import androidx.compose.runtime.getValue -import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.composed import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.platform.debugInspectorInfo -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTagsAsResourceId -import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.common.util.DebounceClickHandler -const val PACKAGE_ID = "jp.co.soramitsu.sora.develop" - -@OptIn(ExperimentalComposeUiApi::class) -@SuppressLint("ModifierFactoryUnreferencedReceiver") -fun Modifier.testTagAsId(tag: String): Modifier { - return if (BuildUtils.isPlayMarket()) { - this - } else { - this - .semantics { - testTagsAsResourceId = true - } - .testTag("$PACKAGE_ID:id/$tag") - } -} - fun Modifier.debounceClickable(debounceClickHandler: DebounceClickHandler, onClick: () -> Unit): Modifier { return this.clickable { debounceClickHandler.debounceClick(onClick) } } diff --git a/common/src/main/java/jp/co/soramitsu/common/view/AmountCardIcon.kt b/common/src/main/java/jp/co/soramitsu/common/view/AmountCardIcon.kt index 65e0426f1..97a874db4 100644 --- a/common/src/main/java/jp/co/soramitsu/common/view/AmountCardIcon.kt +++ b/common/src/main/java/jp/co/soramitsu/common/view/AmountCardIcon.kt @@ -47,7 +47,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.BleachedButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size diff --git a/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt b/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt index 12563ad48..41306470b 100644 --- a/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt @@ -33,12 +33,12 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.date import android.content.Context +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import java.util.Date import java.util.Locale import java.util.TimeZone import jp.co.soramitsu.common.R import jp.co.soramitsu.common.resourses.LanguagesHolder -import jp.co.soramitsu.common.resourses.ResourceManager import jp.co.soramitsu.test_shared.eqNonNull import org.junit.Assert.assertEquals import org.junit.Before diff --git a/common/src/test/java/jp/co/soramitsu/common/domain/SoraExceptionTest.kt b/common/src/test/java/jp/co/soramitsu/common/domain/SoraExceptionTest.kt index aba256206..585e7299e 100644 --- a/common/src/test/java/jp/co/soramitsu/common/domain/SoraExceptionTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/domain/SoraExceptionTest.kt @@ -32,9 +32,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.domain +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import java.io.IOException import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.resourses.ResourceManager import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test diff --git a/common_wallet/build.gradle.kts b/common_wallet/build.gradle.kts index 81591dea0..83a5e0fc1 100644 --- a/common_wallet/build.gradle.kts +++ b/common_wallet/build.gradle.kts @@ -32,7 +32,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/components/AssetItem.kt b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/components/AssetItem.kt index 3f15d4f8a..9e473e455 100644 --- a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/components/AssetItem.kt +++ b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/components/AssetItem.kt @@ -45,7 +45,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.common_wallet.presentation.compose.states.AssetItemCardState import jp.co.soramitsu.common_wallet.presentation.compose.states.previewAssetItemCardStateList import jp.co.soramitsu.ui_core.component.asset.Asset diff --git a/core_db/build.gradle.kts b/core_db/build.gradle.kts index 1b81b0399..155b16617 100644 --- a/core_db/build.gradle.kts +++ b/core_db/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/core_di/.gitignore b/core_di/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/core_di/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/core_di/build.gradle.kts b/core_di/build.gradle.kts deleted file mode 100644 index a84bd83d7..000000000 --- a/core_di/build.gradle.kts +++ /dev/null @@ -1,56 +0,0 @@ -plugins { - alias(libs.plugins.androidLibrary) - alias(libs.plugins.kotlinAndroid) - alias(libs.plugins.kover) -} - -kotlin { - jvmToolchain(11) -} - -android { - namespace = "jp.co.soramitsu.core_di" - compileSdk = 34 - - defaultConfig { - minSdk = 24 - multiDexEnabled = true - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - testOptions { - unitTests.isReturnDefaultValues = true - targetSdk = 34 - } - - buildTypes { - release { - isMinifyEnabled = true - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - - flavorDimensions += listOf("default") - - productFlavors { - create("develop") { - dimension = "default" - } - - create("soralution") { - dimension = "default" - } - - create("production") { - dimension = "default" - } - } -} - -dependencies { - implementation(project(":common")) - implementation(libs.viewmodelKtxDep) -} diff --git a/core_di/src/main/AndroidManifest.xml b/core_di/src/main/AndroidManifest.xml deleted file mode 100644 index 94cbbcfc3..000000000 --- a/core_di/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/core_di/src/main/java/jp/co/soramitsu/core_di/viewmodel/CustomViewModelFactory.kt b/core_di/src/main/java/jp/co/soramitsu/core_di/viewmodel/CustomViewModelFactory.kt deleted file mode 100644 index 2f2c999c6..000000000 --- a/core_di/src/main/java/jp/co/soramitsu/core_di/viewmodel/CustomViewModelFactory.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.core_di.viewmodel - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel - -class CustomViewModelFactory( - private val create: () -> T -) : ViewModelProvider.Factory { - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return create.invoke() as T - } -} diff --git a/demeter/build.gradle.kts b/demeter/build.gradle.kts index 6511527f3..51976fead 100644 --- a/demeter/build.gradle.kts +++ b/demeter/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/demeter/src/main/java/jp/co/soramitsu/demeter/di/DemeterModule.kt b/demeter/src/main/java/jp/co/soramitsu/demeter/di/DemeterModule.kt index c8210425b..187ac3b1f 100644 --- a/demeter/src/main/java/jp/co/soramitsu/demeter/di/DemeterModule.kt +++ b/demeter/src/main/java/jp/co/soramitsu/demeter/di/DemeterModule.kt @@ -96,6 +96,6 @@ object DemeterFarmingModule { userRepository = userRepository, transactionHistoryRepository = transactionHistoryRepository, transactionBuilder = transactionBuilder, - assetRepository = assetsRepository + assetRepository = assetsRepository, ) } diff --git a/feature_account_api/build.gradle.kts b/feature_account_api/build.gradle.kts index bd8c71750..31da44716 100644 --- a/feature_account_api/build.gradle.kts +++ b/feature_account_api/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_account_impl/build.gradle.kts b/feature_account_impl/build.gradle.kts index 24605f903..aa645c8f2 100644 --- a/feature_account_impl/build.gradle.kts +++ b/feature_account_impl/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_assets_api/build.gradle.kts b/feature_assets_api/build.gradle.kts index c7487e56c..5beaef7d1 100644 --- a/feature_assets_api/build.gradle.kts +++ b/feature_assets_api/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_assets_impl/build.gradle.kts b/feature_assets_impl/build.gradle.kts index 64660192c..caf1831d4 100644 --- a/feature_assets_impl/build.gradle.kts +++ b/feature_assets_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -70,7 +70,6 @@ dependencies { implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":core_db")) - implementation(project(":core_di")) implementation(project(":network")) implementation(project(":feature_assets_api")) implementation(project(":feature_polkaswap_api")) diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt index 2d2f64612..db0ce31e7 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt @@ -58,7 +58,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.BleachedButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/send/SendConfirmScreen.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/send/SendConfirmScreen.kt index c91e33115..68b96bf32 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/send/SendConfirmScreen.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/send/SendConfirmScreen.kt @@ -51,7 +51,7 @@ import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.presentation.compose.components.AssetAmountInput import jp.co.soramitsu.common.presentation.compose.components.previewAssetAmountInputState import jp.co.soramitsu.common.presentation.compose.previewDrawable -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.LoaderWrapper import jp.co.soramitsu.ui_core.component.button.properties.Order diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/send/SendScreen.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/send/SendScreen.kt index 6db71105c..1d4556a15 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/send/SendScreen.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/send/SendScreen.kt @@ -60,7 +60,7 @@ import jp.co.soramitsu.common.presentation.compose.components.AssetAmountInput import jp.co.soramitsu.common.presentation.compose.components.DetailsItemNetworkFee import jp.co.soramitsu.common.presentation.compose.components.previewAssetAmountInputState import jp.co.soramitsu.common.presentation.compose.previewDrawable -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.common.view.WarningTextCard import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.properties.Order diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt index 6c1844ce6..bc20f0d2f 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt @@ -53,7 +53,7 @@ import javax.inject.Inject import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.ui_core.resources.Dimens @AndroidEntryPoint diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt index 30f70327c..415c7ca2e 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt @@ -50,9 +50,9 @@ import jp.co.soramitsu.common.domain.formatFiatOrEmpty import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.ext.isZero diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt index 2260a0f84..f34961f16 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt @@ -47,10 +47,10 @@ import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.SoraException import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.io.FileManager -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.uikit.tokens.ScreenStatus import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.QrCodeGenerator import jp.co.soramitsu.common.util.QrException diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountFragment.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountFragment.kt index ac90b74cd..cc06e9f19 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountFragment.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountFragment.kt @@ -56,7 +56,7 @@ import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.compose.components.PercentContainer import jp.co.soramitsu.common.presentation.view.ToastDialog -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_assets_api.presentation.selectsearchtoken.SelectSearchTokenScreen import jp.co.soramitsu.feature_assets_impl.presentation.components.compose.send.SendConfirmScreen import jp.co.soramitsu.feature_assets_impl.presentation.components.compose.send.SendScreen diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt index ea49d2305..b7c22e762 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt @@ -46,11 +46,11 @@ import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.domain.subtractFee -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common.util.ext.nullZero diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/txlist/TxListFragment.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/txlist/TxListFragment.kt index 4e14c5e54..5d32e7c2d 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/txlist/TxListFragment.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/txlist/TxListFragment.kt @@ -48,7 +48,7 @@ import javax.inject.Inject import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.presentation.args.tokenId -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_blockexplorer_api.domain.HistoryState import jp.co.soramitsu.feature_blockexplorer_api.presentation.screen.TxHistoryScreenContainer import jp.co.soramitsu.ui_core.resources.Dimens diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt index d3d2f13ff..3a6d73f5b 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt @@ -50,7 +50,7 @@ import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.io.FileManager -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.QrCodeGenerator import jp.co.soramitsu.common.util.ext.Big100 diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt index 089edc9c4..4b534aa46 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt @@ -43,7 +43,7 @@ import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.equalTo import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt index 7dfe93a97..7b2bc0a53 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt @@ -40,7 +40,7 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.verify import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_assets_impl.presentation.screens.txlist.TxListViewModel diff --git a/feature_blockexplorer_api/build.gradle.kts b/feature_blockexplorer_api/build.gradle.kts index e88aff6e3..df9937d8c 100644 --- a/feature_blockexplorer_api/build.gradle.kts +++ b/feature_blockexplorer_api/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txdetails/BasicTxDetails.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txdetails/BasicTxDetails.kt index 3c445ea78..8aa4eb7b8 100644 --- a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txdetails/BasicTxDetails.kt +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/presentation/txdetails/BasicTxDetails.kt @@ -59,7 +59,7 @@ import androidx.compose.ui.unit.dp import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.DetailsItem import jp.co.soramitsu.common.presentation.compose.components.DetailsItemNetworkFee -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.toColor import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.toName import jp.co.soramitsu.ui_core.component.button.BleachedButton diff --git a/feature_blockexplorer_impl/build.gradle.kts b/feature_blockexplorer_impl/build.gradle.kts index 6dd441f93..a7658b9be 100644 --- a/feature_blockexplorer_impl/build.gradle.kts +++ b/feature_blockexplorer_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -69,7 +69,6 @@ dependencies { implementation(project(":android-foundation")) implementation(project(":common")) - implementation(project(":core_di")) implementation(project(":sorasubstrate")) implementation(project(":feature_assets_api")) implementation(project(":feature_blockexplorer_api")) diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt index 7e6917517..01e2a596b 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt @@ -35,7 +35,7 @@ package jp.co.soramitsu.feature_blockexplorer_impl.data import javax.inject.Inject import javax.inject.Singleton import jp.co.soramitsu.common.account.SoraAccount -import jp.co.soramitsu.common.domain.SuspendableProperty +import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.feature_blockexplorer_api.data.TransactionHistoryRepository import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transaction diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt index 899ab967a..06b4fa2bb 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt @@ -38,7 +38,7 @@ import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.R import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.CoroutineManager -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.DateTimeUtils import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsFragment.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsFragment.kt index 8ef411541..fbebdfdbd 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsFragment.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsFragment.kt @@ -46,13 +46,13 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import javax.inject.Inject import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.presentation.args.txHash -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory import jp.co.soramitsu.feature_blockexplorer_api.presentation.txdetails.TxDetailsDemeterStake import jp.co.soramitsu.feature_blockexplorer_api.presentation.txdetails.TxDetailsLiquidity import jp.co.soramitsu.feature_blockexplorer_api.presentation.txdetails.TxDetailsReferralOrTransferScreen diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModel.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModel.kt index 31a883570..d742b6d40 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModel.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModel.kt @@ -38,6 +38,7 @@ import androidx.lifecycle.viewModelScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import jp.co.soramitsu.androidfoundation.fragment.trigger import java.math.BigDecimal import java.util.Date import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager @@ -46,9 +47,8 @@ import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat -import jp.co.soramitsu.common.presentation.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_blockexplorer_api.domain.TransactionHistoryHandler diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txhistory/TransactionMappersImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txhistory/TransactionMappersImpl.kt index dac6ad4fb..a959fac58 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txhistory/TransactionMappersImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txhistory/TransactionMappersImpl.kt @@ -40,7 +40,7 @@ import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.DemeterType import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.EventUiModel diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/TransactionMappersTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/TransactionMappersTest.kt index d10af23f3..3c0112d84 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/TransactionMappersTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/TransactionMappersTest.kt @@ -41,7 +41,7 @@ import java.util.Date import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.Token -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.EventUiModel import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transaction diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt index bb0880066..4824ac9ae 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt @@ -38,7 +38,7 @@ import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.resourses.LanguagesHolder -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt index 353f187e0..2d2b9ae2e 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt @@ -44,7 +44,7 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.printFiat -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_blockexplorer_api.domain.TransactionHistoryHandler diff --git a/feature_ecosystem_impl/build.gradle.kts b/feature_ecosystem_impl/build.gradle.kts index 7997903e1..fd67ab001 100644 --- a/feature_ecosystem_impl/build.gradle.kts +++ b/feature_ecosystem_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -68,7 +68,6 @@ android { dependencies { implementation(project(":android-foundation")) implementation(project(":common")) - implementation(project(":core_di")) implementation(project(":demeter")) implementation(project(":common_wallet")) implementation(project(":feature_assets_api")) diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/alldemeter/AllDemeterViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/alldemeter/AllDemeterViewModel.kt index 0b6f1f5ba..cfccd0a35 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/alldemeter/AllDemeterViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/alldemeter/AllDemeterViewModel.kt @@ -39,7 +39,7 @@ import javax.inject.Inject import jp.co.soramitsu.androidfoundation.format.formatFiatSuffix import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringTriple diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterFragment.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterFragment.kt index 29806f0e8..ae21b96b1 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterFragment.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterFragment.kt @@ -52,7 +52,7 @@ import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class ClaimDemeterFragment : SoraBaseFragment() { diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterViewModel.kt index 3715033b7..47613d420 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterViewModel.kt @@ -42,7 +42,7 @@ import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmFragment.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmFragment.kt index 941ffd789..269b04ce0 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmFragment.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmFragment.kt @@ -51,7 +51,7 @@ import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class EditFarmFragment : SoraBaseFragment() { diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt index 36fbf6e9f..68b641b90 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt @@ -40,7 +40,7 @@ import java.math.BigDecimal import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.StringTriple diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt index 94be215cd..87f40e32c 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt @@ -40,7 +40,7 @@ import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.isMatchFilter import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.StringTriple diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsFragment.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsFragment.kt index 6ad0abb85..541dddeaf 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsFragment.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsFragment.kt @@ -51,7 +51,7 @@ import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class FarmDetailsFragment : SoraBaseFragment() { diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsScreen.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsScreen.kt index 781b472eb..e89cb26bd 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsScreen.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsScreen.kt @@ -71,7 +71,7 @@ import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.presentation.compose.TokenIcon import jp.co.soramitsu.common.presentation.compose.components.DetailsItem import jp.co.soramitsu.common.util.StringTriple -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.feature_ecosystem_impl.R import jp.co.soramitsu.feature_ecosystem_impl.presentation.farmdetails.model.FarmDetailsState import jp.co.soramitsu.ui_core.component.button.FilledButton diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsViewModel.kt index c710ef5fc..6a2bc8926 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsViewModel.kt @@ -42,7 +42,7 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.StringTriple diff --git a/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt b/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt index e8643f844..5f03064a9 100644 --- a/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt +++ b/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt @@ -37,7 +37,7 @@ import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.verify -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter diff --git a/feature_ethereum_api/build.gradle.kts b/feature_ethereum_api/build.gradle.kts index 39925dbf4..1bcef3c21 100644 --- a/feature_ethereum_api/build.gradle.kts +++ b/feature_ethereum_api/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_ethereum_impl/build.gradle.kts b/feature_ethereum_impl/build.gradle.kts index 077446d8e..91c6d16ba 100644 --- a/feature_ethereum_impl/build.gradle.kts +++ b/feature_ethereum_impl/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_main_api/build.gradle.kts b/feature_main_api/build.gradle.kts index 520ca480c..9bafe855c 100644 --- a/feature_main_api/build.gradle.kts +++ b/feature_main_api/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_main_impl/build.gradle.kts b/feature_main_impl/build.gradle.kts index 3107a6367..a4df15bdb 100644 --- a/feature_main_impl/build.gradle.kts +++ b/feature_main_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/core_di/consumer-rules.pro b/feature_main_impl/consumer-rules.pro similarity index 100% rename from core_di/consumer-rules.pro rename to feature_main_impl/consumer-rules.pro diff --git a/core_di/proguard-rules.pro b/feature_main_impl/proguard-rules.pro similarity index 100% rename from core_di/proguard-rules.pro rename to feature_main_impl/proguard-rules.pro diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt index 57fd7ce29..e1dcc7b04 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt @@ -39,7 +39,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.RepeatStrategyBuilder -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.ext.setValueIfNew import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModel.kt index bc5f5ad57..34e15ebc5 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModel.kt @@ -40,10 +40,10 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_main_impl.domain.MainInteractor import kotlinx.coroutines.launch diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt index 73dcd1e19..70d942ad6 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt @@ -44,11 +44,11 @@ import java.util.Date import javax.inject.Inject import jp.co.soramitsu.common.R import jp.co.soramitsu.common.interfaces.WithProgress -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.SnackBarState -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.vibration.DeviceVibrator import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PincodeFragment.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PincodeFragment.kt index 21f621e87..564e6d774 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PincodeFragment.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PincodeFragment.kt @@ -49,13 +49,13 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import com.google.android.material.bottomsheet.BottomSheetDialog import dagger.hilt.android.AndroidEntryPoint +import jp.co.soramitsu.androidfoundation.intent.restartApplication import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.io.MainThreadExecutor import jp.co.soramitsu.common.presentation.args.addresses import jp.co.soramitsu.common.presentation.view.SoraProgressDialog -import jp.co.soramitsu.common.util.ext.restartApplication import jp.co.soramitsu.common.util.ext.runDelayed import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_impl.R diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PincodeScreen.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PincodeScreen.kt index cb3acb125..0f3eed66a 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PincodeScreen.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PincodeScreen.kt @@ -56,7 +56,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.base.ProgressDialog import jp.co.soramitsu.common.util.ext.shake -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.feature_main_impl.R import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt index 49811a5e9..439e20f53 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt @@ -42,7 +42,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.item.CategoryItem import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt index b035a3292..cfc5474b9 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt @@ -39,7 +39,7 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuFragment.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuFragment.kt index fa4be50e9..bce75be20 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuFragment.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuFragment.kt @@ -92,7 +92,6 @@ class DebugMenuFragment : SoraBaseFragment() { return super.onCreateView(inflater, container, savedInstanceState) } - @OptIn(ExperimentalAnimationApi::class) override fun NavGraphBuilder.content( scrollState: ScrollState, navController: NavHostController @@ -102,9 +101,6 @@ class DebugMenuFragment : SoraBaseFragment() { activity?.getSize() } - val pushState = NewHistoryEventsWorker.getInfo(requireContext()).observeAsState().value - val pushEnabled = - (pushState != null) && (pushState.size > 0) && ((pushState[0].state == WorkInfo.State.RUNNING) || (pushState[0].state == WorkInfo.State.ENQUEUED)) Column(modifier = Modifier.fillMaxSize()) { Text( color = MaterialTheme.customColors.fgPrimary, @@ -136,24 +132,6 @@ class DebugMenuFragment : SoraBaseFragment() { text = "Reset runtime" ) } - Button( - modifier = Modifier - .wrapContentSize() - .background(color = if (pushEnabled) Color.Green else Color.Gray), - onClick = { - if (pushEnabled) { - NewHistoryEventsWorker.stop(requireContext()) - } else { - NewHistoryEventsWorker.start(requireContext()) - } - }, - content = { - Text( - color = MaterialTheme.customColors.fgPrimary, - text = if (pushEnabled) "Disable" else "Enable" - ) - } - ) DebugMenuScreen(state = viewModel.state) } } diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuViewModel.kt index 39531311b..296e70fc3 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuViewModel.kt @@ -45,9 +45,9 @@ import javax.inject.Inject import jp.co.soramitsu.common.BuildConfig import jp.co.soramitsu.common.config.BuildConfigWrapper import jp.co.soramitsu.common.domain.OptionsProvider -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager import jp.co.soramitsu.xbackup.BackupService diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/NewHistoryEventsWorker.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/NewHistoryEventsWorker.kt deleted file mode 100644 index f4748c301..000000000 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/NewHistoryEventsWorker.kt +++ /dev/null @@ -1,114 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_main_impl.presentation.profile.debugmenu - -import android.annotation.SuppressLint -import android.content.Context -import androidx.core.app.NotificationCompat -import androidx.core.app.NotificationManagerCompat -import androidx.hilt.work.HiltWorker -import androidx.work.CoroutineWorker -import androidx.work.ExistingPeriodicWorkPolicy -import androidx.work.ForegroundInfo -import androidx.work.PeriodicWorkRequestBuilder -import androidx.work.WorkManager -import androidx.work.WorkerParameters -import dagger.assisted.Assisted -import dagger.assisted.AssistedInject -import java.util.concurrent.TimeUnit -import javax.inject.Inject -import jp.co.soramitsu.common.util.Const -import jp.co.soramitsu.common.util.Notification -import jp.co.soramitsu.feature_blockexplorer_api.domain.TransactionHistoryHandler - -@HiltWorker -class NewHistoryEventsWorker @AssistedInject constructor( - @Assisted val appContext: Context, - @Assisted workerParams: WorkerParameters, -) : - CoroutineWorker(appContext, workerParams) { - - companion object { - private const val WORK_NAME = "PushWorker" - private const val progress = "SORA is looking for new events..." - - fun start(context: Context) { - val workRequest = PeriodicWorkRequestBuilder(15, TimeUnit.MINUTES) - .build() - - WorkManager.getInstance(context) - .enqueueUniquePeriodicWork( - WORK_NAME, - ExistingPeriodicWorkPolicy.KEEP, - workRequest - ) - } - - fun getInfo(context: Context) = - WorkManager.getInstance(context).getWorkInfosForUniqueWorkLiveData(WORK_NAME) - - fun stop(context: Context) = - WorkManager.getInstance(context).cancelUniqueWork(WORK_NAME) - } - - @Inject - lateinit var txHandler: TransactionHistoryHandler - - @SuppressLint("MissingPermission") - override suspend fun doWork(): Result { - val notificationManager = NotificationManagerCompat.from(appContext) - Notification.checkNotificationChannel(notificationManager) - val cancelIntent = WorkManager.getInstance(appContext) - .createCancelPendingIntent(id) - val progress = Notification.getBuilder(appContext) - .setContentTitle(Const.SORA) - .setTicker(Const.SORA) - .setContentText(progress) - .setOngoing(true) - .addAction(android.R.drawable.ic_delete, "Cancel", cancelIntent) - .build() - val foreground = ForegroundInfo(123123, progress) - setForeground(foreground) - val new = txHandler.hasNewTransaction() - if (new) { - val notification = Notification.getBuilder(appContext) - .setContentTitle(Const.SORA) - .setTicker(Const.SORA) - .setContentText("New SORA event is found") - .setPriority(NotificationCompat.PRIORITY_DEFAULT) - .build() - notificationManager.notify(234234, notification) - } - return Result.success() - } -} diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/information/InformationViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/information/InformationViewModel.kt index 8cca2e867..0e37338d0 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/information/InformationViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/information/InformationViewModel.kt @@ -40,7 +40,7 @@ import javax.inject.Inject import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.Const import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_main_impl.domain.MainInteractor diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt index cf8765394..49230d897 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt @@ -35,7 +35,7 @@ package jp.co.soramitsu.feature_main_impl.presentation.language import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.resourses.Language -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_main_impl.domain.MainInteractor import jp.co.soramitsu.test_shared.MainCoroutineRule import jp.co.soramitsu.test_shared.getOrAwaitValue diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt index a274611bd..efed13116 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt @@ -36,7 +36,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.interfaces.WithProgress -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.vibration.DeviceVibrator import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter diff --git a/feature_multiaccount_api/build.gradle.kts b/feature_multiaccount_api/build.gradle.kts index 858e876fe..8e2e3acd1 100644 --- a/feature_multiaccount_api/build.gradle.kts +++ b/feature_multiaccount_api/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_multiaccount_api/src/main/java/jp/co/soramitsu/feature_multiaccount_api/MultiaccountStarter.kt b/feature_multiaccount_api/src/main/java/jp/co/soramitsu/feature_multiaccount_api/MultiaccountStarter.kt index a800842b1..1d309b96d 100644 --- a/feature_multiaccount_api/src/main/java/jp/co/soramitsu/feature_multiaccount_api/MultiaccountStarter.kt +++ b/feature_multiaccount_api/src/main/java/jp/co/soramitsu/feature_multiaccount_api/MultiaccountStarter.kt @@ -37,6 +37,4 @@ import android.content.Context interface MultiaccountStarter { fun startOnboardingFlow(context: Context, isClearTask: Boolean = true) - - fun startOnboardingFlowWithInviteLink(context: Context) } diff --git a/feature_multiaccount_impl/build.gradle.kts b/feature_multiaccount_impl/build.gradle.kts index daa0ba923..0e4d45074 100644 --- a/feature_multiaccount_impl/build.gradle.kts +++ b/feature_multiaccount_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -80,7 +80,6 @@ dependencies { implementation(project(":feature_multiaccount_api")) implementation(project(":feature_main_api")) implementation(project(":sorasubstrate")) - implementation(project(":core_di")) implementation(libs.timberDep) diff --git a/feature_multiaccount_impl/consumer-rules.pro b/feature_multiaccount_impl/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/feature_multiaccount_impl/proguard-rules.pro b/feature_multiaccount_impl/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/feature_multiaccount_impl/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_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/MultiaccountStarterImpl.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/MultiaccountStarterImpl.kt index 00d4d88f3..a57d3f6b0 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/MultiaccountStarterImpl.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/MultiaccountStarterImpl.kt @@ -41,8 +41,4 @@ class MultiaccountStarterImpl : MultiaccountStarter { override fun startOnboardingFlow(context: Context, isClearTask: Boolean) { OnboardingActivity.start(context, isClearTask) } - - override fun startOnboardingFlowWithInviteLink(context: Context) { - OnboardingActivity.startWithInviteLink(context) - } } diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingActivity.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingActivity.kt index 057b96014..5066fd176 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingActivity.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingActivity.kt @@ -113,18 +113,6 @@ class OnboardingActivity : SoraBaseActivity() { ) context.startActivity(intent, options.toBundle()) } - - fun startWithInviteLink(context: Context) { - val intent = Intent(context, OnboardingActivity::class.java).apply { - action = ACTION_INVITE - } - val options = ActivityOptions.makeCustomAnimation( - context, - android.R.anim.fade_in, - android.R.anim.fade_out - ) - context.startActivity(intent, options.toBundle()) - } } private val launcher = @@ -513,14 +501,4 @@ class OnboardingActivity : SoraBaseActivity() { } private lateinit var navController: NavController - - override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - - intent?.let { - if (ACTION_INVITE == it.action) { - viewModel.startedWithInviteAction() - } - } - } } diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt index baff7a46e..669e7085c 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt @@ -54,11 +54,11 @@ import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.InvitationHandler import jp.co.soramitsu.common.domain.ResponseCode import jp.co.soramitsu.common.domain.SoraException -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.compose.webview.WebViewState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.Const.SORA_PRIVACY_PAGE import jp.co.soramitsu.common.util.Const.SORA_TERMS_PAGE import jp.co.soramitsu.common.util.ext.isAccountNameLongerThen32Bytes diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsFragment.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsFragment.kt index 0eaf3a729..a6921c99e 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsFragment.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsFragment.kt @@ -63,7 +63,7 @@ import jp.co.soramitsu.common.domain.ResponseCode import jp.co.soramitsu.common.domain.SoraException import jp.co.soramitsu.common.presentation.args.address import jp.co.soramitsu.common.presentation.compose.components.animatedComposable -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_multiaccount_impl.presentation.backup_password.BackupPasswordScreen import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsScreen.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsScreen.kt index 102d42aab..1f057df90 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsScreen.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsScreen.kt @@ -57,7 +57,7 @@ import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.Option import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.LoaderWrapper import jp.co.soramitsu.ui_core.component.button.properties.Size import jp.co.soramitsu.ui_core.component.card.ContentCard diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsScreenBasic.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsScreenBasic.kt index 537711e52..0edfa640b 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsScreenBasic.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsScreenBasic.kt @@ -47,7 +47,7 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.model.AccountDetailsScreenState import jp.co.soramitsu.ui_core.component.button.TonalButton import jp.co.soramitsu.ui_core.component.button.properties.Order diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt index e5d2137fa..c39387fcb 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt @@ -49,11 +49,11 @@ import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.SoraException -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.ext.isPasswordSecure import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListFragment.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListFragment.kt index 602a4c0af..1c4872dd3 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListFragment.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListFragment.kt @@ -56,7 +56,7 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.feature_multiaccount_api.OnboardingNavigator import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.properties.Order diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListMenu.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListMenu.kt index 9ebc361aa..221e2534b 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListMenu.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListMenu.kt @@ -42,7 +42,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.feature_multiaccount_impl.R import jp.co.soramitsu.ui_core.theme.customColors import jp.co.soramitsu.ui_core.theme.customTypography diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListScreen.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListScreen.kt index 5e789d5db..892730e69 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListScreen.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListScreen.kt @@ -63,7 +63,7 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.presentation.compose.previewDrawable import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.model.AccountListScreenState import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.model.ExportAccountData import jp.co.soramitsu.ui_core.component.card.ContentCard diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListViewModel.kt index d90c844be..528a3ae11 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListViewModel.kt @@ -40,9 +40,9 @@ import javax.inject.Inject import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupFragment.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupFragment.kt index 545303326..b419d95a4 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupFragment.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupFragment.kt @@ -47,7 +47,7 @@ import javax.inject.Inject import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.presentation.args.address -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_multiaccount_impl.util.type @AndroidEntryPoint diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupScreen.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupScreen.kt index 99a7e1408..125c5db56 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupScreen.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupScreen.kt @@ -59,7 +59,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.model.BackupScreenState import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.TonalButton diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt index 009c6286d..66d76088a 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt @@ -40,9 +40,9 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.common.presentation.compose.components.initMediumTitle2 -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.ext.addHexPrefix import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.R diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/json/BackupJsonFragment.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/json/BackupJsonFragment.kt index 45663c055..6d2317326 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/json/BackupJsonFragment.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/json/BackupJsonFragment.kt @@ -54,7 +54,7 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.presentation.args.addresses -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class BackupJsonFragment : SoraBaseFragment() { diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/protection/ExportProtectionFragment.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/protection/ExportProtectionFragment.kt index cb518ad74..8ed5088ef 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/protection/ExportProtectionFragment.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/protection/ExportProtectionFragment.kt @@ -48,7 +48,7 @@ import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.presentation.args.address import jp.co.soramitsu.common.presentation.args.addresses -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_multiaccount_impl.util.type @AndroidEntryPoint diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/tutorial/TutorialScreen.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/tutorial/TutorialScreen.kt index 591b81892..2e59ff9b9 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/tutorial/TutorialScreen.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/tutorial/TutorialScreen.kt @@ -64,7 +64,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.ExperimentalUnitApi import androidx.compose.ui.unit.dp import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.feature_multiaccount_impl.presentation.TutorialScreenState import jp.co.soramitsu.ui_core.component.button.LoaderWrapper import jp.co.soramitsu.ui_core.component.button.OutlinedButton diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt index 6155ab8f9..81e58fb62 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt @@ -38,7 +38,7 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.InvitationHandler -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_main_api.launcher.MainStarter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.OnboardingViewModel diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt index 7a9fb05e6..8c955b593 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt @@ -41,7 +41,7 @@ import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.CoroutineManager -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.account_details.AccountDetailsViewModel diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt index b62dee189..46e0ee206 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt @@ -35,7 +35,7 @@ package jp.co.soramitsu.feature_multiaccount_impl.export.backup import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.common.R as commonR -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.ext.addHexPrefix import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor diff --git a/feature_polkaswap_api/build.gradle.kts b/feature_polkaswap_api/build.gradle.kts index 40b7dc28a..ef02b42e4 100644 --- a/feature_polkaswap_api/build.gradle.kts +++ b/feature_polkaswap_api/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_polkaswap_impl/build.gradle.kts b/feature_polkaswap_impl/build.gradle.kts index 7cd599469..8b8ee47a5 100644 --- a/feature_polkaswap_impl/build.gradle.kts +++ b/feature_polkaswap_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -71,7 +71,6 @@ dependencies { implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":core_db")) - implementation(project(":core_di")) implementation(project(":demeter")) implementation(project(":feature_assets_api")) implementation(project(":feature_polkaswap_api")) diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt index e452e6755..ae5db9cea 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt @@ -37,7 +37,7 @@ import java.math.RoundingMode import java.util.Date import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.PoolDex -import jp.co.soramitsu.common.domain.SuspendableProperty +import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common_wallet.domain.model.WithDesired diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityAddScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityAddScreen.kt index 92bbb8a85..36fbc485b 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityAddScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityAddScreen.kt @@ -58,7 +58,7 @@ import jp.co.soramitsu.common.presentation.compose.components.DetailsItem import jp.co.soramitsu.common.presentation.compose.components.DetailsItemNetworkFee import jp.co.soramitsu.common.presentation.compose.components.previewAssetAmountInputState import jp.co.soramitsu.common.presentation.compose.states.ButtonState -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.common.view.WarningTextCard import jp.co.soramitsu.feature_polkaswap_impl.presentation.states.LiquidityAddConfirmState import jp.co.soramitsu.feature_polkaswap_impl.presentation.states.LiquidityAddEstimatedState diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt index ee0e1b5ed..410631d0e 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt @@ -61,7 +61,7 @@ import jp.co.soramitsu.common.presentation.compose.components.DetailsItemNetwork import jp.co.soramitsu.common.presentation.compose.components.previewAssetAmountInputState import jp.co.soramitsu.common.presentation.compose.states.ButtonState import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.common.view.WarningTextCard import jp.co.soramitsu.feature_polkaswap_impl.presentation.states.LiquidityRemoveConfirmState import jp.co.soramitsu.feature_polkaswap_impl.presentation.states.LiquidityRemoveEstimatedState diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMainScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMainScreen.kt index 60b2780b5..d2daa7a91 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMainScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMainScreen.kt @@ -63,7 +63,7 @@ import jp.co.soramitsu.common.presentation.compose.components.DetailsItem import jp.co.soramitsu.common.presentation.compose.components.DetailsItemNetworkFee import jp.co.soramitsu.common.presentation.compose.components.previewAssetAmountInputState import jp.co.soramitsu.common.presentation.compose.states.ButtonState -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.common.view.WarningTextCard import jp.co.soramitsu.feature_polkaswap_impl.presentation.states.SwapMainState import jp.co.soramitsu.feature_polkaswap_impl.presentation.states.defaultSwapDetailsState diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMarketSlippageSelector.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMarketSlippageSelector.kt index 98f58f39c..3850a24b4 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMarketSlippageSelector.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMarketSlippageSelector.kt @@ -51,7 +51,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.BleachedButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMarketsScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMarketsScreen.kt index b80465174..90613d93d 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMarketsScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/SwapMarketsScreen.kt @@ -60,7 +60,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.domain.Market -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.R import jp.co.soramitsu.ui_core.component.card.ContentCard import jp.co.soramitsu.ui_core.resources.Dimens diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddFragment.kt index 11270ec51..33ec5dbaa 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddFragment.kt @@ -59,7 +59,7 @@ import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.compose.components.PercentContainer import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_assets_api.presentation.selectsearchtoken.SelectSearchTokenScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.LiquidityAddConfirmScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.LiquidityAddScreen diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt index d5d335265..d3ff1072d 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt @@ -42,11 +42,11 @@ import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.LiquidityDetails -import jp.co.soramitsu.common.domain.SuspendableProperty +import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.compose.states.ButtonState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common.util.ext.lazyAsync diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt index d9dee0783..b3a1462d3 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt @@ -60,7 +60,7 @@ import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.compose.components.PercentContainer import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.LiquidityRemoveConfirmScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.LiquidityRemoveScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.SwapSlippageScreen diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt index ea6cbad60..80452e86e 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt @@ -46,7 +46,7 @@ import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.compose.states.ButtonState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.lazyAsync import jp.co.soramitsu.common.util.ext.nullZero diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsFragment.kt index b61c46d50..5b517bfef 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsFragment.kt @@ -55,7 +55,7 @@ import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.PoolDetailsScreen import jp.co.soramitsu.ui_core.resources.Dimens diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt index 7f14a21b3..4206bff69 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt @@ -46,7 +46,7 @@ import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.common.util.ext.lazyAsync diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapFragment.kt index efd8dbbbe..40032fc93 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapFragment.kt @@ -60,7 +60,7 @@ import jp.co.soramitsu.common.presentation.args.tokenToId import jp.co.soramitsu.common.presentation.compose.components.PercentContainer import jp.co.soramitsu.common.presentation.compose.components.PolkaswapDisclaimer import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_assets_api.presentation.selectsearchtoken.SelectSearchTokenScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.SwapConfirmScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.SwapMainScreen diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt index 13419ef00..76df97562 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt @@ -47,15 +47,15 @@ import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.Market -import jp.co.soramitsu.common.domain.SuspendableProperty +import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.domain.subtractFee -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.states.ButtonState -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common.util.ext.lazyAsync diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt index ee6d8671d..3b3697a8a 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt @@ -39,7 +39,7 @@ import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.PoolDex import jp.co.soramitsu.common.presentation.compose.states.ButtonState -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common_wallet.presentation.compose.states.AssetItemCardState import jp.co.soramitsu.common_wallet.presentation.compose.states.mapAssetsToCardState diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt index 57278ad17..b0dadc75e 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt @@ -38,7 +38,7 @@ import java.math.BigDecimal import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.logger.FirebaseWrapper -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.equalTo import jp.co.soramitsu.common_wallet.domain.model.LiquidityData diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt index 623f458a7..fa4e623e0 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt @@ -35,7 +35,7 @@ package jp.co.soramitsu.feature_polkaswap_impl.presentation.polkaswap.liquidity. import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.equalTo import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor diff --git a/feature_referral_api/build.gradle.kts b/feature_referral_api/build.gradle.kts index 8b25cf72a..0e0568fcc 100644 --- a/feature_referral_api/build.gradle.kts +++ b/feature_referral_api/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_referral_impl/build.gradle.kts b/feature_referral_impl/build.gradle.kts index 1c83df8ea..f9679fb75 100644 --- a/feature_referral_impl/build.gradle.kts +++ b/feature_referral_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralAvailableInvitations.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralAvailableInvitations.kt index 73d706310..a0a8719be 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralAvailableInvitations.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralAvailableInvitations.kt @@ -47,7 +47,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.TextButton import jp.co.soramitsu.ui_core.component.button.properties.Order diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralBondUnbondXor.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralBondUnbondXor.kt index 3c41b7e2f..b34502cc6 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralBondUnbondXor.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralBondUnbondXor.kt @@ -64,7 +64,7 @@ import androidx.compose.ui.unit.dp import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.DetailsItemNetworkFee import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.common.view.WarningTextCard import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.LoaderWrapper diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralButtons.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralButtons.kt index eb34fc1d9..3126ad6cd 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralButtons.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralButtons.kt @@ -40,7 +40,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.TonalButton import jp.co.soramitsu.ui_core.component.button.properties.Order diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt index ff4066cf3..93082d6a5 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt @@ -42,10 +42,10 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.domain.printFiat -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.lazyAsync import jp.co.soramitsu.common.util.ext.orZero diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferrerFilled.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferrerFilled.kt index 255ce9f7f..f7099bd9c 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferrerFilled.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferrerFilled.kt @@ -43,7 +43,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.TonalButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferrerInput.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferrerInput.kt index 83abeba04..576df2462 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferrerInput.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferrerInput.kt @@ -49,7 +49,7 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.LoaderWrapper import jp.co.soramitsu.ui_core.component.button.properties.Order diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/YourReferrerCard.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/YourReferrerCard.kt index da61b4038..fe14b2231 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/YourReferrerCard.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/YourReferrerCard.kt @@ -42,7 +42,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.TonalButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size diff --git a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt index dbfbc2ed0..c4a86f774 100644 --- a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt +++ b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt @@ -37,7 +37,7 @@ import androidx.compose.ui.text.input.TextFieldValue import java.math.BigDecimal import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter diff --git a/feature_select_node_api/build.gradle.kts b/feature_select_node_api/build.gradle.kts index dfe22064d..3c8f2e0e0 100644 --- a/feature_select_node_api/build.gradle.kts +++ b/feature_select_node_api/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_select_node_impl/build.gradle.kts b/feature_select_node_impl/build.gradle.kts index 5344c9f7c..75f7bc096 100644 --- a/feature_select_node_impl/build.gradle.kts +++ b/feature_select_node_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -72,7 +72,6 @@ dependencies { implementation(project(":feature_main_api")) implementation(project(":feature_blockexplorer_api")) implementation(project(":core_db")) - implementation(project(":core_di")) implementation(project(":sorasubstrate")) implementation(project(":network")) diff --git a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsFragment.kt b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsFragment.kt index 661108aea..12e281b81 100644 --- a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsFragment.kt +++ b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsFragment.kt @@ -42,12 +42,12 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import javax.inject.Inject import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.args.BUNDLE_KEY -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory import jp.co.soramitsu.feature_select_node_impl.presentation.nodeAddress import jp.co.soramitsu.feature_select_node_impl.presentation.nodeName import jp.co.soramitsu.feature_select_node_impl.presentation.pinCodeChecked diff --git a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModel.kt b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModel.kt index 3b23b683f..18750b24f 100644 --- a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModel.kt +++ b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModel.kt @@ -40,11 +40,11 @@ import androidx.lifecycle.viewModelScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.ChainNode import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager import jp.co.soramitsu.common.util.Const import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter diff --git a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModel.kt b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModel.kt index 720404daf..97ea5319f 100644 --- a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModel.kt +++ b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModel.kt @@ -37,12 +37,12 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import javax.inject.Inject import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.ChainNode import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_select_node_api.NodeManager diff --git a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt index 7a04de5c2..3114c56b6 100644 --- a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt +++ b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt @@ -36,7 +36,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.ChainNode -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.Const import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter diff --git a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt index 6bdc81e13..99cbc68e0 100644 --- a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt +++ b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt @@ -34,7 +34,7 @@ package jp.co.soramitsu.feature_select_node_impl.presentation.select import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_select_node_api.NodeManager diff --git a/feature_sora_card_api/build.gradle.kts b/feature_sora_card_api/build.gradle.kts index 6f55472bf..6c9b0ee80 100644 --- a/feature_sora_card_api/build.gradle.kts +++ b/feature_sora_card_api/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_sora_card_impl/build.gradle.kts b/feature_sora_card_impl/build.gradle.kts index eafef2b60..00cc2e2a7 100644 --- a/feature_sora_card_impl/build.gradle.kts +++ b/feature_sora_card_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -77,7 +77,6 @@ dependencies { implementation(project(":feature_main_api")) implementation(project(":feature_blockexplorer_api")) implementation(project(":sorasubstrate")) - implementation(project(":core_di")) implementation(project(":network")) implementation(libs.kotlinxSerializationJsonDep) diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt index 8bd8408d4..553a4b0b8 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt @@ -47,7 +47,7 @@ import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.util.ShareUtil -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContract @AndroidEntryPoint diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardScreen.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardScreen.kt index 838705ff7..129c9c9bf 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardScreen.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardScreen.kt @@ -52,7 +52,7 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.SoraCardImage -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.TextButton import jp.co.soramitsu.ui_core.component.button.properties.Order diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt index dab15e9dc..0f4fe2fc6 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt @@ -39,10 +39,10 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import jp.co.soramitsu.androidfoundation.format.unsafeCast import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt index 518cb1c15..3b98398ea 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt @@ -50,7 +50,7 @@ import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrievePainter import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrieveString -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors import jp.co.soramitsu.ui_core.theme.customTypography diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index 110620bc3..971e5a229 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -40,8 +40,8 @@ import javax.inject.Inject import jp.co.soramitsu.androidfoundation.intent.isAppAvailableCompat import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.presentation.SingleLiveEvent -import jp.co.soramitsu.common.presentation.trigger +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt index a2291d29d..b2b48cdce 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt @@ -54,7 +54,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.common.util.ext.underlineSubstring import jp.co.soramitsu.oauth.clients.ClientsFacade import jp.co.soramitsu.ui_core.component.card.ContentCard diff --git a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt index 37b0cee1c..da6a9b6c1 100644 --- a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt +++ b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt @@ -38,7 +38,7 @@ import io.mockk.mockkObject import java.math.BigDecimal import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.OptionsProvider -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter diff --git a/feature_wallet_api/build.gradle.kts b/feature_wallet_api/build.gradle.kts index 898d268dd..6366831f4 100644 --- a/feature_wallet_api/build.gradle.kts +++ b/feature_wallet_api/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/feature_wallet_impl/build.gradle.kts b/feature_wallet_impl/build.gradle.kts index 0abece6bf..6999a3197 100644 --- a/feature_wallet_impl/build.gradle.kts +++ b/feature_wallet_impl/build.gradle.kts @@ -31,7 +31,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -74,7 +74,6 @@ dependencies { implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":core_db")) - implementation(project(":core_di")) implementation(project(":network")) implementation(project(":demeter")) implementation(project(":feature_assets_api")) diff --git a/feature_wallet_impl/consumer-rules.pro b/feature_wallet_impl/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/feature_wallet_impl/proguard-rules.pro b/feature_wallet_impl/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/feature_wallet_impl/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_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt index d978d5a15..810856dde 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt @@ -46,7 +46,7 @@ import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.args.isLaunchedFromSoraCard -import jp.co.soramitsu.core_di.viewmodel.CustomViewModelFactory +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class BuyCryptoFragment : SoraBaseFragment() { diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt index 8d9abdf24..fdadc94f2 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt @@ -46,10 +46,10 @@ import jp.co.soramitsu.common.domain.fiatSum import jp.co.soramitsu.common.domain.fiatSymbol import jp.co.soramitsu.common.domain.formatFiatAmount import jp.co.soramitsu.common.domain.iconUri -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.SnackBarState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common_wallet.domain.model.CommonUserPoolData diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt index 2fdaed746..bf4672ffc 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/SoraCard.kt @@ -61,7 +61,7 @@ import androidx.compose.ui.unit.dp import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.SoraCardImage import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.common_wallet.presentation.compose.states.SoraCardState import jp.co.soramitsu.oauth.base.sdk.contract.IbanInfo import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModel.kt index 118293c40..e6358b36a 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModel.kt @@ -39,7 +39,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.OptionsProvider -import jp.co.soramitsu.common.presentation.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.domain.model.MigrationStatus diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsScreen.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsScreen.kt index 94d4a18fb..2ad66ea3b 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsScreen.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsScreen.kt @@ -63,7 +63,7 @@ import androidx.compose.ui.unit.dp import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.AccountWithIcon import jp.co.soramitsu.common.presentation.compose.previewDrawable -import jp.co.soramitsu.common.util.ext.testTagAsId +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.card.ContentCard import jp.co.soramitsu.ui_core.component.input.InputText import jp.co.soramitsu.ui_core.component.input.InputTextState diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModel.kt index 8b14a4482..68517d219 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModel.kt @@ -43,7 +43,7 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModelTest.kt index 27ec459b2..dc8c84102 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModelTest.kt @@ -34,7 +34,7 @@ package jp.co.soramitsu.feature_wallet_impl.presentation.claim import android.content.Context import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.domain.model.MigrationStatus import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt index c08186d32..3091200db 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt @@ -37,7 +37,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.test_shared.MainCoroutineRule diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt index 546648f58..5d6fd9c31 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt @@ -50,7 +50,7 @@ import jp.co.soramitsu.common.domain.CardHubType import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.interfaces.WithProgress -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor diff --git a/gradle.properties b/gradle.properties index bc80a1b1f..21646fd0b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -46,4 +46,4 @@ android.defaults.buildfeatures.shaders=false android.nonTransitiveRClass=false android.nonFinalResIds=false -composeCompilerVersion=1.5.8 +composeCompilerVersion=1.5.14 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4ef15018e..8ea3daf77 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,8 @@ [versions] -agp = "8.3.2" -kotlin = "1.9.22" +agp = "8.4.1" +kotlin = "1.9.24" appcompat = "1.6.1" -coroutines = "1.7.3" +coroutines = "1.8.1" coreKtx = "1.13.1" constraint = "2.2.0-alpha05" biometric = "1.1.0" @@ -39,10 +39,10 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.1.6" +soracard = "1.1.7" xnetworking = "0.2.9" xsubstrate = "1.2.1" -uicore = "0.2.30" +uicore = "0.2.31" xbackup = "1.2.0" xcrypto = "1.2.1" ed = "2.0.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dbb0a111f..c32cb774b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Jan 13 13:13:48 MSK 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/network/build.gradle.kts b/network/build.gradle.kts index 553d548ec..783cbd337 100644 --- a/network/build.gradle.kts +++ b/network/build.gradle.kts @@ -28,7 +28,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/settings.gradle.kts b/settings.gradle.kts index 27e6391e9..4b4de8071 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -48,7 +48,6 @@ include(":app") include(":common") include(":common_wallet") include(":core_db") -include(":core_di") include(":demeter") include(":feature_account_api") include(":feature_account_impl") diff --git a/sorasubstrate/build.gradle.kts b/sorasubstrate/build.gradle.kts index 7ef969f61..af360d212 100644 --- a/sorasubstrate/build.gradle.kts +++ b/sorasubstrate/build.gradle.kts @@ -29,7 +29,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/RequestExecutor.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/RequestExecutor.kt index 646775086..07fa8b2c7 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/RequestExecutor.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/RequestExecutor.kt @@ -37,7 +37,7 @@ import com.neovisionaries.ws.client.WebSocket import com.neovisionaries.ws.client.WebSocketAdapter import com.neovisionaries.ws.client.WebSocketException import com.neovisionaries.ws.client.WebSocketFactory -import jp.co.soramitsu.common.resourses.ResourceManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.xsubstrate.wsrpc.mappers.ResponseMapper import jp.co.soramitsu.xsubstrate.wsrpc.request.base.RpcRequest import jp.co.soramitsu.xsubstrate.wsrpc.response.RpcResponse diff --git a/test_data/build.gradle.kts b/test_data/build.gradle.kts index b65579c36..130ca6f45 100644 --- a/test_data/build.gradle.kts +++ b/test_data/build.gradle.kts @@ -27,7 +27,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/test_shared/build.gradle.kts b/test_shared/build.gradle.kts index 61cf68841..4f6abbb84 100644 --- a/test_shared/build.gradle.kts +++ b/test_shared/build.gradle.kts @@ -27,7 +27,7 @@ android { buildTypes { release { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/test_shared/src/main/java/jp/co/soramitsu/test_shared/Resources.kt b/test_shared/src/main/java/jp/co/soramitsu/test_shared/Resources.kt deleted file mode 100644 index 588c77746..000000000 --- a/test_shared/src/main/java/jp/co/soramitsu/test_shared/Resources.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.test_shared - -import java.io.BufferedReader -import java.io.InputStreamReader -import java.io.Reader - -fun Any.getFileContentFromResources(fileName: String): String { - return getResourceReader(fileName).readText() -} - -fun Any.getResourceReader(fileName: String): Reader { - val stream = javaClass.classLoader!!.getResourceAsStream(fileName) - - return BufferedReader(InputStreamReader(stream)) -} From aaf1e10d91a3255b453bff3a8989ef601186ae3a Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 28 May 2024 15:51:01 +0300 Subject: [PATCH 12/43] sc-29 reformat --- app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt | 2 +- .../soramitsu/sora/splash/presentation/SplashViewModel.kt | 2 +- .../sora/splash/presentation/SplashViewModelTest.kt | 1 - .../java/jp/co/soramitsu/common/date/DateTimeFormatter.kt | 2 +- .../java/jp/co/soramitsu/common/util/ext/ContextExt.kt | 1 - .../java/jp/co/soramitsu/common/date/DateFormatterTest.kt | 2 +- .../jp/co/soramitsu/common/domain/SoraExceptionTest.kt | 2 +- .../screens/assetdetails/AssetDetailsFragment.kt | 2 +- .../screens/assetdetails/AssetDetailsViewModel.kt | 4 ++-- .../screens/receiverequest/QRCodeFlowViewModel.kt | 4 ++-- .../presentation/screens/send/TransferAmountFragment.kt | 2 +- .../presentation/screens/send/TransferAmountViewModel.kt | 6 +++--- .../presentation/screens/txlist/TxListFragment.kt | 2 +- .../presentation/qr/QrCodeFlowViewModelTest.kt | 2 +- .../presentation/send/TransferAmountViewModelTest.kt | 2 +- .../presentation/txlist/AssetSettingsViewModelTest.kt | 2 +- .../data/TransactionHistoryRepositoryImpl.kt | 2 +- .../domain/TransactionHistoryHandlerImpl.kt | 2 +- .../presentation/txdetails/TxDetailsFragment.kt | 2 +- .../presentation/txdetails/TxDetailsViewModel.kt | 4 ++-- .../presentation/txhistory/TransactionMappersImpl.kt | 2 +- .../feature_blockexplorer_impl/TransactionMappersTest.kt | 2 +- .../domain/TransactionHistoryHandlerTest.kt | 2 +- .../presentation/txdetails/TxDetailsViewModelTest.kt | 2 +- .../presentation/alldemeter/AllDemeterViewModel.kt | 2 +- .../presentation/claimdemeter/ClaimDemeterFragment.kt | 2 +- .../presentation/claimdemeter/ClaimDemeterViewModel.kt | 2 +- .../presentation/editfarm/EditFarmFragment.kt | 2 +- .../presentation/editfarm/EditFarmViewModel.kt | 2 +- .../presentation/explore/ExploreViewModel.kt | 2 +- .../presentation/farmdetails/FarmDetailsFragment.kt | 2 +- .../presentation/farmdetails/FarmDetailsViewModel.kt | 2 +- .../feature_main_impl/presentation/MainViewModel.kt | 2 +- .../presentation/language/SelectLanguageViewModel.kt | 4 ++-- .../presentation/pincode/PinCodeViewModel.kt | 6 +++--- .../presentation/profile/ProfileViewModel.kt | 2 +- .../presentation/profile/debugmenu/DebugMenuFragment.kt | 6 ------ .../presentation/profile/debugmenu/DebugMenuViewModel.kt | 4 ++-- .../profile/information/InformationViewModel.kt | 2 +- .../presentation/language/SelectLanguageViewModelTest.kt | 2 +- .../presentation/pincode/PinCodeViewModelTest.kt | 2 +- .../presentation/OnboardingViewModel.kt | 4 ++-- .../account_details/AccountDetailsFragment.kt | 2 +- .../account_details/AccountDetailsViewModel.kt | 6 +++--- .../export_account/account_list/AccountListViewModel.kt | 4 ++-- .../presentation/export_account/backup/BackupFragment.kt | 2 +- .../presentation/export_account/backup/BackupViewModel.kt | 4 ++-- .../export_account/backup/json/BackupJsonFragment.kt | 2 +- .../export_account/protection/ExportProtectionFragment.kt | 2 +- .../feature_multiaccount_impl/OnboardingViewModelTest.kt | 2 +- .../export/account_details/AccountDetailsViewModelTest.kt | 2 +- .../export/backup/BackupViewModelTest.kt | 2 +- .../feature_polkaswap_impl/domain/SwapInteractorImpl.kt | 2 +- .../screens/liquidityadd/LiquidityAddFragment.kt | 2 +- .../screens/liquidityadd/LiquidityAddViewModel.kt | 4 ++-- .../screens/liquidityremove/LiquidityRemoveFragment.kt | 2 +- .../screens/liquidityremove/LiquidityRemoveViewModel.kt | 2 +- .../screens/pooldetails/PoolDetailsFragment.kt | 2 +- .../screens/pooldetails/PoolDetailsViewModel.kt | 2 +- .../presentation/screens/swap/SwapFragment.kt | 2 +- .../presentation/screens/swap/SwapViewModel.kt | 8 ++++---- .../presentation/polkaswap/SwapViewModelTest.kt | 2 +- .../polkaswap/liquidity/add/AddLiquidityViewModelTest.kt | 2 +- .../liquidity/remove/RemoveLiquidityViewModelTest.kt | 2 +- .../presentation/ReferralViewModel.kt | 4 ++-- .../presentation/ReferralViewModelTest.kt | 2 +- .../presentation/details/NodeDetailsFragment.kt | 2 +- .../presentation/select/SelectNodeViewModel.kt | 2 +- .../presentation/details/NodeDetailsViewModelTest.kt | 2 +- .../presentation/select/SelectNodeViewModelTest.kt | 2 +- .../presentation/GetSoraCardFragment.kt | 2 +- .../presentation/GetSoraCardViewModel.kt | 4 ++-- .../presentation/details/SoraCardDetailsViewModel.kt | 4 ++-- .../presentation/details/SoraCardIBANCard.kt | 2 +- .../presentation/get/card/GetSoraCardViewModelTest.kt | 2 +- .../presentation/buycrypto/BuyCryptoFragment.kt | 2 +- .../presentation/cardshub/CardsHubViewModel.kt | 4 ++-- .../presentation/claim/ClaimViewModel.kt | 2 +- .../presentation/contacts/ContactsViewModel.kt | 2 +- .../presentation/contacts/ContactsViewModelTest.kt | 2 +- .../presentation/wallet/CardsHubViewModelTest.kt | 2 +- 81 files changed, 100 insertions(+), 108 deletions(-) diff --git a/app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt b/app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt index 8db074497..677de94d1 100644 --- a/app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt +++ b/app/src/main/java/jp/co/soramitsu/sora/SoraApp.kt @@ -41,10 +41,10 @@ import coil.decode.SvgDecoder import com.google.firebase.FirebaseApp import dagger.hilt.android.HiltAndroidApp import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.domain.DarkThemeManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.io.FileManager -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.BuildType import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.common.util.Flavor diff --git a/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt b/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt index e0e7b0f22..52b0e65b0 100644 --- a/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt +++ b/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt @@ -37,9 +37,9 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.fragment.trigger +import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_account_api.domain.model.OnboardingState import jp.co.soramitsu.sora.splash.domain.SplashInteractor diff --git a/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt b/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt index b6e1d7114..e0b9fa7e2 100644 --- a/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt +++ b/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt @@ -52,7 +52,6 @@ import org.junit.rules.TestRule import org.junit.runner.RunWith import org.mockito.BDDMockito.given import org.mockito.Mock -import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnitRunner @ExperimentalCoroutinesApi diff --git a/common/src/main/java/jp/co/soramitsu/common/date/DateTimeFormatter.kt b/common/src/main/java/jp/co/soramitsu/common/date/DateTimeFormatter.kt index c7105790c..460f4d4ba 100644 --- a/common/src/main/java/jp/co/soramitsu/common/date/DateTimeFormatter.kt +++ b/common/src/main/java/jp/co/soramitsu/common/date/DateTimeFormatter.kt @@ -34,11 +34,11 @@ package jp.co.soramitsu.common.date import android.content.Context import android.text.format.DateUtils -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date import java.util.concurrent.TimeUnit +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.resourses.LanguagesHolder diff --git a/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt b/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt index a14af2e54..ab8c24322 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/ext/ContextExt.kt @@ -34,7 +34,6 @@ package jp.co.soramitsu.common.util.ext import android.content.Context import android.content.ContextWrapper -import android.content.Intent import android.graphics.Color import android.util.TypedValue import android.view.View diff --git a/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt b/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt index 41306470b..a47c02f1b 100644 --- a/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt @@ -33,10 +33,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.date import android.content.Context -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import java.util.Date import java.util.Locale import java.util.TimeZone +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.resourses.LanguagesHolder import jp.co.soramitsu.test_shared.eqNonNull diff --git a/common/src/test/java/jp/co/soramitsu/common/domain/SoraExceptionTest.kt b/common/src/test/java/jp/co/soramitsu/common/domain/SoraExceptionTest.kt index 585e7299e..de20a7f9f 100644 --- a/common/src/test/java/jp/co/soramitsu/common/domain/SoraExceptionTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/domain/SoraExceptionTest.kt @@ -32,8 +32,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.domain -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import java.io.IOException +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import org.junit.Assert.assertEquals import org.junit.Assert.assertNull diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt index bc20f0d2f..652f03230 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt @@ -50,10 +50,10 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.ui_core.resources.Dimens @AndroidEntryPoint diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt index 415c7ca2e..0e2c7aa76 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt @@ -40,7 +40,9 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.CoroutineManager @@ -50,9 +52,7 @@ import jp.co.soramitsu.common.domain.formatFiatOrEmpty import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.ext.isZero diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt index f34961f16..a0cb4e5f3 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt @@ -39,7 +39,9 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import java.math.BigDecimal import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.domain.AssetAmountInputState @@ -47,10 +49,8 @@ import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.SoraException import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.io.FileManager -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.uikit.tokens.ScreenStatus import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.QrCodeGenerator import jp.co.soramitsu.common.util.QrException diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountFragment.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountFragment.kt index cc06e9f19..5031adce7 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountFragment.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountFragment.kt @@ -51,12 +51,12 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.compose.components.PercentContainer import jp.co.soramitsu.common.presentation.view.ToastDialog -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_assets_api.presentation.selectsearchtoken.SelectSearchTokenScreen import jp.co.soramitsu.feature_assets_impl.presentation.components.compose.send.SendConfirmScreen import jp.co.soramitsu.feature_assets_impl.presentation.components.compose.send.SendScreen diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt index b7c22e762..0ace82019 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt @@ -38,7 +38,10 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.domain.Asset @@ -46,11 +49,8 @@ import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.domain.subtractFee -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common.util.ext.nullZero diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/txlist/TxListFragment.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/txlist/TxListFragment.kt index 5d32e7c2d..6f869c8ab 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/txlist/TxListFragment.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/txlist/TxListFragment.kt @@ -45,10 +45,10 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.presentation.args.tokenId -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_blockexplorer_api.domain.HistoryState import jp.co.soramitsu.feature_blockexplorer_api.presentation.screen.TxHistoryScreenContainer import jp.co.soramitsu.ui_core.resources.Dimens diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt index 3a6d73f5b..f856035b4 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt @@ -45,12 +45,12 @@ import io.mockk.mockkStatic import io.mockk.verify import java.util.StringJoiner import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.io.FileManager -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.QrCodeGenerator import jp.co.soramitsu.common.util.ext.Big100 diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt index 4b534aa46..4c3b2e9e4 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt @@ -41,9 +41,9 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.equalTo import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt index 7b2bc0a53..9134e84db 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt @@ -39,8 +39,8 @@ import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.verify -import jp.co.soramitsu.common.R import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.common.R import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_assets_impl.presentation.screens.txlist.TxListViewModel diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt index 01e2a596b..754571ebb 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt @@ -34,8 +34,8 @@ package jp.co.soramitsu.feature_blockexplorer_impl.data import javax.inject.Inject import javax.inject.Singleton -import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty +import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.feature_blockexplorer_api.data.TransactionHistoryRepository import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transaction diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt index 06b4fa2bb..f4e4c7957 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt @@ -35,10 +35,10 @@ package jp.co.soramitsu.feature_blockexplorer_impl.domain import java.util.Date import javax.inject.Inject import jp.co.soramitsu.androidfoundation.format.safeCast +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.CoroutineManager -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.DateTimeUtils import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsFragment.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsFragment.kt index fbebdfdbd..56064b85b 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsFragment.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsFragment.kt @@ -46,8 +46,8 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModel.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModel.kt index d742b6d40..f90223bd1 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModel.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModel.kt @@ -38,17 +38,17 @@ import androidx.lifecycle.viewModelScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import jp.co.soramitsu.androidfoundation.fragment.trigger import java.math.BigDecimal import java.util.Date +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_blockexplorer_api.domain.TransactionHistoryHandler diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txhistory/TransactionMappersImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txhistory/TransactionMappersImpl.kt index a959fac58..7fca13de8 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txhistory/TransactionMappersImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txhistory/TransactionMappersImpl.kt @@ -35,12 +35,12 @@ package jp.co.soramitsu.feature_blockexplorer_impl.presentation.txhistory import java.util.Date import javax.inject.Inject import javax.inject.Singleton +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.DemeterType import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.EventUiModel diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/TransactionMappersTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/TransactionMappersTest.kt index 3c0112d84..2885ffabf 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/TransactionMappersTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/TransactionMappersTest.kt @@ -38,10 +38,10 @@ import io.mockk.every import io.mockk.mockkStatic import java.math.BigDecimal import java.util.Date +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.Token -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.EventUiModel import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transaction diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt index 4824ac9ae..5a54f1c0a 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt @@ -34,11 +34,11 @@ package jp.co.soramitsu.feature_blockexplorer_impl.domain import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.androidfoundation.format.unsafeCast +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.resourses.LanguagesHolder -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt index 2d2b9ae2e..537804e37 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt @@ -40,11 +40,11 @@ import io.mockk.junit4.MockKRule import io.mockk.verify import java.util.Date import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.printFiat -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_blockexplorer_api.domain.TransactionHistoryHandler diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/alldemeter/AllDemeterViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/alldemeter/AllDemeterViewModel.kt index cfccd0a35..6b00d0d68 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/alldemeter/AllDemeterViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/alldemeter/AllDemeterViewModel.kt @@ -37,9 +37,9 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import jp.co.soramitsu.androidfoundation.format.formatFiatSuffix +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringTriple diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterFragment.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterFragment.kt index ae21b96b1..080574dfc 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterFragment.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterFragment.kt @@ -46,13 +46,13 @@ import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import java.math.BigDecimal import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class ClaimDemeterFragment : SoraBaseFragment() { diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterViewModel.kt index 47613d420..6d8ce7c5d 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/claimdemeter/ClaimDemeterViewModel.kt @@ -37,12 +37,12 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmFragment.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmFragment.kt index 269b04ce0..b7ca40205 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmFragment.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmFragment.kt @@ -45,13 +45,13 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class EditFarmFragment : SoraBaseFragment() { diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt index 68b641b90..15bda00f6 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt @@ -37,10 +37,10 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.StringTriple diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt index 87f40e32c..dea113933 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt @@ -36,11 +36,11 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import jp.co.soramitsu.androidfoundation.format.formatFiatSuffix +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.isMatchFilter import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.StringTriple diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsFragment.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsFragment.kt index 541dddeaf..a4eab0eb0 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsFragment.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsFragment.kt @@ -45,13 +45,13 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class FarmDetailsFragment : SoraBaseFragment() { diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsViewModel.kt index 6a2bc8926..b68ac60d2 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/farmdetails/FarmDetailsViewModel.kt @@ -38,11 +38,11 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.format.formatFiatSuffix +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.StringTriple diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt index e1dcc7b04..41761e0e7 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt @@ -37,9 +37,9 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.RepeatStrategyBuilder -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.ext.setValueIfNew import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModel.kt index 34e15ebc5..de9a70a51 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModel.kt @@ -39,11 +39,11 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import jp.co.soramitsu.common.R import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_main_impl.domain.MainInteractor import kotlinx.coroutines.launch diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt index 70d942ad6..a9fee0994 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt @@ -42,13 +42,13 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import java.util.Date import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.interfaces.WithProgress -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.SnackBarState -import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.vibration.DeviceVibrator import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt index cfc5474b9..18893b487 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt @@ -38,8 +38,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import jp.co.soramitsu.common.R import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuFragment.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuFragment.kt index bce75be20..5ca609166 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuFragment.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuFragment.kt @@ -39,24 +39,18 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.ScrollState -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material.Button import androidx.compose.material.MaterialTheme import androidx.compose.material.Text -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.fragment.app.viewModels import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable -import androidx.work.WorkInfo import dagger.hilt.android.AndroidEntryPoint import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuViewModel.kt index 296e70fc3..f9716bab2 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/debugmenu/DebugMenuViewModel.kt @@ -42,12 +42,12 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.BuildConfig import jp.co.soramitsu.common.config.BuildConfigWrapper import jp.co.soramitsu.common.domain.OptionsProvider -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager import jp.co.soramitsu.xbackup.BackupService diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/information/InformationViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/information/InformationViewModel.kt index 0e37338d0..c6af8af0c 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/information/InformationViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/information/InformationViewModel.kt @@ -37,10 +37,10 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.Const import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_main_impl.domain.MainInteractor diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt index 49230d897..fcca07bbf 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt @@ -33,9 +33,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_main_impl.presentation.language import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.resourses.Language -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_main_impl.domain.MainInteractor import jp.co.soramitsu.test_shared.MainCoroutineRule import jp.co.soramitsu.test_shared.getOrAwaitValue diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt index efed13116..528aa04ca 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt @@ -33,10 +33,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_main_impl.presentation.pincode import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.interfaces.WithProgress -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.vibration.DeviceVibrator import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt index 669e7085c..b8e09466a 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt @@ -47,6 +47,8 @@ import dagger.hilt.android.lifecycle.HiltViewModel import java.net.SocketException import java.net.SocketTimeoutException import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.account.SoraAccount @@ -54,11 +56,9 @@ import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.InvitationHandler import jp.co.soramitsu.common.domain.ResponseCode import jp.co.soramitsu.common.domain.SoraException -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.compose.webview.WebViewState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.Const.SORA_PRIVACY_PAGE import jp.co.soramitsu.common.util.Const.SORA_TERMS_PAGE import jp.co.soramitsu.common.util.ext.isAccountNameLongerThen32Bytes diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsFragment.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsFragment.kt index a6921c99e..3ad00bd1e 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsFragment.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsFragment.kt @@ -56,6 +56,7 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.domain.BottomBarController @@ -63,7 +64,6 @@ import jp.co.soramitsu.common.domain.ResponseCode import jp.co.soramitsu.common.domain.SoraException import jp.co.soramitsu.common.presentation.args.address import jp.co.soramitsu.common.presentation.compose.components.animatedComposable -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_multiaccount_impl.presentation.backup_password.BackupPasswordScreen import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt index c39387fcb..01daf3577 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt @@ -43,17 +43,17 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.net.SocketException import java.net.SocketTimeoutException +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.SoraException -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.ext.isPasswordSecure import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListViewModel.kt index 528a3ae11..132419f2d 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_list/AccountListViewModel.kt @@ -37,12 +37,12 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 -import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupFragment.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupFragment.kt index b419d95a4..fd087548a 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupFragment.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupFragment.kt @@ -44,10 +44,10 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.presentation.args.address -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_multiaccount_impl.util.type @AndroidEntryPoint diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt index 66d76088a..e8b428241 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt @@ -38,11 +38,11 @@ import androidx.lifecycle.viewModelScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.presentation.compose.components.initMediumTitle2 -import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.ext.addHexPrefix import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.R diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/json/BackupJsonFragment.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/json/BackupJsonFragment.kt index 6d2317326..7f9d23a89 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/json/BackupJsonFragment.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/json/BackupJsonFragment.kt @@ -49,12 +49,12 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.androidfoundation.intent.ShareUtil.shareFile import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.presentation.args.addresses -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class BackupJsonFragment : SoraBaseFragment() { diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/protection/ExportProtectionFragment.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/protection/ExportProtectionFragment.kt index 8ed5088ef..ee94496cb 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/protection/ExportProtectionFragment.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/protection/ExportProtectionFragment.kt @@ -44,11 +44,11 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.presentation.args.address import jp.co.soramitsu.common.presentation.args.addresses -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_multiaccount_impl.util.type @AndroidEntryPoint diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt index 81e58fb62..6c36cdbe5 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt @@ -34,11 +34,11 @@ package jp.co.soramitsu.feature_multiaccount_impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.navigation.NavController +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.InvitationHandler -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_main_api.launcher.MainStarter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.OnboardingViewModel diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt index 8c955b593..78ab01752 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt @@ -38,10 +38,10 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue import androidx.navigation.NavController import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.CoroutineManager -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.account_details.AccountDetailsViewModel diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt index 46e0ee206..8a923e15d 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt @@ -34,8 +34,8 @@ package jp.co.soramitsu.feature_multiaccount_impl.export.backup import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager -import jp.co.soramitsu.common.R as commonR import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.common.R as commonR import jp.co.soramitsu.common.util.ext.addHexPrefix import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt index ae5db9cea..6c85355c3 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt @@ -35,9 +35,9 @@ package jp.co.soramitsu.feature_polkaswap_impl.domain import java.math.BigDecimal import java.math.RoundingMode import java.util.Date +import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.PoolDex -import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common_wallet.domain.model.WithDesired diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddFragment.kt index 33ec5dbaa..d1c01323b 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddFragment.kt @@ -54,12 +54,12 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.compose.components.PercentContainer import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_assets_api.presentation.selectsearchtoken.SelectSearchTokenScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.LiquidityAddConfirmScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.LiquidityAddScreen diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt index d3ff1072d..f4dfdc085 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt @@ -37,16 +37,16 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.LiquidityDetails -import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.compose.states.ButtonState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common.util.ext.lazyAsync diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt index b3a1462d3..6a7e803ef 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt @@ -54,13 +54,13 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.compose.components.PercentContainer import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.LiquidityRemoveConfirmScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.LiquidityRemoveScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.SwapSlippageScreen diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt index 80452e86e..51d10eec2 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt @@ -40,13 +40,13 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.compose.states.ButtonState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.lazyAsync import jp.co.soramitsu.common.util.ext.nullZero diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsFragment.kt index 5b517bfef..d0864e717 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsFragment.kt @@ -49,13 +49,13 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.PoolDetailsScreen import jp.co.soramitsu.ui_core.resources.Dimens diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt index 4206bff69..39e2ed3c2 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt @@ -40,13 +40,13 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import jp.co.soramitsu.androidfoundation.format.formatFiatSuffix +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.iconUri import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringTriple import jp.co.soramitsu.common.util.ext.lazyAsync diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapFragment.kt index 40032fc93..418bf24f5 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapFragment.kt @@ -50,6 +50,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.R import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.domain.BottomBarController @@ -60,7 +61,6 @@ import jp.co.soramitsu.common.presentation.args.tokenToId import jp.co.soramitsu.common.presentation.compose.components.PercentContainer import jp.co.soramitsu.common.presentation.compose.components.PolkaswapDisclaimer import jp.co.soramitsu.common.util.ext.getColorFromAttrs -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.feature_assets_api.presentation.selectsearchtoken.SelectSearchTokenScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.SwapConfirmScreen import jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose.SwapMainScreen diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt index 76df97562..eb0923163 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt @@ -42,20 +42,20 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.Market -import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.domain.subtractFee -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.states.ButtonState -import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common.util.ext.lazyAsync diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt index 3b3697a8a..2ee14467a 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt @@ -34,12 +34,12 @@ package jp.co.soramitsu.feature_polkaswap_impl.presentation.polkaswap import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.PoolDex import jp.co.soramitsu.common.presentation.compose.states.ButtonState -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common_wallet.presentation.compose.states.AssetItemCardState import jp.co.soramitsu.common_wallet.presentation.compose.states.mapAssetsToCardState diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt index b0dadc75e..a0dfe801c 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt @@ -35,10 +35,10 @@ package jp.co.soramitsu.feature_polkaswap_impl.presentation.polkaswap.liquidity. import androidx.arch.core.executor.testing.InstantTaskExecutorRule import io.mockk.mockkObject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.logger.FirebaseWrapper -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.equalTo import jp.co.soramitsu.common_wallet.domain.model.LiquidityData diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt index fa4e623e0..9735cc7d5 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt @@ -34,8 +34,8 @@ package jp.co.soramitsu.feature_polkaswap_impl.presentation.polkaswap.liquidity. import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal -import jp.co.soramitsu.common.R import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.common.R import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.equalTo import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt index 93082d6a5..1b2156358 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt @@ -38,14 +38,14 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import java.math.BigDecimal import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.domain.printFiat -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.lazyAsync import jp.co.soramitsu.common.util.ext.orZero diff --git a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt index c4a86f774..d8ab81e68 100644 --- a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt +++ b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt @@ -35,9 +35,9 @@ package jp.co.soramitsu.feature_referral_impl.presentation import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter diff --git a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsFragment.kt b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsFragment.kt index 12e281b81..6b5f2710a 100644 --- a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsFragment.kt +++ b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsFragment.kt @@ -42,8 +42,8 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController diff --git a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModel.kt b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModel.kt index 97ea5319f..00a8ff9a1 100644 --- a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModel.kt +++ b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModel.kt @@ -37,8 +37,8 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.ChainNode import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 diff --git a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt index 3114c56b6..78e42667b 100644 --- a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt +++ b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt @@ -34,9 +34,9 @@ package jp.co.soramitsu.feature_select_node_impl.presentation.details import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.ChainNode -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.Const import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter diff --git a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt index 99cbc68e0..8ab12894c 100644 --- a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt +++ b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt @@ -33,8 +33,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_select_node_impl.presentation.select import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import jp.co.soramitsu.common.R import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.common.R import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_select_node_api.NodeManager diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt index 553a4b0b8..786e7a07a 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardFragment.kt @@ -42,12 +42,12 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.util.ShareUtil -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContract @AndroidEntryPoint diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt index 0f4fe2fc6..b3d25c8f6 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/GetSoraCardViewModel.kt @@ -38,11 +38,11 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import jp.co.soramitsu.androidfoundation.format.unsafeCast -import jp.co.soramitsu.common.R import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index 971e5a229..c2c2757ad 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -37,11 +37,11 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.intent.isAppAvailableCompat import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.common.R -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent -import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt index b2b48cdce..49dd39d9c 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt @@ -54,8 +54,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text -import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.common.util.ext.underlineSubstring +import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.oauth.clients.ClientsFacade import jp.co.soramitsu.ui_core.component.card.ContentCard import jp.co.soramitsu.ui_core.resources.Dimens diff --git a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt index da6a9b6c1..9e75627d6 100644 --- a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt +++ b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt @@ -36,9 +36,9 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import io.mockk.every import io.mockk.mockkObject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.OptionsProvider -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt index 810856dde..f26265e57 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoFragment.kt @@ -42,11 +42,11 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController import jp.co.soramitsu.common.presentation.args.isLaunchedFromSoraCard -import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory @AndroidEntryPoint class BuyCryptoFragment : SoraBaseFragment() { diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt index fdadc94f2..49f7baf8b 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt @@ -37,6 +37,8 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import jp.co.soramitsu.androidfoundation.format.safeCast +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.CardHub @@ -46,10 +48,8 @@ import jp.co.soramitsu.common.domain.fiatSum import jp.co.soramitsu.common.domain.fiatSymbol import jp.co.soramitsu.common.domain.formatFiatAmount import jp.co.soramitsu.common.domain.iconUri -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.compose.SnackBarState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common_wallet.domain.model.CommonUserPoolData diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModel.kt index e6358b36a..9bd9f1505 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModel.kt @@ -37,9 +37,9 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.OptionsProvider -import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.domain.model.MigrationStatus diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModel.kt index 68517d219..314f628ba 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModel.kt @@ -39,11 +39,11 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt index 3091200db..2122306a7 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt @@ -35,9 +35,9 @@ package jp.co.soramitsu.feature_wallet_impl.presentation.contacts import android.graphics.drawable.PictureDrawable import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.test_shared.MainCoroutineRule diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt index 5d6fd9c31..56f87b20a 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt @@ -42,6 +42,7 @@ import io.mockk.junit4.MockKRule import io.mockk.just import io.mockk.mockkObject import io.mockk.verify +import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.config.BuildConfigWrapper @@ -50,7 +51,6 @@ import jp.co.soramitsu.common.domain.CardHubType import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.interfaces.WithProgress -import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor From 90c682d00f3342dd49b67faf47e1912e46c8b540 Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 28 May 2024 18:30:56 +0300 Subject: [PATCH 13/43] sc-29 --- .../presentation/profile/ProfileScreen.kt | 18 ++++++------- .../details/SoraCardDetailsViewModel.kt | 27 ++++++++++--------- .../cardshub/CardsHubViewModel.kt | 2 +- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt index 439e20f53..dd939ca94 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt @@ -85,15 +85,15 @@ internal fun ProfileItems( icon = R.drawable.ic_buy_crypto, onClick = onSoraCardClick, ) - CategoryItem( - modifier = Modifier - .testTagAsId("BuyXor") - .padding(top = Dimens.x2), - title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), - subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), - icon = R.drawable.ic_settings_buy_crypto, - onClick = onBuyCrypto, - ) +// CategoryItem( +// modifier = Modifier +// .testTagAsId("BuyXor") +// .padding(top = Dimens.x2), +// title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), +// subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), +// icon = R.drawable.ic_settings_buy_crypto, +// onClick = onBuyCrypto, +// ) } CategoryItem( modifier = Modifier diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index c2c2757ad..c0596b342 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -84,7 +84,7 @@ class SoraCardDetailsViewModel @Inject constructor( soraCardSettingsCard = SoraCardSettingsCardState( soraCardSettingsOptions = SoraCardSettingsOption.entries, ), - soraCardIBANCardState = SoraCardIBANCardState(iban = "", closed = false), + soraCardIBANCardState = null, logoutDialog = false, fiatWalletDialog = false, ) @@ -103,17 +103,20 @@ class SoraCardDetailsViewModel @Inject constructor( viewModelScope.launch { tryCatch { soraCardInteractor.basicStatus.value.let { basicStatus -> - basicStatus.ibanInfo?.let { iban -> - val local = _soraCardDetailsScreenState.value - ibanCache = iban - _soraCardDetailsScreenState.value = local.copy( - soraCardIBANCardState = SoraCardIBANCardState(iban.iban, iban.ibanStatus == IbanStatus.CLOSED), - soraCardMainSoraContentCardState = local.soraCardMainSoraContentCardState.copy( - balance = iban.balance, - phone = basicStatus.phone, - ), - ) - } + val local = _soraCardDetailsScreenState.value + ibanCache = basicStatus.ibanInfo + _soraCardDetailsScreenState.value = local.copy( + soraCardIBANCardState = basicStatus.ibanInfo?.let { iban -> + SoraCardIBANCardState( + iban.iban, + iban.ibanStatus == IbanStatus.CLOSED, + ) + }, + soraCardMainSoraContentCardState = local.soraCardMainSoraContentCardState.copy( + balance = basicStatus.ibanInfo?.balance, + phone = basicStatus.phone, + ), + ) } } } diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt index 49f7baf8b..98508fe03 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt @@ -394,7 +394,7 @@ class CardsHubViewModel @Inject constructor( fun onCardStateClicked() { if (soraCardInteractor.basicStatus.value.initialized) { _state.value.cards.filterIsInstance().firstOrNull()?.let { card -> - if (card.ibanBalance?.ibanStatus != IbanStatus.OTHER) { + if (card.ibanBalance?.ibanStatus != null) { mainRouter.showSoraCardDetails() } else if (card.kycStatus == null) { if (!connectionManager.isConnected) return From 0261aab467dea20dbe19797cd535b86879e2b313 Mon Sep 17 00:00:00 2001 From: arvifox Date: Wed, 29 May 2024 18:39:01 +0300 Subject: [PATCH 14/43] version_up --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8ea3daf77..d89abd20b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -41,10 +41,10 @@ timber = "5.0.1" ktor = "2.3.1" soracard = "1.1.7" xnetworking = "0.2.9" -xsubstrate = "1.2.1" +xsubstrate = "1.2.3" uicore = "0.2.31" xbackup = "1.2.0" -xcrypto = "1.2.1" +xcrypto = "1.2.2" ed = "2.0.1" xerces = "2.9.0" dagger = "2.49" From 2a9ac5efa4f108da83bb0164e1d9757bde8283bb Mon Sep 17 00:00:00 2001 From: arvifox Date: Thu, 30 May 2024 14:50:27 +0300 Subject: [PATCH 15/43] fixes --- android-foundation | 2 +- app/build.gradle.kts | 2 - common/build.gradle.kts | 6 +- .../soramitsu/common/util/CryptoAssistant.kt | 4 + common_wallet/build.gradle.kts | 2 +- core_db/build.gradle.kts | 2 +- demeter/build.gradle.kts | 2 +- feature_account_api/build.gradle.kts | 2 +- feature_account_impl/build.gradle.kts | 2 +- feature_assets_api/build.gradle.kts | 2 +- feature_assets_impl/build.gradle.kts | 2 +- feature_blockexplorer_api/build.gradle.kts | 2 +- feature_blockexplorer_impl/build.gradle.kts | 2 +- feature_ecosystem_impl/build.gradle.kts | 2 +- feature_ethereum_api/build.gradle.kts | 2 +- feature_ethereum_impl/.gitignore | 1 - feature_ethereum_impl/build.gradle.kts | 77 ---- .../src/main/AndroidManifest.xml | 3 - .../data/mappers/EthRegisterStateMapper.kt | 35 -- .../data/mappers/EthereumCredentialsMapper.kt | 60 --- .../data/network/ERC20ContractApi.kt | 82 ---- .../data/network/SmartContractApi.kt | 159 -------- .../data/repository/EthereumRepositoryImpl.kt | 382 ----------------- .../repository/converter/EtherWeiConverter.kt | 61 --- .../datasource/PrefsEthereumDatasource.kt | 88 ---- .../di/EthereumFeatureModule.kt | 86 ---- .../domain/EthereumInteractorImpl.kt | 177 -------- .../util/ContractsApiProvider.kt | 105 ----- .../feature_ethereum_impl/util/GasProvider.kt | 50 --- .../util/Web3jBip32Crypto.kt | 54 --- .../util/Web3jProvider.kt | 57 --- .../data/repository/Bip3244Test.kt | 82 ---- .../data/repository/EthereumRepositoryTest.kt | 385 ------------------ .../datasource/PrefsEthereumDatasourceTest.kt | 111 ----- .../domain/EthereumInteractorTest.kt | 89 ---- .../util/GasProviderTest.kt | 59 --- feature_main_api/build.gradle.kts | 2 +- feature_main_impl/build.gradle.kts | 2 +- feature_multiaccount_api/build.gradle.kts | 2 +- feature_multiaccount_impl/build.gradle.kts | 2 +- feature_polkaswap_api/build.gradle.kts | 2 +- feature_polkaswap_impl/build.gradle.kts | 2 +- .../PolkaswapSubscriptionRepositoryImpl.kt | 8 +- feature_referral_api/build.gradle.kts | 2 +- feature_referral_impl/build.gradle.kts | 2 +- feature_select_node_api/build.gradle.kts | 2 +- feature_select_node_impl/build.gradle.kts | 2 +- feature_sora_card_api/build.gradle.kts | 2 +- feature_sora_card_impl/build.gradle.kts | 2 +- feature_wallet_api/build.gradle.kts | 2 +- feature_wallet_impl/build.gradle.kts | 2 +- gradle/libs.versions.toml | 8 +- network/build.gradle.kts | 2 +- settings.gradle.kts | 1 - sorasubstrate/build.gradle.kts | 2 +- .../sora/substrate/runtime/RuntimeManager.kt | 6 +- .../sora/substrate/substrate/BulkRequest.kt | 6 +- .../substrate/substrate/SubstrateApiImpl.kt | 20 +- .../substrate/substrate/SubstrateCalls.kt | 43 +- test_data/build.gradle.kts | 2 +- test_shared/build.gradle.kts | 2 +- 61 files changed, 84 insertions(+), 2283 deletions(-) delete mode 100644 feature_ethereum_impl/.gitignore delete mode 100644 feature_ethereum_impl/build.gradle.kts delete mode 100644 feature_ethereum_impl/src/main/AndroidManifest.xml delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/mappers/EthRegisterStateMapper.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/mappers/EthereumCredentialsMapper.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/network/ERC20ContractApi.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/network/SmartContractApi.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/EthereumRepositoryImpl.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/converter/EtherWeiConverter.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/datasource/PrefsEthereumDatasource.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/di/EthereumFeatureModule.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/domain/EthereumInteractorImpl.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/ContractsApiProvider.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/GasProvider.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/Web3jBip32Crypto.kt delete mode 100644 feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/Web3jProvider.kt delete mode 100644 feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/Bip3244Test.kt delete mode 100644 feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/EthereumRepositoryTest.kt delete mode 100644 feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/datasource/PrefsEthereumDatasourceTest.kt delete mode 100644 feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/domain/EthereumInteractorTest.kt delete mode 100644 feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/util/GasProviderTest.kt diff --git a/android-foundation b/android-foundation index cc69d1432..cb8898951 160000 --- a/android-foundation +++ b/android-foundation @@ -1 +1 @@ -Subproject commit cc69d1432498c87b92b362480b0bbcb75925a8a7 +Subproject commit cb88989515db39026ac6f7523fc21c206e422c32 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 808b81fa9..09c2e4476 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -188,7 +188,6 @@ dependencies { implementation(project(":feature_account_api")) implementation(project(":feature_account_impl")) implementation(project(":feature_ethereum_api")) - implementation(project(":feature_ethereum_impl")) implementation(project(":feature_polkaswap_api")) implementation(project(":feature_polkaswap_impl")) implementation(project(":feature_wallet_api")) @@ -259,7 +258,6 @@ dependencies { kover(project(":feature_polkaswap_impl")) kover(project(":feature_referral_impl")) kover(project(":feature_ethereum_api")) - kover(project(":feature_ethereum_impl")) kover(project(":feature_wallet_api")) kover(project(":feature_wallet_impl")) kover(project(":feature_select_node_api")) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 2de1eec91..0df7171ad 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -38,7 +38,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -180,7 +180,9 @@ dependencies { implementation(libs.xbackupDep) implementation(libs.xsubstrateDep) implementation(libs.xcryptoDep) - implementation(libs.ed25519Dep) + implementation(libs.ed25519Dep) { +// exclude(module = "bcpkix-jdk15on") + } implementation(libs.xercesDep) implementation(libs.gsonDep) diff --git a/common/src/main/java/jp/co/soramitsu/common/util/CryptoAssistant.kt b/common/src/main/java/jp/co/soramitsu/common/util/CryptoAssistant.kt index a12773cc2..cb4eeeb34 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/CryptoAssistant.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/CryptoAssistant.kt @@ -109,6 +109,10 @@ class CryptoAssistant( } fun generateEd25519Keys(seed: ByteArray): KeyPair { +// return KeyPairGenerator.getInstance("RSA").let { +// it.initialize(2048) +// it.generateKeyPair() +// } return ed25519Sha3.generateKeypair(seed) } } diff --git a/common_wallet/build.gradle.kts b/common_wallet/build.gradle.kts index 83a5e0fc1..1dfd57e7b 100644 --- a/common_wallet/build.gradle.kts +++ b/common_wallet/build.gradle.kts @@ -20,7 +20,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/core_db/build.gradle.kts b/core_db/build.gradle.kts index 155b16617..de75fcfe1 100644 --- a/core_db/build.gradle.kts +++ b/core_db/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } testOptions { diff --git a/demeter/build.gradle.kts b/demeter/build.gradle.kts index 51976fead..7e1615eed 100644 --- a/demeter/build.gradle.kts +++ b/demeter/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_account_api/build.gradle.kts b/feature_account_api/build.gradle.kts index 31da44716..d45f68576 100644 --- a/feature_account_api/build.gradle.kts +++ b/feature_account_api/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_account_impl/build.gradle.kts b/feature_account_impl/build.gradle.kts index aa645c8f2..c18dcf64e 100644 --- a/feature_account_impl/build.gradle.kts +++ b/feature_account_impl/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_assets_api/build.gradle.kts b/feature_assets_api/build.gradle.kts index 5beaef7d1..a2fee241c 100644 --- a/feature_assets_api/build.gradle.kts +++ b/feature_assets_api/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_assets_impl/build.gradle.kts b/feature_assets_impl/build.gradle.kts index caf1831d4..e64e090ee 100644 --- a/feature_assets_impl/build.gradle.kts +++ b/feature_assets_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_blockexplorer_api/build.gradle.kts b/feature_blockexplorer_api/build.gradle.kts index df9937d8c..ed876eb0d 100644 --- a/feature_blockexplorer_api/build.gradle.kts +++ b/feature_blockexplorer_api/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_blockexplorer_impl/build.gradle.kts b/feature_blockexplorer_impl/build.gradle.kts index a7658b9be..a07190e50 100644 --- a/feature_blockexplorer_impl/build.gradle.kts +++ b/feature_blockexplorer_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_ecosystem_impl/build.gradle.kts b/feature_ecosystem_impl/build.gradle.kts index fd67ab001..ecc6f0a2a 100644 --- a/feature_ecosystem_impl/build.gradle.kts +++ b/feature_ecosystem_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_ethereum_api/build.gradle.kts b/feature_ethereum_api/build.gradle.kts index 1bcef3c21..e23525987 100644 --- a/feature_ethereum_api/build.gradle.kts +++ b/feature_ethereum_api/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_ethereum_impl/.gitignore b/feature_ethereum_impl/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/feature_ethereum_impl/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/feature_ethereum_impl/build.gradle.kts b/feature_ethereum_impl/build.gradle.kts deleted file mode 100644 index 91c6d16ba..000000000 --- a/feature_ethereum_impl/build.gradle.kts +++ /dev/null @@ -1,77 +0,0 @@ -plugins { - alias(libs.plugins.androidLibrary) - alias(libs.plugins.kotlinAndroid) - alias(libs.plugins.serialization) - alias(libs.plugins.hilt) - alias(libs.plugins.kapt) - id("kotlin-parcelize") - alias(libs.plugins.kover) -} - -kotlin { - jvmToolchain(11) -} - -android { - namespace = "jp.co.soramitsu.feature_ethereum_impl" - compileSdk = 34 - - defaultConfig { - minSdk = 24 - multiDexEnabled = true - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - testOptions { - unitTests.isReturnDefaultValues = true - targetSdk = 34 - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - - flavorDimensions += listOf("default") - - productFlavors { - create("develop") { - dimension = "default" - } - - create("soralution") { - dimension = "default" - } - - create("production") { - dimension = "default" - } - } -} - -dependencies { - implementation(project(":common")) - implementation(project(":core_db")) - implementation(project(":feature_account_api")) - implementation(project(":feature_ethereum_api")) - implementation(project(":feature_wallet_api")) - implementation(project(":sorasubstrate")) - - implementation(libs.daggerDep) - kapt(libs.daggerKaptDep) - - implementation(libs.xcryptoDep) - - implementation(libs.coroutineAndroidDep) - implementation(libs.coroutineDep) - implementation(libs.web3jDep) - - implementation(libs.roomDep) - - testImplementation(project(":test_shared")) -} diff --git a/feature_ethereum_impl/src/main/AndroidManifest.xml b/feature_ethereum_impl/src/main/AndroidManifest.xml deleted file mode 100644 index 972c3a837..000000000 --- a/feature_ethereum_impl/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/mappers/EthRegisterStateMapper.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/mappers/EthRegisterStateMapper.kt deleted file mode 100644 index c8d91890e..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/mappers/EthRegisterStateMapper.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.mappers - -class EthRegisterStateMapper diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/mappers/EthereumCredentialsMapper.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/mappers/EthereumCredentialsMapper.kt deleted file mode 100644 index 2a752a1fc..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/mappers/EthereumCredentialsMapper.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.mappers - -import java.math.BigInteger -import org.web3j.crypto.Bip32ECKeyPair -import org.web3j.crypto.Credentials - -class EthereumCredentialsMapper { - - companion object { - private const val hexRadix = 16 - } - - fun getPublicKey(privateKey: BigInteger): BigInteger { - return Credentials.create(privateKey.toString(hexRadix)).ecKeyPair.publicKey - } - - fun getAddress(privateKey: BigInteger): String { - return Credentials.create(privateKey.toString(hexRadix)).address - } - - fun getCredentials(privateKey: BigInteger): Credentials { - return Credentials.create(privateKey.toString(hexRadix)) - } - - fun getCredentialsFromECKeyPair(ecKeyPair: Bip32ECKeyPair): Credentials { - return Credentials.create(ecKeyPair) - } -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/network/ERC20ContractApi.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/network/ERC20ContractApi.kt deleted file mode 100644 index d41956b8a..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/network/ERC20ContractApi.kt +++ /dev/null @@ -1,82 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.network - -import java.math.BigInteger -import java.util.Collections -import jp.co.soramitsu.feature_ethereum_impl.util.GasProvider -import org.web3j.abi.TypeReference -import org.web3j.abi.datatypes.Address -import org.web3j.abi.datatypes.generated.Uint256 -import org.web3j.protocol.Web3j -import org.web3j.protocol.core.RemoteCall -import org.web3j.protocol.core.methods.response.TransactionReceipt -import org.web3j.tx.Contract -import org.web3j.tx.FastRawTransactionManager - -class ERC20ContractApi( - web3j: Web3j, - fastRawTransactionManager: FastRawTransactionManager, - customGasProvider: GasProvider, - tokenAddress: String -) : Contract(BIN_NOT_PROVIDED, tokenAddress, web3j, fastRawTransactionManager, customGasProvider) { - - companion object { - private const val FUNC_BALANCEOF = "balanceOf" - private const val FUNC_TRANSFER = "transfer" - } - - fun valBalance(to: String): RemoteCall { - val function = org.web3j.abi.datatypes.Function( - FUNC_BALANCEOF, - listOf(Address(to)), - listOf>(object : TypeReference() {}) as List>? - ) - return executeRemoteCallSingleValueReturn(function, BigInteger::class.java) - } - - fun transferVal(to: String, amountInWei: BigInteger): RemoteCall { - return executeRemoteCallTransaction(getTransferValFunction(to, amountInWei)) - } - - private fun getTransferValFunction(to: String, amount: BigInteger): org.web3j.abi.datatypes.Function { - return org.web3j.abi.datatypes.Function( - FUNC_TRANSFER, - listOf( - Address(to), - Uint256(amount) - ), - Collections.emptyList() - ) - } -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/network/SmartContractApi.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/network/SmartContractApi.kt deleted file mode 100644 index 5eaeba7b2..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/network/SmartContractApi.kt +++ /dev/null @@ -1,159 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.network - -import java.math.BigDecimal -import java.math.BigInteger -import jp.co.soramitsu.feature_ethereum_impl.util.GasProvider -import org.web3j.abi.TypeReference -import org.web3j.abi.Utils -import org.web3j.abi.datatypes.Address -import org.web3j.abi.datatypes.DynamicArray -import org.web3j.abi.datatypes.Function -import org.web3j.abi.datatypes.Uint -import org.web3j.abi.datatypes.generated.Bytes32 -import org.web3j.abi.datatypes.generated.Uint256 -import org.web3j.abi.datatypes.generated.Uint8 -import org.web3j.protocol.Web3j -import org.web3j.protocol.core.RemoteCall -import org.web3j.protocol.core.methods.response.TransactionReceipt -import org.web3j.tx.Contract -import org.web3j.tx.FastRawTransactionManager -import org.web3j.utils.Convert - -class SmartContractApi( - web3j: Web3j, - fastRawTransactionManager: FastRawTransactionManager, - gasProvider: GasProvider, -) : Contract( - BIN_NOT_PROVIDED, - "ethereumConfigProvider.config.masterContract", - web3j, - fastRawTransactionManager, - gasProvider -) { - - companion object { - private const val FUNC_MINTTOKENSBYPEERS = "mintTokensByPeers" - private const val FUNC_VALTOKENINSTANCE = "tokenInstance" - private const val FUNC_USED = "used" - private const val FUNC_PROOF = "proof" - } - - fun used(txHash: ByteArray): RemoteCall { - val function = Function( - FUNC_USED, - listOf(Bytes32(txHash)), - listOf>(object : TypeReference() {}) - ) - return executeRemoteCallSingleValueReturn(function, BigInteger::class.java) - } - - fun proof(): RemoteCall { - val function = Function( - FUNC_PROOF, - listOf(), - listOf>(object : TypeReference() {}) - ) - return executeRemoteCallSingleValueReturn(function, ByteArray::class.java) - } - - fun valTokenInstance(): RemoteCall { - val function = Function( - FUNC_VALTOKENINSTANCE, - listOf(), - listOf>(object : TypeReference

() {}) - ) - return executeRemoteCallSingleValueReturn(function, String::class.java) - } - - fun mintTokensByPeers( - amount: BigDecimal, - beneficiary: String, - txHash: ByteArray, - v: List, - r: List, - s: List, - from: String, - tokenAddress: String - ): RemoteCall { - val amountInWei = Convert.toWei(amount, Convert.Unit.ETHER).toBigInteger() - return executeRemoteCallTransaction( - getMintTokenFunction( - amountInWei, - beneficiary, - txHash, - v, - r, - s, - from, - tokenAddress - ) - ) - } - - private fun getMintTokenFunction( - amount: BigInteger, - beneficiary: String, - txHash: ByteArray, - v: List, - r: List, - s: List, - from: String, - tokenAddress: String - ): Function { - return Function( - FUNC_MINTTOKENSBYPEERS, - listOf( - Address(tokenAddress), - Uint256(amount), - Address(beneficiary), - Bytes32(txHash), - DynamicArray( - Uint8::class.java, - Utils.typeMap(v, Uint8::class.java) - ), - DynamicArray( - Bytes32::class.java, - Utils.typeMap(r, Bytes32::class.java) - ), - DynamicArray( - Bytes32::class.java, - Utils.typeMap(s, Bytes32::class.java) - ), - Address(from) - ), - emptyList() - ) - } -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/EthereumRepositoryImpl.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/EthereumRepositoryImpl.kt deleted file mode 100644 index d3d57f4f8..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/EthereumRepositoryImpl.kt +++ /dev/null @@ -1,382 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.repository - -import java.math.BigDecimal -import java.math.BigInteger -import java.security.KeyPair -import javax.inject.Inject -import jp.co.soramitsu.common.domain.AssetBalance -import jp.co.soramitsu.common.domain.SoraException -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumDatasource -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumRepository -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthRegisterState -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthereumCredentials -import jp.co.soramitsu.feature_ethereum_api.domain.model.Gas -import jp.co.soramitsu.feature_ethereum_api.domain.model.GasEstimation -import jp.co.soramitsu.feature_ethereum_impl.data.mappers.EthereumCredentialsMapper -import jp.co.soramitsu.feature_ethereum_impl.data.repository.converter.EtherWeiConverter -import jp.co.soramitsu.feature_ethereum_impl.util.ContractsApiProvider -import jp.co.soramitsu.feature_ethereum_impl.util.Web3jBip32Crypto -import jp.co.soramitsu.feature_ethereum_impl.util.Web3jProvider -import jp.co.soramitsu.xcrypto.util.fromHex -import org.web3j.crypto.Sign -import org.web3j.protocol.core.DefaultBlockParameterName -import org.web3j.utils.Numeric - -class EthereumRepositoryImpl @Inject constructor( - private val ethDataSource: EthereumDatasource, - private val ethereumCredentialsMapper: EthereumCredentialsMapper, - private val web3jProvider: Web3jProvider, - private val web3jBip32Crypto: Web3jBip32Crypto, - private val contractApiProvider: ContractsApiProvider, - private val etherWeiConverter: EtherWeiConverter, -) : EthereumRepository { - - companion object { - private val EMPTY_PROOF_HASH = ByteArray(32) - } - - override fun getValTokenAddress(ethCredentials: EthereumCredentials): String { - return contractApiProvider.getSmartContractApi(ethCredentials).valTokenInstance().send() - } - - override fun transferValErc20( - to: String, - amount: BigDecimal, - ethCredentials: EthereumCredentials, - tokenAddress: String - ) { - try { - val receipt = contractApiProvider.getErc20ContractApi(ethCredentials, tokenAddress) - .transferVal(to, etherWeiConverter.fromEtherToWei(amount)).send() - val gasPrice = contractApiProvider.getGasPrice() - val gasLimit = contractApiProvider.getGasLimit() - - val fee = etherWeiConverter.fromWeiToEther(gasLimit * gasPrice) - - // db.transactionDao().insert(transaction) - } catch (t: Throwable) { - throw SoraException.unexpectedError(t) - } - } - - override fun updateValErc20AndEthBalance( - ethCredentials: EthereumCredentials, - ethWalletAddress: String, - tokenAddress: String - ) { - val a = getValErc20BalanceRemote(ethCredentials, ethWalletAddress, tokenAddress) - val b = getEthereumBalanceRemote(ethCredentials) - mutableListOf(a, b) -// db.runInTransaction { -// it.forEach { db.assetDao().updateBalance(it.assetId, it.balance) } -// } - } - - private fun getValErc20BalanceRemote( - ethCredentials: EthereumCredentials, - ethWalletAddress: String, - tokenAddress: String - ): AssetBalance { - val c = contractApiProvider.getErc20ContractApi( - ethCredentials, - tokenAddress - ).valBalance(ethWalletAddress).send() - .let { etherWeiConverter.fromWeiToEther(it) } - return AssetBalance( - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - ) - } - - private fun getEthereumBalanceRemote(ethCredentials: EthereumCredentials): AssetBalance { - ethereumCredentialsMapper.getAddress(ethCredentials.privateKey) - .let { - web3jProvider.web3j.ethGetBalance(it, DefaultBlockParameterName.LATEST) - .send().balance - } - .let { etherWeiConverter.fromWeiToEther(it) } - return AssetBalance( - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - BigDecimal.ZERO, - ) - } - - override fun setGasPrice(gasPriceInGwei: BigInteger): BigDecimal { - setGasPriceRemote(gasPriceInGwei) - return getGasLimit() - .let { etherWeiConverter.fromGweiToWei(gasPriceInGwei) * it } - .let { etherWeiConverter.fromWeiToEther(it) } - } - - private fun setGasPriceRemote(gasPriceInGwei: BigInteger) { - val gasPrice = etherWeiConverter.fromGweiToWei(gasPriceInGwei) - contractApiProvider.setGasPrice(gasPrice) - } - - override fun setGasLimit(gasLimit: BigInteger): BigDecimal { - setGasLimitRemote(gasLimit) - return getGasPrice() - .let { gasLimit * it } - .let { etherWeiConverter.fromWeiToEther(it) } - } - - private fun getGasPrice(): BigInteger { - return contractApiProvider.getGasPrice() - } - - private fun getGasLimit(): BigInteger { - return contractApiProvider.getGasLimit() - } - - private fun setGasLimitRemote(gasLimit: BigInteger) { - contractApiProvider.setGasLimit(gasLimit) - } - - override fun calculateValErc20TransferFee(): BigDecimal { - return calculateValErc20Fee(ContractsApiProvider.DEFAULT_GAS_LIMIT_TRANSFER.toBigInteger()) - } - - override fun calculateValErc20WithdrawFee(): BigDecimal { - return calculateValErc20Fee(ContractsApiProvider.DEFAULT_GAS_LIMIT_WITHDRAW.toBigInteger()) - } - - override fun calculateValErc20CombinedFee(): BigDecimal { - return calculateValErc20Fee(ContractsApiProvider.DEFAULT_GAS_LIMIT_WITHDRAW.toBigInteger() + ContractsApiProvider.DEFAULT_GAS_LIMIT_TRANSFER.toBigInteger()) - } - - private fun calculateValErc20Fee(gasLimit: BigInteger): BigDecimal { - return contractApiProvider.setGasLimit(gasLimit) - .let { contractApiProvider.fetchGasPrice() } - .let { etherWeiConverter.fromWeiToGwei(it) * gasLimit } - .let { etherWeiConverter.fromGweiToEther(it) } - } - - override fun getEthWalletAddress(ethCredentials: EthereumCredentials): String { - return ethereumCredentialsMapper.getAddress(ethCredentials.privateKey) - } - - override fun getSerializedProof(ethCredentials: EthereumCredentials): String { - val privateKey = ethCredentials.privateKey - val publicKey = ethereumCredentialsMapper.getPublicKey(privateKey) - val address = ethereumCredentialsMapper.getAddress(privateKey) - val dataToSign = prepareDataToSign(address) - val signature = sign(dataToSign, privateKey) - - return "" - } - - private fun sign(message: ByteArray, privateKey: BigInteger): Sign.SignatureData { - val ecKeyPair = ethereumCredentialsMapper.getCredentials(privateKey).ecKeyPair - return Sign.signMessage(message, ecKeyPair) - } - - private fun prepareDataToSign(data: String): ByteArray { - val dat = Numeric.hexStringToByteArray(data) - return ("\u0019Ethereum Signed Message:\n" + (dat.size)).toByteArray() + dat - } - - override suspend fun getEthCredentials(mnemonic: String): EthereumCredentials { - val credentials = ethDataSource.retrieveEthereumCredentials() - return if (credentials == null) { - val ethCredentials = generateEthCredentials(mnemonic) - ethDataSource.saveEthereumCredentials(ethCredentials) - - ethCredentials - } else { - credentials - } - } - - private fun generateEthCredentials(mnemonic: String): EthereumCredentials { - val seed = web3jBip32Crypto.generateSeedFromMnemonic(mnemonic) - val masterKeyPair = web3jBip32Crypto.generateECMasterKeyPair(seed) - val bip44Keypair = web3jBip32Crypto.deriveECKeyPairFromMaster(masterKeyPair) - val credentials = ethereumCredentialsMapper.getCredentialsFromECKeyPair(bip44Keypair) - return EthereumCredentials(credentials.ecKeyPair.privateKey) - } - - override fun startWithdraw( - amount: BigDecimal, - srcAccountId: String, - ethAddress: String, - transactionFee: String, - keyPair: KeyPair - ) { - } - - override fun startCombinedValErcTransfer( - partialAmount: BigDecimal, - amount: BigDecimal, - srcAccountId: String, - withdrawEthAddress: String, - transferEthAddress: String, - transactionFee: String, - ethCredentials: EthereumCredentials, - keyPair: KeyPair - ) { - } - - override fun startCombinedValTransfer( - partialAmount: BigDecimal, - amount: BigDecimal, - transferAccountId: String, - transferName: String, - transactionFee: BigDecimal, - description: String, - ethCredentials: EthereumCredentials, - keyPair: KeyPair, - tokenAddress: String - ) { - } - - override suspend fun getEthRegistrationState(): EthRegisterState { - return ethDataSource.getEthRegisterState() - } - - override suspend fun registrationStarted(operationId: String) { - val ethRegisterState = EthRegisterState(EthRegisterState.State.IN_PROGRESS, operationId) - ethDataSource.saveEthRegisterState(ethRegisterState) - } - - override suspend fun registrationCompleted(operationId: String) { - val ethRegisterState = EthRegisterState(EthRegisterState.State.REGISTERED, operationId) - ethDataSource.saveEthRegisterState(ethRegisterState) - } - - override suspend fun registrationFailed(operationId: String) { - val ethRegisterState = EthRegisterState(EthRegisterState.State.FAILED, operationId) - ethDataSource.saveEthRegisterState(ethRegisterState) - } - - override fun confirmWithdraw( - ethCredentials: EthereumCredentials, - amount: BigDecimal, - txHash: String, - accountId: String, - gasPrice: BigInteger, - gasLimit: BigInteger, - tokenAddress: String - ): String { - return "" - } - - private fun mintTokensByPeers( - ethCredentials: EthereumCredentials, - amount: BigDecimal, - txHash: String, - beneficiary: String, - v: List, - r: List, - s: List, - from: String, - tokenAddress: String - ): String { - val txHashBytes = txHash.fromHex() - val result = contractApiProvider.getSmartContractApi(ethCredentials) - .mintTokensByPeers(amount, beneficiary, txHashBytes, v, r, s, from, tokenAddress) - .send() - return result.transactionHash - } - - override fun getGasEstimations( - gasLimit: BigInteger, - ethCredentials: EthereumCredentials - ): Gas { - return getGasPrice() - .let { gasPrice -> - val estimations = listOf( - getSlowEstimations(gasLimit, gasPrice), - getRegularEstimations(gasLimit, gasPrice), - getFastEstimations(gasLimit, gasPrice) - ) - - var gasPriceInGwei = etherWeiConverter.fromWeiToGwei(gasPrice) - - if (gasPriceInGwei == BigInteger.ZERO) { - gasPriceInGwei = BigInteger.ONE - } - - Gas(gasPriceInGwei, gasLimit, estimations) - } - } - - private fun getSlowEstimations(gasLimit: BigInteger, gasPrice: BigInteger): GasEstimation { - val amount = gasLimit - BigInteger.TEN - val gweiPrice = etherWeiConverter.fromWeiToGwei(gasPrice) - val amountWithPrice = amount * gweiPrice - val amountInEth = etherWeiConverter.fromGweiToEther(amountWithPrice) - return GasEstimation(GasEstimation.Type.SLOW, amount, amountInEth, 600) - } - - private fun getRegularEstimations(gasLimit: BigInteger, gasPrice: BigInteger): GasEstimation { - val gweiPrice = etherWeiConverter.fromWeiToGwei(gasPrice) - val amountWithPrice = gasLimit * gweiPrice - val amountInEth = etherWeiConverter.fromGweiToEther(amountWithPrice) - return GasEstimation(GasEstimation.Type.REGULAR, gasLimit, amountInEth, 90) - } - - private fun getFastEstimations(gasLimit: BigInteger, gasPrice: BigInteger): GasEstimation { - val amount = gasLimit + BigInteger.TEN - val gweiPrice = etherWeiConverter.fromWeiToGwei(gasPrice) - val amountWithPrice = amount * gweiPrice - val amountInEth = etherWeiConverter.fromGweiToEther(amountWithPrice) - return GasEstimation(GasEstimation.Type.FAST, amount, amountInEth, 20) - } - - override fun getBlockChainExplorerUrl(transactionHash: String): String { - return "" - } - - override fun getActualEthRegisterState(): EthRegisterState.State { - return EthRegisterState.State.NONE - } - - override fun isBridgeEnabled(ethCredentials: EthereumCredentials): Boolean { - val hash = contractApiProvider.getSmartContractApi(ethCredentials).proof().send() - return !EMPTY_PROOF_HASH.contentEquals(hash) - } -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/converter/EtherWeiConverter.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/converter/EtherWeiConverter.kt deleted file mode 100644 index bb4b4d230..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/converter/EtherWeiConverter.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.repository.converter - -import java.math.BigDecimal -import java.math.BigInteger -import javax.inject.Inject -import org.web3j.utils.Convert - -class EtherWeiConverter @Inject constructor() { - - fun fromWeiToEther(amountInWei: BigInteger): BigDecimal { - return Convert.fromWei(amountInWei.toBigDecimal(), Convert.Unit.ETHER) - } - - fun fromGweiToEther(amountInGwei: BigInteger): BigDecimal { - return Convert.fromWei(fromGweiToWei(amountInGwei).toBigDecimal(), Convert.Unit.ETHER) - } - - fun fromEtherToWei(amountInEther: BigDecimal): BigInteger { - return Convert.toWei(amountInEther, Convert.Unit.ETHER).toBigInteger() - } - - fun fromGweiToWei(amountInGwei: BigInteger): BigInteger { - return Convert.toWei(amountInGwei.toBigDecimal(), Convert.Unit.GWEI).toBigInteger() - } - - fun fromWeiToGwei(amountInGwei: BigInteger): BigInteger { - return Convert.fromWei(amountInGwei.toBigDecimal(), Convert.Unit.GWEI).toBigInteger() - } -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/datasource/PrefsEthereumDatasource.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/datasource/PrefsEthereumDatasource.kt deleted file mode 100644 index ecef1e280..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/datasource/PrefsEthereumDatasource.kt +++ /dev/null @@ -1,88 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.repository.datasource - -import java.math.BigInteger -import javax.inject.Inject -import jp.co.soramitsu.common.data.EncryptedPreferences -import jp.co.soramitsu.common.data.SoraPreferences -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumDatasource -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthRegisterState -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthereumCredentials - -class PrefsEthereumDatasource @Inject constructor( - private val encryptedPreferences: EncryptedPreferences, - private val soraPreferences: SoraPreferences -) : EthereumDatasource { - - companion object { - private const val PREFS_ETH_PRIVATE = "prefs_eth_private_key" - private const val PREFS_ETH_REGISTER_TRANSACTION_HASH = "prefs_eth_register_transaction_hash" - private const val PREFS_ETH_REGISTER_STATE = "prefs_eth_register_state" - private const val PREFS_VAL_ADDRESS = "prefs_val_address" - } - - override suspend fun saveVALAddress(address: String) { - soraPreferences.putString(PREFS_VAL_ADDRESS, address) - } - - override suspend fun saveEthereumCredentials(ethereumCredentials: EthereumCredentials) { - encryptedPreferences.putEncryptedString(PREFS_ETH_PRIVATE, ethereumCredentials.privateKey.toString()) - } - - override suspend fun retrieveEthereumCredentials(): EthereumCredentials? { - val privateString = encryptedPreferences.getDecryptedString(PREFS_ETH_PRIVATE) - - return if (privateString.isEmpty()) { - null - } else { - EthereumCredentials(BigInteger(privateString)) - } - } - - override suspend fun getEthRegisterState(): EthRegisterState { - val stateStr = soraPreferences.getString(PREFS_ETH_REGISTER_STATE) - val transactionHash = "soraPreferences.getNullableString(PREFS_ETH_REGISTER_TRANSACTION_HASH)" - return if (stateStr.isEmpty()) { - EthRegisterState(EthRegisterState.State.NONE, transactionHash) - } else { - val state = EthRegisterState.State.valueOf(stateStr) - EthRegisterState(state, transactionHash) - } - } - - override suspend fun saveEthRegisterState(state: EthRegisterState) { - state.transactionHash?.let { soraPreferences.putString(PREFS_ETH_REGISTER_TRANSACTION_HASH, it) } - soraPreferences.putString(PREFS_ETH_REGISTER_STATE, state.state.toString()) - } -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/di/EthereumFeatureModule.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/di/EthereumFeatureModule.kt deleted file mode 100644 index d0533ed76..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/di/EthereumFeatureModule.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.di - -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton -import jp.co.soramitsu.common.data.EncryptedPreferences -import jp.co.soramitsu.common.data.SoraPreferences -import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumDatasource -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumInteractor -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumRepository -import jp.co.soramitsu.feature_ethereum_impl.data.mappers.EthRegisterStateMapper -import jp.co.soramitsu.feature_ethereum_impl.data.mappers.EthereumCredentialsMapper -import jp.co.soramitsu.feature_ethereum_impl.data.repository.EthereumRepositoryImpl -import jp.co.soramitsu.feature_ethereum_impl.data.repository.datasource.PrefsEthereumDatasource -import jp.co.soramitsu.feature_ethereum_impl.domain.EthereumInteractorImpl - -@Module -@InstallIn(SingletonComponent::class) -class EthereumFeatureModule { - - @Provides - @Singleton - fun provideEthereumRepository(ethereumRepositoryImpl: EthereumRepositoryImpl): EthereumRepository = - ethereumRepositoryImpl - - @Provides - @Singleton - fun provideEthereumCredentialsMapper(): EthereumCredentialsMapper = EthereumCredentialsMapper() - - @Provides - @Singleton - fun provideEthereumDatasource( - encryptedPreferences: EncryptedPreferences, - soraPreferences: SoraPreferences - ): EthereumDatasource { - return PrefsEthereumDatasource(encryptedPreferences, soraPreferences) - } - - @Singleton - @Provides - fun provideEthereumInteractor( - ethereumRepository: EthereumRepository, - credentialsRepository: CredentialsRepository, - ): EthereumInteractor { - return EthereumInteractorImpl(ethereumRepository, credentialsRepository) - } - - @Singleton - @Provides - fun provideEthRegisterStateMapper(): EthRegisterStateMapper = EthRegisterStateMapper() -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/domain/EthereumInteractorImpl.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/domain/EthereumInteractorImpl.kt deleted file mode 100644 index 79e2d01d3..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/domain/EthereumInteractorImpl.kt +++ /dev/null @@ -1,177 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.domain - -import java.math.BigDecimal -import java.math.BigInteger -import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumInteractor -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumRepository -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthRegisterState -import jp.co.soramitsu.feature_ethereum_api.domain.model.Gas -import jp.co.soramitsu.feature_ethereum_impl.util.ContractsApiProvider - -class EthereumInteractorImpl( - private val ethereumRepository: EthereumRepository, - private val credentialsRepository: CredentialsRepository, -) : EthereumInteractor { - - override fun transferValERC20(to: String, amount: BigDecimal) { -// return credentialsRepository.retrieveMnemonic() -// .flatMap { ethereumRepository.getEthCredentials(it) } -// .flatMap { ethCreds -> ethereumRepository.getValTokenAddress(ethCreds).map { Pair(ethCreds, it) } } -// .flatMapCompletable { ethereumRepository.transferValErc20(to, amount, it.first, it.second) } - } - - private fun getMinerFeeInitialData(gasLimit: BigInteger): Gas { - return Gas(BigInteger.ZERO, BigInteger.ZERO, emptyList()) -// return credentialsRepository.retrieveMnemonic() -// .flatMap { ethereumRepository.getEthCredentials(it) } -// .flatMap { ethereumRepository.getGasEstimations(gasLimit, it) } - } - - override fun getMinerFeeInitialDataForTransfer(): Gas { - return getMinerFeeInitialData(ContractsApiProvider.DEFAULT_GAS_LIMIT_TRANSFER.toBigInteger()) - } - - override fun getMinerFeeInitialDataForTransferWithdraw(): Gas { - return getMinerFeeInitialData(ContractsApiProvider.DEFAULT_GAS_LIMIT_TRANSFER.toBigInteger() + ContractsApiProvider.DEFAULT_GAS_LIMIT_WITHDRAW.toBigInteger()) - } - - override fun retryWithdrawTransaction(soranetHash: String) { -// return credentialsRepository.getAddress() -// .flatMapCompletable { accountId -> -// credentialsRepository.retrieveKeyPair() -// .flatMapCompletable { keyPair -> -// credentialsRepository.retrieveMnemonic() -// .flatMap { -// ethereumRepository.getEthCredentials(it) -// } -// .flatMapCompletable { ethereumCredentials -> -// ethereumRepository.getValTokenAddress(ethereumCredentials) -// .flatMapCompletable { tokenAddress -> -// Completable.complete() -// } -// } -// } -// } - } - - override fun getMinerFeeInitialDataForWithdraw(): Gas { - return getMinerFeeInitialData(ContractsApiProvider.DEFAULT_GAS_LIMIT_WITHDRAW.toBigInteger()) - } - - override fun getAddress(): String { - return "" -// return credentialsRepository.retrieveMnemonic() -// .flatMap { ethereumRepository.getEthCredentials(it) } -// .flatMap { ethereumRepository.getEthWalletAddress(it) } - } - - override fun updateFeeWithCurrentGasLimitAndPrice( - gasLimit: BigInteger, - gasPrice: BigInteger - ): BigDecimal { - return BigDecimal.ZERO -// return credentialsRepository.retrieveMnemonic() -// .flatMap { ethereumRepository.setGasLimit(gasLimit) } -// .flatMap { ethereumRepository.setGasPrice(gasPrice) } - } - - override fun startWithdraw(amount: BigDecimal, ethAddress: String, transactionFee: String) { -// return credentialsRepository.getAddress() -// .flatMapCompletable { accountId -> -// credentialsRepository.retrieveKeyPair() -// .flatMapCompletable { keyPair -> -// ethereumRepository.startWithdraw(amount, accountId, ethAddress, transactionFee, KeyPair(null, null)) -// } -// } - } - - override fun getActualEthRegisterState(): EthRegisterState.State { - return ethereumRepository.getActualEthRegisterState() - } - - override fun startCombinedValErcTransfer( - partialAmount: BigDecimal, - amount: BigDecimal, - ethAddress: String, - transactionFee: String - ) { -// return credentialsRepository.retrieveMnemonic() -// .flatMap { ethereumRepository.getEthCredentials(it) } -// .flatMap { ethCredentials -> ethereumRepository.getEthWalletAddress(ethCredentials).map { Pair(it, ethCredentials) } } -// .flatMapCompletable { -// credentialsRepository.getAddress() -// .flatMapCompletable { accountId -> -// credentialsRepository.retrieveKeyPair() -// .flatMapCompletable { keypair -> -// ethereumRepository.startCombinedValErcTransfer(partialAmount, amount, accountId, it.first, ethAddress, transactionFee, it.second, KeyPair(null, null)) -// } -// } -// } - } - - override fun startCombinedValTransfer( - partialAmount: BigDecimal, - amount: BigDecimal, - peerId: String, - peerFullName: String, - transactionFee: BigDecimal, - description: String - ) { -// return credentialsRepository.retrieveKeyPair() -// .flatMapCompletable { keyPair -> -// credentialsRepository.retrieveMnemonic() -// .flatMapCompletable { -// ethereumRepository.getEthCredentials(it) -// .flatMap { ethCreds -> ethereumRepository.getValTokenAddress(ethCreds).map { Pair(ethCreds, it) } } -// .flatMapCompletable { ethereumRepository.startCombinedValTransfer(partialAmount, amount, peerId, peerFullName, transactionFee, description, it.first, KeyPair(null, null), it.second) } -// } -// } - } - - override fun isBridgeEnabled(): Pair = - true to true -// if (healthChecker.ethreumConfigState.value != true) -// Single.just(Pair(first = false, second = true)) -// else credentialsRepository.retrieveMnemonic() -// .flatMap { -// ethereumRepository.getEthCredentials(it) -// .flatMap { ethCreds -> -// ethereumRepository.isBridgeEnabled(ethCreds).map { br -> -// Pair(first = true, second = br) -// } -// } -// } -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/ContractsApiProvider.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/ContractsApiProvider.kt deleted file mode 100644 index 53db85c04..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/ContractsApiProvider.kt +++ /dev/null @@ -1,105 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.util - -import java.math.BigInteger -import javax.inject.Inject -import javax.inject.Singleton -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthereumCredentials -import jp.co.soramitsu.feature_ethereum_impl.data.mappers.EthereumCredentialsMapper -import jp.co.soramitsu.feature_ethereum_impl.data.network.ERC20ContractApi -import jp.co.soramitsu.feature_ethereum_impl.data.network.SmartContractApi -import org.web3j.tx.FastRawTransactionManager -import org.web3j.tx.response.NoOpProcessor - -@Singleton -class ContractsApiProvider @Inject constructor( - private val web3jProvider: Web3jProvider, - private val ethereumCredentialsMapper: EthereumCredentialsMapper, -) { - - companion object { - const val DEFAULT_GAS_LIMIT_TRANSFER = 200000 - const val DEFAULT_GAS_LIMIT_WITHDRAW = 350000 - } - - private var smartContractApi: SmartContractApi? = null - private var erc20ContractApi: ERC20ContractApi? = null - private var fastRawTransactionManager: FastRawTransactionManager? = null - private val gasProvider = GasProvider(BigInteger.ZERO, BigInteger.ZERO) - - fun getSmartContractApi(ethCredentials: EthereumCredentials): SmartContractApi { - if (smartContractApi == null) { - smartContractApi = SmartContractApi(web3jProvider.web3j, getOrCreateFastRawTransactionManager(ethCredentials), gasProvider) - } - return smartContractApi!! - } - - fun getErc20ContractApi(ethCredentials: EthereumCredentials, tokenAddress: String): ERC20ContractApi { - if (erc20ContractApi == null) { - erc20ContractApi = ERC20ContractApi(web3jProvider.web3j, getOrCreateFastRawTransactionManager(ethCredentials), gasProvider, tokenAddress) - } - return erc20ContractApi!! - } - - fun fetchGasPrice(): BigInteger { - val gasPrice = web3jProvider.web3j.ethGasPrice().send().gasPrice - gasProvider.price = gasPrice - return gasPrice - } - - fun getGasLimit(): BigInteger { - return gasProvider.estimatedGas - } - - fun getGasPrice(): BigInteger { - return gasProvider.price - } - - fun setGasLimit(gasLimit: BigInteger) { - gasProvider.estimatedGas = gasLimit - } - - fun setGasPrice(gasPrice: BigInteger) { - gasProvider.price = gasPrice - } - - private fun getOrCreateFastRawTransactionManager(ethCredentials: EthereumCredentials): FastRawTransactionManager { - if (fastRawTransactionManager == null) { - val credentials = ethereumCredentialsMapper.getCredentials(ethCredentials.privateKey) - fastRawTransactionManager = FastRawTransactionManager(web3jProvider.web3j, credentials, NoOpProcessor(web3jProvider.web3j)) - } - - return fastRawTransactionManager!! - } -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/GasProvider.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/GasProvider.kt deleted file mode 100644 index e2ab06f05..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/GasProvider.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.util - -import java.math.BigInteger -import org.web3j.tx.gas.ContractGasProvider - -data class GasProvider( - var estimatedGas: BigInteger, - var price: BigInteger -) : ContractGasProvider { - - override fun getGasLimit(contractFunc: String?): BigInteger = estimatedGas - - override fun getGasLimit(): BigInteger = estimatedGas - - override fun getGasPrice(contractFunc: String?): BigInteger = price - - override fun getGasPrice(): BigInteger = price -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/Web3jBip32Crypto.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/Web3jBip32Crypto.kt deleted file mode 100644 index 4b70bd605..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/Web3jBip32Crypto.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.util - -import javax.inject.Inject -import org.web3j.crypto.Bip32ECKeyPair -import org.web3j.crypto.MnemonicUtils - -class Web3jBip32Crypto @Inject constructor() { - - fun generateSeedFromMnemonic(mnemonic: String): ByteArray { - return MnemonicUtils.generateSeed(mnemonic, "") - } - - fun generateECMasterKeyPair(seed: ByteArray): Bip32ECKeyPair { - return Bip32ECKeyPair.generateKeyPair(seed) - } - - fun deriveECKeyPairFromMaster(masterKeyPair: Bip32ECKeyPair): Bip32ECKeyPair { - val path = - intArrayOf(44 or Bip32ECKeyPair.HARDENED_BIT, 60 or Bip32ECKeyPair.HARDENED_BIT, 0 or Bip32ECKeyPair.HARDENED_BIT, 0, 0) - return Bip32ECKeyPair.deriveKeyPair(masterKeyPair, path) - } -} diff --git a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/Web3jProvider.kt b/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/Web3jProvider.kt deleted file mode 100644 index eba0e106f..000000000 --- a/feature_ethereum_impl/src/main/java/jp/co/soramitsu/feature_ethereum_impl/util/Web3jProvider.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.util - -import javax.inject.Inject -import javax.inject.Named -import javax.inject.Singleton -import okhttp3.Credentials -import okhttp3.OkHttpClient -import org.web3j.protocol.Web3j -import org.web3j.protocol.core.JsonRpc2_0Web3j -import org.web3j.protocol.http.HttpService - -@Singleton -class Web3jProvider @Inject constructor( - @Named("WEB3J_CLIENT") okHttpClient: OkHttpClient.Builder -) { - - val web3j: Web3j by lazy { - okHttpClient.addNetworkInterceptor { - val credential: String = Credentials.basic("config.userName", "config.password") - val newRequest = it.request().newBuilder().header("Authorization", credential).build() - it.proceed(newRequest) - } - JsonRpc2_0Web3j((HttpService("config.url", okHttpClient.build()))) - } -} diff --git a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/Bip3244Test.kt b/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/Bip3244Test.kt deleted file mode 100644 index c1f48fa5e..000000000 --- a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/Bip3244Test.kt +++ /dev/null @@ -1,82 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.repository - -import java.math.BigInteger -import java.util.* -import org.bouncycastle.util.encoders.Hex -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.junit.MockitoJUnitRunner -import org.web3j.crypto.Bip32ECKeyPair -import org.web3j.crypto.Credentials -import org.web3j.crypto.MnemonicUtils - -@RunWith(MockitoJUnitRunner::class) -class Bip3244Test { - - private val mnemonic = - "agent plunge forget key stadium bridge garlic board acid volcano patrol sick" - private val hexseed = - "e175fb39d2f2688495d74462ea2596c3fe66a1213a72acd74021c8ac145e7addfe8f9c4c4ce12ec2a03adad3f86cbbb11c33efb51d44f84a6b82c7a5eb65d233" - private val privateKey = - BigInteger("42478643bce06b7d98415ab869afc109e49ade02dcc1dfef7b5ca47ce799b6fe", 16) - private val address = "0x736d66B3313BD8c7d91a08423a0354E4EF57219b" - private val publicKey = BigInteger( - "a499871e2f0ed30cfd2ba035f35e7cccf094d01b7207e275d86dcdf538e41a512dfef76822fc747eafe3cd825b1a05d3ecd0e995acfd9e76edaaab53baf8c198", - 16 - ) - - @Test - fun `bip32 and 44 protocols are implemented right`() { - val path = intArrayOf( - 44 or Bip32ECKeyPair.HARDENED_BIT, - 60 or Bip32ECKeyPair.HARDENED_BIT, - 0 or Bip32ECKeyPair.HARDENED_BIT, - 0, - 0 - ) - val seed = MnemonicUtils.generateSeed(mnemonic, "") - - assertEquals(Hex.toHexString(seed), hexseed) - - val masterKeyPair = Bip32ECKeyPair.generateKeyPair(seed) - val bip44Keypair = Bip32ECKeyPair.deriveKeyPair(masterKeyPair, path) - val credentials = Credentials.create(bip44Keypair) - - assertEquals(publicKey, credentials.ecKeyPair.publicKey) - assertEquals(privateKey, credentials.ecKeyPair.privateKey) - assertEquals(address.lowercase(Locale.getDefault()), credentials.address) - } -} diff --git a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/EthereumRepositoryTest.kt b/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/EthereumRepositoryTest.kt deleted file mode 100644 index 4e2aab434..000000000 --- a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/EthereumRepositoryTest.kt +++ /dev/null @@ -1,385 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.repository - -import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import java.math.BigDecimal -import java.math.BigInteger -import java.util.concurrent.Callable -import jp.co.soramitsu.core_db.AppDatabase -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumDatasource -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumRepository -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthRegisterState -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthereumCredentials -import jp.co.soramitsu.feature_ethereum_api.domain.model.Gas -import jp.co.soramitsu.feature_ethereum_api.domain.model.GasEstimation -import jp.co.soramitsu.feature_ethereum_impl.data.mappers.EthRegisterStateMapper -import jp.co.soramitsu.feature_ethereum_impl.data.mappers.EthereumCredentialsMapper -import jp.co.soramitsu.feature_ethereum_impl.data.network.ERC20ContractApi -import jp.co.soramitsu.feature_ethereum_impl.data.network.SmartContractApi -import jp.co.soramitsu.feature_ethereum_impl.data.repository.converter.EtherWeiConverter -import jp.co.soramitsu.feature_ethereum_impl.util.ContractsApiProvider -import jp.co.soramitsu.feature_ethereum_impl.util.Web3jBip32Crypto -import jp.co.soramitsu.feature_ethereum_impl.util.Web3jProvider -import jp.co.soramitsu.test_shared.MainCoroutineRule -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.runTest -import org.bouncycastle.util.encoders.Hex -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.junit.rules.TestRule -import org.junit.runner.RunWith -import org.mockito.BDDMockito.given -import org.mockito.BDDMockito.verify -import org.mockito.Mock -import org.mockito.Mockito.mock -import org.mockito.junit.MockitoJUnitRunner -import org.web3j.crypto.Bip32ECKeyPair -import org.web3j.crypto.Credentials -import org.web3j.protocol.core.RemoteCall -import org.web3j.protocol.core.methods.response.TransactionReceipt - -@ExperimentalCoroutinesApi -@RunWith(MockitoJUnitRunner::class) -class EthereumRepositoryTest { - - @Rule - @JvmField - val rule: TestRule = InstantTaskExecutorRule() - - @get:Rule - var mainCoroutineRule = MainCoroutineRule() - - @Mock - private lateinit var web3jProvider: Web3jProvider - - @Mock - private lateinit var web3jBip32Crypto: Web3jBip32Crypto - - @Mock - private lateinit var ethereumDatasource: EthereumDatasource - - @Mock - private lateinit var ethereumCredentialsMapper: EthereumCredentialsMapper - - @Mock - private lateinit var contractApiProvider: ContractsApiProvider - - @Mock - private lateinit var smartContractApi: SmartContractApi - - @Mock - private lateinit var erc20ContractApi: ERC20ContractApi - - @Mock - private lateinit var etherWeiConverter: EtherWeiConverter - - @Mock - private lateinit var db: AppDatabase - - @Mock - private lateinit var ethRegisterStateMapper: EthRegisterStateMapper - - private lateinit var ethereumRepository: EthereumRepository - - private val valTokenAddress = "valTokenAddress" - private val txHash = "txHash" - private val srcAccountId = "srcaccountId" - private val address = "address" - private val mnemonic = - "ecology power suggest mad rally exit leg guilt entry bid cook boil blame cry grunt" - private val amount = BigDecimal.ONE - private val minerFee = "11.0" - private val seed = mnemonic.toByteArray() - private val ethereumCredentials = - EthereumCredentials(BigInteger("4309705105768215758615629237602468660061307779130899782366233796951641406004")) - private val ecKeyPair = Bip32ECKeyPair.generateKeyPair(seed) - private val gasPrice = BigInteger.ONE - private val gasLimit = BigInteger.ONE - - @Before - fun setUp() { - given(contractApiProvider.getGasPrice()).willReturn(gasPrice) - given(contractApiProvider.getGasLimit()).willReturn(gasLimit) - given(etherWeiConverter.fromWeiToEther(gasLimit * gasPrice)).willReturn(BigDecimal(minerFee)) - given(contractApiProvider.getSmartContractApi(ethereumCredentials)).willReturn( - smartContractApi - ) - given( - contractApiProvider.getErc20ContractApi( - ethereumCredentials, - valTokenAddress - ) - ).willReturn(erc20ContractApi) - ethereumRepository = EthereumRepositoryImpl( - ethereumDatasource, - ethereumCredentialsMapper, - web3jProvider, - web3jBip32Crypto, - contractApiProvider, - etherWeiConverter - ) - } - - @Test - fun `transfer Xor ERC20 transfer called`() { - val remoteCall = mock(RemoteCall::class.java) - val transactionReceipt = mock(TransactionReceipt::class.java) - - given(etherWeiConverter.fromEtherToWei(amount)).willReturn(amount.toBigInteger()) - given( - erc20ContractApi.transferVal( - address, - amount.toBigInteger() - ) - ).willReturn(remoteCall as RemoteCall?) - // given(ethereumCredentialsMapper.getAddress(anyNonNull())).willReturn(address) - given(remoteCall!!.send()).willReturn(transactionReceipt) - // given(transactionReceipt.transactionHash).willReturn(txHash) - - ethereumRepository.transferValErc20(address, amount, ethereumCredentials, valTokenAddress) - - verify(erc20ContractApi).transferVal(address, amount.toBigInteger()) - verify(remoteCall).send() - } - - @Test - fun `get eth registration state`() = runTest { - val state = EthRegisterState(EthRegisterState.State.NONE, "") - given(ethereumDatasource.getEthRegisterState()).willReturn(state) - - val actual = ethereumRepository.getEthRegistrationState() - assertEquals(state, actual) - } - - @Test - fun `registration state called`() = runTest { - val operationId = "operationId" - val ethRegisterState = EthRegisterState(EthRegisterState.State.IN_PROGRESS, operationId) - - ethereumRepository.registrationStarted(operationId) - - verify(ethereumDatasource).saveEthRegisterState(ethRegisterState) - } - - @Test - fun `registration completed called`() = runTest { - val operationId = "operationId" - val ethRegisterState = EthRegisterState(EthRegisterState.State.REGISTERED, operationId) - - ethereumRepository.registrationCompleted(operationId) - - verify(ethereumDatasource).saveEthRegisterState(ethRegisterState) - } - - @Test - fun `registration failed called`() = runTest { - val operationId = "operationId" - val ethRegisterState = EthRegisterState(EthRegisterState.State.FAILED, operationId) - - ethereumRepository.registrationFailed(operationId) - - verify(ethereumDatasource).saveEthRegisterState(ethRegisterState) - } - - @Test - fun `set gas limit called`() { - val gasLimit = BigInteger.ONE - val gasPrice = BigInteger.TEN - val etherFee = BigDecimal.TEN - - given(etherWeiConverter.fromWeiToEther(BigInteger.TEN)).willReturn(etherFee) - - given(contractApiProvider.getGasPrice()).willReturn(gasPrice) - - assertEquals(etherFee, ethereumRepository.setGasLimit(gasLimit)) - - verify(contractApiProvider).setGasLimit(gasLimit) - } - - @Test - fun `set gas price called`() { - val gasLimit = BigInteger.ONE - val gasPriceInWei = BigInteger.TEN - val gasPriceInGwei = BigInteger("2") - val etherFee = BigDecimal.TEN - - given(etherWeiConverter.fromWeiToEther(BigInteger.TEN)).willReturn(etherFee) - given(etherWeiConverter.fromGweiToWei(gasPriceInGwei)).willReturn(gasPriceInWei) - - given(contractApiProvider.getGasLimit()).willReturn(gasLimit) - - assertEquals(etherFee, ethereumRepository.setGasPrice(gasPriceInGwei)) - - verify(contractApiProvider).setGasPrice(gasPriceInWei) - } - - @Test - fun `get eth credentials from cache called`() = runTest { - given(ethereumDatasource.retrieveEthereumCredentials()).willReturn(ethereumCredentials) - - assertEquals(ethereumCredentials, ethereumRepository.getEthCredentials(mnemonic)) - } - - @Test - fun `get eth credentials called`() = runTest { - val masterKeypair = Bip32ECKeyPair(BigInteger.ONE, BigInteger.ONE, 0, seed, null) - val childKeypair = - Bip32ECKeyPair(ethereumCredentials.privateKey, BigInteger.TEN, 1, seed, masterKeypair) - val credentials = Credentials.create(childKeypair) - - given(web3jBip32Crypto.generateSeedFromMnemonic(mnemonic)).willReturn(seed) - given(web3jBip32Crypto.generateECMasterKeyPair(seed)).willReturn(masterKeypair) - given(web3jBip32Crypto.deriveECKeyPairFromMaster(masterKeypair)).willReturn(childKeypair) - given(ethereumCredentialsMapper.getCredentialsFromECKeyPair(childKeypair)).willReturn( - credentials - ) - - assertEquals(ethereumCredentials, ethereumRepository.getEthCredentials(mnemonic)) - - verify(ethereumDatasource).saveEthereumCredentials(ethereumCredentials) - } - - @Test - fun `get gas estimations called`() { - val slowGasLimit = gasLimit - BigInteger.TEN - val slowGasAmount = slowGasLimit * gasPrice - val slowGasAmountEth = slowGasAmount.toBigDecimal() - given(etherWeiConverter.fromGweiToEther(slowGasAmount)).willReturn(slowGasAmountEth) - given(contractApiProvider.getGasPrice()).willReturn(gasPrice) - given(etherWeiConverter.fromWeiToGwei(gasPrice)).willReturn(gasPrice) - - val normalGasLimit = gasLimit - val normalGasAmount = normalGasLimit * gasPrice - val normalGasAmountEth = normalGasAmount.toBigDecimal() - given(etherWeiConverter.fromGweiToEther(normalGasAmount)).willReturn(normalGasAmountEth) - - val fastGasLimit = gasLimit + BigInteger.TEN - val fastGasAmount = fastGasLimit * gasPrice - val fastGasAmountEth = fastGasAmount.toBigDecimal() - given(etherWeiConverter.fromGweiToEther(fastGasAmount)).willReturn(fastGasAmountEth) - - val estimations = listOf( - GasEstimation(GasEstimation.Type.SLOW, slowGasAmount, slowGasAmountEth, 600), - GasEstimation(GasEstimation.Type.REGULAR, normalGasAmount, normalGasAmountEth, 90), - GasEstimation(GasEstimation.Type.FAST, fastGasAmount, fastGasAmountEth, 20) - ) - - assertEquals( - Gas(gasPrice, gasLimit, estimations), - ethereumRepository.getGasEstimations(gasLimit, ethereumCredentials) - ) - } - - @Test - fun `is bridge enabled called`() { - val txHash = Hex.toHexString("irohaTxHash1".toByteArray()) - val txHashBytes = Hex.decode(txHash) - val userRemoteCall = RemoteCall(Callable { txHashBytes }) - given(smartContractApi.proof()).willReturn(userRemoteCall) - - assertEquals(true, ethereumRepository.isBridgeEnabled(ethereumCredentials)) - } - - @Test - fun `is bridge enabled called when not enabled`() { - val userRemoteCall = RemoteCall(Callable { ByteArray(32) }) - given(smartContractApi.proof()).willReturn(userRemoteCall) - - assertEquals(false, ethereumRepository.isBridgeEnabled(ethereumCredentials)) - } - - @Test - fun `get val token address called`() { - val userRemoteCall = RemoteCall(Callable { valTokenAddress }) - given(smartContractApi.valTokenInstance()).willReturn(userRemoteCall) - - assertEquals(valTokenAddress, ethereumRepository.getValTokenAddress(ethereumCredentials)) - } - - @Test - fun `get eth address called`() { - given(ethereumCredentialsMapper.getAddress(ethereumCredentials.privateKey)).willReturn( - address - ) - - assertEquals(address, ethereumRepository.getEthWalletAddress(ethereumCredentials)) - } - - @Test - fun `calculate transfer fee called`() { - val feeEther = BigDecimal.TEN - - given(contractApiProvider.fetchGasPrice()).willReturn(gasPrice) - given(etherWeiConverter.fromWeiToGwei(gasPrice)).willReturn(gasPrice) - given(etherWeiConverter.fromGweiToEther(gasPrice * ContractsApiProvider.DEFAULT_GAS_LIMIT_TRANSFER.toBigInteger())).willReturn( - feeEther - ) - - assertEquals(feeEther, ethereumRepository.calculateValErc20TransferFee()) - - verify(contractApiProvider).setGasLimit(ContractsApiProvider.DEFAULT_GAS_LIMIT_TRANSFER.toBigInteger()) - } - - @Test - fun `calculate withdraw fee called`() { - val feeEther = BigDecimal.TEN - - given(contractApiProvider.fetchGasPrice()).willReturn(gasPrice) - given(etherWeiConverter.fromWeiToGwei(gasPrice)).willReturn(gasPrice) - given(etherWeiConverter.fromGweiToEther(gasPrice * ContractsApiProvider.DEFAULT_GAS_LIMIT_WITHDRAW.toBigInteger())).willReturn( - feeEther - ) - - assertEquals(feeEther, ethereumRepository.calculateValErc20WithdrawFee()) - - verify(contractApiProvider).setGasLimit(ContractsApiProvider.DEFAULT_GAS_LIMIT_WITHDRAW.toBigInteger()) - } - - @Test - fun `calculate combined fee called`() { - val feeEther = BigDecimal.TEN - val gasLimit = - ContractsApiProvider.DEFAULT_GAS_LIMIT_TRANSFER.toBigInteger() + ContractsApiProvider.DEFAULT_GAS_LIMIT_WITHDRAW.toBigInteger() - - given(contractApiProvider.fetchGasPrice()).willReturn(gasPrice) - given(etherWeiConverter.fromWeiToGwei(gasPrice)).willReturn(gasPrice) - given(etherWeiConverter.fromGweiToEther(gasPrice * gasLimit)).willReturn(feeEther) - - assertEquals(feeEther, ethereumRepository.calculateValErc20CombinedFee()) - - verify(contractApiProvider).setGasLimit(gasLimit) - } -} diff --git a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/datasource/PrefsEthereumDatasourceTest.kt b/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/datasource/PrefsEthereumDatasourceTest.kt deleted file mode 100644 index 85e66a7be..000000000 --- a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/data/repository/datasource/PrefsEthereumDatasourceTest.kt +++ /dev/null @@ -1,111 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.data.repository.datasource - -import jp.co.soramitsu.common.data.EncryptedPreferences -import jp.co.soramitsu.common.data.SoraPreferences -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthRegisterState -import jp.co.soramitsu.feature_ethereum_api.domain.model.EthereumCredentials -import jp.co.soramitsu.test_shared.MainCoroutineRule -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.BDDMockito.given -import org.mockito.Mock -import org.mockito.Mockito.verify -import org.mockito.junit.MockitoJUnitRunner -import org.web3j.crypto.Credentials - -@ExperimentalCoroutinesApi -@RunWith(MockitoJUnitRunner::class) -class PrefsEthereumDatasourceTest { - - companion object { - private const val PREFS_ETH_PRIVATE = "prefs_eth_private_key" - private const val PREFS_XOR_ADDRESS = "prefs_xor_address_key" - private const val PREFS_ETH_REGISTER_STATE = "prefs_eth_register_state" - } - - @get:Rule - var mainCoroutineRule = MainCoroutineRule() - - @Mock - private lateinit var encryptedPreferences: EncryptedPreferences - - @Mock - private lateinit var soraPreferences: SoraPreferences - - private lateinit var prefsEthereumDatasource: PrefsEthereumDatasource - - private val credentials = EthereumCredentials(Credentials.create("1").ecKeyPair.privateKey) - private val address = "valAddress" - private val ethRegisterState = EthRegisterState.State.NONE.toString() - - @Before - fun setUp() = runTest { - // given(soraPreferences.getString(PREFS_ETH_REGISTER_STATE)).willReturn(ethRegisterState) - prefsEthereumDatasource = PrefsEthereumDatasource(encryptedPreferences, soraPreferences) - } - - @Test - fun `save eth private key called`() = runTest { - prefsEthereumDatasource.saveEthereumCredentials(credentials) - - verify(encryptedPreferences).putEncryptedString( - PREFS_ETH_PRIVATE, - credentials.privateKey.toString() - ) - } - - @Test - fun `retrieve eth private key called`() = runTest { - given(encryptedPreferences.getDecryptedString(PREFS_ETH_PRIVATE)).willReturn("1") - - val actualCredentials = prefsEthereumDatasource.retrieveEthereumCredentials() - - assertEquals(actualCredentials, credentials) - } - - @Test - fun `save val address called`() = runTest { - val valAddressKey = "prefs_val_address" - - prefsEthereumDatasource.saveVALAddress(address) - - verify(soraPreferences).putString(valAddressKey, address) - } -} diff --git a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/domain/EthereumInteractorTest.kt b/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/domain/EthereumInteractorTest.kt deleted file mode 100644 index b50c5ff39..000000000 --- a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/domain/EthereumInteractorTest.kt +++ /dev/null @@ -1,89 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.domain - -import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import java.math.BigDecimal -import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository -import jp.co.soramitsu.feature_ethereum_api.domain.interfaces.EthereumRepository -import jp.co.soramitsu.test_shared.MainCoroutineRule -import kotlinx.coroutines.test.runTest -import org.junit.Before -import org.junit.Ignore -import org.junit.Rule -import org.junit.Test -import org.junit.rules.TestRule -import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.junit.MockitoJUnitRunner - -@RunWith(MockitoJUnitRunner::class) -@Ignore("temp. will be enabled after ethereum bridge is done") -class EthereumInteractorTest { - - @Rule - @JvmField - val rule: TestRule = InstantTaskExecutorRule() - - @get:Rule - var mainCoroutineRule = MainCoroutineRule() - - @Mock - private lateinit var ethereumRepository: EthereumRepository - - @Mock - private lateinit var credentialsRepository: CredentialsRepository - - private lateinit var ethereumInteractorImpl: EthereumInteractorImpl - - private val accountId = "accountId" - - @Before - fun setUp() = runTest { - ethereumInteractorImpl = - EthereumInteractorImpl(ethereumRepository, credentialsRepository) - // given(credentialsRepository.retrieveKeyPair()).willReturn(Single.just(keyPair)) - } - - @Test - fun `start withdraw called`() = runTest { - val amount = BigDecimal.ONE - val minerFee = "11.0" - val ethAddress = "0xaddress" - - // given(ethereumRepository.startWithdraw(amount, accountId, ethAddress, minerFee, keyPair)).willReturn(Completable.complete()) - - ethereumInteractorImpl.startWithdraw(amount, ethAddress, minerFee) - // verify(ethereumRepository).startWithdraw(amount, accountId, ethAddress, minerFee, keyPair) - } -} diff --git a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/util/GasProviderTest.kt b/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/util/GasProviderTest.kt deleted file mode 100644 index 9f39ccc71..000000000 --- a/feature_ethereum_impl/src/test/java/jp/co/soramitsu/feature_ethereum_impl/util/GasProviderTest.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.feature_ethereum_impl.util - -import java.math.BigInteger -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.junit.MockitoJUnitRunner - -@RunWith(MockitoJUnitRunner::class) -class GasProviderTest { - - private lateinit var gasProvider: GasProvider - private val gasPrice = BigInteger.ONE - private val estimatedGas = BigInteger.TEN - - @Before - fun setup() { - gasProvider = GasProvider(estimatedGas, gasPrice) - } - - @Test - fun `get gas price and estimate gas called`() { - assertEquals(gasPrice, gasProvider.price) - assertEquals(estimatedGas, gasProvider.estimatedGas) - } -} diff --git a/feature_main_api/build.gradle.kts b/feature_main_api/build.gradle.kts index 9bafe855c..fcffd5a53 100644 --- a/feature_main_api/build.gradle.kts +++ b/feature_main_api/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_main_impl/build.gradle.kts b/feature_main_impl/build.gradle.kts index a4df15bdb..433f5a3cb 100644 --- a/feature_main_impl/build.gradle.kts +++ b/feature_main_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_multiaccount_api/build.gradle.kts b/feature_multiaccount_api/build.gradle.kts index 8e2e3acd1..7eb301658 100644 --- a/feature_multiaccount_api/build.gradle.kts +++ b/feature_multiaccount_api/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_multiaccount_impl/build.gradle.kts b/feature_multiaccount_impl/build.gradle.kts index 0e4d45074..6d05f2efe 100644 --- a/feature_multiaccount_impl/build.gradle.kts +++ b/feature_multiaccount_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_polkaswap_api/build.gradle.kts b/feature_polkaswap_api/build.gradle.kts index ef02b42e4..fcd7a6446 100644 --- a/feature_polkaswap_api/build.gradle.kts +++ b/feature_polkaswap_api/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_polkaswap_impl/build.gradle.kts b/feature_polkaswap_impl/build.gradle.kts index 8b8ee47a5..b33f6fc35 100644 --- a/feature_polkaswap_impl/build.gradle.kts +++ b/feature_polkaswap_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt index 6fd6d848f..9fe0f1064 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt @@ -74,7 +74,7 @@ import jp.co.soramitsu.xsubstrate.runtime.metadata.storage import jp.co.soramitsu.xsubstrate.runtime.metadata.storageKey import jp.co.soramitsu.xsubstrate.ss58.SS58Encoder.toAccountId import jp.co.soramitsu.xsubstrate.wsrpc.SocketService -import jp.co.soramitsu.xsubstrate.wsrpc.executeAsync +import jp.co.soramitsu.xsubstrate.wsrpc.executeAsyncMapped import jp.co.soramitsu.xsubstrate.wsrpc.mappers.nonNull import jp.co.soramitsu.xsubstrate.wsrpc.mappers.pojo import jp.co.soramitsu.xsubstrate.wsrpc.mappers.pojoList @@ -107,12 +107,12 @@ class PolkaswapSubscriptionRepositoryImpl @Inject constructor( .storage(Storage.DEX_INFOS.storageName) val partialKey = metadataStorage.storageKey() return runCatching { - socketService.executeAsync( + socketService.executeAsyncMapped( request = StateKeys(listOf(partialKey)), mapper = pojoList().nonNull() ).let { storageKeys -> storageKeys.mapNotNull { storageKey -> - socketService.executeAsync( + socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = pojo().nonNull(), ) @@ -262,7 +262,7 @@ class PolkaswapSubscriptionRepositoryImpl @Inject constructor( feeToken: Token, dexId: Int, ): SwapQuote? { - val response = socketService.executeAsync( + val response = socketService.executeAsyncMapped( request = RuntimeRequest( "liquidityProxy_quote", listOf( diff --git a/feature_referral_api/build.gradle.kts b/feature_referral_api/build.gradle.kts index 0e0568fcc..400e04147 100644 --- a/feature_referral_api/build.gradle.kts +++ b/feature_referral_api/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_referral_impl/build.gradle.kts b/feature_referral_impl/build.gradle.kts index f9679fb75..070f20b07 100644 --- a/feature_referral_impl/build.gradle.kts +++ b/feature_referral_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_select_node_api/build.gradle.kts b/feature_select_node_api/build.gradle.kts index 3c8f2e0e0..78fa75d63 100644 --- a/feature_select_node_api/build.gradle.kts +++ b/feature_select_node_api/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_select_node_impl/build.gradle.kts b/feature_select_node_impl/build.gradle.kts index 75f7bc096..f92eef8a0 100644 --- a/feature_select_node_impl/build.gradle.kts +++ b/feature_select_node_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_sora_card_api/build.gradle.kts b/feature_sora_card_api/build.gradle.kts index 6c9b0ee80..7838f83b9 100644 --- a/feature_sora_card_api/build.gradle.kts +++ b/feature_sora_card_api/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_sora_card_impl/build.gradle.kts b/feature_sora_card_impl/build.gradle.kts index 00cc2e2a7..14a724ffc 100644 --- a/feature_sora_card_impl/build.gradle.kts +++ b/feature_sora_card_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_wallet_api/build.gradle.kts b/feature_wallet_api/build.gradle.kts index 6366831f4..28c22ecb4 100644 --- a/feature_wallet_api/build.gradle.kts +++ b/feature_wallet_api/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/feature_wallet_impl/build.gradle.kts b/feature_wallet_impl/build.gradle.kts index 6999a3197..9c2fdae03 100644 --- a/feature_wallet_impl/build.gradle.kts +++ b/feature_wallet_impl/build.gradle.kts @@ -19,7 +19,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d89abd20b..7dec19af9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -41,10 +41,10 @@ timber = "5.0.1" ktor = "2.3.1" soracard = "1.1.7" xnetworking = "0.2.9" -xsubstrate = "1.2.3" -uicore = "0.2.31" -xbackup = "1.2.0" -xcrypto = "1.2.2" +xsubstrate = "1.2.4" +uicore = "0.2.32" +xbackup = "1.2.1" +xcrypto = "1.2.3" ed = "2.0.1" xerces = "2.9.0" dagger = "2.49" diff --git a/network/build.gradle.kts b/network/build.gradle.kts index 783cbd337..6b666caab 100644 --- a/network/build.gradle.kts +++ b/network/build.gradle.kts @@ -16,7 +16,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 4b4de8071..8df4d0f74 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -57,7 +57,6 @@ include(":feature_blockexplorer_api") include(":feature_blockexplorer_impl") include(":feature_ecosystem_impl") include(":feature_ethereum_api") -include(":feature_ethereum_impl") include(":feature_main_api") include(":feature_main_impl") include(":feature_multiaccount_api") diff --git a/sorasubstrate/build.gradle.kts b/sorasubstrate/build.gradle.kts index af360d212..0188be39d 100644 --- a/sorasubstrate/build.gradle.kts +++ b/sorasubstrate/build.gradle.kts @@ -17,7 +17,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt index df5f0b87a..298d5aae8 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt @@ -62,7 +62,7 @@ import jp.co.soramitsu.xsubstrate.ss58.SS58Encoder import jp.co.soramitsu.xsubstrate.ss58.SS58Encoder.toAccountId import jp.co.soramitsu.xsubstrate.ss58.SS58Encoder.toAddress import jp.co.soramitsu.xsubstrate.wsrpc.SocketService -import jp.co.soramitsu.xsubstrate.wsrpc.executeAsync +import jp.co.soramitsu.xsubstrate.wsrpc.executeAsyncMapped import jp.co.soramitsu.xsubstrate.wsrpc.mappers.nonNull import jp.co.soramitsu.xsubstrate.wsrpc.mappers.pojo import jp.co.soramitsu.xsubstrate.wsrpc.request.runtime.chain.RuntimeVersion @@ -145,7 +145,7 @@ class RuntimeManager @Inject constructor( private suspend fun checkRuntimeVersion(snapshot: RuntimeSnapshot): RuntimeSnapshot { var result = snapshot - val runtimeVersion = socketService.executeAsync( + val runtimeVersion = socketService.executeAsyncMapped( request = RuntimeVersionRequest(), mapper = pojo().nonNull() ) @@ -156,7 +156,7 @@ class RuntimeManager @Inject constructor( ) { FirebaseWrapper.log("New runtime version ${runtimeVersion.specVersion}") try { - val metadata = socketService.executeAsync( + val metadata = socketService.executeAsyncMapped( request = GetMetadataRequest, mapper = pojo().nonNull() ) diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/BulkRequest.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/BulkRequest.kt index 6f87b7a88..7327c5280 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/BulkRequest.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/BulkRequest.kt @@ -34,7 +34,7 @@ package jp.co.soramitsu.sora.substrate.substrate import jp.co.soramitsu.sora.substrate.response.StateQueryResponse import jp.co.soramitsu.xsubstrate.wsrpc.SocketService -import jp.co.soramitsu.xsubstrate.wsrpc.executeAsync +import jp.co.soramitsu.xsubstrate.wsrpc.executeAsyncMapped import jp.co.soramitsu.xsubstrate.wsrpc.mappers.nonNull import jp.co.soramitsu.xsubstrate.wsrpc.mappers.pojoList import jp.co.soramitsu.xsubstrate.wsrpc.request.runtime.RuntimeRequest @@ -83,7 +83,7 @@ class BulkRetriever( val request = GetKeysPagedRequest(keyPrefix, DEFAULT_PAGE_SIZE, currentOffset) - val page = socketService.executeAsync(request, mapper = pojoList().nonNull()) + val page = socketService.executeAsyncMapped(request, mapper = pojoList().nonNull()) result += page @@ -107,7 +107,7 @@ class BulkRetriever( val request = QueryStorageAtRequest(chunk) val chunkValues = kotlin.runCatching { - socketService.executeAsync(request, mapper = pojoList().nonNull()) + socketService.executeAsyncMapped(request, mapper = pojoList().nonNull()) }.getOrNull()?.first()?.changesAsMap().orEmpty() acc.putAll(chunkValues) diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateApiImpl.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateApiImpl.kt index 44b2ff00c..826b9bfa4 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateApiImpl.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateApiImpl.kt @@ -55,7 +55,7 @@ import jp.co.soramitsu.xsubstrate.runtime.metadata.storage import jp.co.soramitsu.xsubstrate.runtime.metadata.storageKey import jp.co.soramitsu.xsubstrate.ss58.SS58Encoder.toAccountId import jp.co.soramitsu.xsubstrate.wsrpc.SocketService -import jp.co.soramitsu.xsubstrate.wsrpc.executeAsync +import jp.co.soramitsu.xsubstrate.wsrpc.executeAsyncMapped import jp.co.soramitsu.xsubstrate.wsrpc.mappers.nonNull import jp.co.soramitsu.xsubstrate.wsrpc.mappers.pojo import jp.co.soramitsu.xsubstrate.wsrpc.mappers.pojoList @@ -72,7 +72,7 @@ class SubstrateApiImpl @Inject constructor( override suspend fun getUserPoolsTokenIdsKeys(address: String): List { val accountPoolsKey = runtimeManager.getRuntimeSnapshot().accountPoolsKey(address) return runCatching { - socketService.executeAsync( + socketService.executeAsyncMapped( request = StateKeys(listOf(accountPoolsKey)), mapper = pojoList().nonNull() ) @@ -87,7 +87,7 @@ class SubstrateApiImpl @Inject constructor( return runCatching { val storageKeys = getUserPoolsTokenIdsKeys(address) storageKeys.map { storageKey -> - socketService.executeAsync( + socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = pojo().nonNull(), ) @@ -154,7 +154,7 @@ class SubstrateApiImpl @Inject constructor( ): Pair? { val storageKey = runtimeManager.getRuntimeSnapshot().reservesKey(baseTokenId, tokenId) - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = scale(ReservesResponse), ) @@ -175,7 +175,7 @@ class SubstrateApiImpl @Inject constructor( baseTokenId.mapCodeToken(), tokenId.mapCodeToken(), ) - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = scale(PoolPropertiesResponse), ) @@ -217,7 +217,7 @@ class SubstrateApiImpl @Inject constructor( runtimeManager.getRuntimeSnapshot().metadata.module(Pallete.POOL_XYK.palletName) .storage(Storage.TOTAL_ISSUANCES.storageName) .storageKey(runtimeManager.getRuntimeSnapshot(), reservesAccountId) - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = scale(TotalIssuance), ) @@ -239,7 +239,7 @@ class SubstrateApiImpl @Inject constructor( currentAddress.toAccountId() ) return runCatching { - socketService.executeAsync( + socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = scale(PoolProviders), ) @@ -255,7 +255,7 @@ class SubstrateApiImpl @Inject constructor( } override suspend fun isSwapAvailable(tokenId1: String, tokenId2: String, dexId: Int): Boolean = - socketService.executeAsync( + socketService.executeAsyncMapped( request = RuntimeRequest( "liquidityProxy_isPathAvailable", listOf(dexId, tokenId1, tokenId2) @@ -268,7 +268,7 @@ class SubstrateApiImpl @Inject constructor( tokenId2: String, dexId: Int ): List = - socketService.executeAsync( + socketService.executeAsyncMapped( request = RuntimeRequest( "liquidityProxy_listEnabledSourcesForPath", listOf(dexId, tokenId1, tokenId2) @@ -281,7 +281,7 @@ class SubstrateApiImpl @Inject constructor( outputAssetId: String, dexId: Int ): Boolean { - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = IsPairEnabledRequest(inputAssetId, outputAssetId, dexId), mapper = pojo().nonNull() ) diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateCalls.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateCalls.kt index ffbfef51f..63e9b11c3 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateCalls.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/SubstrateCalls.kt @@ -78,6 +78,7 @@ import jp.co.soramitsu.xsubstrate.scale.EncodableStruct import jp.co.soramitsu.xsubstrate.ss58.SS58Encoder.toAccountId import jp.co.soramitsu.xsubstrate.wsrpc.SocketService import jp.co.soramitsu.xsubstrate.wsrpc.executeAsync +import jp.co.soramitsu.xsubstrate.wsrpc.executeAsyncMapped import jp.co.soramitsu.xsubstrate.wsrpc.mappers.nonNull import jp.co.soramitsu.xsubstrate.wsrpc.mappers.pojo import jp.co.soramitsu.xsubstrate.wsrpc.mappers.pojoList @@ -140,13 +141,13 @@ class SubstrateCalls @Inject constructor( } suspend fun getStorageHex(storageKey: String): String? = - socketService.executeAsync( + socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = pojo(), ).result suspend fun getStateKeys(partialKey: String): List = - socketService.executeAsync( + socketService.executeAsyncMapped( request = StateKeys(listOf(partialKey)), mapper = pojoList(), ).result ?: emptyList() @@ -158,7 +159,7 @@ class SubstrateCalls @Inject constructor( .storage(Storage.ACCOUNT.storageName) val storageKey = storage.storageKey(runtimeManager.getRuntimeSnapshot(), accountId.toAccountId()) - val hexString = socketService.executeAsync( + val hexString = socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = pojo(), ) @@ -219,7 +220,7 @@ class SubstrateCalls @Inject constructor( runtimeManager.getRuntimeSnapshot().metadata.module(Pallete.STAKING.palletName) .storage(Storage.LEDGER.storageName) .storageKey(runtimeManager.getRuntimeSnapshot(), it.toAccountId()) - socketService.executeAsync( + socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = scale(StakingLedger).nonNull() ) @@ -231,7 +232,7 @@ class SubstrateCalls @Inject constructor( runtimeManager.getRuntimeSnapshot().metadata.module(Pallete.STAKING.palletName) .storage(Storage.ACTIVE_ERA.storageName) .storageKey() - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = scale(ActiveEraInfo).nonNull() ).let { @@ -276,13 +277,13 @@ class SubstrateCalls @Inject constructor( ) ) val a = - socketService.executeAsync(request = request, mapper = pojoList().nonNull()) + socketService.executeAsyncMapped(request = request, mapper = pojoList().nonNull()) assetKeys.addAll(a) lastKey = a.lastOrNull() loaded = a.size } while (loaded >= amount && lastKey != null) if (assetKeys.isEmpty()) return emptyList() - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = StateQueryStorageAt(listOf(assetKeys)), mapper = pojoList().nonNull(), ).let { @@ -330,7 +331,7 @@ class SubstrateCalls @Inject constructor( ) } val request = StateQueryStorageAt(listOf(storageKeys)) - val chunkValues = socketService.executeAsync( + val chunkValues = socketService.executeAsyncMapped( request, mapper = pojoList().nonNull() ).first().changesAsMap() @@ -352,7 +353,7 @@ class SubstrateCalls @Inject constructor( } suspend fun needsMigration(irohaAddress: String): Boolean = - socketService.executeAsync( + socketService.executeAsyncMapped( request = RuntimeRequest("irohaMigration_needsMigration", listOf(irohaAddress)), mapper = pojo().nonNull(), ) @@ -360,7 +361,7 @@ class SubstrateCalls @Inject constructor( suspend fun submitExtrinsic( extrinsic: String, ): String { - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = SubmitExtrinsicRequest(extrinsic), mapper = pojo().nonNull(), ) @@ -395,7 +396,7 @@ class SubstrateCalls @Inject constructor( } suspend fun getNonce(from: String): BigInteger { - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = NextAccountIndexRequest(from), mapper = pojo().nonNull() ) @@ -403,35 +404,35 @@ class SubstrateCalls @Inject constructor( } suspend fun getBlockHash(number: Int = 0): String { - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = BlockHashRequest(number), mapper = pojo().nonNull(), ) } suspend fun getRuntimeVersion(): RuntimeVersion { - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = RuntimeVersionRequest(), mapper = pojo().nonNull(), ) } suspend fun getFinalizedHead(): String { - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = FinalizedHeadRequest(), mapper = pojo().nonNull() ) } suspend fun getChainHeader(hash: String): ChainHeaderResponse { - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = ChainHeaderRequest(hash), mapper = pojo().nonNull(), ) } suspend fun getChainLastHeader(): ChainHeaderResponse { - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = ChainLastHeaderRequest(), mapper = pojo().nonNull(), ) @@ -444,7 +445,7 @@ class SubstrateCalls @Inject constructor( runtimeManager.getRuntimeSnapshot().metadata.module("System").storage("Events") .storageKey() return runCatching { - socketService.executeAsync( + socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey, blockHash)), mapper = pojo().nonNull(), ) @@ -499,7 +500,7 @@ class SubstrateCalls @Inject constructor( result = runCatching { val request = FeeCalculationRequest(extrinsic) val feeResponse = - socketService.executeAsync( + socketService.executeAsyncMapped( request = request, mapper = pojo().nonNull() ) @@ -509,7 +510,7 @@ class SubstrateCalls @Inject constructor( result = runCatching { val request = FeeCalculationRequest2(extrinsic) val feeResponse = - socketService.executeAsync( + socketService.executeAsyncMapped( request = request, mapper = pojo().nonNull() ) @@ -520,7 +521,7 @@ class SubstrateCalls @Inject constructor( } suspend fun getBlock(blockHash: String): BlockResponse { - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = BlockRequest(blockHash), mapper = pojo().nonNull(), ) @@ -530,7 +531,7 @@ class SubstrateCalls @Inject constructor( val storageKey = runtimeManager.getRuntimeSnapshot().metadata.module(Pallete.SYSTEM.palletName) .storage(Storage.UPGRADED_TO_DUAL_REF_COUNT.storageName).storageKey() - return socketService.executeAsync( + return socketService.executeAsyncMapped( request = GetStorageRequest(listOf(storageKey)), mapper = pojo().nonNull() ).let { diff --git a/test_data/build.gradle.kts b/test_data/build.gradle.kts index 130ca6f45..c10e65e27 100644 --- a/test_data/build.gradle.kts +++ b/test_data/build.gradle.kts @@ -15,7 +15,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/test_shared/build.gradle.kts b/test_shared/build.gradle.kts index 4f6abbb84..a257c31ba 100644 --- a/test_shared/build.gradle.kts +++ b/test_shared/build.gradle.kts @@ -15,7 +15,7 @@ android { compileSdk = 34 defaultConfig { - minSdk = 24 + minSdk = 26 multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } From 5d54e74d5b32abbc8fa4fc2d8fb164a9028f96ca Mon Sep 17 00:00:00 2001 From: arvifox Date: Fri, 31 May 2024 17:35:55 +0300 Subject: [PATCH 16/43] sc-29 --- .../main/java/jp/co/soramitsu/common/domain/OptionsProvider.kt | 2 +- common/src/main/java/jp/co/soramitsu/common/util/BuildUtils.kt | 2 +- common/src/main/res/values-ar/strings.xml | 2 +- common/src/main/res/values-az/strings.xml | 2 +- common/src/main/res/values-de/strings.xml | 2 +- common/src/main/res/values-es/strings.xml | 2 +- common/src/main/res/values-fa/strings.xml | 2 +- common/src/main/res/values-fi/strings.xml | 2 +- common/src/main/res/values-fr/strings.xml | 2 +- common/src/main/res/values-hi-rIN/strings.xml | 2 +- common/src/main/res/values-in/strings.xml | 2 +- common/src/main/res/values-iw/strings.xml | 2 +- common/src/main/res/values-ja/strings.xml | 2 +- common/src/main/res/values-ms-rMY/strings.xml | 2 +- common/src/main/res/values-nb/strings.xml | 2 +- common/src/main/res/values-nl/strings.xml | 2 +- common/src/main/res/values-pt/strings.xml | 2 +- common/src/main/res/values-ru/strings.xml | 2 +- common/src/main/res/values-sr/strings.xml | 2 +- common/src/main/res/values-tr/strings.xml | 2 +- common/src/main/res/values-vi/strings.xml | 2 +- common/src/main/res/values-zh-rCN/strings.xml | 2 +- common/src/main/res/values-zh-rTW/strings.xml | 2 +- common/src/main/res/values/strings.xml | 2 +- .../feature_main_impl/presentation/profile/ProfileViewModel.kt | 2 -- .../feature_sora_card_api/util/SoraCardContractUtil.kt | 2 ++ .../presentation/details/SoraCardDetailsScreen.kt | 2 +- .../presentation/details/SoraCardDetailsViewModel.kt | 2 +- .../presentation/details/SoraCardSettingsCard.kt | 1 - gradle/libs.versions.toml | 2 +- test_data/src/main/java/jp/co/soramitsu/test_data/SoraCard.kt | 3 +++ 31 files changed, 32 insertions(+), 30 deletions(-) diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/OptionsProvider.kt b/common/src/main/java/jp/co/soramitsu/common/domain/OptionsProvider.kt index c51aa6c86..44befe0a4 100644 --- a/common/src/main/java/jp/co/soramitsu/common/domain/OptionsProvider.kt +++ b/common/src/main/java/jp/co/soramitsu/common/domain/OptionsProvider.kt @@ -59,7 +59,7 @@ object OptionsProvider { const val sourceLink = "https://github.com/sora-xor/Sora-Android" const val telegramLink = "https://t.me/sora_xor" const val telegramAnnouncementsLink = "https://t.me/sora_announcements" - const val telegramHappinessLink = "https://t.me/sorahappiness" + const val telegramHappinessLink = "https://t.me/sora_happy" const val email = "support@sora.org" const val twitterLink = "https://twitter.com/sora_xor" const val youtubeLink = "https://youtube.com/sora_xor" diff --git a/common/src/main/java/jp/co/soramitsu/common/util/BuildUtils.kt b/common/src/main/java/jp/co/soramitsu/common/util/BuildUtils.kt index 1e2c8b386..d903a521f 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/BuildUtils.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/BuildUtils.kt @@ -46,7 +46,7 @@ object BuildUtils { fun isPlayMarket(): Boolean = isBuildType(BuildType.RELEASE) && isFlavors(Flavor.PROD, Flavor.SORALUTION) fun isProdPlayMarket(): Boolean = isBuildType(BuildType.RELEASE) && isFlavors(Flavor.PROD) - fun fiatPackageName() = if (isProdPlayMarket()) OptionsProvider.soracardFiatPackageProd else OptionsProvider.soracardFiatPackageTest + fun fiatPackageName() = OptionsProvider.soracardFiatPackageProd } enum class BuildType(val type: String) { diff --git a/common/src/main/res/values-ar/strings.xml b/common/src/main/res/values-ar/strings.xml index 380319ab2..e0429980f 100644 --- a/common/src/main/res/values-ar/strings.xml +++ b/common/src/main/res/values-ar/strings.xml @@ -590,7 +590,7 @@ بإنشاء حساب أنت توافق على %% الشروط والأحكام %% و %% سياسة الخصوصية %% الشروط والأحكام من خلال الاستمرار ، فإنك توافق على - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. تم اصدار تحديث تطبيق SORA وهو جاهز للتثبيت.\n\nمن المهم استخدام أحدث إصدار من التطبيق.\n\nلتحديث التطبيق، يلزمك إعادة التشغيل. هل تود تثبيت التحديث الآن؟ Wallet Backup diff --git a/common/src/main/res/values-az/strings.xml b/common/src/main/res/values-az/strings.xml index ab5a3591c..60996708f 100644 --- a/common/src/main/res/values-az/strings.xml +++ b/common/src/main/res/values-az/strings.xml @@ -566,7 +566,7 @@ Bir hesab yaratmaqla %% Şərtlər %% və %% Məxfilik Siyasəti %% Şərtlər və Qaydalar By continuing you are agreeing with the - Gözlənilməz xəta baş verdi. \n\n Siz @SORAhappiness Telegram çatında SORA icmasında bu problemi həll edə bilərsiniz. + Gözlənilməz xəta baş verdi. \n\n Siz @sora_happy Telegram çatında SORA icmasında bu problemi həll edə bilərsiniz. SORA tətbiqi üçün yeniləmə endirilib və quraşdırılmağa hazırdır. \n\n Proqramın ən son versiyasından istifadə etmək vacibdir. \n\n Proqramı yeniləmək üçün yenidən başladın tələb olunur. Güncəlləməni indi quraşdırmaq istərdinizmi? Pulqabı ehtiyat nüsxəsi diff --git a/common/src/main/res/values-de/strings.xml b/common/src/main/res/values-de/strings.xml index ba702aea6..76b97256d 100644 --- a/common/src/main/res/values-de/strings.xml +++ b/common/src/main/res/values-de/strings.xml @@ -566,7 +566,7 @@ Durch das Erstellen eines Kontos akzeptierst du die %%Geschäftsbedingungen%% und die %%Datenschutzrichtlinien%% Allgemeine Geschäftsbedingungen By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. Ein Update für die SORA-App wurde heruntergeladen und kann nun installiert werden.\n\nEs ist wichtig, die neueste Version der App zu verwenden.\n\nUm die App zu aktualisieren, ist ein Neustart erforderlich. Möchtest du das Update jetzt installieren? Wallet Backup diff --git a/common/src/main/res/values-es/strings.xml b/common/src/main/res/values-es/strings.xml index e437c2ada..5a3392125 100644 --- a/common/src/main/res/values-es/strings.xml +++ b/common/src/main/res/values-es/strings.xml @@ -566,7 +566,7 @@ Al crear una cuenta, acepta los %%Términos y condiciones%% y la %%Política de privacidad%%. Términos y condiciones Al continuar usted está de acuerdo con el - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. An update for the SORA application has been downloaded and is ready to be installed.\n\nIt is important to use the latest version of the application.\n\nIn order to update the app, a restart is required. Would you like to install the update now? Wallet Backup diff --git a/common/src/main/res/values-fa/strings.xml b/common/src/main/res/values-fa/strings.xml index 22de760ef..f6db0d44f 100644 --- a/common/src/main/res/values-fa/strings.xml +++ b/common/src/main/res/values-fa/strings.xml @@ -566,7 +566,7 @@ با ایجاد حساب شما با %% شرایط و ضوابط %% و %% خط مشی رازداری %% موافقت می‌کنید شرایط و ضوابط By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. بروز رسانی برنامه SORA دانلود شده و آماده نصب است. \n\n مهم است که از آخرین نسخه برنامه استفاده کنید. \n\n برای به روز رسانی، برنامه نیازمند راه‌اندازی مجدد است. آیا می‌خواهید هم اکنون آپدیت را نصب کنید؟ Wallet Backup diff --git a/common/src/main/res/values-fi/strings.xml b/common/src/main/res/values-fi/strings.xml index e77442258..3a202d27d 100644 --- a/common/src/main/res/values-fi/strings.xml +++ b/common/src/main/res/values-fi/strings.xml @@ -566,7 +566,7 @@ Luomalla tilin hyväksyt %% Käyttöehdot %% ja %% tietosuojakäytännön %% käyttöehdot By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. SORA-sovelluksen päivitys on ladattu ja se on valmis asennettavaksi.\n\nOn tärkeää käyttää sovelluksen uusinta versiota.\n\nSovelluksen päivittäminen edellyttää uudelleenkäynnistystä. Haluatko asentaa päivityksen nyt? Wallet Backup diff --git a/common/src/main/res/values-fr/strings.xml b/common/src/main/res/values-fr/strings.xml index 4e150f869..8b87f4767 100644 --- a/common/src/main/res/values-fr/strings.xml +++ b/common/src/main/res/values-fr/strings.xml @@ -566,7 +566,7 @@ En créant un compte, vous acceptez les %%Termes et conditions d\'utilisation%% ainsi que la %%Politique de confidentialité%% Conditions générales En continuant, vous acceptez - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. Une mise à jour de l\'application SORA a été téléchargée et est prête à être installée.\n\nIl est important d\'utiliser la dernière version de l\'application.\n\nAfin de mettre à jour l\'application, un redémarrage est requis. Voulez-vous installer la mise à jour maintenant ? Wallet Backup diff --git a/common/src/main/res/values-hi-rIN/strings.xml b/common/src/main/res/values-hi-rIN/strings.xml index 92d677611..e1d019902 100644 --- a/common/src/main/res/values-hi-rIN/strings.xml +++ b/common/src/main/res/values-hi-rIN/strings.xml @@ -566,7 +566,7 @@ खाता बनाकर आप %% नियमों और शर्तों %% और %% गोपनीयता नीति %% से सहमत हैं नियम एवं शर्तें जारी रखते हुए आप इसके साथ सहमत हैं - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. SORA एप्लिकेशन के लिए एक अपडेट डाउनलोड किया गया है और इंस्टॉल करने के लिए तैयार है। \n\n एप्लिकेशन के नवीनतम संस्करण का उपयोग करना महत्वपूर्ण है। \n\n ऐप को अपडेट करने के लिए, पुनरारंभ करना आवश्यक है। क्या आप Update अभी Install करना चाहेंगे? Wallet Backup diff --git a/common/src/main/res/values-in/strings.xml b/common/src/main/res/values-in/strings.xml index e10778a43..aafcb5b41 100644 --- a/common/src/main/res/values-in/strings.xml +++ b/common/src/main/res/values-in/strings.xml @@ -561,7 +561,7 @@ By creating an account you are agreeing with the %%Terms & Conditions%% and %%Privacy Policy%% Syarat & Ketentuan By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. An update for the SORA application has been downloaded and is ready to be installed.\n\nIt is important to use the latest version of the application.\n\nIn order to update the app, a restart is required. Would you like to install the update now? Wallet Backup diff --git a/common/src/main/res/values-iw/strings.xml b/common/src/main/res/values-iw/strings.xml index 49b612e8a..420da72bf 100644 --- a/common/src/main/res/values-iw/strings.xml +++ b/common/src/main/res/values-iw/strings.xml @@ -578,7 +578,7 @@ על ידי יצירת חשבון אתה מסכים עם %%התנאים וההגבלות%% ו- %%מדיניות הפרטיות%% תנאים והגבלות כשאתה ממשיך אתה מסכים עם ה- - אירעה שגיאה בלתי צפויה. \n\n אתה יכול לפתור בעיה זו בצ\'אט הטלגרם של קהילת סורה @SORAhappiness. + אירעה שגיאה בלתי צפויה. \n\n אתה יכול לפתור בעיה זו בצ\'אט הטלגרם של קהילת סורה @sora_happy. עדכון עבור אפליקצית סורה הורד והוא מוכן להתקנה.\n\nחשוב להשתמש בגירסה העדכנית ביותר של האפליקציה.\n\nכדי לעדכן את האפליקציה, נדרשת הפעלה מחדש. האם ברצונך להתקין את העדכון כעת? Wallet Backup diff --git a/common/src/main/res/values-ja/strings.xml b/common/src/main/res/values-ja/strings.xml index 8bc371490..76db90d5d 100644 --- a/common/src/main/res/values-ja/strings.xml +++ b/common/src/main/res/values-ja/strings.xml @@ -560,7 +560,7 @@ アカウントを作成することにより、%%規約と条件%%および%%個人情報保護方針%%に同意したことになります 規約と条件 続行することにより、同意したことになります - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. SORAアプリのアップデートがダウンロードされ、インストールできるようになりました。\n\n最新バージョンのアプリを使用することが重要です。\n\nアプリをアップデートするためには再起動が必要です。 今すぐアップデートをインストールしますか? Wallet Backup diff --git a/common/src/main/res/values-ms-rMY/strings.xml b/common/src/main/res/values-ms-rMY/strings.xml index 519f71f66..f0268a23b 100644 --- a/common/src/main/res/values-ms-rMY/strings.xml +++ b/common/src/main/res/values-ms-rMY/strings.xml @@ -560,7 +560,7 @@ Dengan mencipta akaun yang anda bersetuju dengan %%Terma & Syarat%% dan %%Dasar Privasi%% Terma & Syarat Dengan meneruskan anda bersetuju dengan - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. Kemas kini untuk aplikasi SORA telah dimuat turun dan sedia untuk dipasang.\n\nAdalah penting untuk menggunakan versi terkini aplikasi.\n\nUntuk mengemas kini aplikasi, mulakan semula diperlukan. Adakah anda ingin memasang kemas kini sekarang? Wallet Backup diff --git a/common/src/main/res/values-nb/strings.xml b/common/src/main/res/values-nb/strings.xml index 651418c02..9696f15f0 100644 --- a/common/src/main/res/values-nb/strings.xml +++ b/common/src/main/res/values-nb/strings.xml @@ -566,7 +566,7 @@ By creating an account you are agreeing with the %%Terms & Conditions%% and %%Privacy Policy%% Vilkår og Betingelser By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. An update for the SORA application has been downloaded and is ready to be installed.\n\nIt is important to use the latest version of the application.\n\nIn order to update the app, a restart is required. Would you like to install the update now? Wallet Backup diff --git a/common/src/main/res/values-nl/strings.xml b/common/src/main/res/values-nl/strings.xml index 612891f83..5b13ee39d 100644 --- a/common/src/main/res/values-nl/strings.xml +++ b/common/src/main/res/values-nl/strings.xml @@ -566,7 +566,7 @@ Door een account aan te maken gaat u akkoord met de %% Algemene voorwaarden %% en %% Privacybeleid %% Algemene voorwaarden By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. Een update voor de SORA-toepassing is gedownload en is klaar om te worden geïnstalleerd.\n\nHet is belangrijk om de nieuwste versie van de applicatie te gebruiken.\n\nOm de app bij te werken, is een herstart vereist. Wil je de update nu installeren? Wallet Backup diff --git a/common/src/main/res/values-pt/strings.xml b/common/src/main/res/values-pt/strings.xml index 694b95def..72f2471bb 100644 --- a/common/src/main/res/values-pt/strings.xml +++ b/common/src/main/res/values-pt/strings.xml @@ -566,7 +566,7 @@ Ao criar uma conta, automaticamente concorda com os %%Termos e Condições%% e %%Política de Privacidade%% Termos e Condições By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. Uma atualização para a aplicação SORA foi descarregada e está pronta para ser instalada.\n\nÉ importante utilizar a versão mais recente da aplicação.\n\nDe modo a atualizar a aplicação, é necessário reiniciar o sistema. Deseja instalar a atualização agora? Wallet Backup diff --git a/common/src/main/res/values-ru/strings.xml b/common/src/main/res/values-ru/strings.xml index ac4e13d4d..eaaa665cd 100644 --- a/common/src/main/res/values-ru/strings.xml +++ b/common/src/main/res/values-ru/strings.xml @@ -584,7 +584,7 @@ Создавая учетную запись, вы соглашаетесь с %% Условиями и положениями %% и %% Политикой конфиденциальности %% Условиями использования By continuing you are agreeing with the - Произошла непредвиденная ошибка.\n\nВы можете решить эту проблему в сообществе SORA в Telegram чате @SORAhappiness. + Произошла непредвиденная ошибка.\n\nВы можете решить эту проблему в сообществе SORA в Telegram чате @sora_happy. Обновление для приложения SORA было загружено и готово к установке. \n\n Важно использовать последнюю версию приложения. \n\n Чтобы обновить приложение, требуется перезагрузка. Хотите установить обновление сейчас? Сделайте резервную копию diff --git a/common/src/main/res/values-sr/strings.xml b/common/src/main/res/values-sr/strings.xml index 5b1970f81..be5295fae 100644 --- a/common/src/main/res/values-sr/strings.xml +++ b/common/src/main/res/values-sr/strings.xml @@ -571,7 +571,7 @@ Kreiranjem naloga pristajete na %%Uslove korišćenja%% i %%Politiku privatnosti%% Услови коришћења By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. Ажурирање за апликацију SORA је преузето и спремно за инсталирање. \n\nВажно је да користите најновију верзију апликације. \n\nДа бисте ажурирали апликацију, потребно је поновно покретање. Да ли желите да инсталирате ажурирање сада? Wallet Backup diff --git a/common/src/main/res/values-tr/strings.xml b/common/src/main/res/values-tr/strings.xml index ffd3a0e73..1ad8eafaa 100644 --- a/common/src/main/res/values-tr/strings.xml +++ b/common/src/main/res/values-tr/strings.xml @@ -566,7 +566,7 @@ Bir hesap oluşturarak %%Kullanım Şartlarını%% & %%Gizlilik Politikasını%% kabul ediyorsunuz. Şartlar ve Koşullar By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. SORA uygulaması için bir güncelleme indirildi ve yüklenmek için hazır.\n\nUygulamanın son sürümünü kullanmak önemlidir.\n\nUygulamayı güncellemek için yeniden başlatma gereklidir. Güncellemeyi şimdi yüklemek Istiyor musunuz? Wallet Backup diff --git a/common/src/main/res/values-vi/strings.xml b/common/src/main/res/values-vi/strings.xml index 87c2e4d0a..bd26b6bd7 100644 --- a/common/src/main/res/values-vi/strings.xml +++ b/common/src/main/res/values-vi/strings.xml @@ -560,7 +560,7 @@ Tạo tài khoản là bạn đã đồng ý với %% Điều khoản & Điều kiện %% và %% Chính sách quyền riêng tư %% Điều khoản & Điều kiện Bằng cách tiếp tục, bạn đồng ý với - Đã xảy ra lỗi không mong muốn. \n\n Bạn có thể khắc phục sự cố này trong cộng đồng SORA tại cuộc trò chuyện Telegram @SORAhappiness. + Đã xảy ra lỗi không mong muốn. \n\n Bạn có thể khắc phục sự cố này trong cộng đồng SORA tại cuộc trò chuyện Telegram @sora_happy. Bản cập nhật cho ứng dụng SORA đã được tải xuống và sẵn sàng cài đặt. \n\n Hãy sử dụng phiên bản mới nhất của ứng dụng. \n\n Để cập nhật ứng dụng thành công, bạn cần khởi động lại ứng dụng. Bạn có muốn cài đặt bản cập nhật ngay bây giờ không? Sao lưu ví diff --git a/common/src/main/res/values-zh-rCN/strings.xml b/common/src/main/res/values-zh-rCN/strings.xml index 04d035f19..4f82578b7 100644 --- a/common/src/main/res/values-zh-rCN/strings.xml +++ b/common/src/main/res/values-zh-rCN/strings.xml @@ -560,7 +560,7 @@ 创建账户即表示您同意%%条款和条件%%和%%隐私政策%% 条款及细则 继续操作即表示您同意 - 发生了意外错误。\n\n您可以在SORA社区的@SORAhappiness Telegram聊天中解决此问题。 + 发生了意外错误。\n\n您可以在SORA社区的@sora_happy Telegram聊天中解决此问题。 SORA 应用程序的更新已下载并可以安装。 \n\n使用最新版本的应用程序很重要。 \n\n为了更新应用程序,需要重新启动。 您想现在安装更新吗? 钱包备份 diff --git a/common/src/main/res/values-zh-rTW/strings.xml b/common/src/main/res/values-zh-rTW/strings.xml index bbbe0847c..5cbf04b9e 100644 --- a/common/src/main/res/values-zh-rTW/strings.xml +++ b/common/src/main/res/values-zh-rTW/strings.xml @@ -561,7 +561,7 @@ 創建賬戶即表示您同意%%條款和條件%%和%%隱私政策%% 條款及細則 By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. SORA 應用程序的更新已下載並可以安裝。 \n\n使用最新版本的應用程序很重要。 \n\n為了更新應用程序,需要重新啟動。 您想要現在安裝更新嗎? Wallet Backup diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 065f737be..f5b3d7751 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -566,7 +566,7 @@ By creating an account you are agreeing with the %%Terms & Conditions%% and %%Privacy Policy%% Terms & Conditions By continuing you are agreeing with the - An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @SORAhappiness Telegram chat. + An unexpected error has occured.\n\nYou may troubleshoot this issue in SORA community at the @sora_happy Telegram chat. An update for the SORA application has been downloaded and is ready to be installed.\n\nIt is important to use the latest version of the application.\n\nIn order to update the app, a restart is required. Would you like to install the update now? Wallet Backup diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt index 18893b487..0c2e82d4a 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt @@ -32,8 +32,6 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_main_impl.presentation.profile -import androidx.compose.runtime.getValue -import androidx.compose.runtime.setValue import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt index 28babb8bb..f5b7260ba 100644 --- a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt +++ b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt @@ -61,6 +61,7 @@ fun createSoraCardGateHubContract(): SoraCardContractData { locale = Locale.ENGLISH, soraBackEndUrl = BuildConfigWrapper.getSoraCardBackEndUrl(), client = OptionsProvider.header, + clientDark = true, flow = SoraCardFlow.SoraCardGateHubFlow, ) } @@ -74,6 +75,7 @@ fun createSoraCardContract( locale = Locale.ENGLISH, soraBackEndUrl = BuildConfigWrapper.getSoraCardBackEndUrl(), client = OptionsProvider.header, + clientDark = true, flow = SoraCardFlow.SoraCardKycFlow( kycCredentials = SoraCardKycCredentials( endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt index f9ce6ab40..03b2ef0c8 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt @@ -154,7 +154,7 @@ private fun PreviewSoraCardDetailsScreen() { soraCardDetailsScreenState = SoraCardDetailsScreenState( soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( balance = "3665.50", - phone = "+987654", + phone = "987654", soraCardMenuActions = SoraCardMenuAction.entries, ), soraCardReferralBannerCardState = true, diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index c0596b342..b124787a6 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -114,7 +114,7 @@ class SoraCardDetailsViewModel @Inject constructor( }, soraCardMainSoraContentCardState = local.soraCardMainSoraContentCardState.copy( balance = basicStatus.ibanInfo?.balance, - phone = basicStatus.phone, + phone = basicStatus.phone?.let { "+$it" }, ), ) } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt index 4bea8fe03..88ce58a07 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt @@ -114,7 +114,6 @@ fun SoraCardSettingsCard( title = Text.StringRes(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_card), icon = Image.ResImage(id = R.drawable.ic_arrow_right), subtitle = Text.SimpleText(text = main.phone.orEmpty()), - clickEnabled = main.balance != null, ) ) addAll(state.settings) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7dec19af9..82b31bb2f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,7 +39,7 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.1.7" +soracard = "1.1.9" xnetworking = "0.2.9" xsubstrate = "1.2.4" uicore = "0.2.32" diff --git a/test_data/src/main/java/jp/co/soramitsu/test_data/SoraCard.kt b/test_data/src/main/java/jp/co/soramitsu/test_data/SoraCard.kt index 7914c3057..86a2a5cf6 100644 --- a/test_data/src/main/java/jp/co/soramitsu/test_data/SoraCard.kt +++ b/test_data/src/main/java/jp/co/soramitsu/test_data/SoraCard.kt @@ -68,6 +68,7 @@ object SoraCardTestData { locale = Locale.ENGLISH, client = "test android client", soraBackEndUrl = "soracard backend", + clientDark = false, flow = SoraCardFlow.SoraCardKycFlow( kycCredentials = SoraCardKycCredentials( endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, @@ -87,6 +88,7 @@ object SoraCardTestData { locale = Locale.ENGLISH, client = "test android client", soraBackEndUrl = "soracard backend", + clientDark = false, flow = SoraCardFlow.SoraCardKycFlow( kycCredentials = SoraCardKycCredentials( endpointUrl = BuildConfig.SORA_CARD_KYC_ENDPOINT_URL, @@ -106,6 +108,7 @@ object SoraCardTestData { locale = Locale.ENGLISH, client = "test android client", soraBackEndUrl = "soracard backend", + clientDark = false, flow = SoraCardFlow.SoraCardKycFlow( areAttemptsPaidSuccessfully = false, isEnoughXorAvailable = false, From c824057acf1cd99f0b8abfac47d41eb7335c563c Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 4 Jun 2024 14:33:59 +0300 Subject: [PATCH 17/43] sc-29 reformat --- android-foundation | 2 +- .../compose/uikit/molecules/ListTile.kt | 20 ++--- .../uikit/organisms/PagerTextIndicator.kt | 10 +-- .../compose/uikit/tokens/Image.kt | 80 ------------------- .../compose/uikit/tokens/ScreenStatus.kt | 2 +- .../presentation/compose/uikit/tokens/Text.kt | 71 ---------------- .../receiverequest/QRCodeMainScreen.kt | 6 +- .../receiverequest/ReceiveTokenScreen.kt | 30 +++---- .../RequestTokenConfirmScreen.kt | 38 ++++----- .../receiverequest/RequestTokenScreen.kt | 22 ++--- .../compose/scan/QrCodeScannerScreen.kt | 8 +- .../screens/scan/QRCodeScannerActivity.kt | 3 +- .../presentation/details/IconButtonMenu.kt | 10 +-- .../presentation/details/ListTile.kt | 30 +++---- .../details/SoraCardDetailsFragment.kt | 6 +- .../details/SoraCardDetailsScreen.kt | 4 +- .../details/SoraCardDetailsViewModel.kt | 33 ++++---- .../presentation/details/SoraCardIBANCard.kt | 1 - .../details/SoraCardMainSoraContentCard.kt | 20 ++--- .../details/SoraCardRecentActivitiesCard.kt | 14 ++-- .../details/SoraCardSettingsCard.kt | 46 +++++------ 21 files changed, 152 insertions(+), 304 deletions(-) delete mode 100644 common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/Image.kt delete mode 100644 common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/Text.kt diff --git a/android-foundation b/android-foundation index cb8898951..a75a6d67f 160000 --- a/android-foundation +++ b/android-foundation @@ -1 +1 @@ -Subproject commit cb88989515db39026ac6f7523fc21c206e422c32 +Subproject commit a75a6d67fb65c608af232cfebcc66ad11dcd2bba diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/molecules/ListTile.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/molecules/ListTile.kt index b556fd2ac..5804fcb7f 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/molecules/ListTile.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/molecules/ListTile.kt @@ -49,19 +49,19 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview +import jp.co.soramitsu.androidfoundation.format.ImageValue +import jp.co.soramitsu.androidfoundation.format.TextValue +import jp.co.soramitsu.androidfoundation.format.retrievePainter +import jp.co.soramitsu.androidfoundation.format.retrieveString import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrievePainter -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrieveString import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors import jp.co.soramitsu.ui_core.theme.customTypography data class ListTileState( - val titleText: Text, - val image: Image, - val bodyText: Text + val titleText: TextValue, + val image: ImageValue, + val bodyText: TextValue, ) @Composable @@ -118,9 +118,9 @@ fun ListTile( private fun PreviewListTile() { ListTile( state = ListTileState( - titleText = Text.SimpleText("Title"), - image = Image.ResImage(id = R.drawable.ic_0x0200000000000000000000000000000000000000000000000000000000000000), - bodyText = Text.SimpleText("Body text") + titleText = TextValue.SimpleText("Title"), + image = ImageValue.ResImage(id = R.drawable.ic_0x0200000000000000000000000000000000000000000000000000000000000000), + bodyText = TextValue.SimpleText("Body text") ), onClick = { } ) diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/organisms/PagerTextIndicator.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/organisms/PagerTextIndicator.kt index f19184761..d64bfeb0a 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/organisms/PagerTextIndicator.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/organisms/PagerTextIndicator.kt @@ -58,9 +58,9 @@ import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.LayoutDirection +import jp.co.soramitsu.androidfoundation.format.TextValue +import jp.co.soramitsu.androidfoundation.format.retrieveString import jp.co.soramitsu.common.presentation.compose.extension.noRippleClickable -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrieveString import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors import jp.co.soramitsu.ui_core.theme.customTypography @@ -69,7 +69,7 @@ import kotlin.math.abs @Composable fun PagerTextIndicator( modifier: Modifier, - indicatorsArray: List, + indicatorsArray: List, currentPageRetriever: () -> Int, slideOffsetRetriever: () -> Float, onIndicatorClick: (Int) -> Unit @@ -182,8 +182,8 @@ private fun PreviewSlidingPagerIndicator() { .fillMaxWidth() .wrapContentHeight(), indicatorsArray = listOf( - Text.SimpleText("1234512345"), - Text.SimpleText("3"), + TextValue.SimpleText("1234512345"), + TextValue.SimpleText("3"), ), currentPageRetriever = { ci.value }, slideOffsetRetriever = { 0f }, diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/Image.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/Image.kt deleted file mode 100644 index 8089a97b0..000000000 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/Image.kt +++ /dev/null @@ -1,80 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.common.presentation.compose.uikit.tokens - -import android.graphics.Bitmap -import android.graphics.drawable.Drawable -import androidx.compose.runtime.Composable -import androidx.compose.runtime.key -import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.graphics.painter.BitmapPainter -import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.core.graphics.drawable.toBitmap -import coil.compose.rememberAsyncImagePainter -import coil.request.ImageRequest - -sealed interface Image { - - data class RemoteImage(val url: String) : Image - - data class ResImage(val id: Int) : Image - - data class BitmapImage(val bitmap: Bitmap) : Image - - data class DrawableImage(val drawable: Drawable) : Image -} - -@Composable -fun Image.retrievePainter(): Painter = when (this) { - is Image.RemoteImage -> key(url) { - rememberAsyncImagePainter( - model = ImageRequest.Builder(LocalContext.current) - .data(url) - .build() - ) - } - is Image.ResImage -> key(id) { - painterResource( - id = id - ) - } - is Image.BitmapImage -> BitmapPainter( - image = bitmap.asImageBitmap() - ) - is Image.DrawableImage -> BitmapPainter( - image = drawable.toBitmap() - .asImageBitmap() - ) -} diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/ScreenStatus.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/ScreenStatus.kt index 64bcf8eae..d55a29170 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/ScreenStatus.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/ScreenStatus.kt @@ -35,5 +35,5 @@ package jp.co.soramitsu.common.presentation.compose.uikit.tokens enum class ScreenStatus { LOADING, ERROR, - READY_TO_RENDER + READY_TO_RENDER, } diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/Text.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/Text.kt deleted file mode 100644 index f1786b81e..000000000 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/uikit/tokens/Text.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.common.presentation.compose.uikit.tokens - -import android.content.Context -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource - -sealed interface Text { - - data class SimpleText(val text: String) : Text - - data class StringRes(val id: Int) : Text - - data class StringResWithArgs(val id: Int, val payload: Array) : Text { - - override fun equals(other: Any?): Boolean { - if (other !is StringResWithArgs) - return false - - return payload.contentEquals(other.payload) - } - - override fun hashCode(): Int { - return 137 * id.hashCode() + payload.contentHashCode() - } - } -} - -@Composable -fun Text.retrieveString(): String = when (this) { - is Text.StringRes -> stringResource(id = id) - is Text.StringResWithArgs -> stringResource(id = id, formatArgs = payload) - is Text.SimpleText -> text -} - -fun Text.retrieveString(context: Context): String = when (this) { - is Text.StringRes -> context.getString(id) - is Text.StringResWithArgs -> context.getString(id, payload) - is Text.SimpleText -> text -} diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/QRCodeMainScreen.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/QRCodeMainScreen.kt index 285a47148..8f21714e3 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/QRCodeMainScreen.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/QRCodeMainScreen.kt @@ -48,11 +48,11 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.TextValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.previewAssetAmountInputState import jp.co.soramitsu.common.presentation.compose.uikit.organisms.PagerTextIndicator import jp.co.soramitsu.common.presentation.compose.uikit.tokens.ScreenStatus -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text import jp.co.soramitsu.ui_core.resources.Dimens import kotlinx.coroutines.launch @@ -104,9 +104,9 @@ fun QrCodeMainScreen( .padding(horizontal = Dimens.x9), indicatorsArray = qrCodeMainScreenPages.map { when (it) { - QrCodeMainScreenPage.RECEIVE -> Text.StringRes(id = R.string.common_receive) + QrCodeMainScreenPage.RECEIVE -> TextValue.StringRes(id = R.string.common_receive) - QrCodeMainScreenPage.REQUEST -> Text.StringRes(id = R.string.common_request) + QrCodeMainScreenPage.REQUEST -> TextValue.StringRes(id = R.string.common_request) } }, currentPageRetriever = { pagerState.currentPage }, diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/ReceiveTokenScreen.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/ReceiveTokenScreen.kt index dcdf1a5f8..4e8ee98b0 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/ReceiveTokenScreen.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/ReceiveTokenScreen.kt @@ -53,14 +53,14 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import jp.co.soramitsu.androidfoundation.format.ImageValue +import jp.co.soramitsu.androidfoundation.format.TextValue +import jp.co.soramitsu.androidfoundation.format.retrievePainter import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.uikit.molecules.ListTile import jp.co.soramitsu.common.presentation.compose.uikit.molecules.ListTileState import jp.co.soramitsu.common.presentation.compose.uikit.organisms.LoadableContentCard -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image import jp.co.soramitsu.common.presentation.compose.uikit.tokens.ScreenStatus -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrievePainter import jp.co.soramitsu.ui_core.component.button.BleachedButton import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.properties.Order @@ -75,50 +75,50 @@ data class ReceiveTokenByQrScreenState( val untransformedUserAddress: String?, ) { - val qrCodeImage: Image + val qrCodeImage: ImageValue get() { if (untransformedQrBitmap == null) - return Image.ResImage( + return ImageValue.ResImage( id = R.drawable.ic_empty_state ) - return Image.BitmapImage( + return ImageValue.BitmapImage( bitmap = untransformedQrBitmap ) } - val userAddressTitle: Text + val userAddressTitle: TextValue get() { if (untransformedUserName == null) - return Text.StringRes( + return TextValue.StringRes( id = R.string.common_error_general_title ) - return Text.SimpleText( + return TextValue.SimpleText( text = untransformedUserName ) } - val userAddressAvatar: Image + val userAddressAvatar: ImageValue get() { if (untransformedAvatarDrawable == null) - return Image.ResImage( + return ImageValue.ResImage( id = R.drawable.ic_empty_state ) - return Image.DrawableImage( + return ImageValue.DrawableImage( drawable = untransformedAvatarDrawable ) } - val userAddressBody: Text + val userAddressBody: TextValue get() { if (untransformedUserAddress == null) - return Text.StringRes( + return TextValue.StringRes( id = R.string.common_error_general_title ) - return Text.SimpleText( + return TextValue.SimpleText( text = untransformedUserAddress ) } diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/RequestTokenConfirmScreen.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/RequestTokenConfirmScreen.kt index abac4f425..7dfe7e6ac 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/RequestTokenConfirmScreen.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/RequestTokenConfirmScreen.kt @@ -52,6 +52,10 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview +import jp.co.soramitsu.androidfoundation.format.ImageValue +import jp.co.soramitsu.androidfoundation.format.TextValue +import jp.co.soramitsu.androidfoundation.format.retrievePainter +import jp.co.soramitsu.androidfoundation.format.retrieveString import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.presentation.compose.components.AssetAmountInput @@ -59,11 +63,7 @@ import jp.co.soramitsu.common.presentation.compose.components.previewAssetAmount import jp.co.soramitsu.common.presentation.compose.uikit.molecules.ListTile import jp.co.soramitsu.common.presentation.compose.uikit.molecules.ListTileState import jp.co.soramitsu.common.presentation.compose.uikit.organisms.LoadableContentCard -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image import jp.co.soramitsu.common.presentation.compose.uikit.tokens.ScreenStatus -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrievePainter -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrieveString import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size @@ -80,65 +80,65 @@ data class RequestTokenConfirmScreenState( val assetAmountInputState: AssetAmountInputState? ) { - val qrCodeImage: Image + val qrCodeImage: ImageValue get() { if (untransformedQrBitmap == null) - return Image.ResImage( + return ImageValue.ResImage( id = R.drawable.ic_empty_state ) - return Image.BitmapImage( + return ImageValue.BitmapImage( bitmap = untransformedQrBitmap ) } - val userAddressTitle: Text + val userAddressTitle: TextValue get() { if (untransformedUserName == null) - return Text.StringRes( + return TextValue.StringRes( id = R.string.common_error_general_title ) - return Text.SimpleText( + return TextValue.SimpleText( text = untransformedUserName ) } - val userAddressAvatar: Image + val userAddressAvatar: ImageValue get() { if (untransformedAvatarDrawable == null) - return Image.ResImage( + return ImageValue.ResImage( id = R.drawable.ic_empty_state ) - return Image.DrawableImage( + return ImageValue.DrawableImage( drawable = untransformedAvatarDrawable ) } - val userAddressBody: Text + val userAddressBody: TextValue get() { if (untransformedUserAddress == null) - return Text.StringRes( + return TextValue.StringRes( id = R.string.common_error_general_title ) - return Text.SimpleText( + return TextValue.SimpleText( text = untransformedUserAddress ) } val assetToSendTitleText = - Text.StringRes(id = R.string.asset_to_send) + TextValue.StringRes(id = R.string.asset_to_send) val isShareQRCodeEnabled: Boolean = screenStatus === ScreenStatus.READY_TO_RENDER && untransformedUserAddress != null && untransformedAvatarDrawable != null - val shareQRCodeButtonIcon: Image = Image.ResImage(id = R.drawable.ic_new_arrow_up_24) + val shareQRCodeButtonIcon: ImageValue = ImageValue.ResImage(id = R.drawable.ic_new_arrow_up_24) - val shareQRCodeButtonText: Text = Text.StringRes(id = R.string.common_share) + val shareQRCodeButtonText: TextValue = TextValue.StringRes(id = R.string.common_share) } @Composable diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/RequestTokenScreen.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/RequestTokenScreen.kt index 290371d6d..ab85a23c0 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/RequestTokenScreen.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/receiverequest/RequestTokenScreen.kt @@ -61,6 +61,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.ImageValue +import jp.co.soramitsu.androidfoundation.format.TextValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.presentation.compose.components.AssetAmountInput @@ -68,9 +70,7 @@ import jp.co.soramitsu.common.presentation.compose.components.previewAssetAmount import jp.co.soramitsu.common.presentation.compose.uikit.molecules.ListTile import jp.co.soramitsu.common.presentation.compose.uikit.molecules.ListTileState import jp.co.soramitsu.common.presentation.compose.uikit.organisms.LoadableContentCard -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image import jp.co.soramitsu.common.presentation.compose.uikit.tokens.ScreenStatus -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size @@ -86,38 +86,38 @@ data class RequestTokenScreenState( val assetAmountInputState: AssetAmountInputState?, ) { - val recipientAddressHeader: Text + val recipientAddressHeader: TextValue get() { if (untransformedUserName == null) - return Text.StringRes( + return TextValue.StringRes( id = R.string.common_error_general_title ) - return Text.SimpleText( + return TextValue.SimpleText( text = untransformedUserName ) } - private val recipientAddressAvatar: Image + private val recipientAddressAvatar: ImageValue get() { if (untransformedAvatarDrawable == null) - return Image.ResImage( + return ImageValue.ResImage( id = R.drawable.ic_empty_state ) - return Image.DrawableImage( + return ImageValue.DrawableImage( drawable = untransformedAvatarDrawable ) } - val recipientAddressBody: Text + val recipientAddressBody: TextValue get() { if (untransformedUserAddress == null) - return Text.StringRes( + return TextValue.StringRes( id = R.string.common_error_general_title ) - return Text.SimpleText( + return TextValue.SimpleText( text = untransformedUserAddress ) } diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/scan/QrCodeScannerScreen.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/scan/QrCodeScannerScreen.kt index db120028f..eef2f739b 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/scan/QrCodeScannerScreen.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/scan/QrCodeScannerScreen.kt @@ -54,9 +54,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension +import jp.co.soramitsu.androidfoundation.format.TextValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.uikit.tokens.ScreenStatus -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text import jp.co.soramitsu.ui_core.component.button.BleachedButton import jp.co.soramitsu.ui_core.component.button.FilledButton import jp.co.soramitsu.ui_core.component.button.properties.Order @@ -71,10 +71,10 @@ data class QRCodeScannerScreenState( val screenStatus: ScreenStatus, val throwable: Throwable? ) { - val errorText: Text + val errorText: TextValue get() = throwable?.message?.let { - Text.SimpleText(it) - } ?: Text.StringRes(id = R.string.common_error_general_title) + TextValue.SimpleText(it) + } ?: TextValue.StringRes(id = R.string.common_error_general_title) } @Composable diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt index 2e647f6d3..5b92242dc 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt @@ -46,15 +46,14 @@ import androidx.appcompat.app.AppCompatActivity import androidx.compose.material.MaterialTheme import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.platform.ViewCompositionStrategy -import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.google.zxing.client.android.Intents import com.journeyapps.barcodescanner.CaptureManager import dagger.hilt.android.AndroidEntryPoint +import jp.co.soramitsu.androidfoundation.format.retrieveString import jp.co.soramitsu.common.presentation.compose.uikit.tokens.ScreenStatus -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrieveString import jp.co.soramitsu.feature_assets_impl.databinding.QrCodeScannerLayoutBinding import jp.co.soramitsu.feature_assets_impl.presentation.components.compose.scan.QrCodeScannerScreen import kotlinx.coroutines.flow.collectLatest diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/IconButtonMenu.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/IconButtonMenu.kt index e2cef4cea..13fd6a535 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/IconButtonMenu.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/IconButtonMenu.kt @@ -37,15 +37,15 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrieveString +import jp.co.soramitsu.androidfoundation.format.ImageValue +import jp.co.soramitsu.androidfoundation.format.TextValue +import jp.co.soramitsu.androidfoundation.format.retrieveString import jp.co.soramitsu.common.view.AmountCardIcon data class IconButtonMenuState( val testTagId: String? = null, - val image: Image.ResImage, - val text: Text, + val image: ImageValue.ResImage, + val text: TextValue, val isEnabled: Boolean ) diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt index 3b98398ea..178e6fbc4 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/ListTile.kt @@ -45,11 +45,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import jp.co.soramitsu.androidfoundation.format.ImageValue +import jp.co.soramitsu.androidfoundation.format.TextValue +import jp.co.soramitsu.androidfoundation.format.retrievePainter +import jp.co.soramitsu.androidfoundation.format.retrieveString import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrievePainter -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrieveString import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors @@ -69,20 +69,20 @@ data class ListTileState( val testTagId: String? = null, val variant: ListTileVariant, val flag: ListTileFlag, - val title: Text, - val subtitle: Text? = null, + val title: TextValue, + val subtitle: TextValue? = null, val clickEnabled: Boolean = true, - private val body: Text? = null, - private val icon: Image? = null + private val body: TextValue? = null, + private val icon: ImageValue? = null ) { val isBodyVisible = variant === ListTileVariant.TITLE_SUBTITLE_BODY - val bodyText: Text? + val bodyText: TextValue? get() = if (variant === ListTileVariant.TITLE_SUBTITLE_BODY) body else null - val navigationIcon: Image? + val navigationIcon: ImageValue? get() = if (variant === ListTileVariant.TITLE_NAVIGATION_HINT) icon else null } @@ -151,8 +151,8 @@ private fun PreviewListTile_TITLE_NAVIGATION_HINT() { listTileState = ListTileState( variant = ListTileVariant.TITLE_NAVIGATION_HINT, flag = ListTileFlag.WARNING, - title = Text.SimpleText(text = "Title"), - icon = Image.ResImage(id = R.drawable.ic_arrow_right) + title = TextValue.SimpleText(text = "Title"), + icon = ImageValue.ResImage(id = R.drawable.ic_arrow_right) ), onItemClick = {} ) @@ -165,9 +165,9 @@ private fun PreviewListTile_TITLE_SUBTITLE_BODY() { listTileState = ListTileState( variant = ListTileVariant.TITLE_SUBTITLE_BODY, flag = ListTileFlag.NORMAL, - title = Text.SimpleText(text = "Title"), - subtitle = Text.SimpleText(text = "Subtitle"), - body = Text.SimpleText(text = "Body") + title = TextValue.SimpleText(text = "Title"), + subtitle = TextValue.SimpleText(text = "Subtitle"), + body = TextValue.SimpleText(text = "Body") ), onItemClick = {} ) diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt index 76d8b833e..5d5ed367a 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsFragment.kt @@ -117,11 +117,7 @@ class SoraCardDetailsFragment : SoraBaseFragment() { onIbanCardShareClick = viewModel::onIbanCardShareClick, onIbanCardClick = viewModel::onIbanCardClick, onSettingsOptionClick = { - if (it == 0) { - viewModel.onFiatWalletClick(this@SoraCardDetailsFragment.context) - } else { - viewModel.onSettingsOptionClick(it) - } + viewModel.onSettingsOptionClick(it, this@SoraCardDetailsFragment.context) }, onExchangeXorClick = viewModel::onExchangeXorClick, ) diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt index 03b2ef0c8..ff615b76f 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt @@ -127,7 +127,6 @@ fun SoraCardDetailsScreen( if (state.settings.isNotEmpty()) SoraCardSettingsCard( state = state, - main = soraCardDetailsScreenState.soraCardMainSoraContentCardState, onItemClick = onSettingsOptionClick, ) } @@ -166,7 +165,8 @@ private fun PreviewSoraCardDetailsScreen() { closed = false, ), soraCardSettingsCard = SoraCardSettingsCardState( - soraCardSettingsOptions = SoraCardSettingsOption.entries + soraCardSettingsOptions = SoraCardSettingsOption.entries, + phone = "123123", ), logoutDialog = false, fiatWalletDialog = false, diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index b124787a6..e05e879c9 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -83,6 +83,7 @@ class SoraCardDetailsViewModel @Inject constructor( ), soraCardSettingsCard = SoraCardSettingsCardState( soraCardSettingsOptions = SoraCardSettingsOption.entries, + phone = "", ), soraCardIBANCardState = null, logoutDialog = false, @@ -105,6 +106,7 @@ class SoraCardDetailsViewModel @Inject constructor( soraCardInteractor.basicStatus.value.let { basicStatus -> val local = _soraCardDetailsScreenState.value ibanCache = basicStatus.ibanInfo + val phoneFormatted = basicStatus.phone?.let { "+$it" } _soraCardDetailsScreenState.value = local.copy( soraCardIBANCardState = basicStatus.ibanInfo?.let { iban -> SoraCardIBANCardState( @@ -114,8 +116,11 @@ class SoraCardDetailsViewModel @Inject constructor( }, soraCardMainSoraContentCardState = local.soraCardMainSoraContentCardState.copy( balance = basicStatus.ibanInfo?.balance, - phone = basicStatus.phone?.let { "+$it" }, + phone = phoneFormatted, ), + soraCardSettingsCard = local.soraCardSettingsCard?.copy( + phone = phoneFormatted.orEmpty(), + ) ) } } @@ -161,32 +166,32 @@ class SoraCardDetailsViewModel @Inject constructor( } } - fun onFiatWalletClick(context: Context?) { - if (context == null) return - val fiat = BuildUtils.fiatPackageName() - if (context.isAppAvailableCompat(fiat)) { - fiatWallet.value = fiat - } else { - _soraCardDetailsScreenState.value = - _soraCardDetailsScreenState.value.copy(fiatWalletDialog = true) - } - } - fun onExchangeXorClick() { _launchSoraCard.value = createSoraCardGateHubContract() } - fun onSettingsOptionClick(position: Int) { + fun onSettingsOptionClick(position: Int, context: Context?) { val settings = soraCardDetailsScreenState.value.soraCardSettingsCard ?.soraCardSettingsOptions ?: return - when (settings[position - 1]) { + when (settings[position]) { SoraCardSettingsOption.LOG_OUT -> _soraCardDetailsScreenState.value = _soraCardDetailsScreenState.value.copy(logoutDialog = true) SoraCardSettingsOption.SUPPORT_CHAT -> telegramChat.trigger() + + SoraCardSettingsOption.MANAGE_SORA_CARD -> { + checkNotNull(context) + val fiat = BuildUtils.fiatPackageName() + if (context.isAppAvailableCompat(fiat)) { + fiatWallet.value = fiat + } else { + _soraCardDetailsScreenState.value = + _soraCardDetailsScreenState.value.copy(fiatWalletDialog = true) + } + } } } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt index 49dd39d9c..12c2c5efd 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardIBANCard.kt @@ -53,7 +53,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text import jp.co.soramitsu.common.util.ext.underlineSubstring import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.oauth.clients.ClientsFacade diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt index e6388fb88..852c70fcd 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt @@ -47,10 +47,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import jp.co.soramitsu.androidfoundation.format.ImageValue +import jp.co.soramitsu.androidfoundation.format.TextValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.presentation.compose.components.SoraCardImage -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text import jp.co.soramitsu.ui_core.component.button.BleachedButton import jp.co.soramitsu.ui_core.component.button.TonalButton import jp.co.soramitsu.ui_core.component.button.properties.Order @@ -78,32 +78,32 @@ data class SoraCardMainSoraContentCardState( SoraCardMenuAction.TOP_UP -> IconButtonMenuState( testTagId = it.toString(), - image = Image.ResImage(id = R.drawable.ic_new_arrow_down_24), - text = Text.StringRes(id = R.string.sora_card_action_top_up), + image = ImageValue.ResImage(id = R.drawable.ic_new_arrow_down_24), + text = TextValue.StringRes(id = R.string.sora_card_action_top_up), isEnabled = actionsEnabled, ) SoraCardMenuAction.TRANSFER -> IconButtonMenuState( testTagId = it.toString(), - image = Image.ResImage(id = R.drawable.ic_new_arrow_up_24), - text = Text.StringRes(id = R.string.sora_card_action_transfer), + image = ImageValue.ResImage(id = R.drawable.ic_new_arrow_up_24), + text = TextValue.StringRes(id = R.string.sora_card_action_transfer), isEnabled = actionsEnabled, ) SoraCardMenuAction.EXCHANGE -> IconButtonMenuState( testTagId = it.toString(), - image = Image.ResImage(id = R.drawable.ic_refresh_24), - text = Text.StringRes(id = R.string.sora_card_action_exchange), + image = ImageValue.ResImage(id = R.drawable.ic_refresh_24), + text = TextValue.StringRes(id = R.string.sora_card_action_exchange), isEnabled = actionsEnabled, ) SoraCardMenuAction.FREEZE -> IconButtonMenuState( testTagId = it.toString(), - image = Image.ResImage(id = R.drawable.ic_snow_flake), - text = Text.StringRes(id = R.string.sora_card_action_freeze), + image = ImageValue.ResImage(id = R.drawable.ic_snow_flake), + text = TextValue.StringRes(id = R.string.sora_card_action_freeze), isEnabled = actionsEnabled, ) } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardRecentActivitiesCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardRecentActivitiesCard.kt index dc0118823..ffba7b5d2 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardRecentActivitiesCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardRecentActivitiesCard.kt @@ -43,9 +43,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import jp.co.soramitsu.androidfoundation.format.TextValue +import jp.co.soramitsu.androidfoundation.format.retrieveString import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.retrieveString import jp.co.soramitsu.ui_core.component.card.ContentCard import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors @@ -61,7 +61,7 @@ data class SoraCardRecentActivitiesCardState( val data: List ) { - val headlineText: Text = Text.StringRes( + val headlineText: TextValue = TextValue.StringRes( id = R.string.asset_details_recent_activity ) @@ -71,13 +71,13 @@ data class SoraCardRecentActivitiesCardState( ListTileState( variant = ListTileVariant.TITLE_SUBTITLE_BODY, flag = ListTileFlag.NORMAL, - title = Text.SimpleText(text = it.t), - subtitle = Text.SimpleText(text = it.t), - body = Text.SimpleText(text = it.t) + title = TextValue.SimpleText(text = it.t), + subtitle = TextValue.SimpleText(text = it.t), + body = TextValue.SimpleText(text = it.t) ) } - val showMoreText: Text = Text.StringRes( + val showMoreText: TextValue = TextValue.StringRes( id = R.string.show_more ) } diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt index 88ce58a07..6c1f7fbf8 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardSettingsCard.kt @@ -42,21 +42,23 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import jp.co.soramitsu.androidfoundation.format.ImageValue +import jp.co.soramitsu.androidfoundation.format.TextValue import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Image -import jp.co.soramitsu.common.presentation.compose.uikit.tokens.Text import jp.co.soramitsu.ui_core.component.card.ContentCard import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors import jp.co.soramitsu.ui_core.theme.customTypography enum class SoraCardSettingsOption { + MANAGE_SORA_CARD, SUPPORT_CHAT, LOG_OUT, } data class SoraCardSettingsCardState( - val soraCardSettingsOptions: List + val soraCardSettingsOptions: List, + val phone: String, ) { val settings: List = soraCardSettingsOptions.map { @@ -66,8 +68,8 @@ data class SoraCardSettingsCardState( testTagId = it.toString(), variant = ListTileVariant.TITLE_NAVIGATION_HINT, flag = ListTileFlag.WARNING, - title = Text.StringRes(id = R.string.sora_card_option_logout), - icon = Image.ResImage(id = R.drawable.ic_arrow_right) + title = TextValue.StringRes(id = R.string.sora_card_option_logout), + icon = ImageValue.ResImage(id = R.drawable.ic_arrow_right), ) SoraCardSettingsOption.SUPPORT_CHAT -> @@ -75,9 +77,20 @@ data class SoraCardSettingsCardState( testTagId = it.toString(), variant = ListTileVariant.TITLE_NAVIGATION_HINT, flag = ListTileFlag.NORMAL, - title = Text.StringRes(id = R.string.support_chat), - icon = Image.ResImage(id = R.drawable.ic_arrow_right) + title = TextValue.StringRes(id = R.string.support_chat), + icon = ImageValue.ResImage(id = R.drawable.ic_arrow_right), ) + + SoraCardSettingsOption.MANAGE_SORA_CARD -> { + ListTileState( + testTagId = it.toString(), + variant = ListTileVariant.TITLE_NAVIGATION_HINT, + flag = ListTileFlag.NORMAL, + title = TextValue.StringRes(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_card), + icon = ImageValue.ResImage(id = R.drawable.ic_arrow_right), + subtitle = TextValue.SimpleText(text = phone), + ) + } } } } @@ -85,7 +98,6 @@ data class SoraCardSettingsCardState( @Composable fun SoraCardSettingsCard( state: SoraCardSettingsCardState, - main: SoraCardMainSoraContentCardState, onItemClick: (position: Int) -> Unit, ) { ContentCard( @@ -105,19 +117,7 @@ fun SoraCardSettingsCard( style = MaterialTheme.customTypography.headline2, color = MaterialTheme.customColors.fgPrimary, ) - buildList { - add( - ListTileState( - testTagId = "ManageSoraCard", - variant = ListTileVariant.TITLE_NAVIGATION_HINT, - flag = ListTileFlag.NORMAL, - title = Text.StringRes(id = jp.co.soramitsu.oauth.R.string.card_hub_manage_card), - icon = Image.ResImage(id = R.drawable.ic_arrow_right), - subtitle = Text.SimpleText(text = main.phone.orEmpty()), - ) - ) - addAll(state.settings) - }.forEachIndexed { i, s -> + state.settings.forEachIndexed { i, s -> ListTileView( listTileState = s, onItemClick = { onItemClick.invoke(i) }, @@ -132,9 +132,9 @@ fun SoraCardSettingsCard( private fun PreviewSoraCardSettingsCard() { SoraCardSettingsCard( state = SoraCardSettingsCardState( - soraCardSettingsOptions = SoraCardSettingsOption.entries + soraCardSettingsOptions = SoraCardSettingsOption.entries, + phone = "109328", ), - main = SoraCardMainSoraContentCardState("$34 775.88", "+123123", false, emptyList()), onItemClick = { _ -> } ) } From 581717fdbbc5e71d50b307d74dd69769d478b6fd Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 4 Jun 2024 15:29:37 +0300 Subject: [PATCH 18/43] sc-29 --- .../domain/SoraCardInteractorImpl.kt | 31 ++++++++++++------- gradle/libs.versions.toml | 2 +- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt index b47719c12..0e98a65f6 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt @@ -37,11 +37,9 @@ import javax.inject.Inject import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.compareByTotal -import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.splitVersions import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor -import jp.co.soramitsu.feature_blockexplorer_api.data.BlockExplorerManager import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardAvailabilityInfo import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardBasicStatus @@ -62,8 +60,6 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map internal class SoraCardInteractorImpl @Inject constructor( - private val blockExplorerManager: BlockExplorerManager, - private val formatter: NumbersFormatter, private val assetsInteractor: AssetsInteractor, private val poolsInteractor: PoolsInteractor, private val soraCardClientProxy: SoraCardClientProxy, @@ -84,16 +80,19 @@ internal class SoraCardInteractorImpl @Inject constructor( ) ) + private val _ibanFlow = MutableStateFlow(null) + private val _phoneFlow = MutableStateFlow("") + @Suppress("UNCHECKED_CAST") override suspend fun initialize() { combine( flow { emit(soraCardClientProxy.init()) }, needInstallUpdate(), fetchApplicationFee(), - fetchUserIbanAccount(), + _ibanFlow.asStateFlow(), subscribeToSoraCardAvailabilityFlow(), checkSoraCardPending(), - fetchUserPhone(), + _phoneFlow.asStateFlow(), ) { flows -> val init = flows[0] as Pair val needUpdate = flows[1] as Boolean @@ -117,6 +116,7 @@ internal class SoraCardInteractorImpl @Inject constructor( .collect { _soraCardBasicStatus.value = it } + resetInfo() } override val basicStatus: StateFlow = _soraCardBasicStatus.asStateFlow() @@ -150,11 +150,16 @@ internal class SoraCardInteractorImpl @Inject constructor( return false } + private suspend fun resetInfo() { + fetchUserIbanAccount() + fetchUserPhone() + } + override suspend fun setStatus(status: SoraCardCommonVerification) { _soraCardBasicStatus.value = _soraCardBasicStatus.value.copy( verification = status, - ibanInfo = fetchIbanItem(), ) + resetInfo() } override suspend fun setLogout() { @@ -162,6 +167,7 @@ internal class SoraCardInteractorImpl @Inject constructor( _soraCardBasicStatus.value = _soraCardBasicStatus.value.copy( verification = SoraCardCommonVerification.NotFound, ibanInfo = null, + phone = null, ) } @@ -197,12 +203,13 @@ internal class SoraCardInteractorImpl @Inject constructor( xorRatioAvailable = false, ) - private fun fetchUserIbanAccount() = flow { emit(fetchIbanItem()) } - - private fun fetchUserPhone() = flow { emit(soraCardClientProxy.getPhone()) } + private suspend fun fetchUserIbanAccount() { + _ibanFlow.value = soraCardClientProxy.getIBAN().getOrNull() + } - private suspend fun fetchIbanItem(): IbanInfo? = - soraCardClientProxy.getIBAN().getOrNull() + private suspend fun fetchUserPhone() { + _phoneFlow.value = soraCardClientProxy.getPhone() + } private fun fetchApplicationFee() = flow { emit(soraCardClientProxy.getApplicationFee()) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 82b31bb2f..97f0df3d8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,7 +39,7 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.1.9" +soracard = "1.1.11" xnetworking = "0.2.9" xsubstrate = "1.2.4" uicore = "0.2.32" From b8add91a4af518b0711b1a9833be90636f184a46 Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 18 Jun 2024 14:44:58 +0300 Subject: [PATCH 19/43] sc-29 --- feature_assets_impl/build.gradle.kts | 1 + .../assetdetails/AssetDetailsFragment.kt | 8 +++ .../assetdetails/AssetDetailsViewModel.kt | 9 ++- .../presentation/explore/ExploreFragment.kt | 10 ++-- .../explore/{model => }/ExploreScreenState.kt | 4 +- .../presentation/explore/ExploreViewModel.kt | 5 +- .../explore/ExploreViewModelTest.kt | 58 +++++++++++++++++-- .../presentation/profile/ProfileScreen.kt | 18 +++--- gradle/libs.versions.toml | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../java/jp/co/soramitsu/test_data/Tokens.kt | 12 ++++ 11 files changed, 105 insertions(+), 26 deletions(-) rename feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/{model => }/ExploreScreenState.kt (97%) diff --git a/feature_assets_impl/build.gradle.kts b/feature_assets_impl/build.gradle.kts index e64e090ee..9f686b6bd 100644 --- a/feature_assets_impl/build.gradle.kts +++ b/feature_assets_impl/build.gradle.kts @@ -78,6 +78,7 @@ dependencies { implementation(project(":feature_account_api")) implementation(project(":sorasubstrate")) implementation(project(":feature_main_api")) + implementation(project(":feature_sora_card_api")) implementation(project(":feature_blockexplorer_api")) implementation(libs.xsubstrateDep) diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt index 652f03230..b3a56b042 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsFragment.kt @@ -54,6 +54,7 @@ import jp.co.soramitsu.androidfoundation.fragment.CustomViewModelFactory import jp.co.soramitsu.common.base.SoraBaseFragment import jp.co.soramitsu.common.base.theOnlyRoute import jp.co.soramitsu.common.domain.BottomBarController +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContract import jp.co.soramitsu.ui_core.resources.Dimens @AndroidEntryPoint @@ -71,6 +72,10 @@ class AssetDetailsFragment : SoraBaseFragment() { } } + private val soraCardSignIn = registerForActivityResult( + SoraCardContract() + ) { } + @Inject lateinit var vmf: AssetDetailsViewModel.AssetDetailsViewModelFactory @@ -125,5 +130,8 @@ class AssetDetailsFragment : SoraBaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) (activity as BottomBarController).hideBottomBar() + viewModel.launchSoraCardSignIn.observe { contract -> + soraCardSignIn.launch(contract) + } } } diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt index 0e2c7aa76..ded9587a9 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt @@ -35,11 +35,13 @@ package jp.co.soramitsu.feature_assets_impl.presentation.screens.assetdetails import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue +import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager @@ -68,7 +70,9 @@ import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.feature_blockexplorer_api.domain.TransactionHistoryHandler import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter +import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardGateHubContract import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest @@ -99,6 +103,9 @@ class AssetDetailsViewModel @AssistedInject constructor( private const val TX_HISTORY_COUNT = 5 } + private val _launchSoraCardSignIn = SingleLiveEvent() + val launchSoraCardSignIn: LiveData = _launchSoraCardSignIn + internal var state by mutableStateOf(AssetCardState(true, emptyAssetCardState)) private set @@ -277,6 +284,6 @@ class AssetDetailsViewModel @AssistedInject constructor( } fun onBuyCrypto() { - assetsRouter.showBuyCrypto() + _launchSoraCardSignIn.value = createSoraCardGateHubContract() } } diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt index 5a46a36a8..05ee6d415 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt @@ -145,7 +145,7 @@ class ExploreFragment : SoraBaseFragment() { ) } } else { - if (state.assets != null && state.farms.isEmpty() && state.pools.isEmpty()) { + if ((state.ecoSystemTokensState == null || state.ecoSystemTokensState.topTokens.isEmpty()) && state.farms.isEmpty() && state.pools.isEmpty()) { Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center @@ -160,7 +160,7 @@ class ExploreFragment : SoraBaseFragment() { Column { val listState1 = rememberLazyListState() LazyColumn(state = listState1) { - if (state.assets != null) { + if (state.ecoSystemTokensState != null) { item { Text( modifier = Modifier.padding(start = Dimens.x3, bottom = Dimens.x2), @@ -172,12 +172,12 @@ class ExploreFragment : SoraBaseFragment() { } items( - count = state.assets.topTokens.size, + count = state.ecoSystemTokensState.topTokens.size, ) { position -> AssetItemEnumerated( modifier = Modifier.padding(vertical = Dimens.x1), - assetState = state.assets.topTokens[position].second, - number = state.assets.topTokens[position].first, + assetState = state.ecoSystemTokensState.topTokens[position].second, + number = state.ecoSystemTokensState.topTokens[position].first, testTag = "AssetFilteredItem", onClick = viewModel::onTokenClicked, ) diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/model/ExploreScreenState.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreScreenState.kt similarity index 97% rename from feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/model/ExploreScreenState.kt rename to feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreScreenState.kt index 0e69c1a53..e9b7a9907 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/model/ExploreScreenState.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreScreenState.kt @@ -30,7 +30,7 @@ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package jp.co.soramitsu.feature_ecosystem_impl.presentation.explore.model +package jp.co.soramitsu.feature_ecosystem_impl.presentation.explore import jp.co.soramitsu.common_wallet.presentation.compose.BasicFarmListItemState import jp.co.soramitsu.common_wallet.presentation.compose.BasicPoolListItemState @@ -38,7 +38,7 @@ import jp.co.soramitsu.feature_ecosystem_impl.presentation.EcoSystemTokensState internal data class ExploreScreenState( val isSearching: Boolean = false, - val assets: EcoSystemTokensState? = null, + val ecoSystemTokensState: EcoSystemTokensState? = null, val pools: List = emptyList(), val farms: List = emptyList(), val isLoading: Boolean = false, diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt index dea113933..439687c1d 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt @@ -57,7 +57,6 @@ import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemMapper import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemTokens import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemTokensInteractor import jp.co.soramitsu.feature_ecosystem_impl.presentation.EcoSystemTokensState -import jp.co.soramitsu.feature_ecosystem_impl.presentation.explore.model.ExploreScreenState import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider @@ -132,7 +131,7 @@ class ExploreViewModel @Inject constructor( _state.value = state.value.copy( isLoading = false, pools = pools, - assets = assets, + ecoSystemTokensState = assets, farms = farms, ) } @@ -152,7 +151,7 @@ class ExploreViewModel @Inject constructor( val mapped = ecoSystemMapper.mapEcoSystemTokens(EcoSystemTokens(tokensFiltered)) val mappedEnumerated = mapped.map { - val indexInAll = positions.get(it.second.tokenId).orEmpty() + val indexInAll = positions[it.second.tokenId].orEmpty() indexInAll to it.second } diff --git a/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt b/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt index 5f03064a9..182e000ab 100644 --- a/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt +++ b/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt @@ -33,22 +33,31 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_ecosystem_impl.explore import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.verify import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.util.NumbersFormatter +import jp.co.soramitsu.demeter.domain.DemeterFarmingBasicPool import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemMapper +import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemToken +import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemTokens import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemTokensInteractor import jp.co.soramitsu.feature_ecosystem_impl.presentation.explore.ExploreViewModel import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter +import jp.co.soramitsu.test_data.PolkaswapTestData.BASIC_POOL_DATA +import jp.co.soramitsu.test_data.TestTokens import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull import org.junit.Before import org.junit.Rule import org.junit.Test @@ -91,18 +100,49 @@ class ExploreViewModelTest { @MockK private lateinit var assetsRouter: AssetsRouter - private lateinit var discoverViewModel: ExploreViewModel + private lateinit var exploreViewModel: ExploreViewModel @Before fun setUp() = runTest { every { assetsRouter.showAssetDetails(any()) } returns Unit every { resourceManager.getString(any()) } returns "" - discoverViewModel = ExploreViewModel( + coEvery { ecoSystemTokensInteractor.getTokensWithTvl() } returns EcoSystemTokens( + tokens = listOf( + EcoSystemToken( + token = TestTokens.xorToken, + liquidityFiat = 12.4, + ), + EcoSystemToken( + token = TestTokens.valToken, + liquidityFiat = 122.4, + ), + EcoSystemToken( + token = TestTokens.kxorToken, + liquidityFiat = 2.4, + ), + EcoSystemToken( + token = TestTokens.pswapToken, + liquidityFiat = 22.3, + ), + ), + ) + coEvery { poolsInteractor.getBasicPools() } returns listOf(BASIC_POOL_DATA) + coEvery { demeterFarmingInteractor.getFarmedBasicPools() } returns listOf( + DemeterFarmingBasicPool( + tokenBase = TestTokens.pswapToken, + tokenTarget = TestTokens.xorToken, + tokenReward = TestTokens.valToken, + apr = 1.2, + tvl = 123445.toBigDecimal(), + fee = 4.5, + ) + ) + exploreViewModel = ExploreViewModel( resourceManager, demeterFarmingInteractor, poolsInteractor, ecoSystemTokensInteractor, - ecoSystemMapper, + EcoSystemMapper(NumbersFormatter()), polkaswapRouter, assetsRouter, numbersFormatter @@ -111,7 +151,17 @@ class ExploreViewModelTest { @Test fun test() = runTest { - discoverViewModel.onTokenClicked("0x00") + exploreViewModel.onTokenClicked("0x00") verify { assetsRouter.showAssetDetails("0x00") } } + + @Test + fun `explore search tokens test 01`() = runTest { + advanceUntilIdle() + exploreViewModel.onToolbarSearch("kxo") + advanceUntilIdle() + val ts = exploreViewModel.state.value.ecoSystemTokensState + assertNotNull(ts) + assertEquals(1, ts!!.topTokens.size) + } } diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt index dd939ca94..439e20f53 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt @@ -85,15 +85,15 @@ internal fun ProfileItems( icon = R.drawable.ic_buy_crypto, onClick = onSoraCardClick, ) -// CategoryItem( -// modifier = Modifier -// .testTagAsId("BuyXor") -// .padding(top = Dimens.x2), -// title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), -// subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), -// icon = R.drawable.ic_settings_buy_crypto, -// onClick = onBuyCrypto, -// ) + CategoryItem( + modifier = Modifier + .testTagAsId("BuyXor") + .padding(top = Dimens.x2), + title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), + subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), + icon = R.drawable.ic_settings_buy_crypto, + onClick = onBuyCrypto, + ) } CategoryItem( modifier = Modifier diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 97f0df3d8..5a491e592 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.4.1" +agp = "8.5.0" kotlin = "1.9.24" appcompat = "1.6.1" coroutines = "1.8.1" @@ -41,6 +41,7 @@ timber = "5.0.1" ktor = "2.3.1" soracard = "1.1.11" xnetworking = "0.2.9" +xnetworkingS = "1.0.1" xsubstrate = "1.2.4" uicore = "0.2.32" xbackup = "1.2.1" @@ -90,6 +91,7 @@ lazySodiumDep = { module = "com.goterl:lazysodium-android", version.ref = "lazyS jnaDep = { module = "net.java.dev.jna:jna", version.ref = "jna" } ktorWebSocketDep = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor" } soraCardDep = { module = "jp.co.soramitsu:android-sora-card", version.ref = "soracard" } +xnetworkingSDep = { module = "jp.co.soramitsu.xnetworking:lib-android", version.ref = "xnetworkingS" } xnetworkingDep = { module = "jp.co.soramitsu.xnetworking:basic-android", version.ref = "xnetworking" } xnetworkingSoraWalletDep = { module = "jp.co.soramitsu.xnetworking:sorawallet-android", version.ref = "xnetworking" } xsubstrateDep = { module = "jp.co.soramitsu:xsubstrate", version.ref = "xsubstrate" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c32cb774b..4b792ab3e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Jan 13 13:13:48 MSK 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/test_data/src/main/java/jp/co/soramitsu/test_data/Tokens.kt b/test_data/src/main/java/jp/co/soramitsu/test_data/Tokens.kt index ad1e6371c..c7780ebea 100644 --- a/test_data/src/main/java/jp/co/soramitsu/test_data/Tokens.kt +++ b/test_data/src/main/java/jp/co/soramitsu/test_data/Tokens.kt @@ -36,6 +36,18 @@ import jp.co.soramitsu.common.domain.Token object TestTokens { + val kxorToken = Token( + "0x02000e0000000000000000000000000000000000000000000000000000000000", + "Kensetsu xor token", + "KXOR", + 18, + true, + null, + null, + null, + null, + ) + val xorToken = Token( "0x0200000000000000000000000000000000000000000000000000000000000000", "Sora token", From a4d92f1576d411339b9b1368c60f497d1afa7ddc Mon Sep 17 00:00:00 2001 From: arvifox Date: Wed, 19 Jun 2024 10:19:57 +0300 Subject: [PATCH 20/43] mwr-824 --- android-foundation | 2 +- .../jp/co/soramitsu/common/domain/Asset.kt | 2 + .../jp/co/soramitsu/core_db/dao/AssetDao.kt | 2 +- .../PolkaswapExtrinsicRepository.kt | 11 ++--- .../PolkaswapSubscriptionRepository.kt | 8 ++-- .../PolkaswapExtrinsicRepositoryImpl.kt | 43 ++++++++++--------- .../PolkaswapSubscriptionRepositoryImpl.kt | 22 +++++----- .../domain/PoolsInteractorImpl.kt | 35 +++++++++------ .../liquidityadd/LiquidityAddViewModel.kt | 14 +++++- .../runtime/SubstrateOptionsProvider.kt | 1 + 10 files changed, 84 insertions(+), 56 deletions(-) diff --git a/android-foundation b/android-foundation index a75a6d67f..a5be15486 160000 --- a/android-foundation +++ b/android-foundation @@ -1 +1 @@ -Subproject commit a75a6d67fb65c608af232cfebcc66ad11dcd2bba +Subproject commit a5be154865d8cb01051f6fc827126487210de7c9 diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/Asset.kt b/common/src/main/java/jp/co/soramitsu/common/domain/Asset.kt index 3e8f7a474..9b88c775c 100644 --- a/common/src/main/java/jp/co/soramitsu/common/domain/Asset.kt +++ b/common/src/main/java/jp/co/soramitsu/common/domain/Asset.kt @@ -79,6 +79,8 @@ data class AssetBalance( fun createAssetBalance(b: BigDecimal = BigDecimal.ZERO) = AssetBalance(b, b, b, b, b, b, b, b) +typealias TokenPrecision = Pair + @Parcelize data class Token( val id: String, diff --git a/core_db/src/main/java/jp/co/soramitsu/core_db/dao/AssetDao.kt b/core_db/src/main/java/jp/co/soramitsu/core_db/dao/AssetDao.kt index c35ec02c2..292594a3c 100644 --- a/core_db/src/main/java/jp/co/soramitsu/core_db/dao/AssetDao.kt +++ b/core_db/src/main/java/jp/co/soramitsu/core_db/dao/AssetDao.kt @@ -73,7 +73,7 @@ interface AssetDao { private const val QUERY_ASSET_TOKEN_ACTIVE = """ select * from assets inner join ($joinFiatToken) tokensfiats on assets.tokenId=tokensfiats.id where assets.accountAddress=:address and tokensfiats.whitelistName=:whitelist - and ((assets.visibility=1 or assets.displayAsset=1 or tokensfiats.isHidable = 0) or (tokensfiats.id in (select tokenIdTarget from allpools)) or (tokensfiats.id in (select tokenId from poolBaseTokens))) order by assets.position + and ((assets.visibility=1 or assets.displayAsset=1 or tokensfiats.isHidable = 0) or (tokensfiats.id = "0x02000e0000000000000000000000000000000000000000000000000000000000") or (tokensfiats.id in (select tokenIdTarget from allpools)) or (tokensfiats.id in (select tokenId from poolBaseTokens))) order by assets.position """ } diff --git a/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/PolkaswapExtrinsicRepository.kt b/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/PolkaswapExtrinsicRepository.kt index 704b67dd4..c3fb09500 100644 --- a/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/PolkaswapExtrinsicRepository.kt +++ b/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/PolkaswapExtrinsicRepository.kt @@ -35,6 +35,7 @@ package jp.co.soramitsu.feature_polkaswap_api.domain.interfaces import java.math.BigDecimal import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.Token +import jp.co.soramitsu.common.domain.TokenPrecision import jp.co.soramitsu.common_wallet.domain.model.WithDesired import jp.co.soramitsu.sora.substrate.models.ExtrinsicSubmitStatus import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair @@ -82,8 +83,8 @@ interface PolkaswapExtrinsicRepository { suspend fun calcAddLiquidityNetworkFee( address: String, - tokenFrom: Token, - tokenTo: Token, + tokenFrom: TokenPrecision, + tokenTo: TokenPrecision, tokenFromAmount: BigDecimal, tokenToAmount: BigDecimal, pairEnabled: Boolean, @@ -92,8 +93,8 @@ interface PolkaswapExtrinsicRepository { ): BigDecimal? suspend fun calcRemoveLiquidityNetworkFee( - tokenId1: Token, - tokenId2: Token, - address: String + tokenId1: TokenPrecision, + tokenId2: TokenPrecision, + address: String, ): BigDecimal? } diff --git a/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/PolkaswapSubscriptionRepository.kt b/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/PolkaswapSubscriptionRepository.kt index ee50a6c1e..92b7dab43 100644 --- a/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/PolkaswapSubscriptionRepository.kt +++ b/feature_polkaswap_api/src/main/java/jp/co/soramitsu/feature_polkaswap_api/domain/interfaces/PolkaswapSubscriptionRepository.kt @@ -45,10 +45,12 @@ interface PolkaswapSubscriptionRepository { fun subscribeEachBlock(): Flow suspend fun getRemotePoolReserves( - tokenFrom: Token, - tokenTo: Token, + tokenFromId: String, + tokenFromPrecision: Int, + tokenToId: String, + tokenToPrecision: Int, enabled: Boolean, - presented: Boolean + presented: Boolean, ): LiquidityData suspend fun updateAccountPools(address: String) diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapExtrinsicRepositoryImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapExtrinsicRepositoryImpl.kt index cad59b446..c6b539300 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapExtrinsicRepositoryImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapExtrinsicRepositoryImpl.kt @@ -36,6 +36,7 @@ import java.math.BigDecimal import javax.inject.Inject import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.Token +import jp.co.soramitsu.common.domain.TokenPrecision import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.common_wallet.domain.model.WithDesired import jp.co.soramitsu.common_wallet.presentation.compose.util.PolkaswapFormulas @@ -191,8 +192,8 @@ class PolkaswapExtrinsicRepositoryImpl @Inject constructor( override suspend fun calcAddLiquidityNetworkFee( address: String, - tokenFrom: Token, - tokenTo: Token, + tokenFrom: TokenPrecision, + tokenTo: TokenPrecision, tokenFromAmount: BigDecimal, tokenToAmount: BigDecimal, pairEnabled: Boolean, @@ -201,7 +202,7 @@ class PolkaswapExtrinsicRepositoryImpl @Inject constructor( ): BigDecimal? { val amountFromMin = PolkaswapFormulas.calculateMinAmount(tokenFromAmount, slippageTolerance) val amountToMin = PolkaswapFormulas.calculateMinAmount(tokenToAmount, slippageTolerance) - val dexId = getPoolBaseTokenDexId(tokenFrom.id) + val dexId = getPoolBaseTokenDexId(tokenFrom.first) val fee = extrinsicManager.calcFee( from = address, ) { @@ -209,49 +210,49 @@ class PolkaswapExtrinsicRepositoryImpl @Inject constructor( if (!pairEnabled) { register( dexId = dexId, - tokenFrom.id, tokenTo.id + tokenFrom.first, tokenTo.first ) } initializePool( dexId = dexId, - tokenFrom.id, tokenTo.id + tokenFrom.first, tokenTo.first ) } depositLiquidity( dexId = dexId, - tokenFrom.id, - tokenTo.id, - mapBalance(tokenFromAmount, tokenFrom.precision), - mapBalance(tokenToAmount, tokenTo.precision), - mapBalance(amountFromMin, tokenFrom.precision), - mapBalance(amountToMin, tokenTo.precision) + tokenFrom.first, + tokenTo.first, + mapBalance(tokenFromAmount, tokenFrom.second), + mapBalance(tokenToAmount, tokenTo.second), + mapBalance(amountFromMin, tokenFrom.second), + mapBalance(amountToMin, tokenTo.second) ) } return fee?.let { - mapBalance(it, tokenFrom.precision) + mapBalance(it, tokenFrom.second) } } override suspend fun calcRemoveLiquidityNetworkFee( - tokenId1: Token, - tokenId2: Token, + tokenId1: TokenPrecision, + tokenId2: TokenPrecision, address: String, ): BigDecimal? { val fee = extrinsicManager.calcFee( from = address ) { removeLiquidity( - dexId = getPoolBaseTokenDexId(tokenId1.id), - outputAssetIdA = tokenId1.id, - outputAssetIdB = tokenId2.id, - markerAssetDesired = mapBalance(BigDecimal.ONE, tokenId1.precision), - outputAMin = mapBalance(BigDecimal.ONE, tokenId1.precision), - outputBMin = mapBalance(BigDecimal.ONE, tokenId1.precision) + dexId = getPoolBaseTokenDexId(tokenId1.first), + outputAssetIdA = tokenId1.first, + outputAssetIdB = tokenId2.first, + markerAssetDesired = mapBalance(BigDecimal.ONE, tokenId1.second), + outputAMin = mapBalance(BigDecimal.ONE, tokenId1.second), + outputBMin = mapBalance(BigDecimal.ONE, tokenId1.second) ) } return fee?.let { - mapBalance(it, tokenId1.precision) + mapBalance(it, tokenId1.second) } } } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt index 9fe0f1064..5b41f8112 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapSubscriptionRepositoryImpl.kt @@ -226,24 +226,26 @@ class PolkaswapSubscriptionRepositoryImpl @Inject constructor( } override suspend fun getRemotePoolReserves( - tokenFrom: Token, - tokenTo: Token, + tokenFromId: String, + tokenFromPrecision: Int, + tokenToId: String, + tokenToPrecision: Int, enabled: Boolean, - presented: Boolean + presented: Boolean, ): LiquidityData { return if (presented || enabled) { val (reservesFirst, reservesSecond) = wsConnection.getPoolReserves( - tokenFrom.id, - tokenTo.id + tokenFromId, + tokenToId, ) ?: (BigInteger.ZERO to BigInteger.ZERO) - val poolLocal = db.poolDao().getBasicPool(tokenFrom.id, tokenTo.id) + val poolLocal = db.poolDao().getBasicPool(tokenFromId, tokenToId) LiquidityData( - firstReserves = mapBalance(reservesFirst, tokenFrom.precision), - secondReserves = mapBalance(reservesSecond, tokenTo.precision), - firstPooled = mapBalance(BigInteger.ZERO, tokenFrom.precision), - secondPooled = mapBalance(BigInteger.ZERO, tokenTo.precision), + firstReserves = mapBalance(reservesFirst, tokenFromPrecision), + secondReserves = mapBalance(reservesSecond, tokenToPrecision), + firstPooled = mapBalance(BigInteger.ZERO, tokenFromPrecision), + secondPooled = mapBalance(BigInteger.ZERO, tokenToPrecision), sbApy = poolLocal?.reservesAccount?.let { getPoolStrategicBonusAPY(it)?.times(100) }, diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt index d5ed21453..bef8fd03e 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt @@ -60,6 +60,7 @@ import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapSubscrip import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.emitAll @@ -106,8 +107,8 @@ class PoolsInteractorImpl( return removeLiquidityNetworkFee ?: ( ( polkaswapExtrinsicRepository.calcRemoveLiquidityNetworkFee( - tokenId1, - tokenId2, + tokenId1.id.kensetsu() to tokenId1.precision, + tokenId2.id to tokenId2.precision, userRepository.getCurSoraAccount().substrateAddress, ) ?: BigDecimal.ZERO ).also { @@ -128,8 +129,8 @@ class PoolsInteractorImpl( val user = userRepository.getCurSoraAccount().substrateAddress val result = polkaswapExtrinsicRepository.calcAddLiquidityNetworkFee( user, - tokenFrom, - tokenTo, + tokenFrom.id.kensetsu() to tokenFrom.precision, + tokenTo.id to tokenTo.precision, tokenFromAmount, tokenToAmount, pairEnabled, @@ -185,6 +186,7 @@ class PoolsInteractorImpl( return result } + @OptIn(FlowPreview::class) override fun subscribePoolsChangesOfAccount(address: String): Flow { return polkaswapSubscriptionRepository.subscribeToPoolsAssets(address) .debounce(300) @@ -355,8 +357,8 @@ class PoolsInteractorImpl( userRepository.flowCurSoraAccount().flatMapLatest { polkaswapRepository.subscribeLocalPoolReserves( it.substrateAddress, - baseTokenId, - assetId + baseTokenId.kensetsu(), + assetId, ) } @@ -364,23 +366,23 @@ class PoolsInteractorImpl( val address = userRepository.getCurSoraAccount().substrateAddress emitAll( polkaswapSubscriptionRepository.isPairEnabled( - inputAssetId, + inputAssetId.kensetsu(), outputAssetId, - address + address, ) ) } override fun isPairPresentedInNetwork( baseTokenId: String, - tokenId: String + tokenId: String, ): Flow = flow { val address = userRepository.getCurSoraAccount().substrateAddress emitAll( polkaswapSubscriptionRepository.isPairPresentedInNetwork( - baseTokenId, + baseTokenId.kensetsu(), tokenId, - address + address, ) ) } @@ -389,11 +391,13 @@ class PoolsInteractorImpl( tokenFrom: Token, tokenTo: Token, enabled: Boolean, - presented: Boolean + presented: Boolean, ): LiquidityData { return polkaswapSubscriptionRepository.getRemotePoolReserves( - tokenFrom, - tokenTo, + tokenFrom.id.kensetsu(), + tokenFrom.precision, + tokenTo.id.kensetsu(), + tokenTo.precision, enabled, presented ) @@ -440,4 +444,7 @@ class PoolsInteractorImpl( override suspend fun getRewardToken(): Token { return requireNotNull(assetsRepository.getToken(SubstrateOptionsProvider.pswapAssetId)) } + + private fun String.kensetsu() = + if (this == SubstrateOptionsProvider.kxorTokenId) SubstrateOptionsProvider.feeAssetId else this } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt index f4dfdc085..e2aa92da1 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt @@ -509,7 +509,12 @@ class LiquidityAddViewModel @AssistedInject constructor( fun onToken1Click() { if (assets.isNotEmpty()) { viewModelScope.launch { - val bases = poolsInteractor.getPoolDexList().map { it.tokenId } + val bases = buildList { + if (addToken2 == null || addToken2 == SubstrateOptionsProvider.ethTokenId) { + add(SubstrateOptionsProvider.kxorTokenId) + } + addAll(poolsInteractor.getPoolDexList().map { it.tokenId }) + } val list = assets.filter { it.token.id in bases && it.token.id != addToken2 } _addState.value = _addState.value.copy( assetState1 = _addState.value.assetState1?.copy( @@ -532,6 +537,13 @@ class LiquidityAddViewModel @AssistedInject constructor( val bases = poolsInteractor.getPoolDexList() val curBase = bases.find { it.tokenId == addToken1 } val list = assets + .filter { asset -> + if (addToken1 != null && addToken1 == SubstrateOptionsProvider.kxorTokenId) { + asset.token.id == SubstrateOptionsProvider.ethTokenId + } else { + true + } + } .filter { asset -> val inBases = bases.find { it.tokenId == asset.token.id } if (inBases != null && curBase != null) { diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/SubstrateOptionsProvider.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/SubstrateOptionsProvider.kt index cf63607f9..2d9aacca3 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/SubstrateOptionsProvider.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/SubstrateOptionsProvider.kt @@ -58,6 +58,7 @@ object SubstrateOptionsProvider { const val xstTokenId = "0x0200090000000000000000000000000000000000000000000000000000000000" const val xstusdTokenId = "0x0200080000000000000000000000000000000000000000000000000000000000" const val ethTokenId = "0x0200070000000000000000000000000000000000000000000000000000000000" + const val kxorTokenId = "0x02000e0000000000000000000000000000000000000000000000000000000000" } fun String.isSynthetic(): Boolean = this.matches(syntheticTokenRegex) From 367639a66359ea875a503225235ad084cb62d6d9 Mon Sep 17 00:00:00 2001 From: arvifox Date: Fri, 21 Jun 2024 14:18:06 +0300 Subject: [PATCH 21/43] mwr-824 --- .../domain/model/UserPoolData.kt | 1 + .../data/mappers/PoolLocalMapper.kt | 11 ++++--- .../repository/PolkaswapRepositoryImpl.kt | 32 ++++++++++++++----- .../components/compose/PoolDetailsScreen.kt | 8 +++++ .../pooldetails/PoolDetailsViewModel.kt | 5 ++- .../presentation/states/PoolDetailsState.kt | 1 + .../soramitsu/test_data/PolkaswapTestData.kt | 1 + 7 files changed, 46 insertions(+), 13 deletions(-) diff --git a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/domain/model/UserPoolData.kt b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/domain/model/UserPoolData.kt index a839eedb5..f55ef83cc 100644 --- a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/domain/model/UserPoolData.kt +++ b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/domain/model/UserPoolData.kt @@ -59,6 +59,7 @@ data class UserPoolData( val poolProvidersBalance: BigDecimal, val favorite: Boolean, val sort: Int, + val kensetsuIncluded: BigDecimal?, ) val List.fiatSymbol: String diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/mappers/PoolLocalMapper.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/mappers/PoolLocalMapper.kt index 3be2a9578..e85377d2e 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/mappers/PoolLocalMapper.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/mappers/PoolLocalMapper.kt @@ -32,6 +32,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_polkaswap_impl.data.mappers +import java.math.BigDecimal import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common_wallet.data.AssetLocalToAssetMapper import jp.co.soramitsu.common_wallet.domain.model.BasicPoolData @@ -82,6 +83,7 @@ object PoolLocalMapper { baseToken: Token, token: Token, apy: Double?, + kensetsuIncluded: BigDecimal? = null, ): CommonUserPoolData { val basePooled = PolkaswapFormulas.calculatePooledValue( poolLocal.basicPoolLocal.reserveBase, @@ -112,10 +114,11 @@ object PoolLocalMapper { user = UserPoolData( basePooled = basePooled, targetPooled = secondPooled, - share, - poolLocal.userPoolLocal.poolProvidersBalance, - poolLocal.userPoolLocal.favorite, - poolLocal.userPoolLocal.sortOrder, + poolShare = share, + poolProvidersBalance = poolLocal.userPoolLocal.poolProvidersBalance, + favorite = poolLocal.userPoolLocal.favorite, + sort = poolLocal.userPoolLocal.sortOrder, + kensetsuIncluded = kensetsuIncluded, ), ) } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapRepositoryImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapRepositoryImpl.kt index dbbae5f8d..6f2502319 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapRepositoryImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapRepositoryImpl.kt @@ -33,11 +33,13 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_polkaswap_impl.data.repository import androidx.room.withTransaction +import java.math.BigInteger import javax.inject.Inject import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.PoolDex import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.util.StringPair +import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.common_wallet.data.AssetLocalToAssetMapper import jp.co.soramitsu.common_wallet.domain.model.BasicPoolData import jp.co.soramitsu.common_wallet.domain.model.CommonPoolData @@ -51,9 +53,11 @@ import jp.co.soramitsu.feature_blockexplorer_api.data.BlockExplorerManager import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapRepository import jp.co.soramitsu.feature_polkaswap_impl.data.mappers.PoolLocalMapper -import jp.co.soramitsu.feature_polkaswap_impl.data.mappers.PoolLocalMapper.mapBasicToPoolData import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletDatasource +import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider +import jp.co.soramitsu.sora.substrate.substrate.SubstrateCalls import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged @@ -66,6 +70,7 @@ class PolkaswapRepositoryImpl @Inject constructor( private val assetLocalToAssetMapper: AssetLocalToAssetMapper, blockExplorerManager: BlockExplorerManager, private val soraConfigManager: SoraConfigManager, + private val substrateCalls: SubstrateCalls, ) : PolkaswapRepository, PolkaswapBasicRepositoryImpl(db, blockExplorerManager) { override fun subscribeBasicPools(): Flow> { @@ -108,7 +113,7 @@ class PolkaswapRepositoryImpl @Inject constructor( override suspend fun getBasicPools(): List { return db.poolDao().getBasicPools().map { - mapBasicToPoolData( + PoolLocalMapper.mapBasicToPoolData( basicPoolLocal = it, baseToken = getToken(it.tokenIdBase), token = getToken(it.tokenIdTarget), @@ -146,6 +151,7 @@ class PolkaswapRepositoryImpl @Inject constructor( } } + @OptIn(FlowPreview::class) override fun subscribePools(address: String): Flow> { return db.poolDao().subscribePoolsList(address).map { pools -> pools.map { poolLocal -> @@ -170,8 +176,9 @@ class PolkaswapRepositoryImpl @Inject constructor( basic, null, ) } else { - val userPoolData = - mapPoolLocalToUserData(UserPoolJoinedLocal(userLocal, poolLocal.basicPoolLocal)) + val userPoolData = mapPoolLocalToUserData( + UserPoolJoinedLocal(userLocal, poolLocal.basicPoolLocal), + ) CommonPoolData( basic, userPoolData.user, @@ -185,10 +192,19 @@ class PolkaswapRepositoryImpl @Inject constructor( val token = getToken(poolLocal.userPoolLocal.userTokenIdTarget) val baseToken = getToken(poolLocal.userPoolLocal.userTokenIdBase) return PoolLocalMapper.mapLocal( - poolLocal, - baseToken, - token, - getPoolStrategicBonusAPY(poolLocal.basicPoolLocal.reservesAccount), + poolLocal = poolLocal, + baseToken = baseToken, + token = token, + apy = getPoolStrategicBonusAPY(poolLocal.basicPoolLocal.reservesAccount), + kensetsuIncluded = if (baseToken.id == SubstrateOptionsProvider.feeAssetId && token.id == SubstrateOptionsProvider.ethTokenId) { + substrateCalls.fetchBalances(poolLocal.basicPoolLocal.reservesAccount, listOf(SubstrateOptionsProvider.kxorTokenId)) + .getOrElse(0) { BigInteger.ZERO } + .let { + mapBalance(it, baseToken.precision) + } + } else { + null + }, ) } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt index d9da7055b..f0a00031f 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt @@ -198,6 +198,13 @@ internal fun PoolDetailsScreen( text = stringResource(id = R.string.your_pooled).format(state.symbol1), value1 = state.pooled1, ) + if (state.kensetsu != null) { + Text( + text = "KXOR pooled ${state.kensetsu}", + style = MaterialTheme.customTypography.textXSBold, + color = MaterialTheme.customColors.fgSecondary, + ) + } Divider( modifier = Modifier .fillMaxWidth() @@ -371,6 +378,7 @@ private fun PreviewPoolDetailsScreen() { symbol2 = "VAL", pooled1 = "123 VAL", pooled2 = "2424.2 XOR", + kensetsu = "", tvl = "$34.999 TVL", addEnabled = true, removeEnabled = true, diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt index 39e2ed3c2..09fa6134e 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt @@ -83,7 +83,7 @@ class PoolDetailsViewModel @AssistedInject constructor( internal var detailsState by mutableStateOf( PoolDetailsState( DEFAULT_ICON_URI, DEFAULT_ICON_URI, DEFAULT_ICON_URI, - "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", true, true, "", emptyList(), emptyList(), false, ) ) @@ -189,6 +189,9 @@ class PoolDetailsViewModel @AssistedInject constructor( AssetHolder.ROUNDING, ) }, + kensetsu = userData?.kensetsuIncluded?.let { kxor -> + numbersFormatter.formatBigDecimal(kxor, AssetHolder.ROUNDING) + }, pooled2 = userData?.targetPooled?.let { data.basic.targetToken.printBalance( it, diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/PoolDetailsState.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/PoolDetailsState.kt index a7402de71..2e4c99ece 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/PoolDetailsState.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/PoolDetailsState.kt @@ -45,6 +45,7 @@ internal data class PoolDetailsState( val apy: String, val pooled1: String?, val pooled2: String?, + val kensetsu: String? = null, val tvl: String, val addEnabled: Boolean, val removeEnabled: Boolean, diff --git a/test_data/src/main/java/jp/co/soramitsu/test_data/PolkaswapTestData.kt b/test_data/src/main/java/jp/co/soramitsu/test_data/PolkaswapTestData.kt index 9e8e4669b..86f8532d8 100644 --- a/test_data/src/main/java/jp/co/soramitsu/test_data/PolkaswapTestData.kt +++ b/test_data/src/main/java/jp/co/soramitsu/test_data/PolkaswapTestData.kt @@ -73,6 +73,7 @@ object PolkaswapTestData { BigDecimal.TEN, true, 2, + null, ) val COMMON_POOL_DATA = CommonPoolData( From 8d1003e567a4845d64a93aa01e05ff0a35d5b234 Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 25 Jun 2024 17:43:04 +0300 Subject: [PATCH 22/43] mwr-824 --- .../jp/co/soramitsu/common/domain/Asset.kt | 2 +- .../compose/components/AssetAmount.kt | 2 +- .../common/util/ext/BigDecimalExt.kt | 103 ------------------ .../compose/util/PolkaswapFormulas.kt | 8 +- .../presentation/PolkaswapFormulasTest.kt | 8 +- .../demeter/data/DemeterFarmingRepository.kt | 2 +- .../data/AssetsRepository.kt | 3 + .../domain/AssetsInteractor.kt | 7 ++ .../data/AssetsRepositoryImpl.kt | 7 ++ .../domain/AssetsInteractorImpl.kt | 15 ++- .../assetdetails/AssetDetailsViewModel.kt | 2 +- .../screens/send/TransferAmountViewModel.kt | 6 +- .../qr/QrCodeFlowViewModelTest.kt | 2 +- .../send/TransferAmountViewModelTest.kt | 2 +- .../data/BlockExplorerManager.kt | 3 +- .../domain/EcoSystemPoolsInteractor.kt | 2 +- .../domain/EcoSystemTokensInteractor.kt | 2 +- .../editfarm/EditFarmViewModel.kt | 4 +- .../presentation/explore/ExploreViewModel.kt | 2 +- .../domain/PoolsInteractorImpl.kt | 4 +- .../domain/SwapInteractorImpl.kt | 2 +- .../liquidityadd/LiquidityAddViewModel.kt | 6 +- .../LiquidityRemoveViewModel.kt | 36 +++++- .../screens/swap/SwapViewModel.kt | 6 +- .../add/AddLiquidityViewModelTest.kt | 2 +- .../remove/RemoveLiquidityViewModelTest.kt | 2 +- .../presentation/ReferralViewModel.kt | 2 +- 27 files changed, 98 insertions(+), 144 deletions(-) delete mode 100644 common/src/main/java/jp/co/soramitsu/common/util/ext/BigDecimalExt.kt diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/Asset.kt b/common/src/main/java/jp/co/soramitsu/common/domain/Asset.kt index 9b88c775c..6230995b9 100644 --- a/common/src/main/java/jp/co/soramitsu/common/domain/Asset.kt +++ b/common/src/main/java/jp/co/soramitsu/common/domain/Asset.kt @@ -34,9 +34,9 @@ package jp.co.soramitsu.common.domain import android.os.Parcelable import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.equalTo import jp.co.soramitsu.common.R import jp.co.soramitsu.common.util.NumbersFormatter -import jp.co.soramitsu.common.util.ext.equalTo import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AssetAmount.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AssetAmount.kt index a17c14621..ba3b6404e 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AssetAmount.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/AssetAmount.kt @@ -65,12 +65,12 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.orZero import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.AssetAmountInputState import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.presentation.compose.TokenIcon import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme -import jp.co.soramitsu.common.util.ext.orZero import jp.co.soramitsu.common.util.testTagAsId import jp.co.soramitsu.ui_core.component.button.properties.Size import jp.co.soramitsu.ui_core.component.input.number.BasicNumberInput diff --git a/common/src/main/java/jp/co/soramitsu/common/util/ext/BigDecimalExt.kt b/common/src/main/java/jp/co/soramitsu/common/util/ext/BigDecimalExt.kt deleted file mode 100644 index 14533194a..000000000 --- a/common/src/main/java/jp/co/soramitsu/common/util/ext/BigDecimalExt.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.common.util.ext - -import java.math.BigDecimal -import java.math.BigInteger -import java.math.RoundingMode -import jp.co.soramitsu.common.domain.OptionsProvider -import kotlin.math.max - -val Big100 = BigDecimal.valueOf(100) - -fun compareNullDesc(o1: BigDecimal?, o2: BigDecimal?): Int = - when { - o1 == null && o2 == null -> 0 - o1 != null && o2 != null -> o2.compareTo(o1) - o1 == null -> 1 - else -> -1 - } - -fun compareNullDesc(o1: Double?, o2: Double?): Int = - when { - o1 == null && o2 == null -> 0 - o1 != null && o2 != null -> o2.compareTo(o1) - o1 == null -> 1 - else -> -1 - } - -fun BigInteger.isZero(): Boolean = this.compareTo(BigInteger.ZERO) == 0 -fun BigDecimal.isZero(): Boolean = this.compareTo(BigDecimal.ZERO) == 0 - -fun BigDecimal?.multiplyNullable(decimal: BigDecimal?): BigDecimal? = - if (this != null && decimal != null) this.multiply(decimal) else null - -fun BigDecimal.toDoubleInfinite() = this.toDouble().takeIf { converted -> - converted != Double.NEGATIVE_INFINITY && converted != Double.POSITIVE_INFINITY -} ?: 0.0 - -fun BigDecimal.equalTo(a: BigDecimal) = this.compareTo(a) == 0 - -fun BigDecimal.greaterThan(a: BigDecimal) = this.compareTo(a) == 1 - -fun BigDecimal?.orZero(): BigDecimal = this ?: BigDecimal.ZERO - -fun BigDecimal.nullZero(): BigDecimal? = if (this.isZero()) null else this - -fun BigDecimal.divideBy( - divisor: BigDecimal, - scale: Int? = null, -): BigDecimal { - return if (scale == null) { - val maxScale = max(this.scale(), divisor.scale()).coerceAtMost(OptionsProvider.defaultScale) - - if (maxScale != 0) { - this.divide(divisor, maxScale, RoundingMode.HALF_EVEN) - } else { - this.divide(divisor, OptionsProvider.defaultScale, RoundingMode.HALF_EVEN) - } - } else { - this.divide(divisor, scale, RoundingMode.HALF_EVEN) - } -} - -fun BigDecimal.safeDivide( - divisor: BigDecimal, - scale: Int? = null, -): BigDecimal { - return if (divisor.isZero()) { - BigDecimal.ZERO - } else { - divideBy(divisor, scale) - } -} diff --git a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/util/PolkaswapFormulas.kt b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/util/PolkaswapFormulas.kt index af38a1233..59e2f353c 100644 --- a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/util/PolkaswapFormulas.kt +++ b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/util/PolkaswapFormulas.kt @@ -33,11 +33,11 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common_wallet.presentation.compose.util import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.Big100 +import jp.co.soramitsu.androidfoundation.format.divideBy +import jp.co.soramitsu.androidfoundation.format.equalTo +import jp.co.soramitsu.androidfoundation.format.safeDivide import jp.co.soramitsu.common.domain.OptionsProvider -import jp.co.soramitsu.common.util.ext.Big100 -import jp.co.soramitsu.common.util.ext.divideBy -import jp.co.soramitsu.common.util.ext.equalTo -import jp.co.soramitsu.common.util.ext.safeDivide import jp.co.soramitsu.common_wallet.domain.model.WithDesired object PolkaswapFormulas { diff --git a/common_wallet/src/test/java/jp/co/soramitsu/common_wallet/presentation/PolkaswapFormulasTest.kt b/common_wallet/src/test/java/jp/co/soramitsu/common_wallet/presentation/PolkaswapFormulasTest.kt index 41753c97e..2e49dd35b 100644 --- a/common_wallet/src/test/java/jp/co/soramitsu/common_wallet/presentation/PolkaswapFormulasTest.kt +++ b/common_wallet/src/test/java/jp/co/soramitsu/common_wallet/presentation/PolkaswapFormulasTest.kt @@ -33,10 +33,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common_wallet.presentation import java.math.BigDecimal -import jp.co.soramitsu.common.util.ext.Big100 -import jp.co.soramitsu.common.util.ext.divideBy -import jp.co.soramitsu.common.util.ext.equalTo -import jp.co.soramitsu.common.util.ext.safeDivide +import jp.co.soramitsu.androidfoundation.format.Big100 +import jp.co.soramitsu.androidfoundation.format.divideBy +import jp.co.soramitsu.androidfoundation.format.equalTo +import jp.co.soramitsu.androidfoundation.format.safeDivide import jp.co.soramitsu.common_wallet.domain.model.WithDesired import jp.co.soramitsu.common_wallet.presentation.compose.util.PolkaswapFormulas import org.junit.Assert.assertEquals diff --git a/demeter/src/main/java/jp/co/soramitsu/demeter/data/DemeterFarmingRepository.kt b/demeter/src/main/java/jp/co/soramitsu/demeter/data/DemeterFarmingRepository.kt index 5b7afd8b0..d51a04b83 100644 --- a/demeter/src/main/java/jp/co/soramitsu/demeter/data/DemeterFarmingRepository.kt +++ b/demeter/src/main/java/jp/co/soramitsu/demeter/data/DemeterFarmingRepository.kt @@ -35,9 +35,9 @@ package jp.co.soramitsu.demeter.data import java.math.BigDecimal import java.math.BigInteger import java.util.concurrent.ConcurrentHashMap +import jp.co.soramitsu.androidfoundation.format.isZero import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.common.domain.OptionsProvider -import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.common_wallet.data.AssetLocalToAssetMapper import jp.co.soramitsu.core_db.AppDatabase diff --git a/feature_assets_api/src/main/java/jp/co/soramitsu/feature_assets_api/data/AssetsRepository.kt b/feature_assets_api/src/main/java/jp/co/soramitsu/feature_assets_api/data/AssetsRepository.kt index 97750d5a8..27bdc0a67 100644 --- a/feature_assets_api/src/main/java/jp/co/soramitsu/feature_assets_api/data/AssetsRepository.kt +++ b/feature_assets_api/src/main/java/jp/co/soramitsu/feature_assets_api/data/AssetsRepository.kt @@ -33,6 +33,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_assets_api.data import java.math.BigDecimal +import java.math.BigInteger import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.Token @@ -121,4 +122,6 @@ interface AssetsRepository { suspend fun updateBalancesVisibleAssets(address: String) suspend fun updateWhitelistBalances(address: String) + + suspend fun fetchBalance(address: String, ids: List): List } diff --git a/feature_assets_api/src/main/java/jp/co/soramitsu/feature_assets_api/domain/AssetsInteractor.kt b/feature_assets_api/src/main/java/jp/co/soramitsu/feature_assets_api/domain/AssetsInteractor.kt index 79f98c78c..59c5c501f 100644 --- a/feature_assets_api/src/main/java/jp/co/soramitsu/feature_assets_api/domain/AssetsInteractor.kt +++ b/feature_assets_api/src/main/java/jp/co/soramitsu/feature_assets_api/domain/AssetsInteractor.kt @@ -35,6 +35,7 @@ package jp.co.soramitsu.feature_assets_api.domain import java.math.BigDecimal import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset +import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common_wallet.data.XorAssetBalance import kotlinx.coroutines.flow.Flow @@ -94,4 +95,10 @@ interface AssetsInteractor { suspend fun updateWhitelistBalances() suspend fun updateBalanceVisibleAssets() + + suspend fun fetchBalance( + address: String, + ids: List, + precision: Int = OptionsProvider.defaultScale, + ): List } diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryImpl.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryImpl.kt index b6a8a8606..128de4f89 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryImpl.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryImpl.kt @@ -432,6 +432,13 @@ class AssetsRepositoryImpl @Inject constructor( return balances to xorBalance } + override suspend fun fetchBalance( + address: String, + ids: List, + ): List { + return substrateCalls.fetchBalances(address, ids) + } + private suspend fun checkDefaultNeed(address: String, code: String) { if (db.assetDao().getAssetsWhitelist(address, code) .all { it.assetLocal == null } diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorImpl.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorImpl.kt index ea4aaa1d2..2447227b5 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorImpl.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorImpl.kt @@ -34,6 +34,8 @@ package jp.co.soramitsu.feature_assets_impl.domain import java.math.BigDecimal import java.util.Date +import jp.co.soramitsu.androidfoundation.format.isZero +import jp.co.soramitsu.androidfoundation.format.orZero import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetHolder @@ -41,8 +43,7 @@ import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.common.util.Flavor -import jp.co.soramitsu.common.util.ext.isZero -import jp.co.soramitsu.common.util.ext.orZero +import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.common_wallet.data.XorAssetBalance import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository @@ -211,6 +212,16 @@ class AssetsInteractorImpl constructor( assetsRepository.updateBalancesVisibleAssets(soraAccount.substrateAddress) } + override suspend fun fetchBalance( + address: String, + ids: List, + precision: Int, + ): List { + return assetsRepository.fetchBalance(address, ids).map { + mapBalance(it, precision) + } + } + override suspend fun updateWhitelistBalances() { val soraAccount = userRepository.getCurSoraAccount() assetsRepository.updateWhitelistBalances(soraAccount.substrateAddress) diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt index ded9587a9..97175dbb0 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt @@ -41,6 +41,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.isZero import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager @@ -57,7 +58,6 @@ import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair -import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common_wallet.data.XorAssetBalance import jp.co.soramitsu.common_wallet.domain.model.fiatSymbol import jp.co.soramitsu.common_wallet.presentation.compose.states.mapPoolsData diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt index 0ace82019..5c8e7fb74 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/send/TransferAmountViewModel.kt @@ -38,6 +38,9 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.isZero +import jp.co.soramitsu.androidfoundation.format.nullZero +import jp.co.soramitsu.androidfoundation.format.orZero import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager @@ -52,9 +55,6 @@ import jp.co.soramitsu.common.domain.subtractFee import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter -import jp.co.soramitsu.common.util.ext.isZero -import jp.co.soramitsu.common.util.ext.nullZero -import jp.co.soramitsu.common.util.ext.orZero import jp.co.soramitsu.common.view.ViewHelper import jp.co.soramitsu.common_wallet.presentation.compose.util.PolkaswapFormulas import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt index f856035b4..631f959cd 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt @@ -44,6 +44,7 @@ import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.verify import java.util.StringJoiner +import jp.co.soramitsu.androidfoundation.format.Big100 import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.account.AccountAvatarGenerator @@ -53,7 +54,6 @@ import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.io.FileManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.QrCodeGenerator -import jp.co.soramitsu.common.util.ext.Big100 import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.domain.QrCodeInteractor import jp.co.soramitsu.feature_assets_impl.presentation.screens.receiverequest.QRCodeFlowViewModel diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt index 4c3b2e9e4..2fa37351e 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt @@ -40,12 +40,12 @@ import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.equalTo import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.util.NumbersFormatter -import jp.co.soramitsu.common.util.ext.equalTo import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_assets_impl.presentation.screens.send.TransferAmountViewModel diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt index 65c477826..82ccc68cd 100644 --- a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt @@ -37,12 +37,11 @@ import java.math.BigDecimal import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Singleton +import jp.co.soramitsu.androidfoundation.format.toDoubleInfinite import jp.co.soramitsu.common.config.BuildConfigWrapper import jp.co.soramitsu.common.domain.AppStateProvider import jp.co.soramitsu.common.domain.RetryStrategyBuilder -import jp.co.soramitsu.common.domain.fiatChange import jp.co.soramitsu.common.logger.FirebaseWrapper -import jp.co.soramitsu.common.util.ext.toDoubleInfinite import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.core_db.AppDatabase import jp.co.soramitsu.core_db.model.FiatTokenPriceLocal diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/domain/EcoSystemPoolsInteractor.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/domain/EcoSystemPoolsInteractor.kt index 40f2d3290..bafe16d0c 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/domain/EcoSystemPoolsInteractor.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/domain/EcoSystemPoolsInteractor.kt @@ -32,7 +32,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_ecosystem_impl.domain -import jp.co.soramitsu.common.util.ext.compareNullDesc +import jp.co.soramitsu.androidfoundation.format.compareNullDesc import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/domain/EcoSystemTokensInteractor.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/domain/EcoSystemTokensInteractor.kt index 48b7f1b22..fe9ba2594 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/domain/EcoSystemTokensInteractor.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/domain/EcoSystemTokensInteractor.kt @@ -32,7 +32,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_ecosystem_impl.domain -import jp.co.soramitsu.common.util.ext.compareNullDesc +import jp.co.soramitsu.androidfoundation.format.compareNullDesc import jp.co.soramitsu.feature_assets_api.data.AssetsRepository import jp.co.soramitsu.feature_blockexplorer_api.data.BlockExplorerManager import kotlinx.coroutines.flow.Flow diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt index 15bda00f6..a698b62ef 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/editfarm/EditFarmViewModel.kt @@ -37,6 +37,8 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.Big100 +import jp.co.soramitsu.androidfoundation.format.divideBy import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset @@ -44,8 +46,6 @@ import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.StringTriple -import jp.co.soramitsu.common.util.ext.Big100 -import jp.co.soramitsu.common.util.ext.divideBy import jp.co.soramitsu.common_wallet.domain.model.CommonUserPoolData import jp.co.soramitsu.common_wallet.presentation.compose.util.PolkaswapFormulas import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt index 439687c1d..46762eda5 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreViewModel.kt @@ -35,6 +35,7 @@ package jp.co.soramitsu.feature_ecosystem_impl.presentation.explore import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.format.compareNullDesc import jp.co.soramitsu.androidfoundation.format.formatFiatSuffix import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.domain.iconUri @@ -44,7 +45,6 @@ import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.StringPair import jp.co.soramitsu.common.util.StringTriple -import jp.co.soramitsu.common.util.ext.compareNullDesc import jp.co.soramitsu.common_wallet.domain.model.isFilterMatch import jp.co.soramitsu.common_wallet.presentation.compose.BasicFarmListItemState import jp.co.soramitsu.common_wallet.presentation.compose.BasicPoolListItemState diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt index bef8fd03e..21f9db660 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt @@ -34,12 +34,12 @@ package jp.co.soramitsu.feature_polkaswap_impl.domain import java.math.BigDecimal import java.util.Date +import jp.co.soramitsu.androidfoundation.format.isZero +import jp.co.soramitsu.androidfoundation.format.safeDivide import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.LiquidityDetails import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.util.StringPair -import jp.co.soramitsu.common.util.ext.isZero -import jp.co.soramitsu.common.util.ext.safeDivide import jp.co.soramitsu.common_wallet.domain.model.BasicPoolData import jp.co.soramitsu.common_wallet.domain.model.CommonPoolData import jp.co.soramitsu.common_wallet.domain.model.CommonUserPoolData diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt index 6c85355c3..f252286d7 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorImpl.kt @@ -36,10 +36,10 @@ import java.math.BigDecimal import java.math.RoundingMode import java.util.Date import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty +import jp.co.soramitsu.androidfoundation.format.isZero import jp.co.soramitsu.common.domain.Market import jp.co.soramitsu.common.domain.PoolDex import jp.co.soramitsu.common.domain.Token -import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common_wallet.domain.model.WithDesired import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt index e2aa92da1..2666e3fed 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt @@ -38,6 +38,9 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty +import jp.co.soramitsu.androidfoundation.format.isZero +import jp.co.soramitsu.androidfoundation.format.nullZero +import jp.co.soramitsu.androidfoundation.format.orZero import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset @@ -48,10 +51,7 @@ import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.compose.states.ButtonState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter -import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common.util.ext.lazyAsync -import jp.co.soramitsu.common.util.ext.nullZero -import jp.co.soramitsu.common.util.ext.orZero import jp.co.soramitsu.common.view.ViewHelper import jp.co.soramitsu.common_wallet.domain.model.LiquidityData import jp.co.soramitsu.common_wallet.domain.model.WithDesired diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt index 51d10eec2..1f145f2ca 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt @@ -40,6 +40,9 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.isZero +import jp.co.soramitsu.androidfoundation.format.nullZero +import jp.co.soramitsu.androidfoundation.format.orZero import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset @@ -49,8 +52,6 @@ import jp.co.soramitsu.common.presentation.compose.states.ButtonState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.lazyAsync -import jp.co.soramitsu.common.util.ext.nullZero -import jp.co.soramitsu.common.util.ext.orZero import jp.co.soramitsu.common.view.ViewHelper import jp.co.soramitsu.common_wallet.domain.model.CommonUserPoolData import jp.co.soramitsu.common_wallet.presentation.compose.util.AmountFormat @@ -264,7 +265,7 @@ class LiquidityRemoveViewModel @AssistedInject constructor( poolDataLocal.user.poolProvidersBalance, ) } - if (maxPercent != null && !maxPercent.isNaN()) { + var fixedPoolData: CommonUserPoolData? = if (maxPercent != null && !maxPercent.isNaN()) { poolInFarming = true val usablePercent = 100 - maxPercent poolDataLocal.copy( @@ -289,6 +290,35 @@ class LiquidityRemoveViewModel @AssistedInject constructor( } else { poolDataLocal } + fixedPoolData = if (fixedPoolData != null && token2Id == SubstrateOptionsProvider.ethTokenId) { + if (token1Id == SubstrateOptionsProvider.feeAssetId || token1Id == SubstrateOptionsProvider.kxorTokenId) { + val kxorBalance = assetsInteractor + .fetchBalance(poolDataLocal.basic.reserveAccount, listOf(SubstrateOptionsProvider.kxorTokenId)) + .getOrElse(0) { BigDecimal.ZERO } + if (kxorBalance.isZero()) { + fixedPoolData + } else { + if (token1Id == SubstrateOptionsProvider.feeAssetId) { + fixedPoolData.copy( + user = fixedPoolData.user.copy( + basePooled = fixedPoolData.user.basePooled.minus(kxorBalance) + ) + ) + } else { + fixedPoolData.copy( + user = fixedPoolData.user.copy( + basePooled = kxorBalance + ) + ) + } + } + } else { + fixedPoolData + } + } else { + fixedPoolData + } + fixedPoolData } else { null } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt index eb0923163..69aeef3d5 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/swap/SwapViewModel.kt @@ -43,6 +43,9 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty +import jp.co.soramitsu.androidfoundation.format.isZero +import jp.co.soramitsu.androidfoundation.format.nullZero +import jp.co.soramitsu.androidfoundation.format.orZero import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.resource.ResourceManager @@ -57,10 +60,7 @@ import jp.co.soramitsu.common.domain.subtractFee import jp.co.soramitsu.common.presentation.compose.states.ButtonState import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter -import jp.co.soramitsu.common.util.ext.isZero import jp.co.soramitsu.common.util.ext.lazyAsync -import jp.co.soramitsu.common.util.ext.nullZero -import jp.co.soramitsu.common.util.ext.orZero import jp.co.soramitsu.common.view.ViewHelper import jp.co.soramitsu.common_wallet.domain.model.WithDesired import jp.co.soramitsu.common_wallet.presentation.compose.util.AmountFormat diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt index a0dfe801c..f04a0a01d 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt @@ -35,12 +35,12 @@ package jp.co.soramitsu.feature_polkaswap_impl.presentation.polkaswap.liquidity. import androidx.arch.core.executor.testing.InstantTaskExecutorRule import io.mockk.mockkObject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.equalTo import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.common.util.NumbersFormatter -import jp.co.soramitsu.common.util.ext.equalTo import jp.co.soramitsu.common_wallet.domain.model.LiquidityData import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt index 9735cc7d5..db0d8c859 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt @@ -34,10 +34,10 @@ package jp.co.soramitsu.feature_polkaswap_impl.presentation.polkaswap.liquidity. import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.format.equalTo import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.util.NumbersFormatter -import jp.co.soramitsu.common.util.ext.equalTo import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt index 1b2156358..ca939b342 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModel.kt @@ -38,6 +38,7 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import java.math.BigDecimal import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.format.orZero import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R @@ -48,7 +49,6 @@ import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.ext.lazyAsync -import jp.co.soramitsu.common.util.ext.orZero import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_main_api.launcher.MainRouter From 207f36122cff08089aa3feb69623c0d5026439e1 Mon Sep 17 00:00:00 2001 From: arvifox Date: Wed, 26 Jun 2024 17:00:19 +0300 Subject: [PATCH 23/43] mwr-824 --- .../compose/LiquidityRemoveScreen.kt | 4 +- .../LiquidityRemoveFragment.kt | 1 + .../LiquidityRemoveViewModel.kt | 305 ++++++++++-------- .../remove/RemoveLiquidityViewModelTest.kt | 4 +- 4 files changed, 178 insertions(+), 136 deletions(-) diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt index 410631d0e..2dc2019ec 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt @@ -81,6 +81,7 @@ internal fun LiquidityRemoveScreen( onFocusChange2: (Boolean) -> Unit, onAmountChange1: (BigDecimal) -> Unit, onAmountChange2: (BigDecimal) -> Unit, + onSelectToken1: () -> Unit, onSlippageClick: () -> Unit, onReview: () -> Unit, ) { @@ -102,7 +103,7 @@ internal fun LiquidityRemoveScreen( }, state = state.assetState1, onAmountChange = onAmountChange1, - onSelectToken = {}, + onSelectToken = onSelectToken1, onFocusChange = onFocusChange1, ) AssetAmountInput( @@ -233,6 +234,7 @@ private fun PreviewLiquidityRemoveScreen() { onAmountChange1 = {}, onFocusChange2 = {}, onFocusChange1 = {}, + onSelectToken1 = {}, state = LiquidityRemoveState( btnState = ButtonState( text = "btn", diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt index 6a7e803ef..0cf49de35 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt @@ -177,6 +177,7 @@ class LiquidityRemoveFragment : SoraBaseFragment() { onAmountChange2 = viewModel::onAmount2Change, onSlippageClick = onSlippageClick, onReview = onReview, + onSelectToken1 = viewModel::onSelectToken1, ) } } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt index 1f145f2ca..32131f568 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt @@ -94,8 +94,8 @@ class LiquidityRemoveViewModel @AssistedInject constructor( private val demeterFarmingInteractor: DemeterFarmingInteractor, private val numbersFormatter: NumbersFormatter, private val resourceManager: ResourceManager, - @Assisted("id1") private val token1Id: String, - @Assisted("id2") private val token2Id: String, + @Assisted("id1") private val token1IdStart: String, + @Assisted("id2") private val token2IdStart: String, ) : BaseViewModel() { @AssistedFactory @@ -106,6 +106,9 @@ class LiquidityRemoveViewModel @AssistedInject constructor( ): LiquidityRemoveViewModel } + private var token1Id = token1IdStart + private var token2Id = token2IdStart + private companion object { const val ASSET_PRECISION = 8 } @@ -120,6 +123,7 @@ class LiquidityRemoveViewModel @AssistedInject constructor( private val feeTokenAsync by viewModelScope.lazyAsync { walletInteractor.getFeeToken() } private suspend fun feeToken() = feeTokenAsync.await() + private var poolDataUsableWithKensetsu: CommonUserPoolData? = null private var poolDataUsable: CommonUserPoolData? = null private var poolDataReal: CommonUserPoolData? = null private val amount1Flow = MutableStateFlow(BigDecimal.ZERO) @@ -185,59 +189,7 @@ class LiquidityRemoveViewModel @AssistedInject constructor( .collectLatest { assets -> assetList.clear() assetList.addAll(assets) - - val asset1 = assets.first { it.token.id == token1Id } - val asset2 = assets.first { it.token.id == token2Id } - if (networkFee == null) { - networkFee = poolsInteractor.fetchRemoveLiquidityNetworkFee( - asset1.token, - asset2.token, - ) - } - if (removeState.assetState1 == null) { - removeState = removeState.copy( - assetState1 = AssetAmountInputState( - token = asset1.token, - balance = getAssetBalanceText(asset1), - amount = null, - amountFiat = "", - enabled = true, - ), - ) - } - if (removeState.assetState2 == null) { - removeState = removeState.copy( - assetState2 = AssetAmountInputState( - token = asset2.token, - balance = getAssetBalanceText(asset2), - amount = null, - amountFiat = "", - enabled = true, - ), - ) - } - balanceFee = - assets.first { it.token.id == SubstrateOptionsProvider.feeAssetId }.balance.transferable - - removeState.assetState1?.let { state -> - assets.find { it.token.id == state.token.id }?.let { asset -> - removeState = removeState.copy( - assetState1 = state.copy( - balance = getAssetBalanceText(asset) - ) - ) - } - } - removeState.assetState2?.let { state -> - assets.find { it.token.id == state.token.id }?.let { asset -> - removeState = removeState.copy( - assetState2 = state.copy( - balance = getAssetBalanceText(asset) - ) - ) - } - } - reCalcDetails() + onAssetsActiveCollect() } } viewModelScope.launch { @@ -265,96 +217,30 @@ class LiquidityRemoveViewModel @AssistedInject constructor( poolDataLocal.user.poolProvidersBalance, ) } - var fixedPoolData: CommonUserPoolData? = if (maxPercent != null && !maxPercent.isNaN()) { - poolInFarming = true - val usablePercent = 100 - maxPercent - poolDataLocal.copy( - user = poolDataLocal.user.copy( - basePooled = PolkaswapFormulas.calculateAmountByPercentage( - poolDataLocal.user.basePooled, - usablePercent, - poolDataLocal.basic.baseToken.precision, - ), - targetPooled = PolkaswapFormulas.calculateAmountByPercentage( - poolDataLocal.user.targetPooled, - usablePercent, - poolDataLocal.basic.baseToken.precision, - ), - poolProvidersBalance = PolkaswapFormulas.calculateAmountByPercentage( - poolDataLocal.user.poolProvidersBalance, - usablePercent, - poolDataLocal.basic.baseToken.precision, - ), - ) - ) - } else { - poolDataLocal - } - fixedPoolData = if (fixedPoolData != null && token2Id == SubstrateOptionsProvider.ethTokenId) { - if (token1Id == SubstrateOptionsProvider.feeAssetId || token1Id == SubstrateOptionsProvider.kxorTokenId) { - val kxorBalance = assetsInteractor - .fetchBalance(poolDataLocal.basic.reserveAccount, listOf(SubstrateOptionsProvider.kxorTokenId)) - .getOrElse(0) { BigDecimal.ZERO } - if (kxorBalance.isZero()) { - fixedPoolData - } else { - if (token1Id == SubstrateOptionsProvider.feeAssetId) { - fixedPoolData.copy( - user = fixedPoolData.user.copy( - basePooled = fixedPoolData.user.basePooled.minus(kxorBalance) - ) - ) - } else { - fixedPoolData.copy( - user = fixedPoolData.user.copy( - basePooled = kxorBalance - ) - ) - } - } - } else { - fixedPoolData - } - } else { - fixedPoolData - } - fixedPoolData + userPoolDataFixDemeter(poolDataLocal, maxPercent) } else { null } } - .collectLatest { poolDataLocal -> - poolDataUsable = poolDataLocal - amount1 = - if (poolDataLocal != null) PolkaswapFormulas.calculateAmountByPercentage( - poolDataLocal.user.basePooled, - percent, - poolDataLocal.basic.baseToken.precision, - ) else BigDecimal.ZERO - amount2 = - if (poolDataLocal != null) PolkaswapFormulas.calculateAmountByPercentage( - poolDataLocal.user.targetPooled, - percent, - poolDataLocal.basic.targetToken.precision, - ) else BigDecimal.ZERO - reCalcDetails() - } + .collectLatest(::onPoolCollectKensetsu) } viewModelScope.launch { amount1Flow .debounce(ViewHelper.debounce) .onEach { amount -> - poolDataUsable?.let { - amount1 = if (amount <= it.user.basePooled) amount else it.user.basePooled + val pduk = poolDataUsableWithKensetsu + val pdu = poolDataUsable + if (pdu != null && pduk != null) { + amount1 = if (amount <= pdu.user.basePooled) amount else pdu.user.basePooled amount2 = PolkaswapFormulas.calculateOneAmountFromAnother( amount1, - it.user.basePooled, - it.user.targetPooled, - removeState.assetState2?.token?.precision + pduk.user.basePooled, + pduk.user.targetPooled, + removeState.assetState2?.token?.precision, ) percent = PolkaswapFormulas.calculateShareOfPoolFromAmount( amount1, - it.user.basePooled, + pduk.user.basePooled, ) reCalcDetails() } @@ -388,6 +274,128 @@ class LiquidityRemoveViewModel @AssistedInject constructor( } } + private fun userPoolDataFixDemeter(poolData: CommonUserPoolData, prc: Double?): CommonUserPoolData { + return if (prc != null && !prc.isNaN()) { + poolInFarming = true + val usablePercent = 100 - prc + poolData.copy( + user = poolData.user.copy( + basePooled = PolkaswapFormulas.calculateAmountByPercentage( + poolData.user.basePooled, + usablePercent, + poolData.basic.baseToken.precision, + ), + targetPooled = PolkaswapFormulas.calculateAmountByPercentage( + poolData.user.targetPooled, + usablePercent, + poolData.basic.baseToken.precision, + ), + poolProvidersBalance = PolkaswapFormulas.calculateAmountByPercentage( + poolData.user.poolProvidersBalance, + usablePercent, + poolData.basic.baseToken.precision, + ), + ) + ) + } else { + poolData + } + } + + private suspend fun userPoolDataFixKensetsu(poolData: CommonUserPoolData?): CommonUserPoolData? { + return if (poolData != null && token2Id == SubstrateOptionsProvider.ethTokenId) { + if (token1Id == SubstrateOptionsProvider.feeAssetId || token1Id == SubstrateOptionsProvider.kxorTokenId) { + val kxorBalance = assetsInteractor + .fetchBalance(poolData.basic.reserveAccount, listOf(SubstrateOptionsProvider.kxorTokenId)) + .getOrElse(0) { BigDecimal.ZERO } + if (kxorBalance.isZero()) { + poolData + } else { + if (token1Id == SubstrateOptionsProvider.feeAssetId) { + poolData.copy( + user = poolData.user.copy( + basePooled = poolData.user.basePooled.minus(kxorBalance) + ) + ) + } else { + poolData.copy( + user = poolData.user.copy( + basePooled = kxorBalance + ) + ) + } + } + } else { + poolData + } + } else { + poolData + } + } + + private suspend fun onAssetsActiveCollect() { + val asset1 = assetList.first { it.token.id == token1Id } + val asset2 = assetList.first { it.token.id == token2Id } + if (networkFee == null) { + networkFee = poolsInteractor.fetchRemoveLiquidityNetworkFee( + asset1.token, + asset2.token, + ) + } + if (removeState.assetState1 == null) { + removeState = removeState.copy( + assetState1 = AssetAmountInputState( + token = asset1.token, + balance = getAssetBalanceText(asset1), + amount = null, + amountFiat = "", + enabled = true, + ), + ) + } + if (removeState.assetState1?.token?.id != asset1.token.id) { + removeState = removeState.copy( + assetState1 = removeState.assetState1?.copy( + token = asset1.token, + balance = getAssetBalanceText(asset1), + ), + ) + } + if (removeState.assetState2 == null) { + removeState = removeState.copy( + assetState2 = AssetAmountInputState( + token = asset2.token, + balance = getAssetBalanceText(asset2), + amount = null, + amountFiat = "", + enabled = true, + ), + ) + } + balanceFee = + assetList.first { it.token.id == SubstrateOptionsProvider.feeAssetId }.balance.transferable + + removeState.assetState1?.let { state -> + assetList.find { it.token.id == state.token.id }?.let { asset -> + removeState = removeState.copy( + assetState1 = state.copy( + balance = getAssetBalanceText(asset) + ) + ) + } + } + removeState.assetState2?.let { state -> + assetList.find { it.token.id == state.token.id }?.let { asset -> + removeState = removeState.copy( + assetState2 = state.copy( + balance = getAssetBalanceText(asset) + ) + ) + } + } + reCalcDetails() + } + override fun onCurrentDestinationChanged(curDest: String) { _toolbarState.value?.let { state -> _toolbarState.value = state.copy( @@ -427,12 +435,12 @@ class LiquidityRemoveViewModel @AssistedInject constructor( ) } - fun onPercentClick(p: Int) { + fun onPercentClick(prc: Int) { viewModelScope.launch { poolDataUsable?.let { poolData -> removeState.assetState1?.let { asset1 -> removeState.assetState2?.let { asset2 -> - percent = p.toDouble() + percent = prc.toDouble() if (percent == 100.0) { amount1 = poolData.user.basePooled amount2 = poolData.user.targetPooled @@ -472,6 +480,37 @@ class LiquidityRemoveViewModel @AssistedInject constructor( ) } + private suspend fun onPoolCollectKensetsu(cups: CommonUserPoolData?) { + poolDataUsableWithKensetsu = cups + val poolData = userPoolDataFixKensetsu(cups) + poolDataUsable = poolData + amount1 = + if (poolData != null) PolkaswapFormulas.calculateAmountByPercentage( + poolData.user.basePooled, + percent, + poolData.basic.baseToken.precision, + ) else BigDecimal.ZERO + amount2 = + if (poolData != null) PolkaswapFormulas.calculateAmountByPercentage( + poolData.user.targetPooled, + percent, + poolData.basic.targetToken.precision, + ) else BigDecimal.ZERO + reCalcDetails() + } + + fun onSelectToken1() { + if (token1Id == SubstrateOptionsProvider.feeAssetId && token2Id == SubstrateOptionsProvider.ethTokenId) { + viewModelScope.launch { + poolDataUsable?.let { pdu -> + token1Id = SubstrateOptionsProvider.kxorTokenId + onAssetsActiveCollect() + onPoolCollectKensetsu(pdu) + } + } + } + } + fun onAmount1Change(value: BigDecimal) { removeState = removeState.copy( assetState1 = removeState.assetState1?.copy( diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt index db0d8c859..bda862285 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt @@ -124,8 +124,8 @@ class RemoveLiquidityViewModelTest { poolsInteractor = poolsInteractor, numbersFormatter = NumbersFormatter(), resourceManager = resourceManager, - token1Id = firstTokenId ?: TestTokens.xorToken.id, - token2Id = secondTokenId ?: TestTokens.valToken.id, + token1IdStart = firstTokenId ?: TestTokens.xorToken.id, + token2IdStart = secondTokenId ?: TestTokens.valToken.id, demeterFarmingInteractor = demeterFarmingInteractor, ) } From b4b885c8e64770f5647d17bb833a89bb7baaab18 Mon Sep 17 00:00:00 2001 From: arvifox Date: Thu, 27 Jun 2024 11:35:46 +0300 Subject: [PATCH 24/43] mwr-824 --- .../components/compose/PoolDetailsScreen.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt index f0a00031f..eb7fbb732 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt @@ -32,6 +32,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -46,6 +47,10 @@ import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -194,11 +199,19 @@ internal fun PoolDetailsScreen( ) } if (state.pooled1 != null) { + var visibleClick by remember { mutableStateOf(false) } DetailsItem( + modifier = Modifier.clickable( + enabled = state.kensetsu != null, + onClick = { visibleClick = !visibleClick }, + ), text = stringResource(id = R.string.your_pooled).format(state.symbol1), value1 = state.pooled1, ) - if (state.kensetsu != null) { + AnimatedVisibility( + modifier = Modifier.padding(horizontal = Dimens.x1), + visible = state.kensetsu != null && visibleClick, + ) { Text( text = "KXOR pooled ${state.kensetsu}", style = MaterialTheme.customTypography.textXSBold, From 3cb980c76ce7a4c200c6c21fff8f392d9e08fc7e Mon Sep 17 00:00:00 2001 From: AmadeyKuspakov Date: Wed, 3 Jul 2024 09:56:09 +0400 Subject: [PATCH 25/43] sc-29 mwr-612 xnetworking --- android-foundation | 2 +- app/build.gradle.kts | 12 +- .../splash/domain/SplashInteractorTest.kt | 2 +- .../presentation/SplashViewModelTest.kt | 4 +- common/build.gradle.kts | 14 +- .../common/di/modules/CommonModule.kt | 111 +++++----- .../common/domain/OptionsProvider.kt | 3 +- .../common/domain/WhitelistTokensManager.kt | 89 +++++--- .../soramitsu/common/util/CachingFactory.kt | 51 +++-- .../soramitsu/common/util/TestTagCompose.kt | 2 +- .../co/soramitsu/common/util/ext/StringExt.kt | 2 - .../common/data/EncryptedPreferencesTest.kt | 2 +- .../common/date/DateFormatterTest.kt | 2 +- .../common/delegate/WithProgressImplTest.kt | 2 +- .../common/domain/PushHandlerTest.kt | 2 +- .../common/domain/RetryStrategyTests.kt | 2 +- .../webview/WebViewViewModelTest.kt | 2 +- .../common/util/ext/StringExtTest.kt | 1 + common_wallet/build.gradle.kts | 12 +- .../data/SoraCardNetworkClientImpl.kt | 129 +++++++++++ .../common_wallet/di/CommonWalletModule.kt | 13 ++ core_db/build.gradle.kts | 14 +- .../jp/co/soramitsu/core_db/AssetDaoTests.kt | 2 +- demeter/build.gradle.kts | 12 +- feature_account_api/build.gradle.kts | 10 + feature_account_impl/build.gradle.kts | 16 +- .../repository/CredentialsRepositoryImpl.kt | 5 +- .../repository/CredentialsRepositoryTest.kt | 2 +- .../data/repository/UserRepositoryTest.kt | 2 +- .../PrefsCredentialsDatasourceTest.kt | 2 +- .../datasource/PrefsUserDatasourceTest.kt | 2 +- feature_assets_api/build.gradle.kts | 10 + feature_assets_impl/build.gradle.kts | 16 +- .../data/AssetsRepositoryTest.kt | 4 +- .../domain/AssetsInteractorTest.kt | 2 +- .../domain/QrCodeInteractorTest.kt | 2 - .../AssetSettingsViewModelTest.kt | 4 +- .../qr/QrCodeFlowViewModelTest.kt | 2 +- .../send/TransferAmountViewModelTest.kt | 2 +- .../txlist/AssetSettingsViewModelTest.kt | 4 +- feature_blockexplorer_api/build.gradle.kts | 12 +- .../data/BlockExplorerManager.kt | 127 ++++++----- .../data/SoraConfigManager.kt | 207 +++++++++++++++--- .../data/models/SoraConfig.kt | 31 +++ feature_blockexplorer_impl/build.gradle.kts | 17 +- .../data/TransactionHistoryRepositoryImpl.kt | 88 +++++--- .../data/TransactionMapper.kt | 4 +- .../di/FeatureBlockExplorerModule.kt | 29 +++ .../data/TransactionHistoryRepositoryTest.kt | 36 ++- .../domain/TransactionHistoryHandlerTest.kt | 4 +- .../screen/ActivitiesViewModelTest.kt | 2 +- .../txdetails/TxDetailsViewModelTest.kt | 4 +- .../testdata/TestTransactions.kt | 4 +- feature_ecosystem_impl/build.gradle.kts | 16 +- .../explore/ExploreViewModelTest.kt | 2 +- feature_ethereum_api/build.gradle.kts | 2 - feature_main_impl/build.gradle.kts | 16 +- .../domain/PinCodeInteractorTest.kt | 2 +- .../presentation/MainViewModelTest.kt | 4 +- .../language/SelectLanguageViewModelTest.kt | 4 +- .../pincode/PinCodeViewModelTest.kt | 2 +- .../profile/ProfileViewModelTest.kt | 4 +- feature_multiaccount_api/build.gradle.kts | 10 + feature_multiaccount_impl/build.gradle.kts | 16 +- .../export_account/backup/BackupViewModel.kt | 2 +- .../OnboardingViewModelTest.kt | 2 +- .../domain/MultiaccountInteractorTest.kt | 2 +- .../AccountDetailsViewModelTest.kt | 4 +- .../account_list/AccountListViewModelTest.kt | 4 +- .../export/backup/BackupViewModelTest.kt | 7 +- .../backup/json/BackupJsonViewModelTest.kt | 2 +- .../ExportProtectionViewModelTest.kt | 2 +- feature_polkaswap_api/build.gradle.kts | 10 + feature_polkaswap_impl/build.gradle.kts | 16 +- .../domain/PoolsInteractorTest.kt | 2 +- .../domain/SwapInteractorTest.kt | 2 +- .../polkaswap/SwapViewModelTest.kt | 6 +- .../add/AddLiquidityViewModelTest.kt | 2 +- .../remove/RemoveLiquidityViewModelTest.kt | 2 +- feature_referral_api/build.gradle.kts | 11 +- .../data/ReferralRepository.kt | 4 +- feature_referral_impl/build.gradle.kts | 16 +- .../data/ReferralRepositoryImpl.kt | 6 +- .../data/ReferralRepositoryTest.kt | 6 +- .../domain/ReferralInteractorTest.kt | 6 +- .../presentation/ReferralViewModelTest.kt | 4 +- feature_select_node_api/build.gradle.kts | 10 + feature_select_node_impl/build.gradle.kts | 17 +- .../NodeManagerImpl.kt | 4 +- .../details/NodeDetailsViewModelTest.kt | 4 +- .../presentation/domain/NodeValidatorTest.kt | 2 +- .../select/SelectNodeViewModelTest.kt | 4 +- feature_sora_card_api/build.gradle.kts | 10 + feature_sora_card_impl/build.gradle.kts | 16 +- .../get/card/GetSoraCardViewModelTest.kt | 4 +- feature_wallet_api/build.gradle.kts | 10 + feature_wallet_impl/build.gradle.kts | 18 +- .../datasource/BuyCryptoDataSourceImpl.kt | 13 +- .../di/WalletFeatureModule.kt | 8 +- .../data/repository/WalletRepositoryTest.kt | 9 +- .../datasource/PrefsWalletDatasourceTest.kt | 2 +- .../buycrypto/BuyCryptoViewModelTest.kt | 2 +- .../presentation/claim/ClaimViewModelTest.kt | 2 +- .../contacts/ContactsViewModelTest.kt | 2 +- .../wallet/CardsHubViewModelTest.kt | 4 +- gradle/libs.versions.toml | 20 +- network/build.gradle.kts | 8 +- .../java/jp/co/soramitsu/network/WebSocket.kt | 59 +++-- settings.gradle.kts | 1 - sorasubstrate/build.gradle.kts | 14 +- .../sora/substrate/di/SubstrateModule.kt | 17 -- .../sora/substrate/runtime/RuntimeManager.kt | 13 +- .../runtime/SubstrateOptionsProvider.kt | 2 +- test_data/build.gradle.kts | 10 + test_shared/.gitignore | 1 - test_shared/build.gradle.kts | 67 ------ test_shared/src/main/AndroidManifest.xml | 1 - .../java/jp/co/soramitsu/test_shared/Ext.kt | 45 ---- .../soramitsu/test_shared/LiveDataTestUtil.kt | 88 -------- .../test_shared/TestFlowCollector.kt | 103 --------- 120 files changed, 1185 insertions(+), 738 deletions(-) rename test_shared/src/main/java/jp/co/soramitsu/test_shared/MainCoroutineRule.kt => common/src/main/java/jp/co/soramitsu/common/util/CachingFactory.kt (67%) create mode 100644 common_wallet/src/main/java/jp/co/soramitsu/common_wallet/data/SoraCardNetworkClientImpl.kt create mode 100644 feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/models/SoraConfig.kt delete mode 100644 test_shared/.gitignore delete mode 100644 test_shared/build.gradle.kts delete mode 100644 test_shared/src/main/AndroidManifest.xml delete mode 100644 test_shared/src/main/java/jp/co/soramitsu/test_shared/Ext.kt delete mode 100644 test_shared/src/main/java/jp/co/soramitsu/test_shared/LiveDataTestUtil.kt delete mode 100644 test_shared/src/main/java/jp/co/soramitsu/test_shared/TestFlowCollector.kt diff --git a/android-foundation b/android-foundation index a5be15486..f6b9d333c 160000 --- a/android-foundation +++ b/android-foundation @@ -1 +1 @@ -Subproject commit a5be154865d8cb01051f6fc827126487210de7c9 +Subproject commit f6b9d333c30adcb41c94720dca256f48aac25d2a diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 09c2e4476..107152d64 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -155,6 +155,11 @@ android { configurations { all { exclude(module = "bcprov-jdk15on") +// resolutionStrategy { +// dependencySubstitution { +// substitute(module("")).using(module("")) +// } +// } } } } @@ -234,8 +239,11 @@ dependencies { implementation(libs.webSocketLibDep) - // Tests - testImplementation(project(":test_shared")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) kover(project(":common")) kover(project(":common_wallet")) diff --git a/app/src/test/java/jp/co/soramitsu/sora/splash/domain/SplashInteractorTest.kt b/app/src/test/java/jp/co/soramitsu/sora/splash/domain/SplashInteractorTest.kt index 0a0709da0..6762db0fb 100644 --- a/app/src/test/java/jp/co/soramitsu/sora/splash/domain/SplashInteractorTest.kt +++ b/app/src/test/java/jp/co/soramitsu/sora/splash/domain/SplashInteractorTest.kt @@ -33,9 +33,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.sora.splash.domain import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_account_api.domain.model.OnboardingState -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals diff --git a/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt b/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt index e0b9fa7e2..2fbd4a485 100644 --- a/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt +++ b/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt @@ -35,11 +35,11 @@ package jp.co.soramitsu.sora.splash.presentation import androidx.arch.core.executor.testing.InstantTaskExecutorRule import io.mockk.every import io.mockk.mockkObject +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.feature_account_api.domain.model.OnboardingState import jp.co.soramitsu.sora.splash.domain.SplashInteractor -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 0df7171ad..c1a864169 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -138,6 +138,16 @@ android { buildConfigField("String", "GOOGLE_API_TOKEN", maybeWrapQuotes(secret("SORA_GOOGLE_TOKEN_PROD"))) } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -218,7 +228,9 @@ dependencies { implementation(libs.navigationComposeDep) debugImplementation(libs.composeToolingDep) - testImplementation(project(":test_shared")) + testImplementation(libs.mockitoDep) + testImplementation(libs.archCoreTestDep) + testImplementation(libs.coroutineTestDep) } kapt { diff --git a/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt b/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt index 9cfa97e8e..5e1b7c96e 100644 --- a/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt +++ b/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt @@ -82,15 +82,17 @@ import jp.co.soramitsu.common.util.json_decoder.JsonAccountsEncoder import jp.co.soramitsu.common.vibration.DeviceVibrator import jp.co.soramitsu.crypto.ed25519.Ed25519Sha3 import jp.co.soramitsu.xbackup.BackupService -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuHttpClientProvider -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuHttpClientProviderImpl -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuNetworkClient -import jp.co.soramitsu.xnetworking.sorawallet.blockexplorerinfo.SoraWalletBlockExplorerInfo -import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraRemoteConfigBuilder -import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraRemoteConfigProvider -import jp.co.soramitsu.xnetworking.sorawallet.tokenwhitelist.SoraTokensWhitelistManager -import jp.co.soramitsu.xnetworking.sorawallet.txhistory.client.SubQueryClientForSoraWalletFactory +import jp.co.soramitsu.xnetworking.lib.datasources.blockexplorer.api.BlockExplorerRepository +import jp.co.soramitsu.xnetworking.lib.datasources.blockexplorer.impl.BlockExplorerRepositoryImpl +import jp.co.soramitsu.xnetworking.lib.datasources.chainsconfig.api.ConfigDAO +import jp.co.soramitsu.xnetworking.lib.datasources.chainsconfig.api.data.ConfigParser +import jp.co.soramitsu.xnetworking.lib.datasources.chainsconfig.impl.SuperWalletConfigDAOImpl +import jp.co.soramitsu.xnetworking.lib.datasources.chainsconfig.impl.data.RemoteConfigParserImpl +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.models.AbstractRestClientConfig +import jp.co.soramitsu.xnetworking.lib.engines.rest.impl.RestClientImpl import jp.co.soramitsu.xsubstrate.encrypt.json.JsonSeedEncoder +import kotlinx.serialization.json.Json @InstallIn(SingletonComponent::class) @Module @@ -133,91 +135,86 @@ class CommonModule { @Singleton @Provides - fun provideSvgDecoder(): SvgDecoder.Factory { - return SvgDecoder.Factory() + fun provideJson(): Json = Json { + prettyPrint = true + isLenient = true + ignoreUnknownKeys = true } @Singleton @Provides - fun provideInAppUpdateManager( - @ApplicationContext c: Context, - sp: SoraPreferences - ): InAppUpdateManager = InAppUpdateManager(c, sp) + fun provideConfigParser( + restClient: RestClient + ): ConfigParser = RemoteConfigParserImpl( + restClient = restClient, + chainsRequestUrl = OptionsProvider.configXn, + ) @Singleton @Provides - fun provideAppStateManager(): AppStateProvider = AppStateProviderImpl() + fun provideConfigDAO(configParser: ConfigParser): ConfigDAO = + SuperWalletConfigDAOImpl(configParser = configParser) @Singleton @Provides - fun provideCoroutineManager(): CoroutineManager = - CoroutineManager() - - @Provides - fun provideWithProgress(): WithProgress = WithProgressImpl() + fun provideBlockExplorerRepository( + configDAO: ConfigDAO, + restClient: RestClient + ): BlockExplorerRepository = BlockExplorerRepositoryImpl( + configDAO = configDAO, + restClient = restClient + ) @Singleton @Provides - fun providesPushHandler(): PushHandler = PushHandler() + fun provideRestClient(json: Json): RestClient = RestClientImpl( + restClientConfig = object : AbstractRestClientConfig() { + override fun getConnectTimeoutMillis(): Long = 30_000L + override fun getOrCreateJsonConfig(): Json = json + override fun getRequestTimeoutMillis(): Long = 30_000L + override fun getSocketTimeoutMillis(): Long = 30_000L + override fun isLoggingEnabled(): Boolean = BuildConfig.DEBUG + } + ) @Singleton @Provides - fun provideNetworkStateListener(): NetworkStateListener = NetworkStateListener() + fun provideSvgDecoder(): SvgDecoder.Factory { + return SvgDecoder.Factory() + } @Singleton @Provides - fun provideQrCodeGenerator(): QrCodeGenerator { - return QrCodeGenerator(Color.BLACK) - } + fun provideInAppUpdateManager( + @ApplicationContext c: Context, + sp: SoraPreferences + ): InAppUpdateManager = InAppUpdateManager(c, sp) @Singleton @Provides - fun provideSoramitsuNetworkClient(): SoramitsuNetworkClient = - SoramitsuNetworkClient(logging = BuildConfig.DEBUG, timeout = 20000) + fun provideAppStateManager(): AppStateProvider = AppStateProviderImpl() @Singleton @Provides - fun provideSoraWalletBlockExplorerInfo( - client: SoramitsuNetworkClient, - soraRemoteConfigBuilder: SoraRemoteConfigBuilder, - ): SoraWalletBlockExplorerInfo { - return SoraWalletBlockExplorerInfo( - networkClient = client, - soraRemoteConfigBuilder = soraRemoteConfigBuilder, - ) - } + fun provideCoroutineManager(): CoroutineManager = + CoroutineManager() - @Singleton @Provides - fun provideSoraRemoteConfigBuilder( - client: SoramitsuNetworkClient, - @ApplicationContext context: Context, - ): SoraRemoteConfigBuilder { - return SoraRemoteConfigProvider( - context = context, - client = client, - commonUrl = OptionsProvider.configCommon, - mobileUrl = OptionsProvider.configMobile, - ).provide() - } + fun provideWithProgress(): WithProgress = WithProgressImpl() @Singleton @Provides - fun provideSoramitsuHttpClientProvider(): SoramitsuHttpClientProvider = - SoramitsuHttpClientProviderImpl() + fun providesPushHandler(): PushHandler = PushHandler() @Singleton @Provides - fun provideSubQueryClientForSoraWalletFactory( - @ApplicationContext context: Context - ): SubQueryClientForSoraWalletFactory = SubQueryClientForSoraWalletFactory(context) + fun provideNetworkStateListener(): NetworkStateListener = NetworkStateListener() @Singleton @Provides - fun provideSoraTokensWhitelistFetcher( - client: SoramitsuNetworkClient, - ): SoraTokensWhitelistManager = - SoraTokensWhitelistManager(networkClient = client) + fun provideQrCodeGenerator(): QrCodeGenerator { + return QrCodeGenerator(Color.BLACK) + } @Singleton @Provides diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/OptionsProvider.kt b/common/src/main/java/jp/co/soramitsu/common/domain/OptionsProvider.kt index 44befe0a4..11ec9588a 100644 --- a/common/src/main/java/jp/co/soramitsu/common/domain/OptionsProvider.kt +++ b/common/src/main/java/jp/co/soramitsu/common/domain/OptionsProvider.kt @@ -40,6 +40,7 @@ object OptionsProvider { var APPLICATION_ID: String = "" const val configCommon = "https://config.polkaswap2.io/${FlavorOptionsProvider.typesFilePath}/common.json" const val configMobile = "https://config.polkaswap2.io/${FlavorOptionsProvider.typesFilePath}/mobile.json" + const val configXn = "https://config.polkaswap2.io/${FlavorOptionsProvider.typesFilePath}/xn.json" val fileProviderAuthority: String get() = "$APPLICATION_ID.soraFileProvider" val header: String by lazy { "$APPLICATION_ID/$CURRENT_VERSION_NAME/$CURRENT_VERSION_CODE/${BuildConfig.BUILD_TYPE}/${BuildConfig.FLAVOR}" @@ -49,7 +50,7 @@ object OptionsProvider { const val defaultScale = 18 const val nameByteLimit = 32 const val fiatSymbol = "$" - const val nbspace = ' ' + const val nbspace = Typography.nbsp const val euroSign = '€' const val soracard = "2.2.4" const val soracardFiatPackageTest = "com.soracard.iban.wallet.test" diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/WhitelistTokensManager.kt b/common/src/main/java/jp/co/soramitsu/common/domain/WhitelistTokensManager.kt index 256fdbb83..9daba2225 100644 --- a/common/src/main/java/jp/co/soramitsu/common/domain/WhitelistTokensManager.kt +++ b/common/src/main/java/jp/co/soramitsu/common/domain/WhitelistTokensManager.kt @@ -32,16 +32,21 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.domain +import io.ktor.http.decodeURLPart +import io.ktor.util.decodeBase64Bytes import javax.inject.Inject import javax.inject.Singleton import jp.co.soramitsu.common.io.FileManager import jp.co.soramitsu.common.logger.FirebaseWrapper -import jp.co.soramitsu.xnetworking.sorawallet.tokenwhitelist.SoraTokensWhitelistManager +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient +import jp.co.soramitsu.xnetworking.lib.engines.utils.JsonGetRequest +import jp.co.soramitsu.xnetworking.lib.engines.utils.fieldOrNull import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonArray @Serializable private data class TokenDto( @@ -51,12 +56,12 @@ private data class TokenDto( @Singleton class WhitelistTokensManager @Inject constructor( - private val manager: SoraTokensWhitelistManager, + private val restClient: RestClient, private val fileManager: FileManager, ) { companion object { - private const val whitelistFileName = "whitelist_tokens.json" + private const val WHITELIST_FILE_NAME = "whitelist_tokens.json" } var whitelistIds: List = emptyList() @@ -71,7 +76,7 @@ class WhitelistTokensManager @Inject constructor( } init { - fileManager.readInternalFile(whitelistFileName)?.let { + fileManager.readInternalFile(WHITELIST_FILE_NAME)?.let { val ids = Json.decodeFromString(ListSerializer(TokenDto.serializer()), it) updateWhitelist(ids) } @@ -88,36 +93,64 @@ class WhitelistTokensManager @Inject constructor( } suspend fun updateWhitelistStorage() { - runCatching { manager.getTokens() }.onSuccess { dtoList -> - val ids = dtoList.map { TokenDto(it.address, it.type) } + runCatching { + restClient.get( + JsonGetRequest( + url = "https://whitelist.polkaswap2.io/whitelist.json", + responseDeserializer = JsonArray.serializer() + ) + ) + }.onSuccess { dtoList -> + val ids = dtoList.mapNotNull { + TokenDto( + id = it.fieldOrNull("address") + ?: return@mapNotNull null, + type = it.fieldOrNull("icon") + ?: return@mapNotNull null + ) + } updateWhitelist(ids) - fileManager.writeInternalFile(whitelistFileName, Json.encodeToString(ids)) + fileManager.writeInternalFile( + WHITELIST_FILE_NAME, + Json.encodeToString(ids) + ) + dtoList.forEach { dto -> - when (dto.rawIcon) { - is String -> { - fileManager.writeInternalCacheFile( - "${dto.address}.${dto.type}", - dto.rawIcon as String, - ) - } - is ByteArray -> { - fileManager.writeInternalCacheFile( - "${dto.address}.${dto.type}", - dto.rawIcon as ByteArray, - ) - } - else -> {} + val address = dto.fieldOrNull("address") ?: return@forEach + val iconField = dto.fieldOrNull("icon") ?: return@forEach + + val iconRaw = iconField.substringAfter( + delimiter = ",", + missingDelimiterValue = "" + ) + val iconExtension = iconField.removeSurrounding( + prefix = "data:image/", + suffix = iconRaw + ) + + when (iconExtension) { + "svg" -> fileManager.writeInternalCacheFile( + fileName = "$address.$iconExtension", + content = iconRaw.decodeURLPart() + ) + "png" -> fileManager.writeInternalCacheFile( + fileName = "$address.$iconExtension", + content = iconRaw.decodeBase64Bytes() + ) + else -> return@forEach } } }.onFailure { FirebaseWrapper.recordException(it) - if (fileManager.existsInternalFile(whitelistFileName).not()) { - updateWhitelist( - AssetHolder.getIds().map { id -> - TokenDto(id, "") - } - ) - } + + if (fileManager.existsInternalFile(WHITELIST_FILE_NAME)) + return@onFailure + + updateWhitelist( + AssetHolder.getIds().map { id -> + TokenDto(id, "") + } + ) } } } diff --git a/test_shared/src/main/java/jp/co/soramitsu/test_shared/MainCoroutineRule.kt b/common/src/main/java/jp/co/soramitsu/common/util/CachingFactory.kt similarity index 67% rename from test_shared/src/main/java/jp/co/soramitsu/test_shared/MainCoroutineRule.kt rename to common/src/main/java/jp/co/soramitsu/common/util/CachingFactory.kt index d768a3280..eef9e66dc 100644 --- a/test_shared/src/main/java/jp/co/soramitsu/test_shared/MainCoroutineRule.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/CachingFactory.kt @@ -30,28 +30,37 @@ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package jp.co.soramitsu.test_shared - -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.StandardTestDispatcher -import kotlinx.coroutines.test.TestDispatcher -import kotlinx.coroutines.test.resetMain -import kotlinx.coroutines.test.setMain -import org.junit.rules.TestWatcher -import org.junit.runner.Description - -@ExperimentalCoroutinesApi -class MainCoroutineRule(private val dispatcher: TestDispatcher = StandardTestDispatcher()) : - TestWatcher() { - - override fun starting(description: Description) { - super.starting(description) - Dispatchers.setMain(dispatcher) +package jp.co.soramitsu.common.util + +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock + +class CachingFactory( + private val factory: suspend Args.() -> Value +) { + + abstract class Args + + private val cacheMutex = Mutex() + private var cachedValue = mutableMapOf() + + suspend fun nullableValue(args: Args): Value? { + initialize(args) + return cachedValue[args] + } + + suspend fun value(args: Args): Value { + initialize(args) + return checkNotNull(cachedValue[args]) } - override fun finished(description: Description) { - Dispatchers.resetMain() - super.finished(description) + private suspend fun initialize(args: Args) { + if (cachedValue[args] == null) { + cacheMutex.withLock { + if (cachedValue[args] == null) { + cachedValue[args] = factory(args) + } + } + } } } diff --git a/common/src/main/java/jp/co/soramitsu/common/util/TestTagCompose.kt b/common/src/main/java/jp/co/soramitsu/common/util/TestTagCompose.kt index 1e8a9e7c4..9e597972e 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/TestTagCompose.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/TestTagCompose.kt @@ -5,4 +5,4 @@ import jp.co.soramitsu.androidfoundation.compose.testTagAsId const val PACKAGE_ID = "jp.co.soramitsu.sora.develop" -fun Modifier.testTagAsId(tag: String): Modifier = this.testTagAsId(PACKAGE_ID, tag) +fun Modifier.testTagAsId(tag: String): Modifier = this.testTagAsId("$PACKAGE_ID:id", tag) diff --git a/common/src/main/java/jp/co/soramitsu/common/util/ext/StringExt.kt b/common/src/main/java/jp/co/soramitsu/common/util/ext/StringExt.kt index 798d35c58..acefb2bfb 100644 --- a/common/src/main/java/jp/co/soramitsu/common/util/ext/StringExt.kt +++ b/common/src/main/java/jp/co/soramitsu/common/util/ext/StringExt.kt @@ -80,8 +80,6 @@ fun String.didToAccountId(): String { return this.replace(":", "_") + "@sora" } -fun String.addHexPrefix(): String = "${HEX_PREFIX}$this" - fun String.removeWebPrefix(): String = this.removePrefix("http://").removePrefix("https://").removePrefix("www.") diff --git a/common/src/test/java/jp/co/soramitsu/common/data/EncryptedPreferencesTest.kt b/common/src/test/java/jp/co/soramitsu/common/data/EncryptedPreferencesTest.kt index ec5913dff..4bf5c6a4b 100644 --- a/common/src/test/java/jp/co/soramitsu/common/data/EncryptedPreferencesTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/data/EncryptedPreferencesTest.kt @@ -32,8 +32,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.data +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.util.EncryptionUtil -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Before diff --git a/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt b/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt index a47c02f1b..85130e9b6 100644 --- a/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/date/DateFormatterTest.kt @@ -37,9 +37,9 @@ import java.util.Date import java.util.Locale import java.util.TimeZone import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.eqNonNull import jp.co.soramitsu.common.R import jp.co.soramitsu.common.resourses.LanguagesHolder -import jp.co.soramitsu.test_shared.eqNonNull import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test diff --git a/common/src/test/java/jp/co/soramitsu/common/delegate/WithProgressImplTest.kt b/common/src/test/java/jp/co/soramitsu/common/delegate/WithProgressImplTest.kt index c3f253cf2..28909b04e 100644 --- a/common/src/test/java/jp/co/soramitsu/common/delegate/WithProgressImplTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/delegate/WithProgressImplTest.kt @@ -33,7 +33,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.delegate import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import jp.co.soramitsu.test_shared.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Assert.assertFalse diff --git a/common/src/test/java/jp/co/soramitsu/common/domain/PushHandlerTest.kt b/common/src/test/java/jp/co/soramitsu/common/domain/PushHandlerTest.kt index bb9fe034b..db87b7ca5 100644 --- a/common/src/test/java/jp/co/soramitsu/common/domain/PushHandlerTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/domain/PushHandlerTest.kt @@ -32,7 +32,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.domain -import jp.co.soramitsu.test_shared.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.take import kotlinx.coroutines.launch diff --git a/common/src/test/java/jp/co/soramitsu/common/domain/RetryStrategyTests.kt b/common/src/test/java/jp/co/soramitsu/common/domain/RetryStrategyTests.kt index be58841f0..5f46e38aa 100644 --- a/common/src/test/java/jp/co/soramitsu/common/domain/RetryStrategyTests.kt +++ b/common/src/test/java/jp/co/soramitsu/common/domain/RetryStrategyTests.kt @@ -32,7 +32,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.domain -import jp.co.soramitsu.test_shared.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Rule diff --git a/common/src/test/java/jp/co/soramitsu/common/presentation/webview/WebViewViewModelTest.kt b/common/src/test/java/jp/co/soramitsu/common/presentation/webview/WebViewViewModelTest.kt index 242329a88..6ba909fe3 100644 --- a/common/src/test/java/jp/co/soramitsu/common/presentation/webview/WebViewViewModelTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/presentation/webview/WebViewViewModelTest.kt @@ -33,8 +33,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.presentation.webview import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.presentation.compose.webview.WebViewViewModel -import jp.co.soramitsu.test_shared.getOrAwaitValue import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue diff --git a/common/src/test/java/jp/co/soramitsu/common/util/ext/StringExtTest.kt b/common/src/test/java/jp/co/soramitsu/common/util/ext/StringExtTest.kt index d5de015d7..d94c7a994 100644 --- a/common/src/test/java/jp/co/soramitsu/common/util/ext/StringExtTest.kt +++ b/common/src/test/java/jp/co/soramitsu/common/util/ext/StringExtTest.kt @@ -32,6 +32,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.common.util.ext +import jp.co.soramitsu.androidfoundation.format.addHexPrefix import jp.co.soramitsu.androidfoundation.format.removeHexPrefix import org.junit.Assert.assertEquals import org.junit.Test diff --git a/common_wallet/build.gradle.kts b/common_wallet/build.gradle.kts index 1dfd57e7b..4bbddb777 100644 --- a/common_wallet/build.gradle.kts +++ b/common_wallet/build.gradle.kts @@ -64,6 +64,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -123,6 +133,6 @@ dependencies { implementation(libs.composeToolingPreviewDep) debugImplementation(libs.composeToolingDep) - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) + testImplementation(libs.junitDep) } diff --git a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/data/SoraCardNetworkClientImpl.kt b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/data/SoraCardNetworkClientImpl.kt new file mode 100644 index 000000000..53c2428a0 --- /dev/null +++ b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/data/SoraCardNetworkClientImpl.kt @@ -0,0 +1,129 @@ +/* +This file is part of the SORA network and Polkaswap app. + +Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. +SPDX-License-Identifier: BSD-4-Clause + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or other +materials provided with the distribution. + +All advertising materials mentioning features or use of this software must display +the following acknowledgement: This product includes software developed by Polka Biome +Ltd., SORA, and Polkaswap. + +Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used +to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package jp.co.soramitsu.common_wallet.data + +import jp.co.soramitsu.oauth.network.SoraCardNetworkClient +import jp.co.soramitsu.oauth.network.SoraCardNetworkResponse +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.models.AbstractRestServerRequest +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.models.RestClientException +import kotlinx.serialization.DeserializationStrategy + +class SoraCardNetworkClientImpl( + private val restClient: RestClient +) : SoraCardNetworkClient { + + private companion object { + const val SUCCESS_STATUS_CODE = 200 + } + + private class RestfulGetRequest( + override val userAgent: String?, + override val bearerToken: String?, + override val url: String, + override val responseDeserializer: DeserializationStrategy + ) : AbstractRestServerRequest() + + override suspend fun get( + header: String?, + bearerToken: String?, + url: String, + deserializer: DeserializationStrategy + ): SoraCardNetworkResponse { + return try { + val result = restClient.get( + RestfulGetRequest( + userAgent = header, + bearerToken = bearerToken, + url = url, + responseDeserializer = deserializer + ) + ) + + SoraCardNetworkResponse( + value = result, + statusCode = SUCCESS_STATUS_CODE + ) + } catch (exception: RestClientException) { + if (exception !is RestClientException.WithCode) + throw exception + + SoraCardNetworkResponse( + value = null, + statusCode = exception.code + ) + } + } + + private class RestfulPostRequest( + override val userAgent: String?, + override val bearerToken: String?, + override val url: String, + override val responseDeserializer: DeserializationStrategy, + override val body: Any, + override val requestContentType: RestClient.ContentType = RestClient.ContentType.JSON, + ) : AbstractRestServerRequest.WithBody() + + override suspend fun post( + header: String?, + bearerToken: String?, + url: String, + body: Any, + deserializer: DeserializationStrategy + ): SoraCardNetworkResponse { + return try { + val result = restClient.post( + RestfulPostRequest( + userAgent = header, + bearerToken = bearerToken, + url = url, + responseDeserializer = deserializer, + body = body + ) + ) + + SoraCardNetworkResponse( + value = result, + statusCode = SUCCESS_STATUS_CODE + ) + } catch (exception: RestClientException) { + if (exception !is RestClientException.WithCode) + throw exception + + SoraCardNetworkResponse( + value = null, + statusCode = exception.code + ) + } + } +} diff --git a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/di/CommonWalletModule.kt b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/di/CommonWalletModule.kt index 5f0c1ba4d..338c93a98 100644 --- a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/di/CommonWalletModule.kt +++ b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/di/CommonWalletModule.kt @@ -40,6 +40,9 @@ import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import javax.inject.Singleton import jp.co.soramitsu.common.util.QrCodeDecoder +import jp.co.soramitsu.common_wallet.data.SoraCardNetworkClientImpl +import jp.co.soramitsu.oauth.network.SoraCardNetworkClient +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient @Module @InstallIn(SingletonComponent::class) @@ -50,4 +53,14 @@ class CommonWalletModule { fun provideQrCodeDecoder(@ApplicationContext context: Context): QrCodeDecoder { return QrCodeDecoder(context.contentResolver) } + + @Singleton + @Provides + fun provideSoraCardNetworkClient( + restClient: RestClient + ): SoraCardNetworkClient { + return SoraCardNetworkClientImpl( + restClient = restClient + ) + } } diff --git a/core_db/build.gradle.kts b/core_db/build.gradle.kts index de75fcfe1..2d5d2eaea 100644 --- a/core_db/build.gradle.kts +++ b/core_db/build.gradle.kts @@ -52,6 +52,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } class RoomSchemaArgProvider( @@ -82,9 +92,11 @@ dependencies { implementation(libs.roomKtxDep) ksp(libs.roomKaptDep) - androidTestImplementation(project(":test_shared")) androidTestImplementation(project(":test_data")) + androidTestImplementation(project(":android-foundation")) androidTestImplementation(libs.androidxTestExtJunitDep) androidTestImplementation(libs.androidxTestEspressoCoreDep) androidTestImplementation(libs.archCoreTestDep) + androidTestImplementation(libs.roomTestHelpersDep) + androidTestImplementation(libs.coroutineTestDep) } diff --git a/core_db/src/androidTest/java/jp/co/soramitsu/core_db/AssetDaoTests.kt b/core_db/src/androidTest/java/jp/co/soramitsu/core_db/AssetDaoTests.kt index 168e6c8da..f03729d4b 100644 --- a/core_db/src/androidTest/java/jp/co/soramitsu/core_db/AssetDaoTests.kt +++ b/core_db/src/androidTest/java/jp/co/soramitsu/core_db/AssetDaoTests.kt @@ -36,12 +36,12 @@ import android.content.Context import androidx.room.Room import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.core_db.dao.AssetDao import jp.co.soramitsu.core_db.model.FiatTokenPriceLocal import jp.co.soramitsu.core_db.model.TokenLocal import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.After diff --git a/demeter/build.gradle.kts b/demeter/build.gradle.kts index 7e1615eed..a31c0e04e 100644 --- a/demeter/build.gradle.kts +++ b/demeter/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -86,13 +96,11 @@ dependencies { implementation(libs.coroutineAndroidDep) implementation(libs.xsubstrateDep) - implementation(libs.xnetworkingDep) implementation(libs.composeRuntimeDep) implementation(libs.roomDep) implementation(libs.roomKtxDep) - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) } diff --git a/feature_account_api/build.gradle.kts b/feature_account_api/build.gradle.kts index d45f68576..b5c6473f6 100644 --- a/feature_account_api/build.gradle.kts +++ b/feature_account_api/build.gradle.kts @@ -52,6 +52,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { diff --git a/feature_account_impl/build.gradle.kts b/feature_account_impl/build.gradle.kts index c18dcf64e..3fdb2e59f 100644 --- a/feature_account_impl/build.gradle.kts +++ b/feature_account_impl/build.gradle.kts @@ -52,6 +52,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -75,5 +85,9 @@ dependencies { implementation(libs.coroutineDep) implementation(libs.viewmodelKtxDep) - testImplementation(project(":test_shared")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryImpl.kt b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryImpl.kt index 1b65f8215..b05d7c2ec 100644 --- a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryImpl.kt +++ b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryImpl.kt @@ -207,6 +207,7 @@ class CredentialsRepositoryImpl constructor( } override suspend fun generateJson(accounts: List, password: String): String { + val localGenesis = soraConfigManager.getGenesis(true) if (accounts.size == 1) { accounts.first().let { val seed = credentialsPrefs.retrieveSeed(it.substrateAddress) @@ -222,7 +223,7 @@ class CredentialsRepositoryImpl constructor( return jsonSeedEncoder.generate( account = exportAccountData, password = password, - genesisHash = soraConfigManager.getGenesis() + genesisHash = localGenesis, ) } } else { @@ -238,7 +239,7 @@ class CredentialsRepositoryImpl constructor( ) } - return jsonSeedEncoder.generate(accountsList, password, soraConfigManager.getGenesis()) + return jsonSeedEncoder.generate(accountsList, password, localGenesis) } } diff --git a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryTest.kt b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryTest.kt index 721ec5812..481398066 100644 --- a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryTest.kt +++ b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/CredentialsRepositoryTest.kt @@ -36,6 +36,7 @@ import io.mockk.every import io.mockk.just import io.mockk.mockkObject import io.mockk.runs +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.common.util.CryptoAssistant @@ -43,7 +44,6 @@ import jp.co.soramitsu.common.util.json_decoder.JsonAccountsEncoder import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsDatasource import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager -import jp.co.soramitsu.test_shared.MainCoroutineRule import jp.co.soramitsu.xcrypto.seed.Mnemonic import jp.co.soramitsu.xcrypto.seed.MnemonicCreator import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair diff --git a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryTest.kt b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryTest.kt index 144d5e548..339752f46 100644 --- a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryTest.kt +++ b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryTest.kt @@ -41,6 +41,7 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.mockkStatic import io.mockk.slot +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.CardHubType @@ -57,7 +58,6 @@ import jp.co.soramitsu.core_db.model.SoraAccountLocal import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsDatasource import jp.co.soramitsu.feature_account_api.domain.interfaces.UserDatasource import jp.co.soramitsu.feature_account_api.domain.model.OnboardingState -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flow diff --git a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/datasource/PrefsCredentialsDatasourceTest.kt b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/datasource/PrefsCredentialsDatasourceTest.kt index 525361b8f..37d9e8c08 100644 --- a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/datasource/PrefsCredentialsDatasourceTest.kt +++ b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/datasource/PrefsCredentialsDatasourceTest.kt @@ -33,9 +33,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_account_impl.data.repository.datasource import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.data.EncryptedPreferences import jp.co.soramitsu.common.data.SoraPreferences -import jp.co.soramitsu.test_shared.MainCoroutineRule import jp.co.soramitsu.xcrypto.util.toHexString import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair import kotlinx.coroutines.ExperimentalCoroutinesApi diff --git a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/datasource/PrefsUserDatasourceTest.kt b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/datasource/PrefsUserDatasourceTest.kt index 10f6924ad..a7ed86a82 100644 --- a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/datasource/PrefsUserDatasourceTest.kt +++ b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/datasource/PrefsUserDatasourceTest.kt @@ -33,10 +33,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_account_impl.data.repository.datasource import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.data.EncryptedPreferences import jp.co.soramitsu.common.data.SoraPreferences import jp.co.soramitsu.feature_account_api.domain.model.OnboardingState -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Before diff --git a/feature_assets_api/build.gradle.kts b/feature_assets_api/build.gradle.kts index a2fee241c..a24d325fe 100644 --- a/feature_assets_api/build.gradle.kts +++ b/feature_assets_api/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { diff --git a/feature_assets_impl/build.gradle.kts b/feature_assets_impl/build.gradle.kts index 9f686b6bd..30c2f9064 100644 --- a/feature_assets_impl/build.gradle.kts +++ b/feature_assets_impl/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -142,6 +152,10 @@ dependencies { } } - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryTest.kt index 0a5912f18..2fb919e8d 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryTest.kt @@ -35,6 +35,7 @@ package jp.co.soramitsu.feature_assets_impl.data import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal import java.math.BigInteger +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.CoroutineManager @@ -49,13 +50,12 @@ import jp.co.soramitsu.core_db.model.AssetTokenWithFiatLocal import jp.co.soramitsu.core_db.model.TokenLocal import jp.co.soramitsu.feature_assets_api.data.AssetsRepository import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager +import jp.co.soramitsu.feature_blockexplorer_api.data.models.SoraCurrency import jp.co.soramitsu.sora.substrate.models.ExtrinsicSubmitStatus import jp.co.soramitsu.sora.substrate.substrate.ExtrinsicManager import jp.co.soramitsu.sora.substrate.substrate.SubstrateCalls import jp.co.soramitsu.test_data.TestAssets import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraCurrency import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorTest.kt index 88c33ffc2..d94605259 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorTest.kt @@ -39,6 +39,7 @@ import io.mockk.junit4.MockKRule import io.mockk.mockkObject import io.mockk.mockkStatic import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.CoroutineManager @@ -59,7 +60,6 @@ import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import jp.co.soramitsu.sora.substrate.substrate.extrinsicHash import jp.co.soramitsu.test_data.TestAssets import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/QrCodeInteractorTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/QrCodeInteractorTest.kt index 380c0e62c..0106d840c 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/QrCodeInteractorTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/QrCodeInteractorTest.kt @@ -38,7 +38,6 @@ import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository import jp.co.soramitsu.feature_assets_api.domain.QrCodeInteractor import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Assert import org.junit.Before @@ -49,7 +48,6 @@ import org.mockito.junit.MockitoJUnitRunner import org.mockito.kotlin.given @RunWith(MockitoJUnitRunner::class) -@OptIn(ExperimentalCoroutinesApi::class) class QrCodeInteractorTest { private val soraAccount = SoraAccount("address", "name") diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/assetsettings/AssetSettingsViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/assetsettings/AssetSettingsViewModelTest.kt index 45626700f..4def8aeaf 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/assetsettings/AssetSettingsViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/assetsettings/AssetSettingsViewModelTest.kt @@ -37,6 +37,8 @@ import io.mockk.every import io.mockk.mockkObject import java.math.BigDecimal import java.util.Collections +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetHolder import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI @@ -52,8 +54,6 @@ import jp.co.soramitsu.test_data.TestTokens.valToken import jp.co.soramitsu.test_data.TestTokens.xorToken import jp.co.soramitsu.test_data.TestTokens.xstToken import jp.co.soramitsu.test_data.TestTokens.xstusdToken -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt index 631f959cd..35e12ccbd 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt @@ -47,6 +47,7 @@ import java.util.StringJoiner import jp.co.soramitsu.androidfoundation.format.Big100 import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset @@ -59,7 +60,6 @@ import jp.co.soramitsu.feature_assets_api.domain.QrCodeInteractor import jp.co.soramitsu.feature_assets_impl.presentation.screens.receiverequest.QRCodeFlowViewModel import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.test_data.TestAssets -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flow diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt index 2fa37351e..a3f1340dd 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/send/TransferAmountViewModelTest.kt @@ -43,6 +43,7 @@ import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.format.equalTo import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.util.NumbersFormatter @@ -53,7 +54,6 @@ import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.test_data.PolkaswapTestData import jp.co.soramitsu.test_data.TestAssets import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.advanceUntilIdle diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt index 9134e84db..eadbc06d7 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/txlist/AssetSettingsViewModelTest.kt @@ -40,6 +40,8 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.verify import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter @@ -48,8 +50,6 @@ import jp.co.soramitsu.feature_blockexplorer_api.domain.HistoryState import jp.co.soramitsu.feature_blockexplorer_api.domain.TransactionHistoryHandler import jp.co.soramitsu.test_data.TestAccounts import jp.co.soramitsu.test_data.TestTokens.xorToken -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf diff --git a/feature_blockexplorer_api/build.gradle.kts b/feature_blockexplorer_api/build.gradle.kts index ed876eb0d..9e518d531 100644 --- a/feature_blockexplorer_api/build.gradle.kts +++ b/feature_blockexplorer_api/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -112,8 +122,6 @@ dependencies { implementation(libs.daggerDep) kapt(libs.daggerKaptDep) - - testImplementation(project(":test_shared")) } kapt { diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt index 82ccc68cd..9d88314c0 100644 --- a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt @@ -46,79 +46,93 @@ import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.core_db.AppDatabase import jp.co.soramitsu.core_db.model.FiatTokenPriceLocal import jp.co.soramitsu.core_db.model.ReferralLocal -import jp.co.soramitsu.xnetworking.basic.common.Utils.toDoubleNan -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuNetworkClient -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuNetworkException -import jp.co.soramitsu.xnetworking.sorawallet.blockexplorerinfo.SoraWalletBlockExplorerInfo -import jp.co.soramitsu.xnetworking.sorawallet.blockexplorerinfo.sbapy.SbApyInfo +import jp.co.soramitsu.xnetworking.lib.datasources.blockexplorer.api.BlockExplorerRepository +import jp.co.soramitsu.xnetworking.lib.datasources.blockexplorer.api.models.Apy +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.models.RestClientException +import jp.co.soramitsu.xnetworking.lib.engines.utils.JsonGetRequest import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import kotlinx.serialization.json.Json -import kotlinx.serialization.serializer + +fun String.toDoubleNan(): Double? = this.toDoubleOrNull()?.let { + if (it.isNaN()) null else it +} @Singleton class BlockExplorerManager @Inject constructor( - private val info: SoraWalletBlockExplorerInfo, + private val restClient: RestClient, + private val info: BlockExplorerRepository, private val db: AppDatabase, private val appStateProvider: AppStateProvider, - private val networkClient: SoramitsuNetworkClient, private val soraConfigManager: SoraConfigManager, ) { - private val tempApy = mutableListOf() + private val tempApy = mutableListOf() private var assetsInfo: List>? = null private val mutexFiat = Mutex() - fun getTempApy(id: String) = tempApy.find { - it.id == id - }?.sbApy?.times(100) + fun getTempApy(id: String) = tempApy.find { it.id == id }?.value?.toDoubleNan() + ?.times(100) - suspend fun getTokensLiquidity(tokenIds: List): List> = - assetsInfo ?: mutexFiat.withLock { - assetsInfo ?: getAssetsInfoInternal(tokenIds).also { - assetsInfo = it + suspend fun getTokensLiquidity(tokenIds: List): List> { + if (assetsInfo == null) { + mutexFiat.withLock { + if (assetsInfo == null) { + assetsInfo = getAssetsInfoInternal(tokenIds) + } } } - private suspend fun getAssetsInfoInternal(tokenIds: List): List> = - runCatching { + return checkNotNull(assetsInfo) + } + + private suspend fun getAssetsInfoInternal(tokenIds: List): List> { + return runCatching { val selected = soraConfigManager.getSelectedCurrency() val tokens = db.assetDao().getFiatTokenPriceLocal(selected.code) val yesterdayHour = yesterday() val resultList = mutableListOf>() val fiats = mutableListOf() + RetryStrategyBuilder.build().retryIf( retries = 3, - predicate = { t -> t is SoramitsuNetworkException }, - block = { info.getAssetsInfo(tokenIds, yesterdayHour) }, + predicate = { t -> t is RestClientException }, + block = { info.getAssetsInfo(soraConfigManager.getGenesis(), tokenIds, yesterdayHour.toInt()) }, ).forEach { assetInfo -> - val dbValue = tokens.find { it.tokenIdFiat == assetInfo.tokenId } - val delta = assetInfo.hourDelta + val dbValue = tokens.find { it.tokenIdFiat == assetInfo.id } + val delta = assetInfo.previousPrice + if (dbValue != null && delta != null) { - fiats.add( - dbValue.copy( - fiatChange = delta / 100.0, - fiatPricePrevHTime = yesterdayHour, - ) + fiats += dbValue.copy( + fiatChange = delta / 100.0, + fiatPricePrevHTime = yesterdayHour, ) } - dbValue?.tokenIdFiat?.let { tokenId -> - db.assetDao().getPrecisionOfToken(tokenId)?.let { precision -> - assetInfo.liquidity.toBigIntegerOrNull()?.let { mapBalance(it, precision) }?.let { supply -> - val tvl = supply.times(BigDecimal(dbValue.fiatPrice)) - resultList.add(assetInfo.tokenId to tvl.toDoubleInfinite()) - } - } - } + + val precision = db.assetDao().getPrecisionOfToken( + tokenId = dbValue?.tokenIdFiat ?: return@forEach + ) ?: return@forEach + + val supply = assetInfo.liquidity.toBigIntegerOrNull()?.let { + mapBalance(it, precision) + } ?: return@forEach + + resultList += Pair( + first = assetInfo.id, + second = supply.times(BigDecimal(dbValue.fiatPrice)) + .toDoubleInfinite() + ) } + db.assetDao().insertFiatPrice(fiats) resultList }.getOrElse { FirebaseWrapper.recordException(it) emptyList() } + } suspend fun updatePoolsSbApy() { updateSbApyInternal() @@ -127,41 +141,42 @@ class BlockExplorerManager @Inject constructor( suspend fun updateFiat() { if (appStateProvider.isForeground) { runCatching { - val response = info.getFiat() - updateFiatPrices(response.map { FiatInfo(it.id, it.priceUsd) }) + updateFiatPrices( + fiatData = info.getFiat(soraConfigManager.getGenesis()).map { + FiatInfo(it.id, it.priceUSD.toDoubleNan()) + } + ) } } } - suspend fun updateReferrerRewards( - address: String, - ) { + suspend fun updateReferrerRewards(address: String) { runCatching { - val response = info.getReferrerRewards(address) - response.rewards.map { + val rewards = info.getReferralReward(soraConfigManager.getGenesis(), address).map { ReferralLocal(it.referral, it.amount) } - } - .onSuccess { - db.withTransaction { - db.referralsDao().clearTable() - db.referralsDao().insertReferrals(it) - } - } - .onFailure { - FirebaseWrapper.recordException(it) + + db.withTransaction { + db.referralsDao().clearTable() + db.referralsDao().insertReferrals(rewards) } + }.onFailure { + FirebaseWrapper.recordException(it) + } } suspend fun getXorPerEurRatio(): Double? = runCatching { - val json = networkClient.get(BuildConfigWrapper.soraCardEuroRateUrl) - val soraCoin = Json.decodeFromString(serializer(), json) - soraCoin.price.toDoubleNan() + restClient.get( + request = JsonGetRequest( + url = BuildConfigWrapper.soraCardEuroRateUrl, + responseDeserializer = SoraCoin.serializer() + ) + ).price.toDoubleNan() }.getOrNull() private suspend fun updateSbApyInternal() { runCatching { - val response = info.getSpApy() + val response = info.getApy(soraConfigManager.getGenesis()) tempApy.clear() tempApy.addAll(response) } diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/SoraConfigManager.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/SoraConfigManager.kt index cfa6e7fbd..3386edb6d 100644 --- a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/SoraConfigManager.kt +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/SoraConfigManager.kt @@ -34,51 +34,204 @@ package jp.co.soramitsu.feature_blockexplorer_api.data import javax.inject.Inject import javax.inject.Singleton +import jp.co.soramitsu.androidfoundation.format.addHexPrefix +import jp.co.soramitsu.androidfoundation.format.removeHexPrefix import jp.co.soramitsu.common.data.SoraPreferences -import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraConfig -import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraConfigNode -import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraCurrency -import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraRemoteConfigBuilder +import jp.co.soramitsu.common.domain.OptionsProvider +import jp.co.soramitsu.common.util.CachingFactory +import jp.co.soramitsu.feature_blockexplorer_api.data.models.ConfigExplorerType +import jp.co.soramitsu.feature_blockexplorer_api.data.models.SoraConfig +import jp.co.soramitsu.feature_blockexplorer_api.data.models.SoraConfigNode +import jp.co.soramitsu.feature_blockexplorer_api.data.models.SoraCurrency +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient +import jp.co.soramitsu.xnetworking.lib.engines.utils.JsonGetRequest +import kotlinx.serialization.DeserializationStrategy +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.json.Json @Singleton class SoraConfigManager @Inject constructor( - private val remoteConfigBuilder: SoraRemoteConfigBuilder, + private val json: Json, + private val restClient: RestClient, private val soraPreferences: SoraPreferences, ) { - companion object { - private const val SELECTED_CURRENCY = "selected_currency" - private val default = SoraCurrency("USD", "United States Dollar", "$") + private companion object { + const val SELECTED_CURRENCY = "selected_currency" + + val DEFAULT_SORA_CURRENCY = SoraCurrency( + code = "USD", + name = "United States Dollar", + sign = "$" + ) } - private suspend fun getConfig(): SoraConfig? = remoteConfigBuilder.getConfig() + private object EmptyArgs : CachingFactory.Args() + + private val soraConfigFactory = CachingFactory { + val commonConfig = tryLoadSaveRecoverMap( + url = { OptionsProvider.configCommon }, + nameToSaveWith = { "commonConfig" }, + deserializer = { ConfigDto.serializer() } + ) ?: return@CachingFactory null + + val mobileConfig = tryLoadSaveRecoverMap( + url = { OptionsProvider.configMobile }, + nameToSaveWith = { "mobileConfig" }, + deserializer = { MobileDto.serializer() } + ) ?: return@CachingFactory null + + val blockExplorerType = ConfigExplorerType( + fiat = mobileConfig.explorerTypeFiat, + reward = mobileConfig.explorerTypeReward, + sbapy = mobileConfig.explorerTypeSbapy, + assets = mobileConfig.explorerTypeAssets, + ) + + val nodes = commonConfig.nodes.map { nodeInfo -> + SoraConfigNode( + chain = nodeInfo.chain, + name = nodeInfo.name, + address = nodeInfo.address, + ) + } - suspend fun getNodes(): List { - return getConfig()?.nodes ?: emptyList() + val currencies = mobileConfig.currencies.map { currencyDto -> + SoraCurrency( + code = currencyDto.code, + name = currencyDto.name, + sign = currencyDto.sign, + ) + } + + return@CachingFactory SoraConfig( + blockExplorerUrl = commonConfig.subquery, + blockExplorerType = blockExplorerType, + nodes = nodes, + genesis = commonConfig.genesis, + joinUrl = mobileConfig.joinLink, + substrateTypesUrl = mobileConfig.substrateTypesAndroid, + soracard = mobileConfig.soracard, + currencies = currencies + ) } - suspend fun getSoraCard(): Boolean = - getConfig()?.soracard ?: false + private suspend inline fun tryLoadSaveRecoverMap( + url: () -> String, + nameToSaveWith: () -> String, + deserializer: () -> DeserializationStrategy + ): T? { + val result = runCatching { + restClient.getReturnString( + JsonGetRequest( + url = url(), + responseDeserializer = String.serializer() + ) + ) + }.onSuccess { configAsString -> + soraPreferences.putString( + field = nameToSaveWith(), + value = configAsString + ) + }.recoverCatching { + soraPreferences.getString( + field = nameToSaveWith() + ) + }.mapCatching { configAsString -> + json.decodeFromString( + deserializer = deserializer(), + string = configAsString + ) + }.getOrNull() - suspend fun getGenesis(): String = getConfig()?.genesis.orEmpty() + return result + } + + suspend fun getNodes(): List = + soraConfigFactory.nullableValue(EmptyArgs) + ?.nodes ?: emptyList() - suspend fun getInviteLink(): String = getConfig()?.joinUrl.orEmpty() + suspend fun getSoraCard(): Boolean = + soraConfigFactory.nullableValue(EmptyArgs) + ?.soracard ?: false - suspend fun getSubstrateTypesUrl(): String = getConfig()?.substrateTypesUrl.orEmpty() + suspend fun getGenesis(prefix: Boolean = false): String = + soraConfigFactory.nullableValue(EmptyArgs) + ?.genesis.orEmpty().removeHexPrefix().let { if (prefix) it.addHexPrefix() else it } - private suspend fun getCurrencies(): List = - getConfig()?.currencies ?: listOf(default) + suspend fun getInviteLink(): String = + soraConfigFactory.nullableValue(EmptyArgs) + ?.joinUrl.orEmpty() - private var selectedCurrency: SoraCurrency? = null + suspend fun getSubstrateTypesUrl(): String = + soraConfigFactory.nullableValue(EmptyArgs) + ?.substrateTypesUrl.orEmpty() - suspend fun getSelectedCurrency() = selectedCurrency ?: getSelectedCurrencyInternal().also { - selectedCurrency = it + private suspend fun getCurrencies(): List = + soraConfigFactory.nullableValue(EmptyArgs) + ?.currencies ?: listOf(DEFAULT_SORA_CURRENCY) + + private val selectedCurrencyFactory = CachingFactory { + val selectedCurrency = getCurrencies().find { + it.code == soraPreferences.getString(SELECTED_CURRENCY).ifEmpty { "USD" } + } + return@CachingFactory selectedCurrency ?: DEFAULT_SORA_CURRENCY } - private suspend fun getSelectedCurrencyInternal(): SoraCurrency = getCurrencies().find { - it.code == ( - soraPreferences.getString(SELECTED_CURRENCY).takeIf { pref -> pref.isNotEmpty() } - ?: "USD" - ) - } ?: default + suspend fun getSelectedCurrency() = + selectedCurrencyFactory.value(EmptyArgs) } + +@Serializable +private data class ConfigDto( + @SerialName("SUBQUERY_ENDPOINT") + val subquery: String, + @SerialName("DEFAULT_NETWORKS") + val nodes: List, + @SerialName("CHAIN_GENESIS_HASH") + val genesis: String, +) + +@Serializable +private data class NodeInfo( + @SerialName("chain") + val chain: String, + @SerialName("name") + val name: String, + @SerialName("address") + val address: String, +) + +@Serializable +private data class MobileDto( + @SerialName("explorer_type_fiat") + val explorerTypeFiat: String, + @SerialName("explorer_type_sbapy") + val explorerTypeSbapy: String, + @SerialName("explorer_type_reward") + val explorerTypeReward: String, + @SerialName("explorer_type_assets") + val explorerTypeAssets: String, + @SerialName("join_link") + val joinLink: String, + @SerialName("substrate_types_android") + val substrateTypesAndroid: String, + @SerialName("substrate_types_ios") + val substrateTypesIos: String, + @SerialName("soracard") + val soracard: Boolean = false, + @SerialName("currencies") + val currencies: List, +) + +@Serializable +private data class CurrencyDto( + @SerialName("code") + val code: String, + @SerialName("name") + val name: String, + @SerialName("sign") + val sign: String, +) diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/models/SoraConfig.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/models/SoraConfig.kt new file mode 100644 index 000000000..bb16de167 --- /dev/null +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/models/SoraConfig.kt @@ -0,0 +1,31 @@ +package jp.co.soramitsu.feature_blockexplorer_api.data.models + +data class SoraConfig( + val blockExplorerUrl: String, + val blockExplorerType: ConfigExplorerType, + val nodes: List, + val genesis: String, + val joinUrl: String, + val substrateTypesUrl: String, + val soracard: Boolean, + val currencies: List, +) + +data class SoraConfigNode( + val chain: String, + val name: String, + val address: String, +) + +data class SoraCurrency( + val code: String, + val name: String, + val sign: String, +) + +data class ConfigExplorerType( + val fiat: String, + val reward: String, + val sbapy: String, + val assets: String, +) diff --git a/feature_blockexplorer_impl/build.gradle.kts b/feature_blockexplorer_impl/build.gradle.kts index a07190e50..c39d27dc1 100644 --- a/feature_blockexplorer_impl/build.gradle.kts +++ b/feature_blockexplorer_impl/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -115,6 +125,11 @@ dependencies { implementation(libs.daggerDep) kapt(libs.daggerKaptDep) - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) + testImplementation(libs.truthDep) } diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt index 754571ebb..021151f3a 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt @@ -37,6 +37,7 @@ import javax.inject.Singleton import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Token +import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.feature_blockexplorer_api.data.TransactionHistoryRepository import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transaction import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.TransactionStatus @@ -44,16 +45,19 @@ import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transact import jp.co.soramitsu.sora.substrate.runtime.Pallete import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import jp.co.soramitsu.sora.substrate.substrate.ExtrinsicManager -import jp.co.soramitsu.xnetworking.basic.txhistory.TxHistoryItem -import jp.co.soramitsu.xnetworking.sorawallet.txhistory.client.SubQueryClientForSoraWallet +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.TxHistoryRepository +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.models.ChainInfo +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.models.TxFilter +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.models.TxHistoryItem import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.debounce @OptIn(ExperimentalCoroutinesApi::class) @Singleton class TransactionHistoryRepositoryImpl @Inject constructor( - private val subQueryClient: SubQueryClientForSoraWallet, + private val txHistoryRepository: TxHistoryRepository, extrinsicManager: ExtrinsicManager, + private val soraConfigManager: SoraConfigManager, ) : TransactionHistoryRepository { init { @@ -69,7 +73,7 @@ class TransactionHistoryRepositoryImpl @Inject constructor( } override suspend fun getContacts(query: String): Set = - subQueryClient.getTransactionPeers(query).toSet() + txHistoryRepository.getTransactionPeers(query, soraConfigManager.getGenesis()).toSet() private fun updateTransactionStatus(txHash: String, status: Boolean, block: String?) { localPendingTransactions[txHash]?.base?.status = @@ -84,14 +88,21 @@ class TransactionHistoryRepositoryImpl @Inject constructor( count: Int, filterTokenId: String?, ): List { - val tx = subQueryClient.getTransactionHistoryCached( + val tx = txHistoryRepository.getTransactionHistoryCached( + count = count, + address = soraAccount.substrateAddress, + chainId = soraConfigManager.getGenesis(), + ).filter { + if (filterTokenId != null) + return@filter isReferral(it, filterTokenId) + + return@filter true + } + val mapped = mapHistoryItemsToTransactions( + tx, soraAccount.substrateAddress, - count, - filter = if (filterTokenId == null) null else { r -> - filterHistoryItem(r, filterTokenId) - } + tokens ) - val mapped = mapHistoryItemsToTransactions(tx, soraAccount.substrateAddress, tokens) return buildList { addAll(filterLocalPendingTx(filterTokenId)) addAll(mapped) @@ -103,9 +114,10 @@ class TransactionHistoryRepositoryImpl @Inject constructor( tokens: List, soraAccount: SoraAccount ): Transaction? { - val tx = subQueryClient.getTransactionCached( + val tx = txHistoryRepository.getTransactionCached( address = soraAccount.substrateAddress, - txHash = txHash + txHash = txHash, + chainId = soraConfigManager.getGenesis(), ) val transaction = mapHistoryItemsToTransactions( @@ -124,26 +136,37 @@ class TransactionHistoryRepositoryImpl @Inject constructor( filterTokenId: String?, ): TransactionsInfo { val historyInfo = - subQueryClient.getTransactionHistoryPaged( + txHistoryRepository.getTransactionHistoryPaged( address = soraAccount.substrateAddress, page = page, - filter = if (filterTokenId == null) null else { r -> - filterHistoryItem(r, filterTokenId) - }, + chainInfo = ChainInfo.Simple("SoraChainId"), + pageCount = 100, + filters = TxFilter.entries.toSet() ) - val transactions = historyInfo?.items?.let { - mapHistoryItemsToTransactions(it, soraAccount.substrateAddress, tokens) - }.orEmpty() + val referralTransactions = historyInfo.items + .filter { item -> + if (filterTokenId != null) + return@filter isReferral(item, filterTokenId) + + return@filter true + }.let { item -> + mapHistoryItemsToTransactions( + item, + soraAccount.substrateAddress, + tokens + ) + } + val filtered = localPendingTransactions.filter { transactionLocal -> - transactions.find { transaction -> transaction.base.txHash == transactionLocal.key } == null + referralTransactions.find { transaction -> transaction.base.txHash == transactionLocal.key } == null } localPendingTransactions.clear() localPendingTransactions.putAll(filtered) return TransactionsInfo( buildList { if (page == 1L) addAll(filterLocalPendingTx(filterTokenId).sortedByDescending { it.base.timestamp }) - addAll(transactions) + addAll(referralTransactions) }, historyInfo?.endReached ?: true, historyInfo?.errorMessage, @@ -157,23 +180,22 @@ class TransactionHistoryRepositoryImpl @Inject constructor( _state.set(true) } - private fun filterHistoryItem(item: TxHistoryItem, tokenId: String): Boolean { - return ( + private fun isReferral(item: TxHistoryItem, tokenId: String): Boolean { + val hasTokenIdInMainParams = item.data?.find { it.paramValue == tokenId } != null - ) || ( + + val hasTokenIdInNestedParams = item.nestedData?.find { nested -> - nested.data.find { - it.paramValue == tokenId - } != null + nested.data.find { it.paramValue == tokenId } != null } != null - ) || ( - tokenId == SubstrateOptionsProvider.feeAssetId && item.module.equals( - Pallete.Referrals.palletName, - true - ) - ) + + val usedInReferralModule = + tokenId == SubstrateOptionsProvider.feeAssetId && + item.module.equals(Pallete.Referrals.palletName, true) + + return hasTokenIdInMainParams || hasTokenIdInNestedParams || usedInReferralModule } private fun filterLocalPendingTx(tokenId: String?): Collection = diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionMapper.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionMapper.kt index 6879db463..fae140509 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionMapper.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionMapper.kt @@ -50,8 +50,8 @@ import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transact import jp.co.soramitsu.sora.substrate.runtime.Method import jp.co.soramitsu.sora.substrate.runtime.Pallete import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider -import jp.co.soramitsu.xnetworking.basic.txhistory.TxHistoryItem -import jp.co.soramitsu.xnetworking.basic.txhistory.TxHistoryItemParam +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.models.TxHistoryItem +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.models.TxHistoryItemParam fun mapHistoryItemsToTransactions( txs: List, diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/di/FeatureBlockExplorerModule.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/di/FeatureBlockExplorerModule.kt index ccfec622d..afd2d7198 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/di/FeatureBlockExplorerModule.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/di/FeatureBlockExplorerModule.kt @@ -32,9 +32,11 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_blockexplorer_impl.di +import android.content.Context 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 import jp.co.soramitsu.feature_blockexplorer_api.data.TransactionHistoryRepository @@ -45,11 +47,38 @@ import jp.co.soramitsu.feature_blockexplorer_impl.data.TransactionHistoryReposit import jp.co.soramitsu.feature_blockexplorer_impl.domain.TransactionBuilderImpl import jp.co.soramitsu.feature_blockexplorer_impl.domain.TransactionHistoryHandlerImpl import jp.co.soramitsu.feature_blockexplorer_impl.presentation.txhistory.TransactionMappersImpl +import jp.co.soramitsu.xnetworking.lib.datasources.chainsconfig.api.ConfigDAO +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.HistoryItemsFilter +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.TxHistoryRepository +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.models.TxHistoryItem +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.impl.TxHistoryRepositoryImpl +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.impl.builder.ExpectActualDBDriverFactory +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient @Module @InstallIn(SingletonComponent::class) class FeatureBlockExplorerModule { + private companion object { + const val txHistoryDBName = "historyDatabase.db" + } + + @Singleton + @Provides + fun provideTxHistoryRepository( + @ApplicationContext context: Context, + configDAO: ConfigDAO, + restClient: RestClient, + ): TxHistoryRepository = TxHistoryRepositoryImpl( + databaseDriverFactory = ExpectActualDBDriverFactory(context, txHistoryDBName), + configDAO = configDAO, + restClient = restClient, + historyItemsFilter = object : HistoryItemsFilter { + override fun List.filterCachedHistoryItems(): List = this + override fun List.filterPagedHistoryItems(): List = this + } + ) + @Singleton @Provides fun provideTransactionHistoryRepository( diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryTest.kt index 355343ec2..02e57a327 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryTest.kt @@ -40,14 +40,15 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.mockkStatic import io.mockk.verify +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.feature_blockexplorer_api.data.TransactionHistoryRepository import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transaction import jp.co.soramitsu.feature_blockexplorer_impl.testdata.TestTransactions import jp.co.soramitsu.sora.substrate.substrate.ExtrinsicManager import jp.co.soramitsu.test_data.TestAccounts import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.xnetworking.sorawallet.txhistory.client.SubQueryClientForSoraWallet +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.TxHistoryRepository import junit.framework.TestCase.assertEquals import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest @@ -74,7 +75,10 @@ class TransactionHistoryRepositoryTest { val mockkRule = MockKRule(this) @MockK - private lateinit var subQueryClient: SubQueryClientForSoraWallet + private lateinit var txHistoryRepository: TxHistoryRepository + + @MockK + private lateinit var soraConfigManager: SoraConfigManager @MockK private lateinit var extrinsicManager: ExtrinsicManager @@ -89,15 +93,31 @@ class TransactionHistoryRepositoryTest { fun setUp() = runTest { mockkStatic(Uri::parse) every { Uri.parse(any()) } returns mockedUri - every { extrinsicManager.setWatchingExtrinsicListener(any()) } returns Unit - every { subQueryClient.getTransactionPeers("query") } returns peersList + every { + extrinsicManager.setWatchingExtrinsicListener( + listener = any() + ) + } returns Unit + coEvery { soraConfigManager.getGenesis() } returns "7e4e" + every { + txHistoryRepository.getTransactionPeers( + query = "query", + chainId = "7e4e", + ) + } returns peersList + coEvery { - subQueryClient.getTransactionHistoryCached(TestAccounts.soraAccount.substrateAddress, 1, null) + txHistoryRepository.getTransactionHistoryCached( + address = TestAccounts.soraAccount.substrateAddress, + count = 1, + chainId = "7e4e", + ) } returns listOf(TestTransactions.txHistoryItem) transactionHistoryRepository = TransactionHistoryRepositoryImpl( - subQueryClient, - extrinsicManager + txHistoryRepository, + extrinsicManager, + soraConfigManager, ) } diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt index 5a54f1c0a..f3bd94b01 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt @@ -35,6 +35,8 @@ package jp.co.soramitsu.feature_blockexplorer_impl.domain import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.androidfoundation.format.unsafeCast import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.test import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI @@ -53,8 +55,6 @@ import jp.co.soramitsu.feature_blockexplorer_impl.presentation.txhistory.Transac import jp.co.soramitsu.feature_blockexplorer_impl.testdata.TestTransactions import jp.co.soramitsu.test_data.TestAccounts import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.test import junit.framework.TestCase.assertEquals import junit.framework.TestCase.assertTrue import kotlinx.coroutines.CoroutineDispatcher diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/screen/ActivitiesViewModelTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/screen/ActivitiesViewModelTest.kt index f64598f39..65f4982b2 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/screen/ActivitiesViewModelTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/screen/ActivitiesViewModelTest.kt @@ -33,6 +33,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_blockexplorer_impl.presentation.screen import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_blockexplorer_api.domain.HistoryState @@ -40,7 +41,6 @@ import jp.co.soramitsu.feature_blockexplorer_api.domain.TransactionHistoryHandle import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.test_data.TestAccounts -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt index 537804e37..28e171414 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/presentation/txdetails/TxDetailsViewModelTest.kt @@ -41,6 +41,8 @@ import io.mockk.verify import java.util.Date import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI @@ -58,8 +60,6 @@ import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.test_data.TestAccounts import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import junit.framework.TestCase.assertEquals import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/testdata/TestTransactions.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/testdata/TestTransactions.kt index 4ea0e0eae..4fa54d5be 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/testdata/TestTransactions.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/testdata/TestTransactions.kt @@ -41,8 +41,8 @@ import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transact import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.TransactionTransferType import jp.co.soramitsu.test_data.TestAccounts import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.xnetworking.basic.txhistory.TxHistoryItem -import jp.co.soramitsu.xnetworking.basic.txhistory.TxHistoryItemParam +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.models.TxHistoryItem +import jp.co.soramitsu.xnetworking.lib.datasources.txhistory.api.models.TxHistoryItemParam object TestTransactions { val txHistoryItem = TxHistoryItem( diff --git a/feature_ecosystem_impl/build.gradle.kts b/feature_ecosystem_impl/build.gradle.kts index ecc6f0a2a..daf26999c 100644 --- a/feature_ecosystem_impl/build.gradle.kts +++ b/feature_ecosystem_impl/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -124,6 +134,10 @@ dependencies { debugImplementation(libs.composeToolingDep) implementation(libs.navigationComposeDep) - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt b/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt index 182e000ab..6d57dd38c 100644 --- a/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt +++ b/feature_ecosystem_impl/src/test/java/jp/co/soramitsu/feature_ecosystem_impl/explore/ExploreViewModelTest.kt @@ -39,6 +39,7 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.verify import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.demeter.domain.DemeterFarmingBasicPool import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor @@ -52,7 +53,6 @@ import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter import jp.co.soramitsu.test_data.PolkaswapTestData.BASIC_POOL_DATA import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest diff --git a/feature_ethereum_api/build.gradle.kts b/feature_ethereum_api/build.gradle.kts index e23525987..d996d7ae3 100644 --- a/feature_ethereum_api/build.gradle.kts +++ b/feature_ethereum_api/build.gradle.kts @@ -61,6 +61,4 @@ dependencies { implementation(libs.coroutineAndroidDep) implementation(libs.coroutineDep) - - testImplementation(project(":test_shared")) } diff --git a/feature_main_impl/build.gradle.kts b/feature_main_impl/build.gradle.kts index 433f5a3cb..bd95d5a4d 100644 --- a/feature_main_impl/build.gradle.kts +++ b/feature_main_impl/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -134,6 +144,10 @@ dependencies { implementation(libs.insetterDep) - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractorTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractorTest.kt index e8e0a59ab..56ad8be40 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractorTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractorTest.kt @@ -32,12 +32,12 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_main_impl.domain +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.IrohaData import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletRepository -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModelTest.kt index b28aef749..6dfd2e966 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModelTest.kt @@ -35,6 +35,8 @@ package jp.co.soramitsu.feature_main_impl.presentation import androidx.arch.core.executor.testing.InstantTaskExecutorRule import io.mockk.every import io.mockk.mockkObject +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.RepeatStrategy import jp.co.soramitsu.common.domain.RepeatStrategyBuilder @@ -46,8 +48,6 @@ import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsUpdateSubscr import jp.co.soramitsu.feature_select_node_api.NodeManager import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.test_data.TestAccounts -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flowOf diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt index fcca07bbf..9bab13bb9 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/language/SelectLanguageViewModelTest.kt @@ -34,11 +34,11 @@ package jp.co.soramitsu.feature_main_impl.presentation.language import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.resourses.Language import jp.co.soramitsu.feature_main_impl.domain.MainInteractor -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt index 528aa04ca..6bb03ce85 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModelTest.kt @@ -34,6 +34,7 @@ package jp.co.soramitsu.feature_main_impl.presentation.pincode import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.interfaces.WithProgress @@ -44,7 +45,6 @@ import jp.co.soramitsu.feature_main_impl.domain.MainInteractor import jp.co.soramitsu.feature_main_impl.domain.PinCodeInteractor import jp.co.soramitsu.feature_select_node_api.SelectNodeRouter import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flowOf diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt index d878700f3..09a47e976 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt @@ -41,6 +41,8 @@ import io.mockk.just import io.mockk.runs import io.mockk.verify import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.domain.ChainNode import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager @@ -56,8 +58,6 @@ import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow import jp.co.soramitsu.test_data.SoraCardTestData.soraCardBasicStatusTest -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import junit.framework.TestCase.assertEquals import junit.framework.TestCase.assertNotNull import kotlinx.coroutines.ExperimentalCoroutinesApi diff --git a/feature_multiaccount_api/build.gradle.kts b/feature_multiaccount_api/build.gradle.kts index 7eb301658..eeb436ecc 100644 --- a/feature_multiaccount_api/build.gradle.kts +++ b/feature_multiaccount_api/build.gradle.kts @@ -52,6 +52,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { diff --git a/feature_multiaccount_impl/build.gradle.kts b/feature_multiaccount_impl/build.gradle.kts index 6d05f2efe..c0dc4dee6 100644 --- a/feature_multiaccount_impl/build.gradle.kts +++ b/feature_multiaccount_impl/build.gradle.kts @@ -67,6 +67,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -127,5 +137,9 @@ dependencies { implementation(libs.hiltNavComposeDep) kapt(libs.daggerKaptDep) - testImplementation(project(":test_shared")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt index e8b428241..35f3f9535 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/backup/BackupViewModel.kt @@ -38,12 +38,12 @@ import androidx.lifecycle.viewModelScope import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import jp.co.soramitsu.androidfoundation.format.addHexPrefix import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.presentation.compose.components.initMediumTitle2 import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel -import jp.co.soramitsu.common.util.ext.addHexPrefix import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.R import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt index 6c36cdbe5..3472aedc3 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt @@ -35,6 +35,7 @@ package jp.co.soramitsu.feature_multiaccount_impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.navigation.NavController import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.domain.CoroutineManager @@ -44,7 +45,6 @@ import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.OnboardingViewModel import jp.co.soramitsu.feature_multiaccount_impl.presentation.RecoveryState import jp.co.soramitsu.feature_multiaccount_impl.presentation.RecoveryType -import jp.co.soramitsu.test_shared.MainCoroutineRule import jp.co.soramitsu.ui_core.component.input.InputTextState import jp.co.soramitsu.xbackup.BackupService import kotlinx.coroutines.ExperimentalCoroutinesApi diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/domain/MultiaccountInteractorTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/domain/MultiaccountInteractorTest.kt index 13edd7119..4da933834 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/domain/MultiaccountInteractorTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/domain/MultiaccountInteractorTest.kt @@ -39,6 +39,7 @@ import io.mockk.coVerify import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.mockk +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.io.FileManager import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository @@ -46,7 +47,6 @@ import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_account_api.domain.model.OnboardingState import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletRepository import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager -import jp.co.soramitsu.test_shared.MainCoroutineRule import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt index 78ab01752..08e06ebdd 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt @@ -39,6 +39,8 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.navigation.NavController import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.CoroutineManager @@ -46,8 +48,6 @@ import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.account_details.AccountDetailsViewModel import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.model.AccountDetailsScreenState -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import jp.co.soramitsu.ui_core.component.input.InputTextState import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbarType import jp.co.soramitsu.xbackup.BackupService diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_list/AccountListViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_list/AccountListViewModelTest.kt index df724bfbd..6dd984737 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_list/AccountListViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_list/AccountListViewModelTest.kt @@ -35,6 +35,8 @@ package jp.co.soramitsu.feature_multiaccount_impl.export.account_list import android.graphics.drawable.PictureDrawable import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.account.SoraAccount @@ -43,8 +45,6 @@ import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.account_list.AccountListViewModel import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.model.AccountListScreenState import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.model.ExportAccountData -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbarType import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flow diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt index 8a923e15d..bf344973c 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/BackupViewModelTest.kt @@ -35,15 +35,14 @@ package jp.co.soramitsu.feature_multiaccount_impl.export.backup import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R as commonR -import jp.co.soramitsu.common.util.ext.addHexPrefix import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.backup.BackupViewModel import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.model.BackupScreenState import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.protection.ExportProtectionViewModel -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbarType import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest @@ -134,7 +133,7 @@ class BackupViewModelTest { fun backupPressedWithSeed() { setUp(ExportProtectionViewModel.Type.SEED) viewModel.backupPressed() - verify(clipboardManager).addToClipboard(seed.addHexPrefix()) + verify(clipboardManager).addToClipboard("0x$seed") viewModel.copiedToast.getOrAwaitValue() } diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/json/BackupJsonViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/json/BackupJsonViewModelTest.kt index cf6db6158..54d9ea582 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/json/BackupJsonViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/backup/json/BackupJsonViewModelTest.kt @@ -35,12 +35,12 @@ package jp.co.soramitsu.feature_multiaccount_impl.export.backup.json import android.net.Uri import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.R import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.backup.json.BackupJsonViewModel import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.model.BackupJsonScreenState -import jp.co.soramitsu.test_shared.MainCoroutineRule import jp.co.soramitsu.ui_core.component.input.InputTextState import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/protection/ExportProtectionViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/protection/ExportProtectionViewModelTest.kt index 22d0bdd46..6fb2a5824 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/protection/ExportProtectionViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/protection/ExportProtectionViewModelTest.kt @@ -33,9 +33,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_multiaccount_impl.export.protection import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.protection.ExportProtectionViewModel -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Assert.assertFalse diff --git a/feature_polkaswap_api/build.gradle.kts b/feature_polkaswap_api/build.gradle.kts index fcd7a6446..3957a7d9c 100644 --- a/feature_polkaswap_api/build.gradle.kts +++ b/feature_polkaswap_api/build.gradle.kts @@ -52,6 +52,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { diff --git a/feature_polkaswap_impl/build.gradle.kts b/feature_polkaswap_impl/build.gradle.kts index b33f6fc35..c52473545 100644 --- a/feature_polkaswap_impl/build.gradle.kts +++ b/feature_polkaswap_impl/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -133,6 +143,10 @@ dependencies { debugImplementation(libs.composeToolingDep) implementation(libs.navigationComposeDep) - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorTest.kt index cb0baa360..bbf99e1c0 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorTest.kt @@ -34,6 +34,7 @@ package jp.co.soramitsu.feature_polkaswap_impl.domain import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common_wallet.domain.model.WithDesired import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository @@ -46,7 +47,6 @@ import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapReposito import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapSubscriptionRepository import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorTest.kt index 26bc94141..b502d63fa 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/domain/SwapInteractorTest.kt @@ -33,6 +33,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_polkaswap_impl.domain import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository @@ -42,7 +43,6 @@ import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapExtrinsi import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapRepository import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapSubscriptionRepository import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.SwapInteractor -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Before diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt index 2ee14467a..efb74e042 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/SwapViewModelTest.kt @@ -35,6 +35,9 @@ package jp.co.soramitsu.feature_polkaswap_impl.presentation.polkaswap import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.anyNonNull +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.Market @@ -53,9 +56,6 @@ import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.test_data.PolkaswapTestData import jp.co.soramitsu.test_data.TestAssets import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.anyNonNull -import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.flow diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt index f04a0a01d..ae404bede 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt @@ -37,6 +37,7 @@ import io.mockk.mockkObject import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.format.equalTo import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.logger.FirebaseWrapper @@ -55,7 +56,6 @@ import jp.co.soramitsu.test_data.PolkaswapTestData.XOR_ASSET import jp.co.soramitsu.test_data.PolkaswapTestData.XSTXAU_ASSET import jp.co.soramitsu.test_data.TestAssets import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt index bda862285..6d6e8006e 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/remove/RemoveLiquidityViewModelTest.kt @@ -36,6 +36,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.format.equalTo import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor @@ -51,7 +52,6 @@ import jp.co.soramitsu.test_data.PolkaswapTestData.XOR_ASSET import jp.co.soramitsu.test_data.PolkaswapTestData.XOR_ASSET_ZERO_BALANCE import jp.co.soramitsu.test_data.TestAssets import jp.co.soramitsu.test_data.TestTokens -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.flowOf diff --git a/feature_referral_api/build.gradle.kts b/feature_referral_api/build.gradle.kts index 400e04147..eff44a145 100644 --- a/feature_referral_api/build.gradle.kts +++ b/feature_referral_api/build.gradle.kts @@ -52,6 +52,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -64,7 +74,6 @@ dependencies { implementation(libs.navigationFragmentDep) implementation(libs.navigationUiDep) - implementation(libs.xnetworkingDep) implementation(libs.xsubstrateDep) implementation(libs.daggerDep) diff --git a/feature_referral_api/src/main/java/jp/co/soramitsu/feature_referral_api/data/ReferralRepository.kt b/feature_referral_api/src/main/java/jp/co/soramitsu/feature_referral_api/data/ReferralRepository.kt index 04b3548f4..8c7252dca 100644 --- a/feature_referral_api/src/main/java/jp/co/soramitsu/feature_referral_api/data/ReferralRepository.kt +++ b/feature_referral_api/src/main/java/jp/co/soramitsu/feature_referral_api/data/ReferralRepository.kt @@ -35,7 +35,7 @@ package jp.co.soramitsu.feature_referral_api.data import java.math.BigDecimal import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.feature_blockexplorer_api.presentation.txhistory.Transaction -import jp.co.soramitsu.xnetworking.sorawallet.blockexplorerinfo.referral.ReferrerReward +import jp.co.soramitsu.xnetworking.lib.datasources.blockexplorer.api.models.ReferralReward import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair import kotlinx.coroutines.flow.Flow @@ -43,7 +43,7 @@ interface ReferralRepository { suspend fun updateReferralRewards(address: String) - fun getReferralRewards(): Flow> + fun getReferralRewards(): Flow> suspend fun getSetReferrerFee(from: String, feeToken: Token): BigDecimal? diff --git a/feature_referral_impl/build.gradle.kts b/feature_referral_impl/build.gradle.kts index 070f20b07..1dc70c514 100644 --- a/feature_referral_impl/build.gradle.kts +++ b/feature_referral_impl/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -119,6 +129,10 @@ dependencies { implementation(libs.daggerDep) kapt(libs.daggerKaptDep) - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryImpl.kt b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryImpl.kt index c6d4b6ed6..f8a08c2d2 100644 --- a/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryImpl.kt +++ b/feature_referral_impl/src/main/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryImpl.kt @@ -53,7 +53,7 @@ import jp.co.soramitsu.sora.substrate.substrate.SubstrateCalls import jp.co.soramitsu.sora.substrate.substrate.referralBond import jp.co.soramitsu.sora.substrate.substrate.referralUnbond import jp.co.soramitsu.sora.substrate.substrate.setReferrer -import jp.co.soramitsu.xnetworking.sorawallet.blockexplorerinfo.referral.ReferrerReward +import jp.co.soramitsu.xnetworking.lib.datasources.blockexplorer.api.models.ReferralReward import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair import jp.co.soramitsu.xsubstrate.runtime.definitions.types.fromHex import jp.co.soramitsu.xsubstrate.runtime.metadata.module @@ -222,10 +222,10 @@ class ReferralRepositoryImpl @Inject constructor( } } - override fun getReferralRewards(): Flow> { + override fun getReferralRewards(): Flow> { return db.referralsDao().getReferrals().map { list -> list.map { - ReferrerReward(it.address, it.amount) + ReferralReward(it.address, it.amount) } } } diff --git a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryTest.kt b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryTest.kt index 46cb75ee7..af24b733d 100644 --- a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryTest.kt +++ b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/data/ReferralRepositoryTest.kt @@ -33,6 +33,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_referral_impl.data import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.core_db.AppDatabase import jp.co.soramitsu.core_db.dao.ReferralsDao import jp.co.soramitsu.core_db.model.ReferralLocal @@ -41,8 +42,7 @@ import jp.co.soramitsu.feature_referral_api.data.ReferralRepository import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager import jp.co.soramitsu.sora.substrate.substrate.ExtrinsicManager import jp.co.soramitsu.sora.substrate.substrate.SubstrateCalls -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.xnetworking.sorawallet.blockexplorerinfo.referral.ReferrerReward +import jp.co.soramitsu.xnetworking.lib.datasources.blockexplorer.api.models.ReferralReward import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.toList @@ -90,7 +90,7 @@ class ReferralRepositoryTest { private lateinit var referralRepository: ReferralRepository private val REFERRER_REWARDS = listOf( - ReferrerReward( + ReferralReward( "address", "1000000000000000000" ) diff --git a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/domain/ReferralInteractorTest.kt b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/domain/ReferralInteractorTest.kt index 6e94d1988..73bf2c195 100644 --- a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/domain/ReferralInteractorTest.kt +++ b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/domain/ReferralInteractorTest.kt @@ -34,6 +34,7 @@ package jp.co.soramitsu.feature_referral_impl.domain import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository @@ -43,8 +44,7 @@ import jp.co.soramitsu.feature_referral_api.data.ReferralRepository import jp.co.soramitsu.feature_referral_impl.domain.model.Referral import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletRepository import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.xnetworking.sorawallet.blockexplorerinfo.referral.ReferrerReward +import jp.co.soramitsu.xnetworking.lib.datasources.blockexplorer.api.models.ReferralReward import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.toList @@ -95,7 +95,7 @@ class ReferralInteractorTest { private lateinit var interactor: ReferralInteractor private val REFERRER_REWARDS = listOf( - ReferrerReward( + ReferralReward( "address", "1000000000000000000" ) diff --git a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt index d8ab81e68..57dca3aca 100644 --- a/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt +++ b/feature_referral_impl/src/test/java/jp/co/soramitsu/feature_referral_impl/presentation/ReferralViewModelTest.kt @@ -36,6 +36,8 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.util.NumbersFormatter @@ -47,8 +49,6 @@ import jp.co.soramitsu.feature_referral_impl.domain.model.Referral import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import jp.co.soramitsu.test_data.TestAssets -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import jp.co.soramitsu.ui_core.component.toolbar.BasicToolbarState import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbarState import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbarType diff --git a/feature_select_node_api/build.gradle.kts b/feature_select_node_api/build.gradle.kts index 78fa75d63..ea55d05c5 100644 --- a/feature_select_node_api/build.gradle.kts +++ b/feature_select_node_api/build.gradle.kts @@ -52,6 +52,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { diff --git a/feature_select_node_impl/build.gradle.kts b/feature_select_node_impl/build.gradle.kts index f92eef8a0..c20b10f5b 100644 --- a/feature_select_node_impl/build.gradle.kts +++ b/feature_select_node_impl/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -89,7 +99,6 @@ dependencies { implementation(libs.navigationFragmentDep) implementation(libs.navigationUiDep) - implementation(libs.xnetworkingDep) implementation(libs.xsubstrateDep) implementation(libs.roomDep) @@ -114,5 +123,9 @@ dependencies { implementation(libs.daggerDep) kapt(libs.daggerKaptDep) - testImplementation(project(":test_shared")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/NodeManagerImpl.kt b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/NodeManagerImpl.kt index ae855b8e9..0d9da50c3 100644 --- a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/NodeManagerImpl.kt +++ b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/NodeManagerImpl.kt @@ -203,7 +203,7 @@ internal class NodeManagerImpl( if (state.url == customNodeUrl) { blockHashCheckObserverEnabled = false try { - val newHash = selectNodeRepository.getBlockHash().removeHexPrefix() + val newHash = selectNodeRepository.getBlockHash() if (BuildUtils.isFlavors( Flavor.DEVELOP, Flavor.SORALUTION @@ -211,7 +211,7 @@ internal class NodeManagerImpl( ) { _events.emit(NodeManagerEvent.GenesisValidated(result = true)) } else { - _events.emit(NodeManagerEvent.GenesisValidated(result = soraConfigManager.getGenesis() == newHash)) + _events.emit(NodeManagerEvent.GenesisValidated(result = soraConfigManager.getGenesis().removeHexPrefix() == newHash.removeHexPrefix())) } } catch (e: Throwable) { _events.emit(NodeManagerEvent.GenesisValidated(result = false)) diff --git a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt index 78e42667b..2d05fcb03 100644 --- a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt +++ b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/details/NodeDetailsViewModelTest.kt @@ -35,6 +35,8 @@ package jp.co.soramitsu.feature_select_node_impl.presentation.details import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.ChainNode import jp.co.soramitsu.common.util.Const @@ -50,8 +52,6 @@ import jp.co.soramitsu.feature_select_node_impl.TestData.NODE_LIST import jp.co.soramitsu.feature_select_node_impl.TestData.SELECTED_NODE import jp.co.soramitsu.feature_select_node_impl.domain.SelectNodeInteractor import jp.co.soramitsu.feature_select_node_impl.domain.ValidationEvent -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf diff --git a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/domain/NodeValidatorTest.kt b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/domain/NodeValidatorTest.kt index 4b2f55b85..f0f0f7c23 100644 --- a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/domain/NodeValidatorTest.kt +++ b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/domain/NodeValidatorTest.kt @@ -33,10 +33,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_select_node_impl.presentation.domain import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.feature_select_node_impl.domain.InetAddressesWrapper import jp.co.soramitsu.feature_select_node_impl.domain.NodeValidator import jp.co.soramitsu.feature_select_node_impl.domain.ValidationEvent -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals diff --git a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt index 8ab12894c..a7e15558e 100644 --- a/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt +++ b/feature_select_node_impl/src/test/java/jp/co/soramitsu/feature_select_node_impl/presentation/select/SelectNodeViewModelTest.kt @@ -34,6 +34,8 @@ package jp.co.soramitsu.feature_select_node_impl.presentation.select import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.feature_main_api.domain.model.PinCodeAction import jp.co.soramitsu.feature_main_api.launcher.MainRouter @@ -47,8 +49,6 @@ import jp.co.soramitsu.feature_select_node_impl.TestData.SELECTED_NODE import jp.co.soramitsu.feature_select_node_impl.domain.SelectNodeInteractor import jp.co.soramitsu.feature_select_node_impl.presentation.select.model.RemoveNodeAlertState import jp.co.soramitsu.feature_select_node_impl.presentation.select.model.SwitchNodeAlertState -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf diff --git a/feature_sora_card_api/build.gradle.kts b/feature_sora_card_api/build.gradle.kts index 7838f83b9..130eaed23 100644 --- a/feature_sora_card_api/build.gradle.kts +++ b/feature_sora_card_api/build.gradle.kts @@ -52,6 +52,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { diff --git a/feature_sora_card_impl/build.gradle.kts b/feature_sora_card_impl/build.gradle.kts index 14a724ffc..f40ceb645 100644 --- a/feature_sora_card_impl/build.gradle.kts +++ b/feature_sora_card_impl/build.gradle.kts @@ -63,6 +63,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -116,6 +126,10 @@ dependencies { implementation(libs.daggerDep) kapt(libs.daggerKaptDep) - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt index 9e75627d6..95026d91d 100644 --- a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt +++ b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/GetSoraCardViewModelTest.kt @@ -37,6 +37,8 @@ import io.mockk.every import io.mockk.mockkObject import java.math.BigDecimal import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter @@ -49,8 +51,6 @@ import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager import jp.co.soramitsu.test_data.SoraCardTestData.soraCardBasicStatusTest -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import jp.co.soramitsu.ui_core.component.toolbar.SoramitsuToolbarType import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow diff --git a/feature_wallet_api/build.gradle.kts b/feature_wallet_api/build.gradle.kts index 28c22ecb4..619396621 100644 --- a/feature_wallet_api/build.gradle.kts +++ b/feature_wallet_api/build.gradle.kts @@ -52,6 +52,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { diff --git a/feature_wallet_impl/build.gradle.kts b/feature_wallet_impl/build.gradle.kts index 9c2fdae03..393319405 100644 --- a/feature_wallet_impl/build.gradle.kts +++ b/feature_wallet_impl/build.gradle.kts @@ -67,6 +67,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -127,7 +137,7 @@ dependencies { implementation(libs.uiCoreDep) - implementation(platform(libs.compose.bom)) +// implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) implementation(libs.composeFoundationDep) implementation(libs.composeMaterialDep) @@ -143,6 +153,10 @@ dependencies { implementation(libs.kotlinxSerializationJsonDep) - testImplementation(project(":test_shared")) testImplementation(project(":test_data")) + testImplementation(libs.coroutineTestDep) + testImplementation(libs.junitDep) + testImplementation(libs.mockkDep) + testImplementation(libs.mockitoKotlinDep) + testImplementation(libs.archCoreTestDep) } diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/datasource/BuyCryptoDataSourceImpl.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/datasource/BuyCryptoDataSourceImpl.kt index 6f915c426..61e3f264e 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/datasource/BuyCryptoDataSourceImpl.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/datasource/BuyCryptoDataSourceImpl.kt @@ -40,23 +40,15 @@ import jp.co.soramitsu.network.WebSocket import jp.co.soramitsu.network.WebSocketListener import jp.co.soramitsu.network.WebSocketRequest import jp.co.soramitsu.network.WebSocketResponse -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuHttpClientProvider import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json class BuyCryptoDataSourceImpl( - clientProvider: SoramitsuHttpClientProvider + private val json: Json ) : BuyCryptoDataSource { - private val json = Json { - prettyPrint = true - isLenient = true - ignoreUnknownKeys = true - } - private val paymentOrderFlow = MutableSharedFlow() private val webSocketListener = object : WebSocketListener { @@ -77,8 +69,7 @@ class BuyCryptoDataSourceImpl( url = BuildConfigWrapper.soraCardX1StatusUrl, listener = webSocketListener, json = json, - logging = false, - provider = clientProvider, + logging = false ) override suspend fun requestPaymentOrderStatus(paymentOrder: PaymentOrder) { diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/di/WalletFeatureModule.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/di/WalletFeatureModule.kt index 00e3aff5d..dac643d4a 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/di/WalletFeatureModule.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/di/WalletFeatureModule.kt @@ -57,8 +57,8 @@ import jp.co.soramitsu.feature_wallet_impl.data.repository.datasource.PrefsWalle import jp.co.soramitsu.feature_wallet_impl.domain.PoolsFeatureStorageManager import jp.co.soramitsu.feature_wallet_impl.domain.WalletInteractorImpl import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuHttpClientProvider import kotlinx.coroutines.FlowPreview +import kotlinx.serialization.json.Json @FlowPreview @Module @@ -77,10 +77,8 @@ class WalletFeatureModule { @Provides @Singleton - fun provideBuyCryptoDataSource( - clientProvider: SoramitsuHttpClientProvider - ): BuyCryptoDataSource = - BuyCryptoDataSourceImpl(clientProvider) + fun provideBuyCryptoDataSource(json: Json): BuyCryptoDataSource = + BuyCryptoDataSourceImpl(json) @Singleton @Provides diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryTest.kt index 9ab5f9dd5..fd4225e53 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryTest.kt @@ -34,6 +34,7 @@ package jp.co.soramitsu.feature_wallet_impl.data.repository import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.Token @@ -51,8 +52,6 @@ import jp.co.soramitsu.sora.substrate.runtime.RuntimeManager import jp.co.soramitsu.sora.substrate.substrate.ExtrinsicManager import jp.co.soramitsu.sora.substrate.substrate.SubstrateCalls import jp.co.soramitsu.test_data.TestAssets -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraCurrency import jp.co.soramitsu.xsubstrate.encrypt.keypair.substrate.Sr25519Keypair import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flowOf @@ -178,12 +177,6 @@ class WalletRepositoryTest { verify(globalCardsHubDao).updateCardVisibility(cardId = "cardId", visibility = true) } - private val usdFiat = SoraCurrency( - code = "USD", - name = "Dollar", - sign = "$", - ) - private fun assetLocalList() = listOf( AssetLocal( "0x0200000000000000000000000000000000000000000000000000000000000000", diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/data/repository/datasource/PrefsWalletDatasourceTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/data/repository/datasource/PrefsWalletDatasourceTest.kt index 9f92fe70a..7d432988e 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/data/repository/datasource/PrefsWalletDatasourceTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/data/repository/datasource/PrefsWalletDatasourceTest.kt @@ -33,10 +33,10 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_wallet_impl.data.repository.datasource import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.data.EncryptedPreferences import jp.co.soramitsu.common.data.SoraPreferences import jp.co.soramitsu.feature_wallet_api.domain.model.MigrationStatus -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoViewModelTest.kt index a2b7a2bad..484184a27 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/buycrypto/BuyCryptoViewModelTest.kt @@ -38,13 +38,13 @@ import io.mockk.every import io.mockk.mockkObject import io.mockk.mockkStatic import java.util.UUID +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.config.BuildConfigWrapper import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_wallet_api.domain.interfaces.BuyCryptoRepository -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModelTest.kt index dc8c84102..9dc50fd23 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/claim/ClaimViewModelTest.kt @@ -35,10 +35,10 @@ package jp.co.soramitsu.feature_wallet_impl.presentation.claim import android.content.Context import androidx.arch.core.executor.testing.InstantTaskExecutorRule import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.domain.model.MigrationStatus import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flow import kotlinx.coroutines.test.advanceUntilIdle diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt index 2122306a7..ec707393c 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/contacts/ContactsViewModelTest.kt @@ -36,11 +36,11 @@ import android.graphics.drawable.PictureDrawable import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletInteractor import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter -import jp.co.soramitsu.test_shared.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt index 56f87b20a..8a09e4b91 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt @@ -43,6 +43,8 @@ import io.mockk.just import io.mockk.mockkObject import io.mockk.verify import jp.co.soramitsu.androidfoundation.resource.ResourceManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.config.BuildConfigWrapper @@ -71,8 +73,6 @@ import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager import jp.co.soramitsu.test_data.PolkaswapTestData.POOL_DATA import jp.co.soramitsu.test_data.SoraCardTestData.soraCardBasicStatusTest import jp.co.soramitsu.test_data.TestAssets -import jp.co.soramitsu.test_shared.MainCoroutineRule -import jp.co.soramitsu.test_shared.getOrAwaitValue import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5a491e592..5752020a2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,13 +39,12 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.1.11" -xnetworking = "0.2.9" -xnetworkingS = "1.0.1" -xsubstrate = "1.2.4" +soracard = "1.1.13" +xnetworkingLib = "1.0.5" +xsubstrate = "1.2.7" uicore = "0.2.32" -xbackup = "1.2.1" -xcrypto = "1.2.3" +xbackup = "1.2.2" +xcrypto = "1.2.6" ed = "2.0.1" xerces = "2.9.0" dagger = "2.49" @@ -89,15 +88,16 @@ hiltWorkManagerDep = { module = "androidx.hilt:hilt-work", version.ref = "hiltWo hiltWorkManagerKaptDep = { module = "androidx.hilt:hilt-compiler", version.ref = "hiltWorkManager" } lazySodiumDep = { module = "com.goterl:lazysodium-android", version.ref = "lazySodium" } jnaDep = { module = "net.java.dev.jna:jna", version.ref = "jna" } +ktorLoggingDep = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } +ktorContentNegotiationDep = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } +ktorOkHttpDep = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } ktorWebSocketDep = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor" } soraCardDep = { module = "jp.co.soramitsu:android-sora-card", version.ref = "soracard" } -xnetworkingSDep = { module = "jp.co.soramitsu.xnetworking:lib-android", version.ref = "xnetworkingS" } -xnetworkingDep = { module = "jp.co.soramitsu.xnetworking:basic-android", version.ref = "xnetworking" } -xnetworkingSoraWalletDep = { module = "jp.co.soramitsu.xnetworking:sorawallet-android", version.ref = "xnetworking" } +xnetworkingLibDep = { module = "jp.co.soramitsu.xnetworking:lib-android", version.ref = "xnetworkingLib" } xsubstrateDep = { module = "jp.co.soramitsu:xsubstrate", version.ref = "xsubstrate" } uiCoreDep = { module = "jp.co.soramitsu:ui-core", version.ref = "uicore" } xbackupDep = { module = "jp.co.soramitsu:xbackup", version.ref = "xbackup" } -xcryptoDep = { module = "jp.co.soramitsu:x-crypto", version.ref = "xcrypto" } +xcryptoDep = { module = "jp.co.soramitsu:xcrypto", version.ref = "xcrypto" } ed25519Dep = { module = "com.github.warchant:ed25519-sha3-java", version.ref = "ed" } xercesDep = { module = "org.eclipse.birt.runtime.3_7_1:org.apache.xerces", version.ref = "xerces" } timberDep = { module = "com.jakewharton.timber:timber", version.ref = "timber" } diff --git a/network/build.gradle.kts b/network/build.gradle.kts index 6b666caab..07d1afd40 100644 --- a/network/build.gradle.kts +++ b/network/build.gradle.kts @@ -57,9 +57,9 @@ dependencies { implementation(libs.kotlinxSerializationJsonDep) - api(libs.xnetworkingDep) - api(libs.xnetworkingSoraWalletDep) { - exclude(group = "jp.co.soramitsu.xnetworking", module = "basic") - } + api(libs.xnetworkingLibDep) + implementation(libs.ktorOkHttpDep) + implementation(libs.ktorLoggingDep) + implementation(libs.ktorContentNegotiationDep) implementation(libs.ktorWebSocketDep) } diff --git a/network/src/main/java/jp/co/soramitsu/network/WebSocket.kt b/network/src/main/java/jp/co/soramitsu/network/WebSocket.kt index 9ddfad295..7baa4eeaa 100644 --- a/network/src/main/java/jp/co/soramitsu/network/WebSocket.kt +++ b/network/src/main/java/jp/co/soramitsu/network/WebSocket.kt @@ -32,15 +32,23 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.network +import io.ktor.client.HttpClient +import io.ktor.client.engine.okhttp.OkHttp import io.ktor.client.plugins.HttpTimeout +import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.client.plugins.logging.LogLevel +import io.ktor.client.plugins.logging.Logger +import io.ktor.client.plugins.logging.Logging +import io.ktor.client.plugins.logging.SIMPLE import io.ktor.client.plugins.websocket.DefaultClientWebSocketSession +import io.ktor.client.plugins.websocket.WebSockets import io.ktor.client.plugins.websocket.webSocket +import io.ktor.http.ContentType +import io.ktor.serialization.kotlinx.KotlinxWebsocketSerializationConverter +import io.ktor.serialization.kotlinx.json.json import io.ktor.websocket.Frame import io.ktor.websocket.close import io.ktor.websocket.readText -import jp.co.soramitsu.xnetworking.basic.networkclient.NetworkClientConfig -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuHttpClientProvider -import jp.co.soramitsu.xnetworking.basic.networkclient.WebSocketClientConfig import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch @@ -63,24 +71,41 @@ class WebSocket( pingInterval: Long = 20, maxFrameSize: Long = Int.MAX_VALUE.toLong(), logging: Boolean = false, - provider: SoramitsuHttpClientProvider, ) { private var socketSession: DefaultClientWebSocketSession? = null - private val networkClient = provider.provide( - NetworkClientConfig( - logging = logging, - requestTimeoutMillis = HttpTimeout.INFINITE_TIMEOUT_MS, - connectTimeoutMillis = connectTimeoutMillis, - socketTimeoutMillis = HttpTimeout.INFINITE_TIMEOUT_MS, - json = json, - webSocketClientConfig = WebSocketClientConfig( - pingInterval = pingInterval, - maxFrameSize = maxFrameSize - ) - ) - ) + private val networkClient = + HttpClient(OkHttp) { + expectSuccess = true + + if (logging) { + install(Logging) { + level = LogLevel.ALL + logger = Logger.SIMPLE + } + } + + install(ContentNegotiation) { + json( + json = json, + contentType = ContentType.Any + ) + } + + install(HttpTimeout) { + this.requestTimeoutMillis = HttpTimeout.INFINITE_TIMEOUT_MS + this.connectTimeoutMillis = connectTimeoutMillis + this.socketTimeoutMillis = HttpTimeout.INFINITE_TIMEOUT_MS + } + + install(WebSockets) { + this.pingInterval = pingInterval + this.maxFrameSize = maxFrameSize + this.contentConverter = + KotlinxWebsocketSerializationConverter(json) + } + } private suspend fun DefaultClientWebSocketSession.listenIncomingMessages() { try { diff --git a/settings.gradle.kts b/settings.gradle.kts index 8df4d0f74..75272dd6a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -74,4 +74,3 @@ include(":feature_wallet_impl") include(":network") include(":sorasubstrate") include(":test_data") -include(":test_shared") diff --git a/sorasubstrate/build.gradle.kts b/sorasubstrate/build.gradle.kts index 0188be39d..371349f53 100644 --- a/sorasubstrate/build.gradle.kts +++ b/sorasubstrate/build.gradle.kts @@ -51,6 +51,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { @@ -63,7 +73,7 @@ dependencies { implementation(libs.xsubstrateDep) implementation(libs.xcryptoDep) - implementation(libs.xnetworkingDep) + implementation(libs.xnetworkingLibDep) implementation(libs.gsonDep) implementation(libs.webSocketLibDep) @@ -72,6 +82,4 @@ dependencies { implementation(libs.timberDep) implementation(libs.daggerDep) kapt(libs.daggerKaptDep) - - testImplementation(project(":test_shared")) } diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/di/SubstrateModule.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/di/SubstrateModule.kt index 2297adbe5..5e31c91d0 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/di/SubstrateModule.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/di/SubstrateModule.kt @@ -44,16 +44,11 @@ import javax.inject.Singleton import jp.co.soramitsu.common.data.network.connection.NetworkStateListener import jp.co.soramitsu.common.domain.AppStateProvider import jp.co.soramitsu.common.domain.CoroutineManager -import jp.co.soramitsu.common.util.Const import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager import jp.co.soramitsu.sora.substrate.substrate.SubstrateApi import jp.co.soramitsu.sora.substrate.substrate.SubstrateApiImpl import jp.co.soramitsu.sora.substrate.substrate.WsConnectionManager import jp.co.soramitsu.sora.substrate.substrate.WsLogger -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuNetworkClient -import jp.co.soramitsu.xnetworking.sorawallet.mainconfig.SoraRemoteConfigBuilder -import jp.co.soramitsu.xnetworking.sorawallet.txhistory.client.SubQueryClientForSoraWallet -import jp.co.soramitsu.xnetworking.sorawallet.txhistory.client.SubQueryClientForSoraWalletFactory import jp.co.soramitsu.xsubstrate.wsrpc.SocketService import jp.co.soramitsu.xsubstrate.wsrpc.logging.Logger import jp.co.soramitsu.xsubstrate.wsrpc.recovery.ConstantReconnectStrategy @@ -72,18 +67,6 @@ class SubstrateModule { @Singleton fun provideWsSocketLogger(): Logger = WsLogger() - @Singleton - @Provides - fun provideSubQueryClient( - client: SoramitsuNetworkClient, - factory: SubQueryClientForSoraWalletFactory, - soraRemoteConfigBuilder: SoraRemoteConfigBuilder, - ): SubQueryClientForSoraWallet = factory.create( - soramitsuNetworkClient = client, - pageSize = Const.HISTORY_PAGE_SIZE, - soraRemoteConfigBuilder = soraRemoteConfigBuilder, - ) - @Provides @Singleton fun provideReconnector(): Reconnector = diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt index 298d5aae8..e27325d85 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt @@ -41,7 +41,8 @@ import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.io.FileManager import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager -import jp.co.soramitsu.xnetworking.basic.networkclient.SoramitsuNetworkClient +import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient +import jp.co.soramitsu.xnetworking.lib.engines.utils.JsonGetRequest import jp.co.soramitsu.xsubstrate.runtime.RuntimeSnapshot import jp.co.soramitsu.xsubstrate.runtime.definitions.TypeDefinitionParser import jp.co.soramitsu.xsubstrate.runtime.definitions.TypeDefinitionsTree @@ -71,6 +72,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext +import kotlinx.serialization.builtins.serializer private const val DEFAULT_TYPES_FILE = "default_types.json" private const val SORA2_TYPES_FILE = "types_scalecodec_mobile.json" @@ -84,7 +86,7 @@ class RuntimeManager @Inject constructor( private val gson: Gson, private val soraPreferences: SoraPreferences, private val socketService: SocketService, - private val networkClient: SoramitsuNetworkClient, + private val restClient: RestClient, private val coroutineManager: CoroutineManager, private val soraConfigManager: SoraConfigManager, ) { @@ -195,7 +197,12 @@ class RuntimeManager @Inject constructor( } is MetadataSource.SoraNet -> { - val sora2Types = networkClient.get(soraConfigManager.getSubstrateTypesUrl()) + val sora2Types = restClient.getReturnString( + JsonGetRequest( + url = soraConfigManager.getSubstrateTypesUrl(), + responseDeserializer = String.serializer() + ) + ) buildTypeRegistry14(sora2Types, runtimeMetadataReader, runtimeVersion).also { saveToCache(SORA2_TYPES_FILE, sora2Types) } diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/SubstrateOptionsProvider.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/SubstrateOptionsProvider.kt index 2d9aacca3..2184a44be 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/SubstrateOptionsProvider.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/SubstrateOptionsProvider.kt @@ -33,8 +33,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.sora.substrate.runtime import java.math.BigInteger +import jp.co.soramitsu.androidfoundation.format.addHexPrefix import jp.co.soramitsu.common.data.network.dto.TokenInfoDto -import jp.co.soramitsu.common.util.ext.addHexPrefix import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider.syntheticTokenRegex import jp.co.soramitsu.sora.substrate.substrate.fromHex import jp.co.soramitsu.xcrypto.util.fromHex diff --git a/test_data/build.gradle.kts b/test_data/build.gradle.kts index c10e65e27..816612576 100644 --- a/test_data/build.gradle.kts +++ b/test_data/build.gradle.kts @@ -50,6 +50,16 @@ android { dimension = "default" } } + + packaging { + resources { + excludes += listOf( + "META-INF/DEPENDENCIES", + "META-INF/LICENSE.md", + "META-INF/LICENSE-notice.md", + ) + } + } } dependencies { diff --git a/test_shared/.gitignore b/test_shared/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/test_shared/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/test_shared/build.gradle.kts b/test_shared/build.gradle.kts deleted file mode 100644 index a257c31ba..000000000 --- a/test_shared/build.gradle.kts +++ /dev/null @@ -1,67 +0,0 @@ -plugins { - alias(libs.plugins.androidLibrary) - alias(libs.plugins.kotlinAndroid) - alias(libs.plugins.serialization) - alias(libs.plugins.kapt) - id("kotlin-parcelize") -} - -kotlin { - jvmToolchain(11) -} - -android { - namespace = "jp.co.soramitsu.test_shared" - compileSdk = 34 - - defaultConfig { - minSdk = 26 - multiDexEnabled = true - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - testOptions { - unitTests.isReturnDefaultValues = true - targetSdk = 34 - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - flavorDimensions += listOf("default") - - productFlavors { - create("develop") { - dimension = "default" - } - - create("soralution") { - dimension = "default" - } - - create("production") { - dimension = "default" - } - } -} - -dependencies { - api(libs.coroutineTestDep) - api(libs.xsubstrateDep) - - api(libs.junitDep) - api(libs.mockitoDep) - api(libs.mockitoKotlinDep) - api(libs.archCoreTestDep) - api(libs.archFragmentTestDep) - api(libs.truthDep) - api(libs.mockkDep) - - api(libs.roomTestHelpersDep) -} diff --git a/test_shared/src/main/AndroidManifest.xml b/test_shared/src/main/AndroidManifest.xml deleted file mode 100644 index 94cbbcfc3..000000000 --- a/test_shared/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/test_shared/src/main/java/jp/co/soramitsu/test_shared/Ext.kt b/test_shared/src/main/java/jp/co/soramitsu/test_shared/Ext.kt deleted file mode 100644 index 492b6d19b..000000000 --- a/test_shared/src/main/java/jp/co/soramitsu/test_shared/Ext.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.test_shared - -import org.mockito.ArgumentMatchers.eq -import org.mockito.Mockito - -fun anyNonNull(): T { - Mockito.any() - return initialized() -} - -fun eqNonNull(value: T): T = eq(value) ?: value - -private fun initialized(): T = null as T diff --git a/test_shared/src/main/java/jp/co/soramitsu/test_shared/LiveDataTestUtil.kt b/test_shared/src/main/java/jp/co/soramitsu/test_shared/LiveDataTestUtil.kt deleted file mode 100644 index 4fc690db1..000000000 --- a/test_shared/src/main/java/jp/co/soramitsu/test_shared/LiveDataTestUtil.kt +++ /dev/null @@ -1,88 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.test_shared - -import androidx.annotation.VisibleForTesting -import androidx.lifecycle.LiveData -import androidx.lifecycle.Observer -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit -import java.util.concurrent.TimeoutException - -/** - * [https://medium.com/androiddevelopers/unit-testing-livedata-and-other-common-observability-problems-bb477262eb04] - */ -@VisibleForTesting(otherwise = VisibleForTesting.NONE) -fun LiveData.getOrAwaitValue( - time: Long = 2, - timeUnit: TimeUnit = TimeUnit.SECONDS, - afterObserve: () -> Unit = {} -): T { - var data: T? = null - val latch = CountDownLatch(1) - val observer = object : Observer { - override fun onChanged(o: T) { - data = o - latch.countDown() - this@getOrAwaitValue.removeObserver(this) - } - } - this.observeForever(observer) - - try { - afterObserve.invoke() - - // Don't wait indefinitely if the LiveData is not set. - if (!latch.await(time, timeUnit)) { - throw TimeoutException("LiveData value was never set.") - } - } finally { - this.removeObserver(observer) - } - - @Suppress("UNCHECKED_CAST") - return data as T -} - -suspend fun LiveData.observeForTesting(checker: (Int, T) -> Unit, block: suspend () -> Unit) { - var i = 0 - val observer = Observer { - checker(i++, it) - } - try { - observeForever(observer) - block() - } finally { - removeObserver(observer) - } -} diff --git a/test_shared/src/main/java/jp/co/soramitsu/test_shared/TestFlowCollector.kt b/test_shared/src/main/java/jp/co/soramitsu/test_shared/TestFlowCollector.kt deleted file mode 100644 index 549fa6330..000000000 --- a/test_shared/src/main/java/jp/co/soramitsu/test_shared/TestFlowCollector.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.test_shared - -import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.Duration.Companion.seconds -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.TimeoutCancellationException -import kotlinx.coroutines.cancelAndJoin -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.launch -import kotlinx.coroutines.test.TestScope -import kotlinx.coroutines.test.UnconfinedTestDispatcher -import kotlinx.coroutines.withTimeout - -/** - * Collect the receiving [Flow] in the given [TestScope], then run assertions on the flow's emissions in the given - * [assertionBlock] by using the available functions in [TestFlowCollector]. Usually, you can simply pass the scope - * given in the [runTest] function. - */ -@OptIn(ExperimentalCoroutinesApi::class) -suspend fun Flow.test( - scope: TestScope, - assertionBlock: suspend TestFlowCollector.() -> Unit = {}, -) { - with(TestFlowCollector(this, scope)) { - assertionBlock() - finishAssertion() - } -} - -@OptIn(ExperimentalCoroutinesApi::class) -class TestFlowCollector(private val flow: Flow, scope: TestScope) { - - private val values = mutableListOf() - - private val job = scope.launch(UnconfinedTestDispatcher(scope.testScheduler)) { - flow.collect { values.add(it) } - } - - suspend fun finishAssertion() { - job.cancelAndJoin() - } - - suspend fun awaitValue(at: Int): T { - return try { - withTimeout(1.seconds) { - while (values.getOrNull(at) == null) { - delay(50.milliseconds) - } - values[at] - } - } catch (e: TimeoutCancellationException) { - throw AssertionError("No value was emitted within 1 second at index $at") - } - } - - suspend fun ensureNoValue(at: Int) { - try { - val value = awaitValue(at) - throw UnexpectedValueException(value, at) - } catch (e: AssertionError) { - if (e is UnexpectedValueException) { - throw e - } - // all good, expected the exception to be thrown - } - } - - private class UnexpectedValueException(value: Any?, at: Int) : - AssertionError("Expected no value to be emitted at index $at but received: $value") -} From 76a876250290e087bc9f594928011f5de44e8eef Mon Sep 17 00:00:00 2001 From: AmadeyKuspakov Date: Sat, 13 Jul 2024 05:14:52 +0400 Subject: [PATCH 26/43] Fix on icons saving, txHistory retrieval --- .../common/domain/WhitelistTokensManager.kt | 50 +++++++++---------- .../data/TransactionHistoryRepositoryImpl.kt | 2 +- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/WhitelistTokensManager.kt b/common/src/main/java/jp/co/soramitsu/common/domain/WhitelistTokensManager.kt index 9daba2225..a8b42c87b 100644 --- a/common/src/main/java/jp/co/soramitsu/common/domain/WhitelistTokensManager.kt +++ b/common/src/main/java/jp/co/soramitsu/common/domain/WhitelistTokensManager.kt @@ -101,19 +101,7 @@ class WhitelistTokensManager @Inject constructor( ) ) }.onSuccess { dtoList -> - val ids = dtoList.mapNotNull { - TokenDto( - id = it.fieldOrNull("address") - ?: return@mapNotNull null, - type = it.fieldOrNull("icon") - ?: return@mapNotNull null - ) - } - updateWhitelist(ids) - fileManager.writeInternalFile( - WHITELIST_FILE_NAME, - Json.encodeToString(ids) - ) + val ids = mutableListOf() dtoList.forEach { dto -> val address = dto.fieldOrNull("address") ?: return@forEach @@ -123,23 +111,33 @@ class WhitelistTokensManager @Inject constructor( delimiter = ",", missingDelimiterValue = "" ) - val iconExtension = iconField.removeSurrounding( - prefix = "data:image/", - suffix = iconRaw - ) - when (iconExtension) { - "svg" -> fileManager.writeInternalCacheFile( - fileName = "$address.$iconExtension", - content = iconRaw.decodeURLPart() - ) - "png" -> fileManager.writeInternalCacheFile( - fileName = "$address.$iconExtension", - content = iconRaw.decodeBase64Bytes() - ) + when { + iconField.startsWith("data:image/svg") -> { + fileManager.writeInternalCacheFile( + fileName = "$address.svg", + content = iconRaw.decodeURLPart() + ) + + ids += TokenDto(id = address, type = "svg") + } + iconField.startsWith("data:image/png") -> { + fileManager.writeInternalCacheFile( + fileName = "$address.png", + content = iconRaw.decodeBase64Bytes() + ) + + ids += TokenDto(id = address, type = "png") + } else -> return@forEach } } + + updateWhitelist(ids) + fileManager.writeInternalFile( + WHITELIST_FILE_NAME, + Json.encodeToString(ids) + ) }.onFailure { FirebaseWrapper.recordException(it) diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt index 021151f3a..eeb693726 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt @@ -139,7 +139,7 @@ class TransactionHistoryRepositoryImpl @Inject constructor( txHistoryRepository.getTransactionHistoryPaged( address = soraAccount.substrateAddress, page = page, - chainInfo = ChainInfo.Simple("SoraChainId"), + chainInfo = ChainInfo.Simple(soraConfigManager.getGenesis()), pageCount = 100, filters = TxFilter.entries.toSet() ) From 6a00cfd628f2fadbe96301b72a9fba3bdcf75c8f Mon Sep 17 00:00:00 2001 From: arvifox Date: Mon, 15 Jul 2024 13:13:31 +0300 Subject: [PATCH 27/43] mwr-612 --- .../common/di/modules/CommonModule.kt | 3 ++- .../data/BlockExplorerManager.kt | 18 +++++++++++++----- .../data/TransactionHistoryRepositoryImpl.kt | 4 ++-- gradle/libs.versions.toml | 2 +- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt b/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt index 5e1b7c96e..83ccee519 100644 --- a/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt +++ b/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt @@ -72,6 +72,7 @@ import jp.co.soramitsu.common.interfaces.WithProgress import jp.co.soramitsu.common.io.FileManager import jp.co.soramitsu.common.io.FileManagerImpl import jp.co.soramitsu.common.resourses.LanguagesHolder +import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.common.util.CryptoAssistant import jp.co.soramitsu.common.util.DeviceParamsProvider import jp.co.soramitsu.common.util.EncryptionUtil @@ -173,7 +174,7 @@ class CommonModule { override fun getOrCreateJsonConfig(): Json = json override fun getRequestTimeoutMillis(): Long = 30_000L override fun getSocketTimeoutMillis(): Long = 30_000L - override fun isLoggingEnabled(): Boolean = BuildConfig.DEBUG + override fun isLoggingEnabled(): Boolean = BuildUtils.isPlayMarket().not() } ) diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt index 9d88314c0..965044076 100644 --- a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/BlockExplorerManager.kt @@ -98,15 +98,23 @@ class BlockExplorerManager @Inject constructor( RetryStrategyBuilder.build().retryIf( retries = 3, - predicate = { t -> t is RestClientException }, - block = { info.getAssetsInfo(soraConfigManager.getGenesis(), tokenIds, yesterdayHour.toInt()) }, + predicate = { t -> + t is RestClientException + }, + block = { + info.getAssetsInfo( + soraConfigManager.getGenesis(), + tokenIds, + yesterdayHour.toInt(), + ) + }, ).forEach { assetInfo -> val dbValue = tokens.find { it.tokenIdFiat == assetInfo.id } - val delta = assetInfo.previousPrice + val prevPrice = assetInfo.previousPrice - if (dbValue != null && delta != null) { + if (dbValue != null) { fiats += dbValue.copy( - fiatChange = delta / 100.0, + fiatChange = prevPrice?.div(100.0), fiatPricePrevHTime = yesterdayHour, ) } diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt index eeb693726..0c98aa661 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/data/TransactionHistoryRepositoryImpl.kt @@ -168,8 +168,8 @@ class TransactionHistoryRepositoryImpl @Inject constructor( if (page == 1L) addAll(filterLocalPendingTx(filterTokenId).sortedByDescending { it.base.timestamp }) addAll(referralTransactions) }, - historyInfo?.endReached ?: true, - historyInfo?.errorMessage, + historyInfo.endReached, + historyInfo.errorMessage, ) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5752020a2..4a3e44965 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -40,7 +40,7 @@ tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" soracard = "1.1.13" -xnetworkingLib = "1.0.5" +xnetworkingLib = "1.0.7" xsubstrate = "1.2.7" uicore = "0.2.32" xbackup = "1.2.2" From 8fb41ab5e6657f354cc7cf94673277cfbd29c830 Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 16 Jul 2024 16:20:27 +0300 Subject: [PATCH 28/43] sc-29 --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4a3e44965..7175390e8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.5.0" +agp = "8.5.1" kotlin = "1.9.24" appcompat = "1.6.1" coroutines = "1.8.1" @@ -39,7 +39,7 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.1.13" +soracard = "1.1.14" xnetworkingLib = "1.0.7" xsubstrate = "1.2.7" uicore = "0.2.32" From 7f521f0092de6ff374b021be825482b05d0b1f6f Mon Sep 17 00:00:00 2001 From: arvifox Date: Mon, 22 Jul 2024 12:51:40 +0300 Subject: [PATCH 29/43] sc-29 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7175390e8..52660d701 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,7 +39,7 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.1.14" +soracard = "1.1.15" xnetworkingLib = "1.0.7" xsubstrate = "1.2.7" uicore = "0.2.32" From 88d86ad882aae7d91d2c02dd5798fa6112fd971d Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 30 Jul 2024 15:18:49 +0300 Subject: [PATCH 30/43] reformat --- android-foundation | 2 +- .../common/di/modules/CommonModule.kt | 2 +- .../common/domain/CoroutineManager.kt | 45 ------------------- .../common/domain/DarkThemeManager.kt | 1 + .../data/repository/UserRepositoryImpl.kt | 2 +- .../di/AccountFeatureModule.kt | 2 +- .../data/repository/UserRepositoryTest.kt | 2 +- .../data/AssetsRepositoryImpl.kt | 2 +- .../di/AssetsFeatureModule.kt | 2 +- .../domain/AssetsInteractorImpl.kt | 2 +- .../assetdetails/AssetDetailsViewModel.kt | 2 +- .../receiverequest/QRCodeFlowViewModel.kt | 2 +- .../screens/scan/QrCodeScannerViewModel.kt | 2 +- .../data/AssetsRepositoryTest.kt | 2 +- .../domain/AssetsInteractorTest.kt | 2 +- .../qr/QrCodeFlowViewModelTest.kt | 2 +- .../domain/TransactionHistoryHandlerImpl.kt | 2 +- .../domain/TransactionHistoryHandlerTest.kt | 2 +- .../allcurrencies/AllCurrenciesViewModel.kt | 2 +- .../allpools/AllPoolsViewModel.kt | 2 +- .../presentation/MainViewModel.kt | 2 +- .../presentation/MainViewModelTest.kt | 2 +- .../presentation/OnboardingViewModel.kt | 2 +- .../AccountDetailsViewModel.kt | 2 +- .../OnboardingViewModelTest.kt | 2 +- .../AccountDetailsViewModelTest.kt | 2 +- .../di/PolkaswapFeatureModule.kt | 2 +- .../domain/PoolsUpdateSubscriptionImpl.kt | 2 +- .../liquidityadd/LiquidityAddViewModel.kt | 2 +- .../add/AddLiquidityViewModelTest.kt | 2 +- .../NodeManagerImpl.kt | 2 +- .../di/SelectNodeFeatureModule.kt | 2 +- .../domain/SelectNodeInteractor.kt | 2 +- .../domain/SoraCardInteractorImpl.kt | 2 +- .../cardshub/CardsHubViewModel.kt | 2 +- .../wallet/CardsHubViewModelTest.kt | 2 +- .../sora/substrate/di/SubstrateModule.kt | 2 +- .../sora/substrate/runtime/RuntimeManager.kt | 2 +- .../substrate/substrate/ExtrinsicManager.kt | 2 +- .../substrate/WsConnectionManager.kt | 2 +- 40 files changed, 39 insertions(+), 83 deletions(-) delete mode 100644 common/src/main/java/jp/co/soramitsu/common/domain/CoroutineManager.kt diff --git a/android-foundation b/android-foundation index f6b9d333c..193868497 160000 --- a/android-foundation +++ b/android-foundation @@ -1 +1 @@ -Subproject commit f6b9d333c30adcb41c94720dca256f48aac25d2a +Subproject commit 193868497926d8f7f8e1714d804b4898f34b790e diff --git a/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt b/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt index 83ccee519..0eeecbf11 100644 --- a/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt +++ b/common/src/main/java/jp/co/soramitsu/common/di/modules/CommonModule.kt @@ -52,6 +52,7 @@ import java.security.SecureRandom import java.util.Locale import java.util.TimeZone import javax.inject.Singleton +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.BuildConfig @@ -63,7 +64,6 @@ import jp.co.soramitsu.common.data.network.connection.NetworkStateListener import jp.co.soramitsu.common.date.DateTimeFormatter import jp.co.soramitsu.common.delegate.WithProgressImpl import jp.co.soramitsu.common.domain.AppStateProvider -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.InvitationHandler import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.PushHandler diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/CoroutineManager.kt b/common/src/main/java/jp/co/soramitsu/common/domain/CoroutineManager.kt deleted file mode 100644 index d65c11e72..000000000 --- a/common/src/main/java/jp/co/soramitsu/common/domain/CoroutineManager.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* -This file is part of the SORA network and Polkaswap app. - -Copyright (c) 2020, 2021, Polka Biome Ltd. All rights reserved. -SPDX-License-Identifier: BSD-4-Clause - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -All advertising materials mentioning features or use of this software must display -the following acknowledgement: This product includes software developed by Polka Biome -Ltd., SORA, and Polkaswap. - -Neither the name of the Polka Biome Ltd. nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Polka Biome Ltd. AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Polka Biome Ltd. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package jp.co.soramitsu.common.domain - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob - -class CoroutineManager { - val applicationScope = CoroutineScope(SupervisorJob()) - val io = Dispatchers.IO - val main = Dispatchers.Main - - fun createSupervisorScope() = CoroutineScope(Dispatchers.IO + SupervisorJob()) -} diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/DarkThemeManager.kt b/common/src/main/java/jp/co/soramitsu/common/domain/DarkThemeManager.kt index 9cae87af2..cd28bae01 100644 --- a/common/src/main/java/jp/co/soramitsu/common/domain/DarkThemeManager.kt +++ b/common/src/main/java/jp/co/soramitsu/common/domain/DarkThemeManager.kt @@ -38,6 +38,7 @@ import androidx.appcompat.app.AppCompatDelegate import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import javax.inject.Singleton +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.data.SoraPreferences import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.BufferOverflow diff --git a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryImpl.kt b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryImpl.kt index 5d8171a56..d35631cb0 100644 --- a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryImpl.kt +++ b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryImpl.kt @@ -33,9 +33,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_account_impl.data.repository import androidx.room.withTransaction +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.CardHubType -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.resourses.Language import jp.co.soramitsu.common.resourses.LanguagesHolder import jp.co.soramitsu.core_db.AppDatabase diff --git a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/di/AccountFeatureModule.kt b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/di/AccountFeatureModule.kt index d34c90516..45e231490 100644 --- a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/di/AccountFeatureModule.kt +++ b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/di/AccountFeatureModule.kt @@ -37,9 +37,9 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import javax.inject.Singleton +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.data.EncryptedPreferences import jp.co.soramitsu.common.data.SoraPreferences -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.resourses.LanguagesHolder import jp.co.soramitsu.core_db.AppDatabase import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsDatasource diff --git a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryTest.kt b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryTest.kt index 339752f46..630aad432 100644 --- a/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryTest.kt +++ b/feature_account_impl/src/test/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryTest.kt @@ -41,11 +41,11 @@ import io.mockk.impl.annotations.MockK import io.mockk.junit4.MockKRule import io.mockk.mockkStatic import io.mockk.slot +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.CardHubType -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.resourses.Language import jp.co.soramitsu.common.resourses.LanguagesHolder import jp.co.soramitsu.core_db.AppDatabase diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryImpl.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryImpl.kt index 128de4f89..fc6c827d1 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryImpl.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryImpl.kt @@ -36,11 +36,11 @@ import androidx.room.withTransaction import java.math.BigDecimal import java.math.BigInteger import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.data.network.dto.TokenInfoDto import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetHolder -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.domain.WhitelistTokensManager diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/di/AssetsFeatureModule.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/di/AssetsFeatureModule.kt index 6639e36ff..fa9628ae3 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/di/AssetsFeatureModule.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/di/AssetsFeatureModule.kt @@ -37,7 +37,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import javax.inject.Singleton -import jp.co.soramitsu.common.domain.CoroutineManager +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorImpl.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorImpl.kt index 2447227b5..11d79988b 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorImpl.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorImpl.kt @@ -34,12 +34,12 @@ package jp.co.soramitsu.feature_assets_impl.domain import java.math.BigDecimal import java.util.Date +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.format.isZero import jp.co.soramitsu.androidfoundation.format.orZero import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetHolder -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.common.util.Flavor diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt index 97175dbb0..aa82b6a11 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt @@ -41,6 +41,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.format.isZero import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.fragment.trigger @@ -48,7 +49,6 @@ import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.AssetHolder -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.formatFiatAmount import jp.co.soramitsu.common.domain.formatFiatChange import jp.co.soramitsu.common.domain.formatFiatOrEmpty diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt index a0cb4e5f3..458ff795a 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/receiverequest/QRCodeFlowViewModel.kt @@ -39,13 +39,13 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import java.math.BigDecimal import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.domain.AssetAmountInputState -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.SoraException import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.io.FileManager diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QrCodeScannerViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QrCodeScannerViewModel.kt index 8bb17ad7d..691d932df 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QrCodeScannerViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QrCodeScannerViewModel.kt @@ -39,7 +39,7 @@ import androidx.compose.runtime.setValue import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import jp.co.soramitsu.common.domain.CoroutineManager +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.presentation.compose.uikit.tokens.ScreenStatus import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.QrCodeDecoder diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryTest.kt index 2fb919e8d..d44f90566 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/data/AssetsRepositoryTest.kt @@ -35,10 +35,10 @@ package jp.co.soramitsu.feature_assets_impl.data import androidx.arch.core.executor.testing.InstantTaskExecutorRule import java.math.BigDecimal import java.math.BigInteger +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.domain.WhitelistTokensManager diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorTest.kt index d94605259..6c9b076e6 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/domain/AssetsInteractorTest.kt @@ -39,10 +39,10 @@ import io.mockk.junit4.MockKRule import io.mockk.mockkObject import io.mockk.mockkStatic import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt index 35e12ccbd..9fc02269b 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/qr/QrCodeFlowViewModelTest.kt @@ -44,6 +44,7 @@ import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.verify import java.util.StringJoiner +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.format.Big100 import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager @@ -51,7 +52,6 @@ import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.Asset -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.io.FileManager import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common.util.QrCodeGenerator diff --git a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt index f4e4c7957..cf7e3885b 100644 --- a/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt +++ b/feature_blockexplorer_impl/src/main/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerImpl.kt @@ -34,11 +34,11 @@ package jp.co.soramitsu.feature_blockexplorer_impl.domain import java.util.Date import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.date.DateTimeFormatter -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.util.DateTimeUtils import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository diff --git a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt index f3bd94b01..7f31c8719 100644 --- a/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt +++ b/feature_blockexplorer_impl/src/test/java/jp/co/soramitsu/feature_blockexplorer_impl/domain/TransactionHistoryHandlerTest.kt @@ -32,13 +32,13 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_blockexplorer_impl.domain +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.androidfoundation.format.unsafeCast import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.androidfoundation.testing.test import jp.co.soramitsu.common.date.DateTimeFormatter -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.DEFAULT_ICON_URI import jp.co.soramitsu.common.resourses.LanguagesHolder import jp.co.soramitsu.common.util.NumbersFormatter diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/allcurrencies/AllCurrenciesViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/allcurrencies/AllCurrenciesViewModel.kt index f7354f648..98fe6c331 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/allcurrencies/AllCurrenciesViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/allcurrencies/AllCurrenciesViewModel.kt @@ -35,7 +35,7 @@ package jp.co.soramitsu.feature_ecosystem_impl.presentation.allcurrencies import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import jp.co.soramitsu.common.domain.CoroutineManager +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemMapper import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemTokensInteractor diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/allpools/AllPoolsViewModel.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/allpools/AllPoolsViewModel.kt index 3449a8b62..648df0476 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/allpools/AllPoolsViewModel.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/allpools/AllPoolsViewModel.kt @@ -35,7 +35,7 @@ package jp.co.soramitsu.feature_ecosystem_impl.presentation.allpools import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import jp.co.soramitsu.common.domain.CoroutineManager +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemMapper import jp.co.soramitsu.feature_ecosystem_impl.domain.EcoSystemPoolsInteractor diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt index 41761e0e7..2a116d042 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModel.kt @@ -37,8 +37,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.RepeatStrategyBuilder import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.ext.setValueIfNew diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModelTest.kt index 6dfd2e966..edfd8bf56 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/MainViewModelTest.kt @@ -35,9 +35,9 @@ package jp.co.soramitsu.feature_main_impl.presentation import androidx.arch.core.executor.testing.InstantTaskExecutorRule import io.mockk.every import io.mockk.mockkObject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.RepeatStrategy import jp.co.soramitsu.common.domain.RepeatStrategyBuilder import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt index b8e09466a..726dc0a53 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/OnboardingViewModel.kt @@ -47,12 +47,12 @@ import dagger.hilt.android.lifecycle.HiltViewModel import java.net.SocketException import java.net.SocketTimeoutException import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator import jp.co.soramitsu.common.account.SoraAccount -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.InvitationHandler import jp.co.soramitsu.common.domain.ResponseCode import jp.co.soramitsu.common.domain.SoraException diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt index 01daf3577..d7464a57f 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/export_account/account_details/AccountDetailsViewModel.kt @@ -43,13 +43,13 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.net.SocketException import java.net.SocketTimeoutException +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.SoraException import jp.co.soramitsu.common.presentation.compose.components.initSmallTitle2 diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt index 3472aedc3..c66cc65b4 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/OnboardingViewModelTest.kt @@ -34,11 +34,11 @@ package jp.co.soramitsu.feature_multiaccount_impl import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.navigation.NavController +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.AccountAvatarGenerator -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.InvitationHandler import jp.co.soramitsu.feature_main_api.launcher.MainStarter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor diff --git a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt index 08e06ebdd..c853c4d0a 100644 --- a/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt +++ b/feature_multiaccount_impl/src/test/java/jp/co/soramitsu/feature_multiaccount_impl/export/account_details/AccountDetailsViewModelTest.kt @@ -37,13 +37,13 @@ import androidx.activity.result.ActivityResultLauncher import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.ui.text.input.TextFieldValue import androidx.navigation.NavController +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.phone.BasicClipboardManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.R import jp.co.soramitsu.common.account.SoraAccount -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_multiaccount_impl.domain.MultiaccountInteractor import jp.co.soramitsu.feature_multiaccount_impl.presentation.export_account.account_details.AccountDetailsViewModel diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/di/PolkaswapFeatureModule.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/di/PolkaswapFeatureModule.kt index 5ee2ddecd..559b0e976 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/di/PolkaswapFeatureModule.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/di/PolkaswapFeatureModule.kt @@ -37,7 +37,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import javax.inject.Singleton -import jp.co.soramitsu.common.domain.CoroutineManager +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.feature_account_api.domain.interfaces.CredentialsRepository import jp.co.soramitsu.feature_account_api.domain.interfaces.UserRepository import jp.co.soramitsu.feature_assets_api.data.AssetsRepository diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsUpdateSubscriptionImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsUpdateSubscriptionImpl.kt index 916b62584..8cc6f03a4 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsUpdateSubscriptionImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsUpdateSubscriptionImpl.kt @@ -32,7 +32,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_polkaswap_impl.domain -import jp.co.soramitsu.common.domain.CoroutineManager +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapSubscriptionRepository import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsUpdateSubscription import kotlinx.coroutines.flow.Flow diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt index 2666e3fed..909c36dc5 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt @@ -37,6 +37,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.coroutine.SuspendableProperty import jp.co.soramitsu.androidfoundation.format.isZero import jp.co.soramitsu.androidfoundation.format.nullZero @@ -45,7 +46,6 @@ import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.AssetAmountInputState -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.LiquidityDetails import jp.co.soramitsu.common.domain.printFiat import jp.co.soramitsu.common.presentation.compose.states.ButtonState diff --git a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt index ae404bede..f2cbd151d 100644 --- a/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt +++ b/feature_polkaswap_impl/src/test/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/polkaswap/liquidity/add/AddLiquidityViewModelTest.kt @@ -35,11 +35,11 @@ package jp.co.soramitsu.feature_polkaswap_impl.presentation.polkaswap.liquidity. import androidx.arch.core.executor.testing.InstantTaskExecutorRule import io.mockk.mockkObject import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.format.equalTo import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.common.R -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.common.util.NumbersFormatter import jp.co.soramitsu.common_wallet.domain.model.LiquidityData diff --git a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/NodeManagerImpl.kt b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/NodeManagerImpl.kt index 0d9da50c3..7d08132d3 100644 --- a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/NodeManagerImpl.kt +++ b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/NodeManagerImpl.kt @@ -32,9 +32,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_select_node_impl +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.format.removeHexPrefix import jp.co.soramitsu.common.domain.ChainNode -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.FlavorOptionsProvider import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.common.util.Flavor diff --git a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/di/SelectNodeFeatureModule.kt b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/di/SelectNodeFeatureModule.kt index 6af0b86e4..e8ce363b4 100644 --- a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/di/SelectNodeFeatureModule.kt +++ b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/di/SelectNodeFeatureModule.kt @@ -37,7 +37,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import javax.inject.Singleton -import jp.co.soramitsu.common.domain.CoroutineManager +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.core_db.AppDatabase import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.feature_select_node_api.NodeManager diff --git a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/domain/SelectNodeInteractor.kt b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/domain/SelectNodeInteractor.kt index ddcbd69c9..23f20d5f3 100644 --- a/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/domain/SelectNodeInteractor.kt +++ b/feature_select_node_impl/src/main/java/jp/co/soramitsu/feature_select_node_impl/domain/SelectNodeInteractor.kt @@ -33,8 +33,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_select_node_impl.domain import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.domain.ChainNode -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.feature_select_node_api.data.SelectNodeRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOn diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt index 0e98a65f6..c590be16b 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt @@ -34,7 +34,7 @@ package jp.co.soramitsu.feature_sora_card_impl.domain import java.math.BigDecimal import javax.inject.Inject -import jp.co.soramitsu.common.domain.CoroutineManager +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.domain.compareByTotal import jp.co.soramitsu.common.util.ext.splitVersions diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt index 98508fe03..969391ffe 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt @@ -36,6 +36,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.format.safeCast import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.resource.ResourceManager @@ -43,7 +44,6 @@ import jp.co.soramitsu.common.R import jp.co.soramitsu.common.domain.Asset import jp.co.soramitsu.common.domain.CardHub import jp.co.soramitsu.common.domain.CardHubType -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.fiatSum import jp.co.soramitsu.common.domain.fiatSymbol import jp.co.soramitsu.common.domain.formatFiatAmount diff --git a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt index 8a09e4b91..d48d363c8 100644 --- a/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt +++ b/feature_wallet_impl/src/test/java/jp/co/soramitsu/feature_wallet_impl/presentation/wallet/CardsHubViewModelTest.kt @@ -42,6 +42,7 @@ import io.mockk.junit4.MockKRule import io.mockk.just import io.mockk.mockkObject import io.mockk.verify +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.resource.ResourceManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue @@ -50,7 +51,6 @@ import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.config.BuildConfigWrapper import jp.co.soramitsu.common.domain.CardHub import jp.co.soramitsu.common.domain.CardHubType -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.domain.OptionsProvider import jp.co.soramitsu.common.interfaces.WithProgress import jp.co.soramitsu.common.util.NumbersFormatter diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/di/SubstrateModule.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/di/SubstrateModule.kt index 5e31c91d0..531332355 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/di/SubstrateModule.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/di/SubstrateModule.kt @@ -41,9 +41,9 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import javax.inject.Singleton +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.data.network.connection.NetworkStateListener import jp.co.soramitsu.common.domain.AppStateProvider -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.sora.substrate.substrate.ConnectionManager import jp.co.soramitsu.sora.substrate.substrate.SubstrateApi import jp.co.soramitsu.sora.substrate.substrate.SubstrateApiImpl diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt index e27325d85..9d3983ead 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt @@ -36,8 +36,8 @@ import com.google.gson.Gson import java.math.BigInteger import javax.inject.Inject import javax.inject.Singleton +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.data.SoraPreferences -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.common.io.FileManager import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/ExtrinsicManager.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/ExtrinsicManager.kt index beb8c4a9e..6199edb91 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/ExtrinsicManager.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/ExtrinsicManager.kt @@ -35,7 +35,7 @@ package jp.co.soramitsu.sora.substrate.substrate import java.math.BigInteger import javax.inject.Inject import javax.inject.Singleton -import jp.co.soramitsu.common.domain.CoroutineManager +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.sora.substrate.models.ExtrinsicStatusResponse import jp.co.soramitsu.sora.substrate.models.ExtrinsicSubmitStatus diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/WsConnectionManager.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/WsConnectionManager.kt index 232b2e8ab..a78382f64 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/WsConnectionManager.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/substrate/WsConnectionManager.kt @@ -34,9 +34,9 @@ package jp.co.soramitsu.sora.substrate.substrate import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.common.data.network.connection.NetworkStateListener import jp.co.soramitsu.common.domain.AppStateProvider -import jp.co.soramitsu.common.domain.CoroutineManager import jp.co.soramitsu.xsubstrate.wsrpc.SocketService import jp.co.soramitsu.xsubstrate.wsrpc.networkStateFlow import jp.co.soramitsu.xsubstrate.wsrpc.state.SocketStateMachine From 4088d33056bedb8128462987c1cf6f17752f6c12 Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 30 Jul 2024 16:33:51 +0300 Subject: [PATCH 31/43] sc-42 --- .../assetdetails/AssetDetailsBalanceCard.kt | 9 +- .../presentation/profile/ProfileScreen.kt | 18 +-- .../domain/SoraCardInteractorImpl.kt | 91 +++++++------ .../details/SoraCardDetailsViewModel.kt | 10 +- .../details/SoraCardMainSoraContentCard.kt | 2 +- .../get/card/SoraCardInteractorTest.kt | 120 ++++++++++++++++++ .../data/repository/WalletRepositoryImpl.kt | 3 +- .../cardshub/CardsHubViewModel.kt | 1 - gradle/libs.versions.toml | 4 +- 9 files changed, 196 insertions(+), 62 deletions(-) create mode 100644 feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/SoraCardInteractorTest.kt diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt index db0ce31e7..44cdcf20f 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt @@ -63,6 +63,7 @@ import jp.co.soramitsu.ui_core.component.button.BleachedButton import jp.co.soramitsu.ui_core.component.button.properties.Order import jp.co.soramitsu.ui_core.component.button.properties.Size import jp.co.soramitsu.ui_core.component.card.ContentCard +import jp.co.soramitsu.ui_core.extensions.withOpacity import jp.co.soramitsu.ui_core.resources.Dimens import jp.co.soramitsu.ui_core.theme.customColors import jp.co.soramitsu.ui_core.theme.customTypography @@ -186,17 +187,20 @@ internal fun AssetDetailsBalanceCard( AmountCardIcon( res = R.drawable.ic_new_arrow_up_24, text = stringResource(id = R.string.common_send), + enabled = true, onClick = onSendClick, ) } AmountCardIcon( res = R.drawable.ic_new_arrow_down_24, text = stringResource(id = R.string.common_receive), + enabled = true, onClick = onReceiveClick, ) AmountCardIcon( res = R.drawable.ic_refresh_24, text = stringResource(id = R.string.polkaswap_swap_title), + enabled = true, onClick = onSwapClick, ) @@ -204,6 +208,7 @@ internal fun AssetDetailsBalanceCard( AmountCardIcon( res = R.drawable.ic_buy_crypto, text = stringResource(id = R.string.common_buy), + enabled = false, onClick = onBuyCryptoClick ) } @@ -216,6 +221,7 @@ internal fun AssetDetailsBalanceCard( private fun AmountCardIcon( @DrawableRes res: Int, text: String, + enabled: Boolean, onClick: () -> Unit, ) { Column( @@ -228,6 +234,7 @@ private fun AmountCardIcon( shape = CircleShape, size = Size.Large, order = Order.TERTIARY, + enabled = enabled, leftIcon = painterResource(res), onClick = onClick, ) @@ -238,7 +245,7 @@ private fun AmountCardIcon( .padding(top = Dimens.x1), text = text, style = MaterialTheme.customTypography.textXSBold, - color = MaterialTheme.customColors.fgSecondary, + color = MaterialTheme.customColors.fgSecondary.withOpacity(opacity = if (enabled) 1.0f else 0.3f), ) } } diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt index 439e20f53..dd939ca94 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt @@ -85,15 +85,15 @@ internal fun ProfileItems( icon = R.drawable.ic_buy_crypto, onClick = onSoraCardClick, ) - CategoryItem( - modifier = Modifier - .testTagAsId("BuyXor") - .padding(top = Dimens.x2), - title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), - subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), - icon = R.drawable.ic_settings_buy_crypto, - onClick = onBuyCrypto, - ) +// CategoryItem( +// modifier = Modifier +// .testTagAsId("BuyXor") +// .padding(top = Dimens.x2), +// title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), +// subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), +// icon = R.drawable.ic_settings_buy_crypto, +// onClick = onBuyCrypto, +// ) } CategoryItem( modifier = Modifier diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt index c590be16b..c49de8505 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/domain/SoraCardInteractorImpl.kt @@ -48,16 +48,20 @@ import jp.co.soramitsu.oauth.base.sdk.contract.IbanInfo import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import kotlin.math.min +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch internal class SoraCardInteractorImpl @Inject constructor( private val assetsInteractor: AssetsInteractor, @@ -82,51 +86,60 @@ internal class SoraCardInteractorImpl @Inject constructor( private val _ibanFlow = MutableStateFlow(null) private val _phoneFlow = MutableStateFlow("") + private val _verStatus = MutableStateFlow(SoraCardCommonVerification.NotFound) + @OptIn(FlowPreview::class) @Suppress("UNCHECKED_CAST") override suspend fun initialize() { - combine( - flow { emit(soraCardClientProxy.init()) }, - needInstallUpdate(), - fetchApplicationFee(), - _ibanFlow.asStateFlow(), - subscribeToSoraCardAvailabilityFlow(), - checkSoraCardPending(), - _phoneFlow.asStateFlow(), - ) { flows -> - val init = flows[0] as Pair - val needUpdate = flows[1] as Boolean - val fee = flows[2] as String - val ibanInfo = flows[3] as IbanInfo? - val availability = flows[4] as SoraCardAvailabilityInfo - val verification = flows[5] as SoraCardCommonVerification - val phone = flows[6] as String - SoraCardBasicStatus( - initialized = init.first, - initError = init.second, - availabilityInfo = availability, - verification = verification, - needInstallUpdate = needUpdate, - applicationFee = fee, - ibanInfo = ibanInfo, - phone = phone, - ) - } - .debounce(1000) - .collect { - _soraCardBasicStatus.value = it + coroutineScope { + launch { + resetInfo() } - resetInfo() + launch { + checkSoraCardPending() + } + combine( + flow { emit(soraCardClientProxy.init()) }, + needInstallUpdate(), + fetchApplicationFee(), + _ibanFlow.asStateFlow(), + subscribeToSoraCardAvailabilityFlow(), + _verStatus.asStateFlow(), + _phoneFlow.asStateFlow(), + ) { flows -> + val init = flows[0] as Pair + val needUpdate = flows[1] as Boolean + val fee = flows[2] as String + val ibanInfo = flows[3] as IbanInfo? + val availability = flows[4] as SoraCardAvailabilityInfo + val verification = flows[5] as SoraCardCommonVerification + val phone = flows[6] as String + SoraCardBasicStatus( + initialized = init.first, + initError = init.second, + availabilityInfo = availability, + verification = verification, + needInstallUpdate = needUpdate, + applicationFee = fee, + ibanInfo = ibanInfo, + phone = phone, + ) + } + .debounce(1000) + .collectLatest { + _soraCardBasicStatus.value = it + } + } } override val basicStatus: StateFlow = _soraCardBasicStatus.asStateFlow() - private suspend fun checkSoraCardPending() = flow { + private suspend fun checkSoraCardPending() { var isLoopInProgress = true while (isLoopInProgress) { val status = soraCardClientProxy.getKycStatus().getOrDefault(SoraCardCommonVerification.NotFound) - emit(status) + _verStatus.value = status if (status != SoraCardCommonVerification.Pending) { isLoopInProgress = false } else { @@ -156,19 +169,15 @@ internal class SoraCardInteractorImpl @Inject constructor( } override suspend fun setStatus(status: SoraCardCommonVerification) { - _soraCardBasicStatus.value = _soraCardBasicStatus.value.copy( - verification = status, - ) + _verStatus.value = status resetInfo() } override suspend fun setLogout() { soraCardClientProxy.logout() - _soraCardBasicStatus.value = _soraCardBasicStatus.value.copy( - verification = SoraCardCommonVerification.NotFound, - ibanInfo = null, - phone = null, - ) + _verStatus.value = SoraCardCommonVerification.NotFound + _ibanFlow.value = null + _phoneFlow.value = "" } private fun subscribeToSoraCardAvailabilityFlow() = diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index e05e879c9..804e1365a 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -108,12 +108,10 @@ class SoraCardDetailsViewModel @Inject constructor( ibanCache = basicStatus.ibanInfo val phoneFormatted = basicStatus.phone?.let { "+$it" } _soraCardDetailsScreenState.value = local.copy( - soraCardIBANCardState = basicStatus.ibanInfo?.let { iban -> - SoraCardIBANCardState( - iban.iban, - iban.ibanStatus == IbanStatus.CLOSED, - ) - }, + soraCardIBANCardState = SoraCardIBANCardState( + iban = basicStatus.ibanInfo?.iban.orEmpty(), + closed = basicStatus.ibanInfo?.ibanStatus == IbanStatus.CLOSED, + ), soraCardMainSoraContentCardState = local.soraCardMainSoraContentCardState.copy( balance = basicStatus.ibanInfo?.balance, phone = phoneFormatted, diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt index 852c70fcd..579d9ced8 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt @@ -180,7 +180,7 @@ fun SoraCardMainSoraContentCard( .padding(horizontal = Dimens.x1) .weight(1f), size = Size.Large, - enabled = true, + enabled = false, order = Order.PRIMARY, onClick = onExchangeXor, text = stringResource(id = jp.co.soramitsu.oauth.R.string.exchange_xor), diff --git a/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/SoraCardInteractorTest.kt b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/SoraCardInteractorTest.kt new file mode 100644 index 000000000..dcaaa75af --- /dev/null +++ b/feature_sora_card_impl/src/test/java/jp/co/soramitsu/feature_sora_card_impl/presentation/get/card/SoraCardInteractorTest.kt @@ -0,0 +1,120 @@ +package jp.co.soramitsu.feature_sora_card_impl.presentation.get.card + +import java.math.BigDecimal +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager +import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule +import jp.co.soramitsu.demeter.domain.DemeterFarmingInteractor +import jp.co.soramitsu.feature_assets_api.domain.AssetsInteractor +import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor +import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor +import jp.co.soramitsu.feature_sora_card_impl.domain.SoraCardClientProxy +import jp.co.soramitsu.feature_sora_card_impl.domain.SoraCardInteractorImpl +import jp.co.soramitsu.oauth.base.sdk.contract.IbanInfo +import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus +import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification +import jp.co.soramitsu.test_data.PolkaswapTestData.POOL_DATA +import jp.co.soramitsu.test_data.TestAssets +import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.wheneverBlocking + +@RunWith(MockitoJUnitRunner::class) +@OptIn(ExperimentalCoroutinesApi::class) +class SoraCardInteractorTest { + + @get:Rule + var mainCoroutineRule = MainCoroutineRule() + + @Mock + private lateinit var ai: AssetsInteractor + + @Mock + private lateinit var pi: PoolsInteractor + + @Mock + private lateinit var sccp: SoraCardClientProxy + + @Mock + private lateinit var dfi: DemeterFarmingInteractor + + @Mock + private lateinit var cm: CoroutineManager + + private lateinit var soraCardInteractor: SoraCardInteractor + + @OptIn(ExperimentalStdlibApi::class) + @Before + fun setUp() = runTest { + `when`(cm.io).thenReturn(this.coroutineContext[CoroutineDispatcher]!!) + wheneverBlocking { sccp.init() } doReturn (true to "") + wheneverBlocking { sccp.getVersion() } doReturn Result.success("2.3.4") + wheneverBlocking { sccp.getApplicationFee() } doReturn "$8.98" + wheneverBlocking { + sccp.getKycStatus() + } doReturn Result.success(SoraCardCommonVerification.Successful) + wheneverBlocking { ai.subscribeAssetOfCurAccount(any()) } doReturn flowOf(TestAssets.xorAsset()) + wheneverBlocking { pi.getPoolsCacheOfCurAccount() } doReturn listOf(POOL_DATA) + wheneverBlocking { dfi.getStakedFarmedBalanceOfAsset(any()) } doReturn BigDecimal.ONE + soraCardInteractor = SoraCardInteractorImpl( + assetsInteractor = ai, + poolsInteractor = pi, + soraCardClientProxy = sccp, + demeterFarmingInteractor = dfi, + coroutineManager = cm, + ) + } + + @Test + fun `test init with full data`() = runTest { + wheneverBlocking { sccp.getIBAN() } doReturn Result.success( + IbanInfo( + "iban", + IbanStatus.ACTIVE, + "$12.34", + "ok", + ) + ) + wheneverBlocking { sccp.getPhone() } doReturn "+123" + advanceUntilIdle() + backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) { + soraCardInteractor.initialize() + } + advanceTimeBy(1100.milliseconds) + val bs = soraCardInteractor.basicStatus.value + assertTrue(bs.initialized) + } + + @Test + fun `test call status set`() = runTest { + wheneverBlocking { sccp.getIBAN() } doReturn Result.success(null) + wheneverBlocking { sccp.getPhone() } doReturn "+123" + advanceUntilIdle() + backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) { + soraCardInteractor.initialize() + } + advanceTimeBy(1100.milliseconds) + var bs = soraCardInteractor.basicStatus.value + assertTrue(bs.initialized) + soraCardInteractor.setStatus(SoraCardCommonVerification.Pending) + advanceUntilIdle() + bs = soraCardInteractor.basicStatus.value + assertTrue(bs.initialized) + } +} diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt index 60966ff07..39a1e9f57 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt @@ -129,7 +129,8 @@ class WalletRepositoryImpl @Inject constructor( val card = CardsHubMapper.map(cardLocal) when (card?.cardType) { CardHubType.GET_SORA_CARD -> if (soraCard) card else null - CardHubType.BUY_XOR_TOKEN -> if (soraCard) card else null +// CardHubType.BUY_XOR_TOKEN -> if (soraCard) card else null + CardHubType.BUY_XOR_TOKEN -> null else -> card } } diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt index 969391ffe..ef9221a2a 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt @@ -144,7 +144,6 @@ class CardsHubViewModel @Inject constructor( _state.value = _state.value.copy( accountAddress = data.first.substrateAddress, curAccount = data.first.accountTitle(), - loading = false, ) val flows = data.second.filter { it.visibility }.map { cardHub -> when (cardHub.cardType) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 52660d701..fc48ed339 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ svg = "1.4" jdenticon = "1.1" archFragmentTest = "1.7.1" mockk = "1.13.8" -truth = "1.1.5" +truth = "1.4.2" mockitoKotlin = "5.2.1" mockito = "5.2.0" junit = "4.13.2" @@ -39,7 +39,7 @@ firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" ktor = "2.3.1" -soracard = "1.1.15" +soracard = "1.1.16" xnetworkingLib = "1.0.7" xsubstrate = "1.2.7" uicore = "0.2.32" From 7d6f1e53c668e7ace135c2b8b421a0266570dd1c Mon Sep 17 00:00:00 2001 From: arvifox Date: Mon, 2 Sep 2024 16:50:24 +0300 Subject: [PATCH 32/43] agp 8.6.0, versions up --- .gitmodules | 3 -- android-foundation | 1 - app/build.gradle.kts | 2 +- common/build.gradle.kts | 2 +- common_wallet/build.gradle.kts | 5 +- core_db/build.gradle.kts | 2 +- demeter/build.gradle.kts | 2 +- feature_account_impl/build.gradle.kts | 2 +- feature_assets_impl/build.gradle.kts | 2 +- feature_blockexplorer_api/build.gradle.kts | 2 +- .../data/SoraConfigManager.kt | 9 +--- feature_blockexplorer_impl/build.gradle.kts | 2 +- feature_ecosystem_impl/build.gradle.kts | 2 +- feature_main_impl/build.gradle.kts | 2 +- feature_multiaccount_impl/build.gradle.kts | 2 +- feature_polkaswap_impl/build.gradle.kts | 2 +- feature_referral_impl/build.gradle.kts | 2 +- feature_select_node_impl/build.gradle.kts | 2 +- feature_sora_card_impl/build.gradle.kts | 2 +- feature_wallet_impl/build.gradle.kts | 2 +- gradle/libs.versions.toml | 48 ++++++++++--------- settings.gradle.kts | 1 - sorasubstrate/build.gradle.kts | 2 +- .../sora/substrate/runtime/RuntimeManager.kt | 10 ++-- 24 files changed, 49 insertions(+), 62 deletions(-) delete mode 160000 android-foundation diff --git a/.gitmodules b/.gitmodules index cd03d0ec3..e69de29bb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "android-foundation"] - path = android-foundation - url = https://github.com/soramitsu/android-foundation.git diff --git a/android-foundation b/android-foundation deleted file mode 160000 index 193868497..000000000 --- a/android-foundation +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 193868497926d8f7f8e1714d804b4898f34b790e diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 107152d64..f34cdd97c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -178,7 +178,6 @@ play { dependencies { // implementation(libs.fileTree(dir: 'libs', include: ['*.jar']) - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":core_db")) implementation(project(":demeter")) @@ -222,6 +221,7 @@ dependencies { implementation(libs.timberDep) implementation(libs.xsubstrateDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.daggerDep) kapt(libs.daggerKaptDep) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index c1a864169..2da5b1a91 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -151,7 +151,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":network")) implementation(libs.activityKtxDep) @@ -165,6 +164,7 @@ dependencies { implementation(libs.coroutineDep) implementation(libs.uiCoreDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.kotlinxSerializationJsonDep) diff --git a/common_wallet/build.gradle.kts b/common_wallet/build.gradle.kts index 4bbddb777..56add40fe 100644 --- a/common_wallet/build.gradle.kts +++ b/common_wallet/build.gradle.kts @@ -79,7 +79,6 @@ android { dependencies { // implementation(libs.fileTree(dir: 'libs', include: ['*.jar'])) - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":feature_blockexplorer_api")) implementation(project(":core_db")) @@ -93,6 +92,7 @@ dependencies { implementation(libs.coroutineDep) implementation(libs.uiCoreDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.coilSvgDep) @@ -106,9 +106,8 @@ dependencies { implementation(libs.svgDep) implementation(libs.jdenticonDep) - api(libs.soraCardDep) { + api(libs.soramitsu.sora.card) { exclude(group = "com.paywings.onboarding.kyc.android-libs", module = "java-websocket-lib") - exclude(module = "android-foundation") } implementation(libs.daggerDep) diff --git a/core_db/build.gradle.kts b/core_db/build.gradle.kts index 2d5d2eaea..69be73846 100644 --- a/core_db/build.gradle.kts +++ b/core_db/build.gradle.kts @@ -93,7 +93,7 @@ dependencies { ksp(libs.roomKaptDep) androidTestImplementation(project(":test_data")) - androidTestImplementation(project(":android-foundation")) + androidTestImplementation(libs.soramitsu.android.foundation) androidTestImplementation(libs.androidxTestExtJunitDep) androidTestImplementation(libs.androidxTestEspressoCoreDep) androidTestImplementation(libs.archCoreTestDep) diff --git a/demeter/build.gradle.kts b/demeter/build.gradle.kts index a31c0e04e..e718715ce 100644 --- a/demeter/build.gradle.kts +++ b/demeter/build.gradle.kts @@ -76,7 +76,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":core_db")) @@ -96,6 +95,7 @@ dependencies { implementation(libs.coroutineAndroidDep) implementation(libs.xsubstrateDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.composeRuntimeDep) diff --git a/feature_account_impl/build.gradle.kts b/feature_account_impl/build.gradle.kts index 3fdb2e59f..1736bdbf2 100644 --- a/feature_account_impl/build.gradle.kts +++ b/feature_account_impl/build.gradle.kts @@ -65,7 +65,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":feature_account_api")) implementation(project(":feature_blockexplorer_api")) @@ -74,6 +73,7 @@ dependencies { implementation(libs.xcryptoDep) implementation(libs.xsubstrateDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.daggerDep) kapt(libs.daggerKaptDep) diff --git a/feature_assets_impl/build.gradle.kts b/feature_assets_impl/build.gradle.kts index 30c2f9064..7412823c8 100644 --- a/feature_assets_impl/build.gradle.kts +++ b/feature_assets_impl/build.gradle.kts @@ -76,7 +76,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":core_db")) @@ -93,6 +92,7 @@ dependencies { implementation(libs.xsubstrateDep) implementation(libs.xcryptoDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.appcompatDep) implementation(libs.materialDep) diff --git a/feature_blockexplorer_api/build.gradle.kts b/feature_blockexplorer_api/build.gradle.kts index 9e518d531..17dcef38e 100644 --- a/feature_blockexplorer_api/build.gradle.kts +++ b/feature_blockexplorer_api/build.gradle.kts @@ -76,7 +76,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":core_db")) implementation(project(":network")) @@ -93,6 +92,7 @@ dependencies { implementation(libs.viewmodelKtxDep) implementation(libs.uiCoreDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.navigationComposeDep) implementation(platform(libs.compose.bom)) diff --git a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/SoraConfigManager.kt b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/SoraConfigManager.kt index 3386edb6d..769dff4c9 100644 --- a/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/SoraConfigManager.kt +++ b/feature_blockexplorer_api/src/main/java/jp/co/soramitsu/feature_blockexplorer_api/data/SoraConfigManager.kt @@ -44,7 +44,7 @@ import jp.co.soramitsu.feature_blockexplorer_api.data.models.SoraConfig import jp.co.soramitsu.feature_blockexplorer_api.data.models.SoraConfigNode import jp.co.soramitsu.feature_blockexplorer_api.data.models.SoraCurrency import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient -import jp.co.soramitsu.xnetworking.lib.engines.utils.JsonGetRequest +import jp.co.soramitsu.xnetworking.lib.engines.utils.getAsString import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -124,12 +124,7 @@ class SoraConfigManager @Inject constructor( deserializer: () -> DeserializationStrategy ): T? { val result = runCatching { - restClient.getReturnString( - JsonGetRequest( - url = url(), - responseDeserializer = String.serializer() - ) - ) + restClient.getAsString(url()) }.onSuccess { configAsString -> soraPreferences.putString( field = nameToSaveWith(), diff --git a/feature_blockexplorer_impl/build.gradle.kts b/feature_blockexplorer_impl/build.gradle.kts index c39d27dc1..8bb6ea06e 100644 --- a/feature_blockexplorer_impl/build.gradle.kts +++ b/feature_blockexplorer_impl/build.gradle.kts @@ -77,7 +77,6 @@ android { dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":sorasubstrate")) implementation(project(":feature_assets_api")) @@ -99,6 +98,7 @@ dependencies { implementation(libs.viewmodelKtxDep) implementation(libs.uiCoreDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.navigationComposeDep) implementation(platform(libs.compose.bom)) diff --git a/feature_ecosystem_impl/build.gradle.kts b/feature_ecosystem_impl/build.gradle.kts index daf26999c..a1a177772 100644 --- a/feature_ecosystem_impl/build.gradle.kts +++ b/feature_ecosystem_impl/build.gradle.kts @@ -76,7 +76,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":demeter")) implementation(project(":common_wallet")) @@ -119,6 +118,7 @@ dependencies { kapt(libs.lifecycleKaptDep) implementation(libs.uiCoreDep) + implementation(libs.soramitsu.android.foundation) implementation(platform(libs.compose.bom)) implementation(libs.composeUiDep) diff --git a/feature_main_impl/build.gradle.kts b/feature_main_impl/build.gradle.kts index bd95d5a4d..27f15be1b 100644 --- a/feature_main_impl/build.gradle.kts +++ b/feature_main_impl/build.gradle.kts @@ -76,7 +76,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":core_db")) @@ -99,6 +98,7 @@ dependencies { implementation(libs.biometricDep) implementation(libs.uiCoreDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.coreKtxDep) diff --git a/feature_multiaccount_impl/build.gradle.kts b/feature_multiaccount_impl/build.gradle.kts index c0dc4dee6..a775fea21 100644 --- a/feature_multiaccount_impl/build.gradle.kts +++ b/feature_multiaccount_impl/build.gradle.kts @@ -81,7 +81,6 @@ android { dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":feature_assets_api")) implementation(project(":feature_account_api")) @@ -105,6 +104,7 @@ dependencies { implementation(libs.viewmodelKtxDep) implementation(libs.uiCoreDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.coilDep) implementation(libs.coilComposeDep) diff --git a/feature_polkaswap_impl/build.gradle.kts b/feature_polkaswap_impl/build.gradle.kts index c52473545..1ddc98b0d 100644 --- a/feature_polkaswap_impl/build.gradle.kts +++ b/feature_polkaswap_impl/build.gradle.kts @@ -77,7 +77,6 @@ android { dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":core_db")) @@ -93,6 +92,7 @@ dependencies { implementation(libs.xsubstrateDep) implementation(libs.xcryptoDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.appcompatDep) implementation(libs.materialDep) diff --git a/feature_referral_impl/build.gradle.kts b/feature_referral_impl/build.gradle.kts index 1dc70c514..ae4201185 100644 --- a/feature_referral_impl/build.gradle.kts +++ b/feature_referral_impl/build.gradle.kts @@ -77,7 +77,6 @@ android { dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":core_db")) implementation(project(":feature_assets_api")) @@ -98,6 +97,7 @@ dependencies { implementation(libs.viewmodelKtxDep) implementation(libs.uiCoreDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.navigationComposeDep) implementation(platform(libs.compose.bom)) diff --git a/feature_select_node_impl/build.gradle.kts b/feature_select_node_impl/build.gradle.kts index c20b10f5b..40555eb5a 100644 --- a/feature_select_node_impl/build.gradle.kts +++ b/feature_select_node_impl/build.gradle.kts @@ -76,7 +76,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":feature_select_node_api")) implementation(project(":feature_main_api")) @@ -100,6 +99,7 @@ dependencies { implementation(libs.navigationUiDep) implementation(libs.xsubstrateDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.roomDep) implementation(libs.roomKtxDep) diff --git a/feature_sora_card_impl/build.gradle.kts b/feature_sora_card_impl/build.gradle.kts index f40ceb645..3fb9f7b22 100644 --- a/feature_sora_card_impl/build.gradle.kts +++ b/feature_sora_card_impl/build.gradle.kts @@ -76,7 +76,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":demeter")) @@ -106,6 +105,7 @@ dependencies { implementation(libs.navigationUiDep) implementation(libs.uiCoreDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.timberDep) diff --git a/feature_wallet_impl/build.gradle.kts b/feature_wallet_impl/build.gradle.kts index 393319405..93ea84af1 100644 --- a/feature_wallet_impl/build.gradle.kts +++ b/feature_wallet_impl/build.gradle.kts @@ -80,7 +80,6 @@ android { } dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":core_db")) @@ -99,6 +98,7 @@ dependencies { implementation(libs.xsubstrateDep) implementation(libs.xcryptoDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.appcompatDep) implementation(libs.materialDep) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fc48ed339..4f50f0208 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] -agp = "8.5.1" +agp = "8.6.0" kotlin = "1.9.24" -appcompat = "1.6.1" +appcompat = "1.7.0" coroutines = "1.8.1" coreKtx = "1.13.1" constraint = "2.2.0-alpha05" @@ -10,21 +10,21 @@ navigation = "2.7.7" navigationCompose = "2.7.7" lottie = "4.2.0" insetter = "0.6.1" -workManager = "2.9.0" +workManager = "2.9.1" coil = "2.2.2" svg = "1.4" jdenticon = "1.1" -archFragmentTest = "1.7.1" +archFragmentTest = "1.8.2" mockk = "1.13.8" truth = "1.4.2" mockitoKotlin = "5.2.1" mockito = "5.2.0" junit = "4.13.2" -androidxTestExtJunit = "1.1.5" -androidxTestEspressoCore = "3.5.1" +androidxTestExtJunit = "1.2.1" +androidxTestEspressoCore = "3.6.1" archCoreTest = "2.2.0" archComponents = "2.7.0" -activityCompose = "1.9.0" +activityCompose = "1.9.1" material = "1.12.0" fragmentKtx = "1.7.1" permission = "1.7.1" @@ -38,24 +38,18 @@ firebaseCrashlytics = "2.9.9" firebaseAppDistribution = "3.2.0" tripletVersion = "3.8.4" timber = "5.0.1" -ktor = "2.3.1" -soracard = "1.1.16" -xnetworkingLib = "1.0.7" -xsubstrate = "1.2.7" -uicore = "0.2.32" -xbackup = "1.2.2" -xcrypto = "1.2.6" +ktor = "2.3.2" ed = "2.0.1" xerces = "2.9.0" -dagger = "2.49" -daggerKapt = "2.49" +dagger = "2.52" +daggerKapt = "2.52" hiltCompose = "1.2.0" hiltWorkManager = "1.2.0" webSocketLib = "2.14" web3j = "4.6.0-android" zXing = "3.3.3" zXingEmbedded = "4.3.0" -activityKtx = "1.9.0" +activityKtx = "1.9.1" xserializationjson = "1.6.3" gson = "2.10.1" datastore = "1.0.0" @@ -63,8 +57,22 @@ room = "2.6.1" lazySodium = "5.0.2" jna = "5.8.0" kover = "0.7.5" +soramitsuSoracard = "1.1.18" +soramitsuXnetworking = "1.0.9" +soramitsuXsubstrate = "1.2.7" +soramitsuUicore = "0.2.34" +soramitsuXbackup = "1.2.2" +soramitsuXcrypto = "1.2.6" +soramitsuAndroidFoundation = "0.0.1" [libraries] +soramitsu-android-foundation = { module = "jp.co.soramitsu:android-foundation", version.ref = "soramitsuAndroidFoundation" } +soramitsu-sora-card = { module = "jp.co.soramitsu:android-sora-card", version.ref = "soramitsuSoracard" } +xnetworkingLibDep = { module = "jp.co.soramitsu.xnetworking:lib-android", version.ref = "soramitsuXnetworking" } +xsubstrateDep = { module = "jp.co.soramitsu:xsubstrate", version.ref = "soramitsuXsubstrate" } +uiCoreDep = { module = "jp.co.soramitsu:ui-core", version.ref = "soramitsuUicore" } +xbackupDep = { module = "jp.co.soramitsu:xbackup", version.ref = "soramitsuXbackup" } +xcryptoDep = { module = "jp.co.soramitsu:xcrypto", version.ref = "soramitsuXcrypto" } roomDep = { module = "androidx.room:room-runtime", version.ref = "room" } roomKaptDep = { module = "androidx.room:room-compiler", version.ref = "room" } roomKtxDep = { module = "androidx.room:room-ktx", version.ref = "room" } @@ -92,12 +100,6 @@ ktorLoggingDep = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" ktorContentNegotiationDep = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } ktorOkHttpDep = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } ktorWebSocketDep = { module = "io.ktor:ktor-client-websockets", version.ref = "ktor" } -soraCardDep = { module = "jp.co.soramitsu:android-sora-card", version.ref = "soracard" } -xnetworkingLibDep = { module = "jp.co.soramitsu.xnetworking:lib-android", version.ref = "xnetworkingLib" } -xsubstrateDep = { module = "jp.co.soramitsu:xsubstrate", version.ref = "xsubstrate" } -uiCoreDep = { module = "jp.co.soramitsu:ui-core", version.ref = "uicore" } -xbackupDep = { module = "jp.co.soramitsu:xbackup", version.ref = "xbackup" } -xcryptoDep = { module = "jp.co.soramitsu:xcrypto", version.ref = "xcrypto" } ed25519Dep = { module = "com.github.warchant:ed25519-sha3-java", version.ref = "ed" } xercesDep = { module = "org.eclipse.birt.runtime.3_7_1:org.apache.xerces", version.ref = "xerces" } timberDep = { module = "com.jakewharton.timber:timber", version.ref = "timber" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 75272dd6a..fcc5a2b64 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -43,7 +43,6 @@ dependencyResolutionManagement { } rootProject.name = "passport-android" -include(":android-foundation") include(":app") include(":common") include(":common_wallet") diff --git a/sorasubstrate/build.gradle.kts b/sorasubstrate/build.gradle.kts index 371349f53..e77365650 100644 --- a/sorasubstrate/build.gradle.kts +++ b/sorasubstrate/build.gradle.kts @@ -65,7 +65,6 @@ android { dependencies { - implementation(project(":android-foundation")) implementation(project(":common")) implementation(project(":common_wallet")) implementation(project(":feature_blockexplorer_api")) @@ -74,6 +73,7 @@ dependencies { implementation(libs.xsubstrateDep) implementation(libs.xcryptoDep) implementation(libs.xnetworkingLibDep) + implementation(libs.soramitsu.android.foundation) implementation(libs.gsonDep) implementation(libs.webSocketLibDep) diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt index 9d3983ead..977b4d8ed 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt @@ -42,7 +42,7 @@ import jp.co.soramitsu.common.io.FileManager import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.xnetworking.lib.engines.rest.api.RestClient -import jp.co.soramitsu.xnetworking.lib.engines.utils.JsonGetRequest +import jp.co.soramitsu.xnetworking.lib.engines.utils.getAsString import jp.co.soramitsu.xsubstrate.runtime.RuntimeSnapshot import jp.co.soramitsu.xsubstrate.runtime.definitions.TypeDefinitionParser import jp.co.soramitsu.xsubstrate.runtime.definitions.TypeDefinitionsTree @@ -72,7 +72,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -import kotlinx.serialization.builtins.serializer private const val DEFAULT_TYPES_FILE = "default_types.json" private const val SORA2_TYPES_FILE = "types_scalecodec_mobile.json" @@ -197,11 +196,8 @@ class RuntimeManager @Inject constructor( } is MetadataSource.SoraNet -> { - val sora2Types = restClient.getReturnString( - JsonGetRequest( - url = soraConfigManager.getSubstrateTypesUrl(), - responseDeserializer = String.serializer() - ) + val sora2Types = restClient.getAsString( + soraConfigManager.getSubstrateTypesUrl() ) buildTypeRegistry14(sora2Types, runtimeMetadataReader, runtimeVersion).also { saveToCache(SORA2_TYPES_FILE, sora2Types) From 00956539c78d84236e967a089c46f3f8608906b9 Mon Sep 17 00:00:00 2001 From: arvifox Date: Fri, 6 Sep 2024 14:45:31 +0300 Subject: [PATCH 33/43] release soralution v3.8.5.0 139 --- app/build.gradle.kts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f34cdd97c..aa2f30a4a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,7 +19,7 @@ kotlin { jvmToolchain(11) } -// soralution 138 3.8.4.0 2024.03.14 +// soralution 138 3.8.5.0 2024.09.06 // sora dae 108 3.8.0.0 2023.12.04 android { @@ -30,8 +30,8 @@ android { applicationId = "jp.co.soramitsu.sora" minSdk = 26 targetSdk = 34 - versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 138 - versionName = "3.8.4.0" + versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 139 + versionName = "3.8.5.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true // resConfigs "en", "ru", "es", "fr", "de", "nb", "in", "tr", "ar" @@ -172,7 +172,7 @@ play { serviceAccountCredentials = file(System.getenv("CI_PLAY_KEY") ?: "../key/fake.json") track = "internal" releaseStatus = ReleaseStatus.DRAFT - releaseName = "3.8.4.0 - SORA Card Improvements" + releaseName = "3.8.5.0 - SORA Card Improvements" defaultToAppBundles = true } From 9fc6107c49df6cc60f4d108be2f5e6eb4b450f04 Mon Sep 17 00:00:00 2001 From: arvifox Date: Mon, 7 Oct 2024 15:23:54 +0300 Subject: [PATCH 34/43] mwr-911 --- app/build.gradle.kts | 81 +++++++++---------- build.gradle.kts | 2 +- common/build.gradle.kts | 2 +- common_wallet/build.gradle.kts | 2 +- core_db/build.gradle.kts | 2 +- demeter/build.gradle.kts | 2 +- feature_account_api/build.gradle.kts | 2 +- feature_account_impl/build.gradle.kts | 2 +- feature_assets_api/build.gradle.kts | 2 +- feature_assets_impl/build.gradle.kts | 2 +- .../assetdetails/AssetDetailsBalanceCard.kt | 2 +- feature_blockexplorer_api/build.gradle.kts | 2 +- feature_blockexplorer_impl/build.gradle.kts | 2 +- feature_ecosystem_impl/build.gradle.kts | 2 +- .../presentation/explore/ExploreFragment.kt | 3 +- feature_ethereum_api/build.gradle.kts | 2 +- feature_main_api/build.gradle.kts | 2 +- feature_main_impl/build.gradle.kts | 2 +- .../presentation/profile/ProfileScreen.kt | 18 ++--- feature_multiaccount_api/build.gradle.kts | 2 +- feature_multiaccount_impl/build.gradle.kts | 2 +- .../backup_password/BackupPasswordScreen.kt | 6 +- .../ImportAccountPasswordScreen.kt | 2 +- feature_polkaswap_api/build.gradle.kts | 2 +- feature_polkaswap_impl/build.gradle.kts | 2 +- feature_referral_api/build.gradle.kts | 2 +- feature_referral_impl/build.gradle.kts | 2 +- feature_select_node_api/build.gradle.kts | 2 +- feature_select_node_impl/build.gradle.kts | 2 +- feature_sora_card_api/build.gradle.kts | 2 +- feature_sora_card_impl/build.gradle.kts | 2 +- .../details/SoraCardMainSoraContentCard.kt | 2 +- feature_wallet_api/build.gradle.kts | 2 +- feature_wallet_impl/build.gradle.kts | 2 +- .../data/repository/WalletRepositoryImpl.kt | 3 +- gradle/libs.versions.toml | 31 ++++--- gradle/wrapper/gradle-wrapper.properties | 2 +- network/build.gradle.kts | 2 +- sorasubstrate/build.gradle.kts | 2 +- test_data/build.gradle.kts | 2 +- 40 files changed, 104 insertions(+), 106 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index aa2f30a4a..9d6efcade 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,7 +16,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } // soralution 138 3.8.5.0 2024.09.06 @@ -280,47 +280,46 @@ kapt { correctErrorTypes = true } -koverReport { - androidReports("developDebug") { - filters { - excludes { - classes( - "*.BuildConfig", - "**.models.*", - "**.core.network.*", - "**.di.*", - "**.shared_utils.wsrpc.*", - "*NetworkDataSource", - "*NetworkDataSource\$*", - "*ChainConnection", - "*ChainConnection\$*", - "**.runtime.definitions.TypeDefinitionsTreeV2", - "**.runtime.definitions.TypeDefinitionsTreeV2\$*", - - // TODO: Coverage these modules by tests - "**.core.rpc.*", - "**.core.utils.*", - "**.core.extrinsic.*", - ) +kover { + reports { + variant("developDebug") { + xml { + onCheck = true + title = "sora wallet xml report" + xmlFile = file("${project.rootDir}/report/coverage.xml") } - } - - xml { - onCheck = false - } - - html { - onCheck = true - } - - verify { - onCheck = true - - rule { - isEnabled = true - - minBound(14) - // TODO: Update to 85 + html { + title = "sora wallet html report" + onCheck = true + charset = "UTF-8" + htmlDir.set(file("${project.rootDir}/htmlreport")) + } + verify { + rule { + minBound(14) + } + } + filters { + excludes { + classes( + "*.BuildConfig", + "**.models.*", + "**.core.network.*", + "**.di.*", + "**.shared_utils.wsrpc.*", + "*NetworkDataSource", + "*NetworkDataSource\$*", + "*ChainConnection", + "*ChainConnection\$*", + "**.runtime.definitions.TypeDefinitionsTreeV2", + "**.runtime.definitions.TypeDefinitionsTreeV2\$*", + + // TODO: Coverage these modules by tests + "**.core.rpc.*", + "**.core.utils.*", + "**.core.extrinsic.*", + ) + } } } } diff --git a/build.gradle.kts b/build.gradle.kts index be00f5677..a5147d8ba 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ plugins { alias(libs.plugins.firebaseAppDistributionPlugin) apply false alias(libs.plugins.triplet) apply false id("com.google.devtools.ksp") version "1.9.24-1.0.20" apply false - id("org.jetbrains.kotlinx.kover") version "0.7.5" + id("org.jetbrains.kotlinx.kover") version "0.8.3" } tasks.register("clean", Delete::class) { diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 2da5b1a91..3c71fa339 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -30,7 +30,7 @@ fun maybeWrapQuotes(s: String): String { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/common_wallet/build.gradle.kts b/common_wallet/build.gradle.kts index 56add40fe..b8cd6d887 100644 --- a/common_wallet/build.gradle.kts +++ b/common_wallet/build.gradle.kts @@ -12,7 +12,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/core_db/build.gradle.kts b/core_db/build.gradle.kts index 69be73846..501aa50d2 100644 --- a/core_db/build.gradle.kts +++ b/core_db/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/demeter/build.gradle.kts b/demeter/build.gradle.kts index e718715ce..935c5a0d0 100644 --- a/demeter/build.gradle.kts +++ b/demeter/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_account_api/build.gradle.kts b/feature_account_api/build.gradle.kts index b5c6473f6..55f5e9e69 100644 --- a/feature_account_api/build.gradle.kts +++ b/feature_account_api/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_account_impl/build.gradle.kts b/feature_account_impl/build.gradle.kts index 1736bdbf2..78ba05cd1 100644 --- a/feature_account_impl/build.gradle.kts +++ b/feature_account_impl/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_assets_api/build.gradle.kts b/feature_assets_api/build.gradle.kts index a24d325fe..f1f9b7641 100644 --- a/feature_assets_api/build.gradle.kts +++ b/feature_assets_api/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_assets_impl/build.gradle.kts b/feature_assets_impl/build.gradle.kts index 7412823c8..8c73ba098 100644 --- a/feature_assets_impl/build.gradle.kts +++ b/feature_assets_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt index 44cdcf20f..20905aa3d 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/components/compose/assetdetails/AssetDetailsBalanceCard.kt @@ -208,7 +208,7 @@ internal fun AssetDetailsBalanceCard( AmountCardIcon( res = R.drawable.ic_buy_crypto, text = stringResource(id = R.string.common_buy), - enabled = false, + enabled = true, onClick = onBuyCryptoClick ) } diff --git a/feature_blockexplorer_api/build.gradle.kts b/feature_blockexplorer_api/build.gradle.kts index 17dcef38e..f89b0eff7 100644 --- a/feature_blockexplorer_api/build.gradle.kts +++ b/feature_blockexplorer_api/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_blockexplorer_impl/build.gradle.kts b/feature_blockexplorer_impl/build.gradle.kts index 8bb6ea06e..fa79f3a3b 100644 --- a/feature_blockexplorer_impl/build.gradle.kts +++ b/feature_blockexplorer_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_ecosystem_impl/build.gradle.kts b/feature_ecosystem_impl/build.gradle.kts index a1a177772..1a8708856 100644 --- a/feature_ecosystem_impl/build.gradle.kts +++ b/feature_ecosystem_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt index 05ee6d415..79dd48991 100644 --- a/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt +++ b/feature_ecosystem_impl/src/main/java/jp/co/soramitsu/feature_ecosystem_impl/presentation/explore/ExploreFragment.kt @@ -274,7 +274,8 @@ class ExploreFragment : SoraBaseFragment() { } HorizontalPager( - modifier = Modifier.fillMaxHeight(), state = pagerState, beyondBoundsPageCount = 1 + modifier = Modifier.fillMaxHeight(), + state = pagerState, ) { when (it) { ExplorePages.CURRENCIES.ordinal -> { diff --git a/feature_ethereum_api/build.gradle.kts b/feature_ethereum_api/build.gradle.kts index d996d7ae3..c2c14dc70 100644 --- a/feature_ethereum_api/build.gradle.kts +++ b/feature_ethereum_api/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_main_api/build.gradle.kts b/feature_main_api/build.gradle.kts index fcffd5a53..fd08046bb 100644 --- a/feature_main_api/build.gradle.kts +++ b/feature_main_api/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_main_impl/build.gradle.kts b/feature_main_impl/build.gradle.kts index 27f15be1b..b1ba382f3 100644 --- a/feature_main_impl/build.gradle.kts +++ b/feature_main_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt index dd939ca94..439e20f53 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt @@ -85,15 +85,15 @@ internal fun ProfileItems( icon = R.drawable.ic_buy_crypto, onClick = onSoraCardClick, ) -// CategoryItem( -// modifier = Modifier -// .testTagAsId("BuyXor") -// .padding(top = Dimens.x2), -// title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), -// subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), -// icon = R.drawable.ic_settings_buy_crypto, -// onClick = onBuyCrypto, -// ) + CategoryItem( + modifier = Modifier + .testTagAsId("BuyXor") + .padding(top = Dimens.x2), + title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), + subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), + icon = R.drawable.ic_settings_buy_crypto, + onClick = onBuyCrypto, + ) } CategoryItem( modifier = Modifier diff --git a/feature_multiaccount_api/build.gradle.kts b/feature_multiaccount_api/build.gradle.kts index eeb436ecc..180469fc3 100644 --- a/feature_multiaccount_api/build.gradle.kts +++ b/feature_multiaccount_api/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_multiaccount_impl/build.gradle.kts b/feature_multiaccount_impl/build.gradle.kts index a775fea21..074fab84e 100644 --- a/feature_multiaccount_impl/build.gradle.kts +++ b/feature_multiaccount_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/backup_password/BackupPasswordScreen.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/backup_password/BackupPasswordScreen.kt index dbb3f52fa..edce49e21 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/backup_password/BackupPasswordScreen.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/backup_password/BackupPasswordScreen.kt @@ -107,7 +107,7 @@ fun BackupPasswordScreen( keyboardOptions = KeyboardOptions.Default.copy( imeAction = ImeAction.Done, keyboardType = KeyboardType.Password, - autoCorrect = false + autoCorrectEnabled = false, ), ) @@ -128,7 +128,7 @@ fun BackupPasswordScreen( keyboardOptions = KeyboardOptions.Default.copy( imeAction = ImeAction.Done, keyboardType = KeyboardType.Password, - autoCorrect = false + autoCorrectEnabled = false, ), ) @@ -145,7 +145,7 @@ fun BackupPasswordScreen( .fillMaxWidth(), loading = state.isLoading, loaderSize = Size.Large, - ) { modifier, elevation -> + ) { modifier, _ -> FilledButton( modifier = modifier .fillMaxWidth(), diff --git a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/import_account_list/import_account_password/ImportAccountPasswordScreen.kt b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/import_account_list/import_account_password/ImportAccountPasswordScreen.kt index b4af02b98..94be57782 100644 --- a/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/import_account_list/import_account_password/ImportAccountPasswordScreen.kt +++ b/feature_multiaccount_impl/src/main/java/jp/co/soramitsu/feature_multiaccount_impl/presentation/import_account_list/import_account_password/ImportAccountPasswordScreen.kt @@ -124,7 +124,7 @@ fun ImportAccountPasswordScreen( keyboardOptions = KeyboardOptions.Default.copy( imeAction = ImeAction.Done, keyboardType = KeyboardType.Password, - autoCorrect = false + autoCorrectEnabled = false, ), ) diff --git a/feature_polkaswap_api/build.gradle.kts b/feature_polkaswap_api/build.gradle.kts index 3957a7d9c..b63831b38 100644 --- a/feature_polkaswap_api/build.gradle.kts +++ b/feature_polkaswap_api/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_polkaswap_impl/build.gradle.kts b/feature_polkaswap_impl/build.gradle.kts index 1ddc98b0d..61f39b80f 100644 --- a/feature_polkaswap_impl/build.gradle.kts +++ b/feature_polkaswap_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_referral_api/build.gradle.kts b/feature_referral_api/build.gradle.kts index eff44a145..839137799 100644 --- a/feature_referral_api/build.gradle.kts +++ b/feature_referral_api/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_referral_impl/build.gradle.kts b/feature_referral_impl/build.gradle.kts index ae4201185..eaf6352e4 100644 --- a/feature_referral_impl/build.gradle.kts +++ b/feature_referral_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_select_node_api/build.gradle.kts b/feature_select_node_api/build.gradle.kts index ea55d05c5..c9ec667a0 100644 --- a/feature_select_node_api/build.gradle.kts +++ b/feature_select_node_api/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_select_node_impl/build.gradle.kts b/feature_select_node_impl/build.gradle.kts index 40555eb5a..bc06b7c18 100644 --- a/feature_select_node_impl/build.gradle.kts +++ b/feature_select_node_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_sora_card_api/build.gradle.kts b/feature_sora_card_api/build.gradle.kts index 130eaed23..d0e697a4b 100644 --- a/feature_sora_card_api/build.gradle.kts +++ b/feature_sora_card_api/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_sora_card_impl/build.gradle.kts b/feature_sora_card_impl/build.gradle.kts index 3fb9f7b22..b44b22f0a 100644 --- a/feature_sora_card_impl/build.gradle.kts +++ b/feature_sora_card_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt index 579d9ced8..852c70fcd 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt @@ -180,7 +180,7 @@ fun SoraCardMainSoraContentCard( .padding(horizontal = Dimens.x1) .weight(1f), size = Size.Large, - enabled = false, + enabled = true, order = Order.PRIMARY, onClick = onExchangeXor, text = stringResource(id = jp.co.soramitsu.oauth.R.string.exchange_xor), diff --git a/feature_wallet_api/build.gradle.kts b/feature_wallet_api/build.gradle.kts index 619396621..04a6f05d9 100644 --- a/feature_wallet_api/build.gradle.kts +++ b/feature_wallet_api/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_wallet_impl/build.gradle.kts b/feature_wallet_impl/build.gradle.kts index 93ea84af1..26203450b 100644 --- a/feature_wallet_impl/build.gradle.kts +++ b/feature_wallet_impl/build.gradle.kts @@ -11,7 +11,7 @@ plugins { val composeCompilerVersion: String by project kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt index 39a1e9f57..60966ff07 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/data/repository/WalletRepositoryImpl.kt @@ -129,8 +129,7 @@ class WalletRepositoryImpl @Inject constructor( val card = CardsHubMapper.map(cardLocal) when (card?.cardType) { CardHubType.GET_SORA_CARD -> if (soraCard) card else null -// CardHubType.BUY_XOR_TOKEN -> if (soraCard) card else null - CardHubType.BUY_XOR_TOKEN -> null + CardHubType.BUY_XOR_TOKEN -> if (soraCard) card else null else -> card } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4f50f0208..8b700441b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,21 +1,21 @@ [versions] -agp = "8.6.0" +agp = "8.7.0" kotlin = "1.9.24" appcompat = "1.7.0" coroutines = "1.8.1" coreKtx = "1.13.1" constraint = "2.2.0-alpha05" biometric = "1.1.0" -navigation = "2.7.7" -navigationCompose = "2.7.7" +navigation = "2.8.2" +navigationCompose = "2.8.2" lottie = "4.2.0" insetter = "0.6.1" workManager = "2.9.1" -coil = "2.2.2" +coil = "2.7.0" svg = "1.4" jdenticon = "1.1" -archFragmentTest = "1.8.2" -mockk = "1.13.8" +archFragmentTest = "1.8.4" +mockk = "1.13.11" truth = "1.4.2" mockitoKotlin = "5.2.1" mockito = "5.2.0" @@ -23,14 +23,13 @@ junit = "4.13.2" androidxTestExtJunit = "1.2.1" androidxTestEspressoCore = "3.6.1" archCoreTest = "2.2.0" -archComponents = "2.7.0" -activityCompose = "1.9.1" +archComponents = "2.8.6" +activityCompose = "1.9.2" material = "1.12.0" -fragmentKtx = "1.7.1" +fragmentKtx = "1.8.4" permission = "1.7.1" -compose-bom = "2024.05.00" -composeViewModel = "2.7.0" -composeLifecycle = "2.7.0" +compose-bom = "2024.09.03" +composeLifecycle = "2.8.6" composeConstraintLayout = "1.1.0-alpha05" firebasebom = "32.7.0" googleServices = "4.3.15" @@ -49,18 +48,18 @@ webSocketLib = "2.14" web3j = "4.6.0-android" zXing = "3.3.3" zXingEmbedded = "4.3.0" -activityKtx = "1.9.1" +activityKtx = "1.9.2" xserializationjson = "1.6.3" gson = "2.10.1" datastore = "1.0.0" room = "2.6.1" lazySodium = "5.0.2" jna = "5.8.0" -kover = "0.7.5" +kover = "0.8.3" soramitsuSoracard = "1.1.18" -soramitsuXnetworking = "1.0.9" +soramitsuXnetworking = "1.0.10" soramitsuXsubstrate = "1.2.7" -soramitsuUicore = "0.2.34" +soramitsuUicore = "0.2.37" soramitsuXbackup = "1.2.2" soramitsuXcrypto = "1.2.6" soramitsuAndroidFoundation = "0.0.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4b792ab3e..05c38d09b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Jan 13 13:13:48 MSK 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/network/build.gradle.kts b/network/build.gradle.kts index 07d1afd40..8d767507b 100644 --- a/network/build.gradle.kts +++ b/network/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/sorasubstrate/build.gradle.kts b/sorasubstrate/build.gradle.kts index e77365650..e52f2eaaa 100644 --- a/sorasubstrate/build.gradle.kts +++ b/sorasubstrate/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/test_data/build.gradle.kts b/test_data/build.gradle.kts index 816612576..29d7007e5 100644 --- a/test_data/build.gradle.kts +++ b/test_data/build.gradle.kts @@ -7,7 +7,7 @@ plugins { } kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { From 2b6d1e686026871a1eb8acf1de9f6daf1bd9b759 Mon Sep 17 00:00:00 2001 From: arvifox Date: Mon, 7 Oct 2024 22:38:14 +0300 Subject: [PATCH 35/43] mwr-921 --- .../domain/model/UserPoolData.kt | 1 - .../jp/co/soramitsu/core_db/dao/AssetDao.kt | 2 +- .../data/mappers/PoolLocalMapper.kt | 3 - .../repository/PolkaswapRepositoryImpl.kt | 12 --- .../domain/PoolsInteractorImpl.kt | 17 ++--- .../compose/LiquidityRemoveScreen.kt | 4 +- .../components/compose/PoolDetailsScreen.kt | 21 +----- .../liquidityadd/LiquidityAddViewModel.kt | 14 +--- .../LiquidityRemoveFragment.kt | 1 - .../LiquidityRemoveViewModel.kt | 74 ++++--------------- .../pooldetails/PoolDetailsViewModel.kt | 5 +- .../presentation/states/PoolDetailsState.kt | 1 - .../soramitsu/test_data/PolkaswapTestData.kt | 1 - 13 files changed, 25 insertions(+), 131 deletions(-) diff --git a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/domain/model/UserPoolData.kt b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/domain/model/UserPoolData.kt index f55ef83cc..a839eedb5 100644 --- a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/domain/model/UserPoolData.kt +++ b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/domain/model/UserPoolData.kt @@ -59,7 +59,6 @@ data class UserPoolData( val poolProvidersBalance: BigDecimal, val favorite: Boolean, val sort: Int, - val kensetsuIncluded: BigDecimal?, ) val List.fiatSymbol: String diff --git a/core_db/src/main/java/jp/co/soramitsu/core_db/dao/AssetDao.kt b/core_db/src/main/java/jp/co/soramitsu/core_db/dao/AssetDao.kt index 292594a3c..c35ec02c2 100644 --- a/core_db/src/main/java/jp/co/soramitsu/core_db/dao/AssetDao.kt +++ b/core_db/src/main/java/jp/co/soramitsu/core_db/dao/AssetDao.kt @@ -73,7 +73,7 @@ interface AssetDao { private const val QUERY_ASSET_TOKEN_ACTIVE = """ select * from assets inner join ($joinFiatToken) tokensfiats on assets.tokenId=tokensfiats.id where assets.accountAddress=:address and tokensfiats.whitelistName=:whitelist - and ((assets.visibility=1 or assets.displayAsset=1 or tokensfiats.isHidable = 0) or (tokensfiats.id = "0x02000e0000000000000000000000000000000000000000000000000000000000") or (tokensfiats.id in (select tokenIdTarget from allpools)) or (tokensfiats.id in (select tokenId from poolBaseTokens))) order by assets.position + and ((assets.visibility=1 or assets.displayAsset=1 or tokensfiats.isHidable = 0) or (tokensfiats.id in (select tokenIdTarget from allpools)) or (tokensfiats.id in (select tokenId from poolBaseTokens))) order by assets.position """ } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/mappers/PoolLocalMapper.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/mappers/PoolLocalMapper.kt index e85377d2e..2005c137f 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/mappers/PoolLocalMapper.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/mappers/PoolLocalMapper.kt @@ -32,7 +32,6 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_polkaswap_impl.data.mappers -import java.math.BigDecimal import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common_wallet.data.AssetLocalToAssetMapper import jp.co.soramitsu.common_wallet.domain.model.BasicPoolData @@ -83,7 +82,6 @@ object PoolLocalMapper { baseToken: Token, token: Token, apy: Double?, - kensetsuIncluded: BigDecimal? = null, ): CommonUserPoolData { val basePooled = PolkaswapFormulas.calculatePooledValue( poolLocal.basicPoolLocal.reserveBase, @@ -118,7 +116,6 @@ object PoolLocalMapper { poolProvidersBalance = poolLocal.userPoolLocal.poolProvidersBalance, favorite = poolLocal.userPoolLocal.favorite, sort = poolLocal.userPoolLocal.sortOrder, - kensetsuIncluded = kensetsuIncluded, ), ) } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapRepositoryImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapRepositoryImpl.kt index 6f2502319..9b7e3a513 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapRepositoryImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/data/repository/PolkaswapRepositoryImpl.kt @@ -33,13 +33,11 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_polkaswap_impl.data.repository import androidx.room.withTransaction -import java.math.BigInteger import javax.inject.Inject import jp.co.soramitsu.common.account.SoraAccount import jp.co.soramitsu.common.domain.PoolDex import jp.co.soramitsu.common.domain.Token import jp.co.soramitsu.common.util.StringPair -import jp.co.soramitsu.common.util.mapBalance import jp.co.soramitsu.common_wallet.data.AssetLocalToAssetMapper import jp.co.soramitsu.common_wallet.domain.model.BasicPoolData import jp.co.soramitsu.common_wallet.domain.model.CommonPoolData @@ -54,7 +52,6 @@ import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PolkaswapRepository import jp.co.soramitsu.feature_polkaswap_impl.data.mappers.PoolLocalMapper import jp.co.soramitsu.feature_wallet_api.domain.interfaces.WalletDatasource -import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider import jp.co.soramitsu.sora.substrate.substrate.SubstrateCalls import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview @@ -196,15 +193,6 @@ class PolkaswapRepositoryImpl @Inject constructor( baseToken = baseToken, token = token, apy = getPoolStrategicBonusAPY(poolLocal.basicPoolLocal.reservesAccount), - kensetsuIncluded = if (baseToken.id == SubstrateOptionsProvider.feeAssetId && token.id == SubstrateOptionsProvider.ethTokenId) { - substrateCalls.fetchBalances(poolLocal.basicPoolLocal.reservesAccount, listOf(SubstrateOptionsProvider.kxorTokenId)) - .getOrElse(0) { BigInteger.ZERO } - .let { - mapBalance(it, baseToken.precision) - } - } else { - null - }, ) } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt index 21f9db660..0a57584b6 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/domain/PoolsInteractorImpl.kt @@ -107,7 +107,7 @@ class PoolsInteractorImpl( return removeLiquidityNetworkFee ?: ( ( polkaswapExtrinsicRepository.calcRemoveLiquidityNetworkFee( - tokenId1.id.kensetsu() to tokenId1.precision, + tokenId1.id to tokenId1.precision, tokenId2.id to tokenId2.precision, userRepository.getCurSoraAccount().substrateAddress, ) ?: BigDecimal.ZERO @@ -129,7 +129,7 @@ class PoolsInteractorImpl( val user = userRepository.getCurSoraAccount().substrateAddress val result = polkaswapExtrinsicRepository.calcAddLiquidityNetworkFee( user, - tokenFrom.id.kensetsu() to tokenFrom.precision, + tokenFrom.id to tokenFrom.precision, tokenTo.id to tokenTo.precision, tokenFromAmount, tokenToAmount, @@ -357,7 +357,7 @@ class PoolsInteractorImpl( userRepository.flowCurSoraAccount().flatMapLatest { polkaswapRepository.subscribeLocalPoolReserves( it.substrateAddress, - baseTokenId.kensetsu(), + baseTokenId, assetId, ) } @@ -366,7 +366,7 @@ class PoolsInteractorImpl( val address = userRepository.getCurSoraAccount().substrateAddress emitAll( polkaswapSubscriptionRepository.isPairEnabled( - inputAssetId.kensetsu(), + inputAssetId, outputAssetId, address, ) @@ -380,7 +380,7 @@ class PoolsInteractorImpl( val address = userRepository.getCurSoraAccount().substrateAddress emitAll( polkaswapSubscriptionRepository.isPairPresentedInNetwork( - baseTokenId.kensetsu(), + baseTokenId, tokenId, address, ) @@ -394,9 +394,9 @@ class PoolsInteractorImpl( presented: Boolean, ): LiquidityData { return polkaswapSubscriptionRepository.getRemotePoolReserves( - tokenFrom.id.kensetsu(), + tokenFrom.id, tokenFrom.precision, - tokenTo.id.kensetsu(), + tokenTo.id, tokenTo.precision, enabled, presented @@ -444,7 +444,4 @@ class PoolsInteractorImpl( override suspend fun getRewardToken(): Token { return requireNotNull(assetsRepository.getToken(SubstrateOptionsProvider.pswapAssetId)) } - - private fun String.kensetsu() = - if (this == SubstrateOptionsProvider.kxorTokenId) SubstrateOptionsProvider.feeAssetId else this } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt index 2dc2019ec..410631d0e 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/LiquidityRemoveScreen.kt @@ -81,7 +81,6 @@ internal fun LiquidityRemoveScreen( onFocusChange2: (Boolean) -> Unit, onAmountChange1: (BigDecimal) -> Unit, onAmountChange2: (BigDecimal) -> Unit, - onSelectToken1: () -> Unit, onSlippageClick: () -> Unit, onReview: () -> Unit, ) { @@ -103,7 +102,7 @@ internal fun LiquidityRemoveScreen( }, state = state.assetState1, onAmountChange = onAmountChange1, - onSelectToken = onSelectToken1, + onSelectToken = {}, onFocusChange = onFocusChange1, ) AssetAmountInput( @@ -234,7 +233,6 @@ private fun PreviewLiquidityRemoveScreen() { onAmountChange1 = {}, onFocusChange2 = {}, onFocusChange1 = {}, - onSelectToken1 = {}, state = LiquidityRemoveState( btnState = ButtonState( text = "btn", diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt index eb7fbb732..9234b147e 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/components/compose/PoolDetailsScreen.kt @@ -32,7 +32,6 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_polkaswap_impl.presentation.components.compose -import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -48,8 +47,6 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -141,7 +138,7 @@ internal fun PoolDetailsScreen( .padding(horizontal = Dimens.x2), style = MaterialTheme.customTypography.textXSBold, color = MaterialTheme.customColors.fgSecondary, - text = state.tvl ?: "", + text = state.tvl, maxLines = 1, ) } @@ -199,25 +196,10 @@ internal fun PoolDetailsScreen( ) } if (state.pooled1 != null) { - var visibleClick by remember { mutableStateOf(false) } DetailsItem( - modifier = Modifier.clickable( - enabled = state.kensetsu != null, - onClick = { visibleClick = !visibleClick }, - ), text = stringResource(id = R.string.your_pooled).format(state.symbol1), value1 = state.pooled1, ) - AnimatedVisibility( - modifier = Modifier.padding(horizontal = Dimens.x1), - visible = state.kensetsu != null && visibleClick, - ) { - Text( - text = "KXOR pooled ${state.kensetsu}", - style = MaterialTheme.customTypography.textXSBold, - color = MaterialTheme.customColors.fgSecondary, - ) - } Divider( modifier = Modifier .fillMaxWidth() @@ -391,7 +373,6 @@ private fun PreviewPoolDetailsScreen() { symbol2 = "VAL", pooled1 = "123 VAL", pooled2 = "2424.2 XOR", - kensetsu = "", tvl = "$34.999 TVL", addEnabled = true, removeEnabled = true, diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt index 909c36dc5..5c88fd50e 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityadd/LiquidityAddViewModel.kt @@ -509,12 +509,7 @@ class LiquidityAddViewModel @AssistedInject constructor( fun onToken1Click() { if (assets.isNotEmpty()) { viewModelScope.launch { - val bases = buildList { - if (addToken2 == null || addToken2 == SubstrateOptionsProvider.ethTokenId) { - add(SubstrateOptionsProvider.kxorTokenId) - } - addAll(poolsInteractor.getPoolDexList().map { it.tokenId }) - } + val bases = poolsInteractor.getPoolDexList().map { it.tokenId } val list = assets.filter { it.token.id in bases && it.token.id != addToken2 } _addState.value = _addState.value.copy( assetState1 = _addState.value.assetState1?.copy( @@ -537,13 +532,6 @@ class LiquidityAddViewModel @AssistedInject constructor( val bases = poolsInteractor.getPoolDexList() val curBase = bases.find { it.tokenId == addToken1 } val list = assets - .filter { asset -> - if (addToken1 != null && addToken1 == SubstrateOptionsProvider.kxorTokenId) { - asset.token.id == SubstrateOptionsProvider.ethTokenId - } else { - true - } - } .filter { asset -> val inBases = bases.find { it.tokenId == asset.token.id } if (inBases != null && curBase != null) { diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt index 0cf49de35..6a7e803ef 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveFragment.kt @@ -177,7 +177,6 @@ class LiquidityRemoveFragment : SoraBaseFragment() { onAmountChange2 = viewModel::onAmount2Change, onSlippageClick = onSlippageClick, onReview = onReview, - onSelectToken1 = viewModel::onSelectToken1, ) } } diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt index 32131f568..3d8edd0a3 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/liquidityremove/LiquidityRemoveViewModel.kt @@ -40,7 +40,6 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.math.BigDecimal -import jp.co.soramitsu.androidfoundation.format.isZero import jp.co.soramitsu.androidfoundation.format.nullZero import jp.co.soramitsu.androidfoundation.format.orZero import jp.co.soramitsu.androidfoundation.resource.ResourceManager @@ -123,7 +122,6 @@ class LiquidityRemoveViewModel @AssistedInject constructor( private val feeTokenAsync by viewModelScope.lazyAsync { walletInteractor.getFeeToken() } private suspend fun feeToken() = feeTokenAsync.await() - private var poolDataUsableWithKensetsu: CommonUserPoolData? = null private var poolDataUsable: CommonUserPoolData? = null private var poolDataReal: CommonUserPoolData? = null private val amount1Flow = MutableStateFlow(BigDecimal.ZERO) @@ -222,25 +220,24 @@ class LiquidityRemoveViewModel @AssistedInject constructor( null } } - .collectLatest(::onPoolCollectKensetsu) + .collectLatest(::onPoolCollect) } viewModelScope.launch { amount1Flow .debounce(ViewHelper.debounce) .onEach { amount -> - val pduk = poolDataUsableWithKensetsu val pdu = poolDataUsable - if (pdu != null && pduk != null) { + if (pdu != null) { amount1 = if (amount <= pdu.user.basePooled) amount else pdu.user.basePooled amount2 = PolkaswapFormulas.calculateOneAmountFromAnother( amount1, - pduk.user.basePooled, - pduk.user.targetPooled, + pdu.user.basePooled, + pdu.user.targetPooled, removeState.assetState2?.token?.precision, ) percent = PolkaswapFormulas.calculateShareOfPoolFromAmount( amount1, - pduk.user.basePooled, + pdu.user.basePooled, ) reCalcDetails() } @@ -302,37 +299,6 @@ class LiquidityRemoveViewModel @AssistedInject constructor( } } - private suspend fun userPoolDataFixKensetsu(poolData: CommonUserPoolData?): CommonUserPoolData? { - return if (poolData != null && token2Id == SubstrateOptionsProvider.ethTokenId) { - if (token1Id == SubstrateOptionsProvider.feeAssetId || token1Id == SubstrateOptionsProvider.kxorTokenId) { - val kxorBalance = assetsInteractor - .fetchBalance(poolData.basic.reserveAccount, listOf(SubstrateOptionsProvider.kxorTokenId)) - .getOrElse(0) { BigDecimal.ZERO } - if (kxorBalance.isZero()) { - poolData - } else { - if (token1Id == SubstrateOptionsProvider.feeAssetId) { - poolData.copy( - user = poolData.user.copy( - basePooled = poolData.user.basePooled.minus(kxorBalance) - ) - ) - } else { - poolData.copy( - user = poolData.user.copy( - basePooled = kxorBalance - ) - ) - } - } - } else { - poolData - } - } else { - poolData - } - } - private suspend fun onAssetsActiveCollect() { val asset1 = assetList.first { it.token.id == token1Id } val asset2 = assetList.first { it.token.id == token2Id } @@ -480,37 +446,23 @@ class LiquidityRemoveViewModel @AssistedInject constructor( ) } - private suspend fun onPoolCollectKensetsu(cups: CommonUserPoolData?) { - poolDataUsableWithKensetsu = cups - val poolData = userPoolDataFixKensetsu(cups) - poolDataUsable = poolData + private suspend fun onPoolCollect(cups: CommonUserPoolData?) { + poolDataUsable = cups amount1 = - if (poolData != null) PolkaswapFormulas.calculateAmountByPercentage( - poolData.user.basePooled, + if (cups != null) PolkaswapFormulas.calculateAmountByPercentage( + cups.user.basePooled, percent, - poolData.basic.baseToken.precision, + cups.basic.baseToken.precision, ) else BigDecimal.ZERO amount2 = - if (poolData != null) PolkaswapFormulas.calculateAmountByPercentage( - poolData.user.targetPooled, + if (cups != null) PolkaswapFormulas.calculateAmountByPercentage( + cups.user.targetPooled, percent, - poolData.basic.targetToken.precision, + cups.basic.targetToken.precision, ) else BigDecimal.ZERO reCalcDetails() } - fun onSelectToken1() { - if (token1Id == SubstrateOptionsProvider.feeAssetId && token2Id == SubstrateOptionsProvider.ethTokenId) { - viewModelScope.launch { - poolDataUsable?.let { pdu -> - token1Id = SubstrateOptionsProvider.kxorTokenId - onAssetsActiveCollect() - onPoolCollectKensetsu(pdu) - } - } - } - } - fun onAmount1Change(value: BigDecimal) { removeState = removeState.copy( assetState1 = removeState.assetState1?.copy( diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt index 09fa6134e..39e2ed3c2 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/screens/pooldetails/PoolDetailsViewModel.kt @@ -83,7 +83,7 @@ class PoolDetailsViewModel @AssistedInject constructor( internal var detailsState by mutableStateOf( PoolDetailsState( DEFAULT_ICON_URI, DEFAULT_ICON_URI, DEFAULT_ICON_URI, - "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", true, true, "", emptyList(), emptyList(), false, ) ) @@ -189,9 +189,6 @@ class PoolDetailsViewModel @AssistedInject constructor( AssetHolder.ROUNDING, ) }, - kensetsu = userData?.kensetsuIncluded?.let { kxor -> - numbersFormatter.formatBigDecimal(kxor, AssetHolder.ROUNDING) - }, pooled2 = userData?.targetPooled?.let { data.basic.targetToken.printBalance( it, diff --git a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/PoolDetailsState.kt b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/PoolDetailsState.kt index 2e4c99ece..a7402de71 100644 --- a/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/PoolDetailsState.kt +++ b/feature_polkaswap_impl/src/main/java/jp/co/soramitsu/feature_polkaswap_impl/presentation/states/PoolDetailsState.kt @@ -45,7 +45,6 @@ internal data class PoolDetailsState( val apy: String, val pooled1: String?, val pooled2: String?, - val kensetsu: String? = null, val tvl: String, val addEnabled: Boolean, val removeEnabled: Boolean, diff --git a/test_data/src/main/java/jp/co/soramitsu/test_data/PolkaswapTestData.kt b/test_data/src/main/java/jp/co/soramitsu/test_data/PolkaswapTestData.kt index 86f8532d8..9e8e4669b 100644 --- a/test_data/src/main/java/jp/co/soramitsu/test_data/PolkaswapTestData.kt +++ b/test_data/src/main/java/jp/co/soramitsu/test_data/PolkaswapTestData.kt @@ -73,7 +73,6 @@ object PolkaswapTestData { BigDecimal.TEN, true, 2, - null, ) val COMMON_POOL_DATA = CommonPoolData( From a41747a3cfde9d3db61597d2b07b10ec7c885261 Mon Sep 17 00:00:00 2001 From: Faimi the Legend Zufarov Date: Mon, 7 Oct 2024 22:36:22 +0500 Subject: [PATCH 36/43] MWR-923 Replaced StartActivityForResult to PickVisualMedia & removed the READ_MEDIA_IMAGES permission --- app/src/main/AndroidManifest.xml | 1 - .../screens/scan/QRCodeScannerActivity.kt | 26 +++++++------------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e9f09cfbd..b7901ef43 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,6 @@ - diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt index 5b92242dc..d15dbc443 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/scan/QRCodeScannerActivity.kt @@ -32,14 +32,14 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package jp.co.soramitsu.feature_assets_impl.presentation.screens.scan -import android.app.Activity import android.content.Intent import android.graphics.Color +import android.net.Uri import android.os.Bundle import android.view.KeyEvent import android.widget.Toast -import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -68,12 +68,10 @@ class QRCodeScannerActivity : AppCompatActivity() { private var capture: CaptureManager? = null - private val startForResultFromGallery: ActivityResultLauncher = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> - if (result.resultCode == Activity.RESULT_OK) { - result.data?.data?.let { selectedImageUri -> - viewModel.decodeScannedQrCodeUri(selectedImageUri) - } + private val startForResultFromGallery: ActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { resultUri: Uri? -> + resultUri?.let { selectedImageUri -> + viewModel.decodeScannedQrCodeUri(selectedImageUri) } } @@ -176,14 +174,8 @@ class QRCodeScannerActivity : AppCompatActivity() { } private fun selectQrFromGallery() { - val intent = Intent().apply { - type = QR_CODE_IMAGE_TYPE - action = Intent.ACTION_GET_CONTENT - } - startForResultFromGallery.launch(intent) - } - - private companion object { - const val QR_CODE_IMAGE_TYPE = "image/*" + val pickVisualMediaRequest = + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) + startForResultFromGallery.launch(pickVisualMediaRequest) } } From d4901a98afdbb028f788d807f85fe37a209507b5 Mon Sep 17 00:00:00 2001 From: arvifox Date: Mon, 21 Oct 2024 18:54:44 +0300 Subject: [PATCH 37/43] release soralution v3.8.5.0 140; mwr-968 --- app/build.gradle.kts | 8 ++++---- .../co/soramitsu/common/domain/AssetHolder.kt | 19 ++++++------------- common/src/soralution/assets/sora2_metadata | 2 +- .../AssetSettingsViewModelTest.kt | 10 +++++----- gradle/libs.versions.toml | 16 ++++++++-------- .../java/jp/co/soramitsu/test_data/Tokens.kt | 4 ++-- 6 files changed, 26 insertions(+), 33 deletions(-) mode change 100755 => 100644 common/src/soralution/assets/sora2_metadata diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9d6efcade..81d333694 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,7 +19,7 @@ kotlin { jvmToolchain(17) } -// soralution 138 3.8.5.0 2024.09.06 +// soralution 140 3.8.6.0 2024.10.21 // sora dae 108 3.8.0.0 2023.12.04 android { @@ -30,8 +30,8 @@ android { applicationId = "jp.co.soramitsu.sora" minSdk = 26 targetSdk = 34 - versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 139 - versionName = "3.8.5.0" + versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 140 + versionName = "3.8.6.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true // resConfigs "en", "ru", "es", "fr", "de", "nb", "in", "tr", "ar" @@ -172,7 +172,7 @@ play { serviceAccountCredentials = file(System.getenv("CI_PLAY_KEY") ?: "../key/fake.json") track = "internal" releaseStatus = ReleaseStatus.DRAFT - releaseName = "3.8.5.0 - SORA Card Improvements" + releaseName = "3.8.6.0 - SORA Card Improvements" defaultToAppBundles = true } diff --git a/common/src/main/java/jp/co/soramitsu/common/domain/AssetHolder.kt b/common/src/main/java/jp/co/soramitsu/common/domain/AssetHolder.kt index 53a93d65e..e30c74856 100644 --- a/common/src/main/java/jp/co/soramitsu/common/domain/AssetHolder.kt +++ b/common/src/main/java/jp/co/soramitsu/common/domain/AssetHolder.kt @@ -70,27 +70,20 @@ object AssetHolder { true, true, 3, ), - // xst - "0x0200090000000000000000000000000000000000000000000000000000000000" to + // dai + "0x0200060000000000000000000000000000000000000000000000000000000000" to AssetDefault( - "SORA Synthetics", "XST", + "Dai", "DAI", true, true, 4, ), - // xstusd - "0x0200080000000000000000000000000000000000000000000000000000000000" to + // eth + "0x0200070000000000000000000000000000000000000000000000000000000000" to AssetDefault( - "SORA Synthetic USD", "XSTUSD", + "Ether", "ETH", true, true, 5, ), - // tbcd - "0x02000a0000000000000000000000000000000000000000000000000000000000" to - AssetDefault( - "SORA TBC Dollar", "TBCD", - true, true, - 6, - ), ) private val defaultAsset: AssetDefault = AssetDefault( name = "", diff --git a/common/src/soralution/assets/sora2_metadata b/common/src/soralution/assets/sora2_metadata old mode 100755 new mode 100644 index 0215d9de7..78001a919 --- a/common/src/soralution/assets/sora2_metadata +++ b/common/src/soralution/assets/sora2_metadata @@ -1 +1 @@ -0x6d6574610e310d000c1c73705f636f72651863727970746f2c4163636f756e7449643332000004000401205b75383b2033325d0000040000032000000008000800000503000c08306672616d655f73797374656d2c4163636f756e74496e666f0814496e64657801102c4163636f756e74446174610114001401146e6f6e6365100114496e646578000124636f6e73756d657273100120526566436f756e7400012470726f766964657273100120526566436f756e7400012c73756666696369656e7473100120526566436f756e740001106461746114012c4163636f756e7444617461000010000005050014083c70616c6c65745f62616c616e6365732c4163636f756e7444617461041c42616c616e63650118001001106672656518011c42616c616e6365000120726573657276656418011c42616c616e636500012c6d6973635f66726f7a656e18011c42616c616e63650001286665655f66726f7a656e18011c42616c616e636500001800000507001c0c346672616d655f737570706f7274206469737061746368405065724469737061746368436c6173730404540120000c01186e6f726d616c2001045400012c6f7065726174696f6e616c200104540001246d616e6461746f7279200104540000200c2873705f77656967687473247765696768745f76321857656967687400000801207265665f74696d6524010c75363400012870726f6f665f73697a6524010c75363400002400000628002800000506002c083c7072696d69746976655f74797065731048323536000004000401205b75383b2033325d000030000002080034102873705f72756e74696d651c67656e65726963186469676573741844696765737400000401106c6f677338013c5665633c4469676573744974656d3e0000380000023c003c102873705f72756e74696d651c67656e6572696318646967657374284469676573744974656d0001142850726552756e74696d650800400144436f6e73656e737573456e67696e654964000030011c5665633c75383e00060024436f6e73656e7375730800400144436f6e73656e737573456e67696e654964000030011c5665633c75383e000400105365616c0800400144436f6e73656e737573456e67696e654964000030011c5665633c75383e000500144f74686572040030011c5665633c75383e0000006452756e74696d65456e7669726f6e6d656e745570646174656400080000400000030400000008004400000248004808306672616d655f73797374656d2c4576656e745265636f7264080445014c0454012c000c011470686173650903011450686173650001146576656e744c010445000118746f706963730d0301185665633c543e00004c08446672616d656e6f64655f72756e74696d653052756e74696d654576656e740001e81853797374656d04005001706672616d655f73797374656d3a3a4576656e743c52756e74696d653e0000002042616c616e636573040074017c70616c6c65745f62616c616e6365733a3a4576656e743c52756e74696d653e000200485472616e73616374696f6e5061796d656e7404007c01a870616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4576656e743c52756e74696d653e0005002c5065726d697373696f6e73040080016c7065726d697373696f6e733a3a4576656e743c52756e74696d653e0006001c52657761726473040084015c726577617264733a3a4576656e743c52756e74696d653e00080018586f72466565040088015c786f725f6665653a3a4576656e743c52756e74696d653e000900384272696467654d756c7469736967040090017c6272696467655f6d756c74697369673a3a4576656e743c52756e74696d653e000a001c5574696c6974790400a0015470616c6c65745f7574696c6974793a3a4576656e74000b001c5374616b696e670400ac017870616c6c65745f7374616b696e673a3a4576656e743c52756e74696d653e001100204f6666656e6365730400c4015870616c6c65745f6f6666656e6365733a3a4576656e740025001c53657373696f6e0400cc015470616c6c65745f73657373696f6e3a3a4576656e74000c001c4772616e6470610400d0015470616c6c65745f6772616e6470613a3a4576656e74000f0020496d4f6e6c696e650400e4018070616c6c65745f696d5f6f6e6c696e653a3a4576656e743c52756e74696d653e00240018546f6b656e73040009010158746f6b656e733a3a4576656e743c52756e74696d653e0012002c54726164696e675061697204001901017074726164696e675f706169723a3a4576656e743c52756e74696d653e001400184173736574730400210101586173736574733a3a4576656e743c52756e74696d653e0015007c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c0400350101c86d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c3a3a4576656e743c52756e74696d653e00170024546563686e6963616c040045010164746563686e6963616c3a3a4576656e743c52756e74696d653e0018001c506f6f6c58594b040059010160706f6f6c5f78796b3a3a4576656e743c52756e74696d653e001900384c697175696469747950726f787904005d01017c6c69717569646974795f70726f78793a3a4576656e743c52756e74696d653e001a001c436f756e63696c0400750101fc70616c6c65745f636f6c6c6563746976653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365313e001b0048546563686e6963616c436f6d6d69747465650400790101fc70616c6c65745f636f6c6c6563746976653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365323e001c002444656d6f637261637904007d01018070616c6c65745f64656d6f63726163793a3a4576656e743c52756e74696d653e001d001844455841504904008d01015c6465785f6170693a3a4576656e743c52756e74696d653e001e00244574684272696467650400910101686574685f6272696467653a3a4576656e743c52756e74696d653e001f00445073776170446973747269627574696f6e04009501018870737761705f646973747269627574696f6e3a3a4576656e743c52756e74696d653e002000204d756c746973696704009901017c70616c6c65745f6d756c74697369673a3a4576656e743c52756e74696d653e002100245363686564756c65720400a101018070616c6c65745f7363686564756c65723a3a4576656e743c52756e74696d653e0022003849726f68614d6967726174696f6e0400ad01017c69726f68615f6d6967726174696f6e3a3a4576656e743c52756e74696d653e0023004c546563686e6963616c4d656d626572736869700400b50101fc70616c6c65745f6d656d626572736869703a3a4576656e743c52756e74696d652c2070616c6c65745f6d656d626572736869703a3a496e7374616e6365313e00260044456c656374696f6e7350687261676d656e0400b90101a470616c6c65745f656c656374696f6e735f70687261676d656e3a3a4576656e743c52756e74696d653e00270034566573746564526577617264730400c50101787665737465645f726577617264733a3a4576656e743c52756e74696d653e002800204964656e746974790400cd01017c70616c6c65745f6964656e746974793a3a4576656e743c52756e74696d653e0029001c585354506f6f6c0400d101014c7873743a3a4576656e743c52756e74696d653e002b00285072696365546f6f6c730400d901016c70726963655f746f6f6c733a3a4576656e743c52756e74696d653e002c003043657265735374616b696e670400dd01017463657265735f7374616b696e673a3a4576656e743c52756e74696d653e002d005043657265734c69717569646974794c6f636b65720400e101019863657265735f6c69717569646974795f6c6f636b65723a3a4576656e743c52756e74696d653e002e00404365726573546f6b656e4c6f636b65720400e501018863657265735f746f6b656e5f6c6f636b65723a3a4576656e743c52756e74696d653e002f005c4365726573476f7665726e616e6365506c6174666f726d0400e90101a463657265735f676f7665726e616e63655f706c6174666f726d3a3a4576656e743c52756e74696d653e0030003843657265734c61756e63687061640400f501017c63657265735f6c61756e63687061643a3a4576656e743c52756e74696d653e0031005844656d657465724661726d696e67506c6174666f726d0400f90101a064656d657465725f6661726d696e675f706c6174666f726d3a3a4576656e743c52756e74696d653e00320020426167734c6973740400fd01018070616c6c65745f626167735f6c6973743a3a4576656e743c52756e74696d653e00330068456c656374696f6e50726f76696465724d756c746950686173650400010201d070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653a3a4576656e743c52756e74696d653e0034001042616e6404001902015062616e643a3a4576656e743c52756e74696d653e0035002c4f7261636c6550726f78790400290201706f7261636c655f70726f78793a3a4576656e743c52756e74696d653e003600604865726d6573476f7665726e616e6365506c6174666f726d0400310201a86865726d65735f676f7665726e616e63655f706c6174666f726d3a3a4576656e743c52756e74696d653e00370020507265696d61676504003d02017c70616c6c65745f707265696d6167653a3a4576656e743c52756e74696d653e003800244f72646572426f6f6b0400410201686f726465725f626f6f6b3a3a4576656e743c52756e74696d653e003900304c65616650726f766964657204005d0201746c6561665f70726f76696465723a3a4576656e743c52756e74696d653e0063002c42726964676550726f787904006102014c6272696467655f70726f78793a3a4576656e7400670074537562737472617465427269646765496e626f756e644368616e6e656c0400690201c47375627374726174655f6272696467655f6368616e6e656c3a3a696e626f756e643a3a4576656e743c52756e74696d653e006a00785375627374726174654272696467654f7574626f756e644368616e6e656c04006d0201c87375627374726174655f6272696467655f6368616e6e656c3a3a6f7574626f756e643a3a4576656e743c52756e74696d653e006b004453756273747261746544697370617463680400750201b464697370617463683a3a4576656e743c52756e74696d652c2064697370617463683a3a496e7374616e6365323e006c004850617261636861696e42726964676541707004008d02019070617261636861696e5f6272696467655f6170703a3a4576656e743c52756e74696d653e006d0040427269646765446174615369676e65720400d90201886272696467655f646174615f7369676e65723a3a4576656e743c52756e74696d653e006e00404d756c746973696756657269666965720400fd0201846d756c74697369675f76657269666965723a3a4576656e743c52756e74696d653e006f00105375646f04000103016c70616c6c65745f7375646f3a3a4576656e743c52756e74696d653e000300184661756365740400050301586661756365743a3a4576656e743c52756e74696d653e00500000500c306672616d655f73797374656d1870616c6c6574144576656e740404540001184045787472696e7369635375636365737304013464697370617463685f696e666f5401304469737061746368496e666f00000490416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656408013864697370617463685f6572726f7260013444697370617463684572726f7200013464697370617463685f696e666f5401304469737061746368496e666f00010450416e2065787472696e736963206661696c65642e2c436f64655570646174656400020450603a636f6465602077617320757064617465642e284e65774163636f756e7404011c6163636f756e74000130543a3a4163636f756e7449640003046841206e6577206163636f756e742077617320637265617465642e344b696c6c65644163636f756e7404011c6163636f756e74000130543a3a4163636f756e74496400040458416e206163636f756e7420776173207265617065642e2052656d61726b656408011873656e646572000130543a3a4163636f756e744964000110686173682c011c543a3a48617368000504704f6e206f6e2d636861696e2072656d61726b2068617070656e65642e04704576656e7420666f72207468652053797374656d2070616c6c65742e540c346672616d655f737570706f7274206469737061746368304469737061746368496e666f00000c0118776569676874200118576569676874000114636c6173735801344469737061746368436c617373000120706179735f6665655c0110506179730000580c346672616d655f737570706f7274206469737061746368344469737061746368436c61737300010c184e6f726d616c0000002c4f7065726174696f6e616c000100244d616e6461746f7279000200005c0c346672616d655f737570706f727420646973706174636810506179730001080c596573000000084e6f0001000060082873705f72756e74696d653444697370617463684572726f72000134144f746865720000003043616e6e6f744c6f6f6b7570000100244261644f726967696e000200184d6f64756c65040064012c4d6f64756c654572726f7200030044436f6e73756d657252656d61696e696e670004002c4e6f50726f76696465727300050040546f6f4d616e79436f6e73756d65727300060014546f6b656e0400680128546f6b656e4572726f720007002841726974686d6574696304006c013c41726974686d657469634572726f72000800345472616e73616374696f6e616c04007001485472616e73616374696f6e616c4572726f7200090024457868617573746564000a0028436f7272757074696f6e000b002c556e617661696c61626c65000c000064082873705f72756e74696d652c4d6f64756c654572726f720000080114696e64657808010875380001146572726f7240018c5b75383b204d41585f4d4f44554c455f4552524f525f454e434f4445445f53495a455d000068082873705f72756e74696d6528546f6b656e4572726f7200011c1c4e6f46756e647300000020576f756c644469650001003042656c6f774d696e696d756d0002003043616e6e6f7443726561746500030030556e6b6e6f776e41737365740004001846726f7a656e0005002c556e737570706f72746564000600006c083473705f61726974686d657469633c41726974686d657469634572726f7200010c24556e646572666c6f77000000204f766572666c6f77000100384469766973696f6e42795a65726f0002000070082873705f72756e74696d65485472616e73616374696f6e616c4572726f72000108304c696d6974526561636865640000001c4e6f4c6179657200010000740c3c70616c6c65745f62616c616e6365731870616c6c6574144576656e740804540004490001281c456e646f77656408011c6163636f756e74000130543a3a4163636f756e744964000130667265655f62616c616e6365180128543a3a42616c616e6365000004b8416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e20447573744c6f737408011c6163636f756e74000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650001083d01416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c78726573756c74696e6720696e20616e206f75747269676874206c6f73732e205472616e736665720c011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650002044c5472616e73666572207375636365656465642e2842616c616e63655365740c010c77686f000130543a3a4163636f756e74496400011066726565180128543a3a42616c616e63650001207265736572766564180128543a3a42616c616e636500030468412062616c616e6365207761732073657420627920726f6f742e20526573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000404e0536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e28556e726573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000504e8536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e4852657365727665526570617472696174656410011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500014864657374696e6174696f6e5f7374617475737801185374617475730006084d01536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742ed846696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e1c4465706f73697408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000704d8536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e20576974686472617708010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650008041d01536f6d6520616d6f756e74207761732077697468647261776e2066726f6d20746865206163636f756e742028652e672e20666f72207472616e73616374696f6e2066656573292e1c536c617368656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650009040101536f6d6520616d6f756e74207761732072656d6f7665642066726f6d20746865206163636f756e742028652e672e20666f72206d69736265686176696f72292e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909097814346672616d655f737570706f72741874726169747318746f6b656e73106d6973633442616c616e63655374617475730001081046726565000000205265736572766564000100007c0c6870616c6c65745f7472616e73616374696f6e5f7061796d656e741870616c6c6574144576656e74040454000104485472616e73616374696f6e466565506169640c010c77686f000130543a3a4163636f756e74496400012861637475616c5f66656518013042616c616e63654f663c543e00010c74697018013042616c616e63654f663c543e000008590141207472616e73616374696f6e20666565206061637475616c5f666565602c206f662077686963682060746970602077617320616464656420746f20746865206d696e696d756d20696e636c7573696f6e206665652c5c686173206265656e2070616964206279206077686f602e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909800c2c7065726d697373696f6e731870616c6c6574144576656e74040454000110445065726d697373696f6e4772616e746564080010010c75333200000001384163636f756e7449644f663c543e000004d45065726d697373696f6e20776173206772616e74656420746f206120686f6c6465722e205b7065726d697373696f6e2c2077686f5d505065726d697373696f6e5472616e736665726564080010010c75333200000001384163636f756e7449644f663c543e000104ec5065726d697373696f6e20776173207472616e73666572656420746f2061206e6577206f776e65722e205b7065726d697373696f6e2c2077686f5d445065726d697373696f6e43726561746564080010010c75333200000001384163636f756e7449644f663c543e000204dc5065726d697373696f6e207761732063726561746564207769746820616e206f776e65722e205b7065726d697373696f6e2c2077686f5d485065726d697373696f6e41737369676e6564080010010c75333200000001384163636f756e7449644f663c543e00030419015065726d697373696f6e207761732061737369676e656420746f20746865206163636f756e7420696e207468652073636f70652e205b7065726d697373696f6e2c2077686f5d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909840c1c726577617264731870616c6c6574144576656e740404540001081c436c61696d656404000001384163636f756e7449644f663c543e000004c0546865206163636f756e742068617320636c61696d656420746865697220726577617264732e205b6163636f756e745d484d6967726174696f6e436f6d706c65746564000104b053746f72616765206d6967726174696f6e20746f2076657273696f6e20312e322e3020636f6d706c6574656404a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909880c1c786f725f6665651870616c6c6574144576656e7404045400010c3046656557697468647261776e08000001384163636f756e7449644f663c543e000018013042616c616e63654f663c543e0000042d0146656520686173206265656e2077697468647261776e2066726f6d20757365722e205b4163636f756e7420496420746f2077697468647261772066726f6d2c2046656520416d6f756e745d40526566657272657252657761726465640c000001384163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e000018011c42616c616e6365000104210154686520706f7274696f6e206f66206665652069732073656e7420746f207468652072656665727265722e205b526566657272616c2c2052656665727265722c20416d6f756e745d70576569676874546f4665654d756c7469706c6965725570646174656404008c0124466978656455313238000208c84e6577206d756c7469706c69657220666f722077656967687420746f2066656520636f6e76657273696f6e20697320736574a4282a315f3030305f3030305f3030305f3030305f3030305f303030292e205b4e65772076616c75655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909098c0c3473705f61726974686d657469632c66697865645f706f696e742446697865645531323800000400180110753132380000900c3c70616c6c65745f6d756c74697369671870616c6c6574144576656e74040454000114584d756c74697369674163636f756e74437265617465640400000130543a3a4163636f756e7449640000048841206e6577206d756c746973696720637265617465642e205b6d756c74697369675d2c4e65774d756c74697369670c00000130543a3a4163636f756e7449640000000130543a3a4163636f756e74496400000401205b75383b2033325d000104110141206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e205b617070726f76696e672c206d756c74697369672c2063616c6c5f686173685d404d756c7469736967417070726f76616c1000000130543a3a4163636f756e744964000094017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e0000000130543a3a4163636f756e74496400000401205b75383b2033325d000204790141206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d404d756c746973696745786563757465641400000130543a3a4163636f756e744964000094017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e0000000130543a3a4163636f756e74496400000401205b75383b2033325d00009c01544f7074696f6e3c44697370617463684572726f723e0003044d0141206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d444d756c746973696743616e63656c6c65641000000130543a3a4163636f756e744964000094017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e0000000130543a3a4163636f756e74496400000401205b75383b2033325d000404550141206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e205b63616e63656c6c696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d04304576656e747320747970652e94083c70616c6c65745f6d756c74697369673c42726964676554696d65706f696e74042c426c6f636b4e756d6265720110000801186865696768749801744d756c7469436861696e4865696768743c426c6f636b4e756d6265723e000114696e64657810010c753332000098083c70616c6c65745f6d756c7469736967404d756c7469436861696e486569676874042c426c6f636b4e756d626572011001082454686973636861696e040010012c426c6f636b4e756d6265720000002453696465636861696e040028010c753634000100009c04184f7074696f6e04045401600108104e6f6e6500000010536f6d650400600000010000a00c3870616c6c65745f7574696c6974791870616c6c6574144576656e74000118404261746368496e746572727570746564080114696e64657810010c7533320001146572726f7260013444697370617463684572726f7200000855014261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734877656c6c20617320746865206572726f722e384261746368436f6d706c65746564000104c84261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e604261746368436f6d706c65746564576974684572726f7273000204b44261746368206f66206469737061746368657320636f6d706c657465642062757420686173206572726f72732e344974656d436f6d706c657465640003041d01412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206e6f206572726f722e284974656d4661696c65640401146572726f7260013444697370617463684572726f720004041101412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206572726f722e30446973706174636865644173040118726573756c74a401384469737061746368526573756c7400050458412063616c6c2077617320646973706174636865642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909a40418526573756c7408045401a8044501600108084f6b0400a8000000000c4572720400600000010000a80000040000ac103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144576656e7404045400013c1c457261506169640801246572615f696e646578100120457261496e64657800014076616c696461746f725f7061796f75741801644d756c746943757272656e637942616c616e63654f663c543e000008550154686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c07468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e2052657761726465640801147374617368000130543a3a4163636f756e744964000118616d6f756e741801644d756c746943757272656e637942616c616e63654f663c543e000104bc546865206e6f6d696e61746f7220686173206265656e207265776172646564206279207468697320616d6f756e742e1c536c61736865640801187374616b6572000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e00020445014f6e65207374616b65722028616e6420706f74656e7469616c6c7920697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e34536c6173685265706f727465640c012476616c696461746f72000130543a3a4163636f756e7449640001206672616374696f6eb0011c50657262696c6c000124736c6173685f657261100120457261496e64657800030859014120736c61736820666f722074686520676976656e2076616c696461746f722c20666f722074686520676976656e2070657263656e74616765206f66207468656972207374616b652c2061742074686520676976656e54657261206173206265656e207265706f727465642e684f6c64536c617368696e675265706f727444697363617264656404013473657373696f6e5f696e64657810013053657373696f6e496e6465780004081901416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c64446e6f742062652070726f6365737365642e385374616b657273456c65637465640005048441206e657720736574206f66207374616b6572732077617320656c65637465642e18426f6e6465640801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000610d0416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d004d014e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c210169742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e6465640801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e00070490416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e2457697468647261776e0801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0008085901416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e6365606466726f6d2074686520756e6c6f636b696e672071756575652e184b69636b65640801246e6f6d696e61746f72000130543a3a4163636f756e7449640001147374617368000130543a3a4163636f756e744964000904b441206e6f6d696e61746f7220686173206265656e206b69636b65642066726f6d20612076616c696461746f722e545374616b696e67456c656374696f6e4661696c6564000a04ac54686520656c656374696f6e206661696c65642e204e6f206e65772065726120697320706c616e6e65642e1c4368696c6c65640401147374617368000130543a3a4163636f756e744964000b042101416e206163636f756e74206861732073746f707065642070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e345061796f7574537461727465640801246572615f696e646578100120457261496e64657800013c76616c696461746f725f7374617368000130543a3a4163636f756e744964000c0498546865207374616b657273272072657761726473206172652067657474696e6720706169642e4456616c696461746f7250726566735365740801147374617368000130543a3a4163636f756e7449640001147072656673b4013856616c696461746f725072656673000d0498412076616c696461746f72206861732073657420746865697220707265666572656e6365732e20466f7263654572610401106d6f6465c0011c466f7263696e67000e047441206e657720666f72636520657261206d6f646520776173207365742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909b00c3473705f61726974686d65746963287065725f7468696e67731c50657262696c6c0000040010010c7533320000b4083870616c6c65745f7374616b696e673856616c696461746f7250726566730000080128636f6d6d697373696f6eb8011c50657262696c6c00011c626c6f636b6564bc0110626f6f6c0000b8000006b000bc0000050000c0083870616c6c65745f7374616b696e671c466f7263696e67000110284e6f74466f7263696e6700000020466f7263654e657700010024466f7263654e6f6e650002002c466f726365416c7761797300030000c40c3c70616c6c65745f6f6666656e6365731870616c6c6574144576656e740001041c4f6666656e63650801106b696e64c801104b696e6400012074696d65736c6f743001384f706171756554696d65536c6f7400000c5101546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e643501286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e4c5c5b6b696e642c2074696d65736c6f745c5d2e04304576656e747320747970652ec8000003100000000800cc0c3870616c6c65745f73657373696f6e1870616c6c6574144576656e74000104284e657753657373696f6e04013473657373696f6e5f696e64657810013053657373696f6e496e64657800000839014e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f74207468659c626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909d00c3870616c6c65745f6772616e6470611870616c6c6574144576656e7400010c384e6577417574686f726974696573040134617574686f726974795f736574d40134417574686f726974794c6973740000048c4e657720617574686f726974792073657420686173206265656e206170706c6965642e185061757365640001049843757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640002049c43757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909d4000002d800d800000408dc2800dc0c4c73705f66696e616c6974795f6772616e6470610c617070185075626c696300000400e0013c656432353531393a3a5075626c69630000e00c1c73705f636f72651c65643235353139185075626c6963000004000401205b75383b2033325d0000e40c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144576656e7404045400010c444865617274626561745265636569766564040130617574686f726974795f6964e80138543a3a417574686f726974794964000004c041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964602e1c416c6c476f6f64000104d041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504011c6f66666c696e65f0016c5665633c4964656e74696669636174696f6e5475706c653c543e3e000204290141742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909e8104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139185075626c696300000400ec013c737232353531393a3a5075626c69630000ec0c1c73705f636f72651c73723235353139185075626c6963000004000401205b75383b2033325d0000f0000002f400f40000040800f800f8083870616c6c65745f7374616b696e67204578706f7375726508244163636f756e74496401001c42616c616e63650118000c0114746f74616cfc011c42616c616e636500010c6f776efc011c42616c616e63650001186f7468657273010101ac5665633c496e646976696475616c4578706f737572653c4163636f756e7449642c2042616c616e63653e3e0000fc000006180001010000020501000501083870616c6c65745f7374616b696e6748496e646976696475616c4578706f7375726508244163636f756e74496401001c42616c616e636501180008010c77686f0001244163636f756e74496400011476616c7565fc011c42616c616e6365000009010c2c6f726d6c5f746f6b656e73186d6f64756c65144576656e7404045400013c1c456e646f7765640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000004b8416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e20447573744c6f73740c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000108ec416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77c84578697374656e7469616c4465706f7369742c20726573756c74696e6720696e20616e206f75747269676874206c6f73732e205472616e7366657210012c63757272656e63795f69640d010134543a3a43757272656e6379496400011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650002044c5472616e73666572207375636365656465642e2052657365727665640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000304e0536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e28556e72657365727665640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000404e8536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e4852657365727665526570617472696174656414012c63757272656e63795f69640d010134543a3a43757272656e6379496400011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500011873746174757378013442616c616e6365537461747573000508f4536f6d652072657365727665642062616c616e63652077617320726570617472696174656420286d6f7665642066726f6d20726573657276656420746f44616e6f74686572206163636f756e74292e2842616c616e636553657410012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e74496400011066726565180128543a3a42616c616e63650001207265736572766564180128543a3a42616c616e636500060468412062616c616e6365207761732073657420627920726f6f742e40546f74616c49737375616e636553657408012c63757272656e63795f69640d010134543a3a43757272656e63794964000118616d6f756e74180128543a3a42616c616e6365000704b854686520746f74616c2069737375616e6365206f6620616e2063757272656e637920686173206265656e207365742457697468647261776e0c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000804ec536f6d652062616c616e63657320776572652077697468647261776e2028652e672e2070617920666f72207472616e73616374696f6e20666565291c536c617368656410012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e74496400012c667265655f616d6f756e74180128543a3a42616c616e636500013c72657365727665645f616d6f756e74180128543a3a42616c616e6365000904d4536f6d652062616c616e636573207765726520736c61736865642028652e672e2064756520746f206d69732d6265686176696f7229244465706f73697465640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000a04984465706f736974656420736f6d652062616c616e636520696e746f20616e206163636f756e741c4c6f636b53657410011c6c6f636b5f6964150101384c6f636b4964656e74696669657200012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000b0454536f6d652066756e647320617265206c6f636b65642c4c6f636b52656d6f7665640c011c6c6f636b5f6964150101384c6f636b4964656e74696669657200012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000c047c536f6d65206c6f636b65642066756e6473207765726520756e6c6f636b6564184c6f636b65640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000d0474536f6d6520667265652062616c616e636520776173206c6f636b65642e20556e6c6f636b65640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000e0478536f6d65206c6f636b65642062616c616e6365207761732066726565642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909090d010c18636f6d6d6f6e287072696d69746976657324417373657449643332041c4173736574496401110100040110636f6465040134417373657449643332436f6465000011010c18636f6d6d6f6e287072696d69746976657344507265646566696e6564417373657449640001300c584f520000000c444f540001000c4b534d00020010555344540003000c56414c0004001450535741500005000c4441490006000c455448000700185853545553440008000c5853540009001054424344000a00104b555344000b0000150100000308000000080019010c3074726164696e675f706169721870616c6c6574144576656e740404540001044454726164696e675061697253746f726564080010012844657849644f663c543e00001d01013854726164696e67506169723c543e000004050154726164696e67207061697220686173206265656e2072656469737465726564206f6e2061204445582e205b4445582049642c2054726164696e6720506169725d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909091d010c18636f6d6d6f6e287072696d6974697665732c54726164696e6750616972041c41737365744964010d0100080134626173655f61737365745f69640d01011c4173736574496400013c7461726765745f61737365745f69640d01011c41737365744964000021010c186173736574731870616c6c6574144576656e740404540001183c41737365745265676973746572656408000d010130417373657449644f663c543e00000001384163636f756e7449644f663c543e000004f84e657720617373657420686173206265656e20726567697374657265642e205b41737365742049642c204173736574204f776e6572204163636f756e745d205472616e7366657210000001384163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650001049501417373657420616d6f756e7420686173206265656e207472616e7366657265642e205b46726f6d204163636f756e742c20546f204163636f756e742c205472616e6665727265642041737365742049642c20416d6f756e74205472616e736665727265645d104d696e7410000001384163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650002047901417373657420616d6f756e7420686173206265656e206d696e7465642e205b497373756572204163636f756e742c20546172676574204163636f756e742c204d696e7465642041737365742049642c20416d6f756e74204d696e7465645d104275726e0c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650003043901417373657420616d6f756e7420686173206265656e206275726e65642e205b497373756572204163636f756e742c204275726e65642041737365742049642c20416d6f756e74204275726e65645d4c41737365745365744e6f6e4d696e7461626c6504000d010130417373657449644f663c543e000404bc417373657420697320736574206173206e6f6e2d6d696e7461626c652e205b5461726765742041737365742049645d304173736574557064617465640c000d010130417373657449644f663c543e00002501014c4f7074696f6e3c417373657453796d626f6c3e00002d0101444f7074696f6e3c41737365744e616d653e0005046c417373657420696e666f20686173206265656e207570646174656404a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909250104184f7074696f6e0404540129010108104e6f6e6500000010536f6d6504002901000001000029010c18636f6d6d6f6e287072696d6974697665732c417373657453796d626f6c0000040030011c5665633c75383e00002d0104184f7074696f6e0404540131010108104e6f6e6500000010536f6d6504003101000001000031010c18636f6d6d6f6e287072696d6974697665732441737365744e616d650000040030011c5665633c75383e000035010c886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c1870616c6c6574144576656e740404540001143c506f6f6c496e697469616c697a6564080010012844657849644f663c543e00000d010130417373657449644f663c543e000004ec506f6f6c20697320696e697469616c697a656420666f7220706169722e205b4445582049642c20436f6c6c61746572616c2041737365742049645d545265666572656e636541737365744368616e67656404000d010130417373657449644f663c543e0001040d015265666572656e636520417373657420686173206265656e206368616e67656420666f7220706f6f6c2e205b4e6577205265666572656e63652041737365742049645d7c4f7074696f6e616c5265776172644d756c7469706c6965725570646174656408000d010130417373657449644f663c543e0000390101344f7074696f6e3c46697865643e00020459014d756c7469706c69657220666f722072657761726420686173206265656e2075706461746564206f6e20706172746963756c61722061737365742e205b41737365742049642c204e6577204d756c7469706c6965725d405072696365426961734368616e676564040018011c42616c616e6365000304a05072696365206269617320776173206368616e6765642e205b4e657720507269636520426961735d6050726963654368616e6765436f6e6669674368616e676564080018011c42616c616e6365000018011c42616c616e63650004043d015072696365206368616e676520636f6e66696720776173206368616e6765642e205b4e6577205072696365204368616e676520526174652c204e6577205072696365204368616e676520537465705d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909390104184f7074696f6e040454013d010108104e6f6e6500000010536f6d6504003d0100000100003d0108186669786e756d284669786564506f696e7408044901410104500000040114696e6e65724101010449000041010000050d0045010c24746563686e6963616c1870616c6c6574144576656e74040454000114184d696e74656410004901014054656368417373657449644f663c543e00004d010148546563684163636f756e7449644f663c543e000018011c42616c616e6365000018011c42616c616e636500000c4d01536f6d65207075726520746563686e6963616c206173736574732077657265206d696e7465642e205b61737365742c206f776e65722c206d696e7465645f616d6f756e742c20746f74616c5f65786973745d2ea054686973206973206e6f74206f6e6c7920666f72207075726520546563684163636f756e7449642eb0546563684163636f756e7449642063616e206265206a7573742077726170706564204163636f756e7449642e184275726e656410004901014054656368417373657449644f663c543e00004d010148546563684163636f756e7449644f663c543e000018011c42616c616e6365000018011c42616c616e63650001084d01536f6d65207075726520746563686e6963616c206173736574732077657265206275726e65642e205b61737365742c206f776e65722c206275726e65645f616d6f756e742c20746f74616c5f65786973745d2ea4466f722066756c6c206b696e64206f66206163636f756e7473206c696b6520696e204d696e7465642e444f75747075745472616e7366657272656410004901014054656368417373657449644f663c543e00004d010148546563684163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e000018011c42616c616e6365000208f0536f6d65206173736574732077657265207472616e73666572726564206f75742e205b61737365742c2066726f6d2c20746f2c20616d6f756e745d2ea4546563684163636f756e744964206973206f6e6c79207075726520546563684163636f756e7449642e40496e7075745472616e7366657272656410004901014054656368417373657449644f663c543e00000001384163636f756e7449644f663c543e00004d010148546563684163636f756e7449644f663c543e000018011c42616c616e6365000308ec536f6d65206173736574732077657265207472616e7366657272656420696e2e205b61737365742c2066726f6d2c20746f2c20616d6f756e745d2ea4546563684163636f756e744964206973206f6e6c79207075726520546563684163636f756e7449642e2c537761705375636365737304000001384163636f756e7449644f663c543e000408d053776170206f706572616374696f6e2069732066696e616c69736564205b696e69746961746f722c2066696e616c697365725d2ea4546563684163636f756e744964206973206f6e6c79207075726520546563684163636f756e7449642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090949010c18636f6d6d6f6e287072696d6974697665732c5465636841737365744964041c4173736574496401110101081c5772617070656404001101011c417373657449640000001c457363617065640400040134417373657449643332436f6465000100004d010c18636f6d6d6f6e287072696d69746976657334546563684163636f756e7449640c244163636f756e74496401001c417373657449640149011444455849640110011410507572650800100114444558496400005101015054656368507572706f73653c417373657449643e0000001c47656e65726963080030011c5665633c75383e000030011c5665633c75383e0001001c5772617070656404000001244163636f756e7449640002002c577261707065645265707204000001244163636f756e744964000300104e6f6e650004000051010c18636f6d6d6f6e287072696d6974697665732c54656368507572706f7365041c41737365744964014901011430466565436f6c6c6563746f720000004c466565436f6c6c6563746f72466f725061697204005501015054726164696e67506169723c417373657449643e0001004858796b4c69717569646974794b656570657204005501015054726164696e67506169723c417373657449643e000200284964656e746966696572040030011c5665633c75383e000300604f72646572426f6f6b4c69717569646974794b656570657204005501015054726164696e67506169723c417373657449643e0004000055010c18636f6d6d6f6e287072696d6974697665732c54726164696e6750616972041c4173736574496401490100080134626173655f61737365745f69644901011c4173736574496400013c7461726765745f61737365745f69644901011c41737365744964000059010c20706f6f6c5f78796b1870616c6c6574144576656e7404045400010444506f6f6c4973496e697469616c697a656404000001384163636f756e7449644f663c543e00000004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909095d010c3c6c69717569646974795f70726f78791870616c6c6574144576656e740404540001182045786368616e676520000001384163636f756e7449644f663c543e000010012844657849644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e6365000018011c42616c616e6365000018011c42616c616e636500006101016c5665633c4c6971756964697479536f7572636549644f663c543e3e0000089445786368616e6765206f6620746f6b656e7320686173206265656e20706572666f726d656489015b43616c6c6572204163636f756e742c204445582049642c20496e7075742041737365742049642c204f75747075742041737365742049642c20496e70757420416d6f756e742c204f757470757420416d6f756e742c2046656520416d6f756e745d584c6971756964697479536f75726365456e61626c656404006901014c4c6971756964697479536f7572636554797065000104704c697175696469747920736f757263652077617320656e61626c65645c4c6971756964697479536f7572636544697361626c656404006901014c4c6971756964697479536f7572636554797065000204744c697175696469747920736f75726365207761732064697361626c6564444261746368537761704578656375746564080018011c42616c616e6365000018011c42616c616e6365000308a84261746368206f662073776170207472616e736665727320686173206265656e20706572666f726d6564905b496e7075742061737365742041444152204665652c20496e70757420616d6f756e745d3c586f726c6573735472616e7366657214000d010130417373657449644f663c543e00000001384163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e000018011c42616c616e636500006d0101c84f7074696f6e3c426f756e6465645665633c75382c20543a3a4d61784164646974696f6e616c446174614c656e6774683e3e0004088c584f526c657373207472616e7366657220686173206265656e20706572666f726d656415015b41737365742049642c2043616c6c6572204163636f756e742c205265636569766572204163636f756e742c20416d6f756e742c204164646974696f6e616c20446174615d404144415246656557697468647261776e08000d010130417373657449644f663c543e000018011c42616c616e6365000508f041444152206665652077686963682069732077697468647261776e2066726f6d20726575736564206f7574636f6d6520617373657420616d6f756e74505b41737365742049642c2041444152204665655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909610100000265010065010c18636f6d6d6f6e287072696d697469766573444c6971756964697479536f757263654964081444455849640110504c6971756964697479536f75726365496e646578016901000801186465785f696410011444455849640001586c69717569646974795f736f757263655f696e646578690101504c6971756964697479536f75726365496e646578000069010c18636f6d6d6f6e287072696d6974697665734c4c6971756964697479536f75726365547970650001241c58594b506f6f6c00000040426f6e64696e674375727665506f6f6c0001007c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c000200204d6f636b506f6f6c000300244d6f636b506f6f6c32000400244d6f636b506f6f6c33000500244d6f636b506f6f6c340006001c585354506f6f6c000700244f72646572426f6f6b000800006d0104184f7074696f6e0404540171010108104e6f6e6500000010536f6d650400710100000100007101101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e000075010c4470616c6c65745f636f6c6c6563746976651870616c6c6574144576656e7408045400044900011c2050726f706f73656410011c6163636f756e74000130543a3a4163636f756e74496400013870726f706f73616c5f696e64657810013450726f706f73616c496e64657800013470726f706f73616c5f686173682c011c543a3a486173680001247468726573686f6c6410012c4d656d626572436f756e74000008490141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e3c604d656d626572436f756e7460292e14566f74656414011c6163636f756e74000130543a3a4163636f756e74496400013470726f706f73616c5f686173682c011c543a3a48617368000114766f746564bc0110626f6f6c00010c79657310012c4d656d626572436f756e740001086e6f10012c4d656d626572436f756e74000108050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e671501612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404013470726f706f73616c5f686173682c011c543a3a48617368000204c041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404013470726f706f73616c5f686173682c011c543a3a48617368000304d041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408013470726f706f73616c5f686173682c011c543a3a48617368000118726573756c74a401384469737061746368526573756c74000404210141206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408013470726f706f73616c5f686173682c011c543a3a48617368000118726573756c74a401384469737061746368526573756c740005044901412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c013470726f706f73616c5f686173682c011c543a3a4861736800010c79657310012c4d656d626572436f756e740001086e6f10012c4d656d626572436f756e740006045501412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090979010c4470616c6c65745f636f6c6c6563746976651870616c6c6574144576656e7408045400044900011c2050726f706f73656410011c6163636f756e74000130543a3a4163636f756e74496400013870726f706f73616c5f696e64657810013450726f706f73616c496e64657800013470726f706f73616c5f686173682c011c543a3a486173680001247468726573686f6c6410012c4d656d626572436f756e74000008490141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e3c604d656d626572436f756e7460292e14566f74656414011c6163636f756e74000130543a3a4163636f756e74496400013470726f706f73616c5f686173682c011c543a3a48617368000114766f746564bc0110626f6f6c00010c79657310012c4d656d626572436f756e740001086e6f10012c4d656d626572436f756e74000108050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e671501612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404013470726f706f73616c5f686173682c011c543a3a48617368000204c041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404013470726f706f73616c5f686173682c011c543a3a48617368000304d041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408013470726f706f73616c5f686173682c011c543a3a48617368000118726573756c74a401384469737061746368526573756c74000404210141206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408013470726f706f73616c5f686173682c011c543a3a48617368000118726573756c74a401384469737061746368526573756c740005044901412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c013470726f706f73616c5f686173682c011c543a3a4861736800010c79657310012c4d656d626572436f756e740001086e6f10012c4d656d626572436f756e740006045501412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909097d010c4070616c6c65745f64656d6f63726163791870616c6c6574144576656e740404540001382050726f706f73656408013870726f706f73616c5f696e64657810012450726f70496e64657800011c6465706f73697418013042616c616e63654f663c543e000004bc41206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c656408013870726f706f73616c5f696e64657810012450726f70496e64657800011c6465706f73697418013042616c616e63654f663c543e000104d841207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400020494416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c537461727465640801247265665f696e64657810013c5265666572656e64756d496e6465780001247468726573686f6c6481010134566f74655468726573686f6c640003045c41207265666572656e64756d2068617320626567756e2e185061737365640401247265665f696e64657810013c5265666572656e64756d496e646578000404ac412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f745061737365640401247265665f696e64657810013c5265666572656e64756d496e646578000504ac412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c65640401247265665f696e64657810013c5265666572656e64756d496e6465780006048041207265666572656e64756d20686173206265656e2063616e63656c6c65642e2444656c65676174656408010c77686f000130543a3a4163636f756e744964000118746172676574000130543a3a4163636f756e744964000704dc416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404011c6163636f756e74000130543a3a4163636f756e744964000804e4416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c010c77686f000130543a3a4163636f756e74496400013470726f706f73616c5f686173682c011048323536000114756e74696c100138543a3a426c6f636b4e756d62657200090494416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e2c426c61636b6c697374656404013470726f706f73616c5f686173682c011048323536000a04c4412070726f706f73616c5f6861736820686173206265656e20626c61636b6c6973746564207065726d616e656e746c792e14566f7465640c0114766f746572000130543a3a4163636f756e7449640001247265665f696e64657810013c5265666572656e64756d496e646578000110766f7465850101644163636f756e74566f74653c42616c616e63654f663c543e3e000b0490416e206163636f756e742068617320766f74656420696e2061207265666572656e64756d205365636f6e6465640801207365636f6e646572000130543a3a4163636f756e74496400012870726f705f696e64657810012450726f70496e646578000c048c416e206163636f756e742068617320736563636f6e64656420612070726f706f73616c4050726f706f73616c43616e63656c656404012870726f705f696e64657810012450726f70496e646578000d0460412070726f706f73616c20676f742063616e63656c65642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090981010c4070616c6c65745f64656d6f637261637938766f74655f7468726573686f6c6434566f74655468726573686f6c6400010c5053757065724d616a6f72697479417070726f76650000005053757065724d616a6f72697479416761696e73740001003853696d706c654d616a6f726974790002000085010c4070616c6c65745f64656d6f637261637910766f74652c4163636f756e74566f7465041c42616c616e636501180108205374616e64617264080110766f746589010110566f746500011c62616c616e636518011c42616c616e63650000001453706c697408010c61796518011c42616c616e636500010c6e617918011c42616c616e63650001000089010c4070616c6c65745f64656d6f637261637910766f746510566f746500000400080000008d010c1c6465785f6170691870616c6c6574144576656e74040454000108584c6971756964697479536f75726365456e61626c656404006901014c4c6971756964697479536f75726365547970650000046c4c697175696469747920736f7572636520697320656e61626c65645c4c6971756964697479536f7572636544697361626c656404006901014c4c6971756964697479536f7572636554797065000104704c697175696469747920736f757263652069732064697361626c656404a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090991010c286574685f6272696467651870616c6c6574144576656e7404045400012044526571756573745265676973746572656404002c011048323536000004bc4e6577207265717565737420686173206265656e20726567697374657265642e205b5265717565737420486173685d48417070726f76616c73436f6c6c656374656404002c0110483235360001044d015468652072657175657374277320617070726f76616c732068617665206265656e20636f6c6c65637465642e205b456e636f646564204f7574676f696e6720526571756573742c205369676e6174757265735d645265717565737446696e616c697a6174696f6e4661696c656404002c011048323536000204e054686520726571756573742066696e616c697a6174696f6e20686173206265656e206661696c65642e205b5265717565737420486173685d84496e636f6d696e675265717565737446696e616c697a6174696f6e4661696c656404002c011048323536000304050154686520696e636f6d696e6720726571756573742066696e616c697a6174696f6e20686173206265656e206661696c65642e205b5265717565737420486173685d60496e636f6d696e675265717565737446696e616c697a656404002c011048323536000404dc54686520696e636f6d696e67207265717565737420686173206265656e2066696e616c697a65642e205b5265717565737420486173685d385265717565737441626f7274656404002c011048323536000504d45468652072657175657374207761732061626f7274656420616e642063616e63656c6c65642e205b5265717565737420486173685d4843616e63656c6c6174696f6e4661696c656404002c011048323536000604e85468652072657175657374207761736e27742066696e616c697a6564206e6f722063616e63656c6c65642e205b5265717565737420486173685d545265676973746572526571756573744661696c656408002c011048323536000060013444697370617463684572726f72000704fc546865207265717565737420726567697374726174696f6e20686173206265656e206661696c65642e205b5265717565737420486173682c204572726f725d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090995010c4870737761705f646973747269627574696f6e1870616c6c6574144576656e74040454000120344665657345786368616e676564180010012844657849644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e000018011c42616c616e6365000008090146656573207375636365737366756c6c792065786368616e67656420666f7220617070726f70726961746520616d6f756e74206f6620706f6f6c20746f6b656e732ea9015b4445582049642c2046656573204163636f756e742049642c20466565732041737365742049642c2046656573205370656e7420416d6f756e742c20496e63656e746976652041737365742049642c20496e63656e7469766520526563656976656420416d6f756e745d484665657345786368616e67654661696c6564180010012844657849644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e000060013444697370617463684572726f72000108e450726f626c656d206f63637572726564207468617420726573756c74656420696e20666565732065786368616e6765206e6f7420646f6e652e8d015b4445582049642c2046656573204163636f756e742049642c20466565732041737365742049642c20417661696c61626c65204665657320416d6f756e742c20496e63656e746976652041737365742049642c2045786368616e6765206572726f725d50496e63656e746976654469737472696275746564140010012844657849644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e6365000018011075313238000208c4496e63656e7469766573207375636365737366756c6c792073656e74206f757420746f207368617265686f6c646572732ea5015b4445582049642c2046656573204163636f756e742049642c20496e63656e746976652041737365742049642c20496e63656e7469766520546f74616c20446973747269627574656420416d6f756e742c204e756d626572206f66207368617265686f6c646572735d6c496e63656e74697665446973747269627574696f6e4661696c6564080010012844657849644f663c543e00000001384163636f756e7449644f663c543e000308090150726f626c656d206f63637572726564207468617420726573756c74656420696e20696e63656e7469766520646973747269627574696f6e206e6f7420646f6e652e645b4445582049642c2046656573204163636f756e742049645d3c4275726e526174654368616e67656404003d0101144669786564000408484275726e207261746520757064617465642e4c5b43757272656e74204275726e20526174655d444e6f7468696e67546f45786368616e6765080010012844657849644f663c543e00000001384163636f756e7449644f663c543e0005080d0146656573204163636f756e7420636f6e7461696e73207a65726f206261736520746f6b656e732c20746875732065786368616e6765206973206469736d69737365642e645b4445582049642c2046656573204163636f756e742049645d4c4e6f7468696e67546f44697374726962757465080010012844657849644f663c543e00000001384163636f756e7449644f663c543e000608310146656573204163636f756e7420636f6e7461696e73207a65726f20696e63656e7469766520746f6b656e732c207468757320646973747269627574696f6e206973206469736d69737365642e645b4445582049642c2046656573204163636f756e742049645d74496e63656e74697665734275726e6564416674657245786368616e6765100010012844657849644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e6365000018011c42616c616e6365000710450154686973206973206e656564656420666f72206f746865722070616c6c657420746861742077696c6c207573652074686973207661726961626c65732c20666f72206578616d706c6520746869732069733c6661726d696e672070616c6c65742e6d015b4445582049642c20496e63656e746976652041737365742049642c20546f74616c2065786368616e67656420696e63656e74697665732028496e63656e7469766573206275726e65642061667465722065786368616e6765292cf8496e63656e7469766573206275726e65642028496e63656e74697665732074686174206973206e6f7420726576697665642028746f206275726e295d292e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090999010c3c70616c6c65745f6d756c74697369671870616c6c6574144576656e740404540001102c4e65774d756c74697369670c0124617070726f76696e67000130543a3a4163636f756e7449640001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c486173680000048c41206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e404d756c7469736967417070726f76616c100124617070726f76696e67000130543a3a4163636f756e74496400012474696d65706f696e749d01016454696d65706f696e743c543a3a426c6f636b4e756d6265723e0001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c48617368000104c841206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e404d756c74697369674578656375746564140124617070726f76696e67000130543a3a4163636f756e74496400012474696d65706f696e749d01016454696d65706f696e743c543a3a426c6f636b4e756d6265723e0001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c48617368000118726573756c74a401384469737061746368526573756c740002049c41206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e444d756c746973696743616e63656c6c656410012863616e63656c6c696e67000130543a3a4163636f756e74496400012474696d65706f696e749d01016454696d65706f696e743c543a3a426c6f636b4e756d6265723e0001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c48617368000304a041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909099d01083c70616c6c65745f6d756c74697369672454696d65706f696e74042c426c6f636b4e756d62657201100008011868656967687410012c426c6f636b4e756d626572000114696e64657810010c7533320000a1010c4070616c6c65745f7363686564756c65721870616c6c6574144576656e74040454000118245363686564756c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e64657810010c753332000004505363686564756c656420736f6d65207461736b2e2043616e63656c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e64657810010c7533320001044c43616e63656c656420736f6d65207461736b2e28446973706174636865640c01107461736ba501016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964a90101404f7074696f6e3c5461736b4e616d653e000118726573756c74a401384469737061746368526573756c74000204544469737061746368656420736f6d65207461736b2e3c43616c6c556e617661696c61626c650801107461736ba501016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964a90101404f7074696f6e3c5461736b4e616d653e00030429015468652063616c6c20666f72207468652070726f7669646564206861736820776173206e6f7420666f756e6420736f20746865207461736b20686173206265656e2061626f727465642e38506572696f6469634661696c65640801107461736ba501016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964a90101404f7074696f6e3c5461736b4e616d653e0004043d0154686520676976656e207461736b2077617320756e61626c6520746f2062652072656e657765642073696e636520746865206167656e64612069732066756c6c206174207468617420626c6f636b2e545065726d616e656e746c794f7665727765696768740801107461736ba501016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964a90101404f7074696f6e3c5461736b4e616d653e000504f054686520676976656e207461736b2063616e206e657665722062652065786563757465642073696e6365206974206973206f7665727765696768742e04304576656e747320747970652ea50100000408101000a90104184f7074696f6e04045401040108104e6f6e6500000010536f6d650400040000010000ad010c3c69726f68615f6d6967726174696f6e1870616c6c6574144576656e74040454000104204d696772617465640800b1010118537472696e6700000001384163636f756e7449644f663c543e000004684d696772617465642e205b736f757263652c207461726765745d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909b1010000050200b5010c4470616c6c65745f6d656d626572736869701870616c6c6574144576656e740804540004490001182c4d656d6265724164646564000004e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f766564000104e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d6265727353776170706564000204d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740003041501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000404844f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d790005046c5068616e746f6d206d656d6265722c206e6576657220757365642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909b9010c6470616c6c65745f656c656374696f6e735f70687261676d656e1870616c6c6574144576656e7404045400011c1c4e65775465726d04012c6e65775f6d656d62657273bd0101ec5665633c283c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449642c2042616c616e63654f663c543e293e000014450141206e6577207465726d2077697468206e65775f6d656d626572732e205468697320696e64696361746573207468617420656e6f7567682063616e64696461746573206578697374656420746f2072756e550174686520656c656374696f6e2c206e6f74207468617420656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e65644501666f72207468697320707572706f73652e204120604e65775465726d285c5b5c5d296020696e64696361746573207468617420736f6d652063616e6469646174657320676f7420746865697220626f6e645501736c617368656420616e64206e6f6e65207765726520656c65637465642c207768696c73742060456d7074795465726d60206d65616e732074686174206e6f2063616e64696461746573206578697374656420746f2c626567696e20776974682e24456d7074795465726d00010831014e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e205468697320697320646966666572656e742066726f6dc8604e65775465726d285c5b5c5d29602e2053656520746865206465736372697074696f6e206f6620604e65775465726d602e34456c656374696f6e4572726f72000204e4496e7465726e616c206572726f722068617070656e6564207768696c6520747279696e6720746f20706572666f726d20656c656374696f6e2e304d656d6265724b69636b65640401186d656d6265720001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e744964000308410141206d656d62657220686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f723060456d7074795465726d602e2452656e6f756e63656404012463616e6469646174650001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400040498536f6d656f6e65206861732072656e6f756e6365642074686569722063616e6469646163792e4043616e646964617465536c617368656408012463616e6469646174650001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0005103901412063616e6469646174652077617320736c617368656420627920616d6f756e742064756520746f206661696c696e6720746f206f627461696e20612073656174206173206d656d626572206f722872756e6e65722d75702e00e44e6f74652074686174206f6c64206d656d6265727320616e642072756e6e6572732d75702061726520616c736f2063616e646964617465732e4453656174486f6c646572536c617368656408012c736561745f686f6c6465720001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000604350141207365617420686f6c6465722077617320736c617368656420627920616d6f756e74206279206265696e6720666f72636566756c6c792072656d6f7665642066726f6d20746865207365742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909bd01000002c10100c10100000408001800c5010c387665737465645f726577617264731870616c6c6574144576656e740404540001103452657761726473566573746564040018011c42616c616e6365000004cc52657761726473207665737465642c206c696d6974732077657265207261697365642e205b76657374656420616d6f756e745d6841637475616c446f65736e744d61746368417661696c61626c650400c9010130526577617264526561736f6e0001047d01417474656d7074656420746f20636c61696d207265776172642c206275742061637475616c20636c61696d656420616d6f756e74206973206c657373207468616e2065787065637465642e205b726561736f6e20666f72207265776172645d704661696c6564546f5361766543616c63756c6174656452657761726404000001384163636f756e7449644f663c543e0002042101536176696e672072657761726420666f72206163636f756e7420686173206661696c656420696e206120646973747269627574696f6e207365726965732e205b6163636f756e745d4043726f77646c6f616e436c61696d65640c00000130543a3a4163636f756e74496400000d010128543a3a41737365744964000018011c42616c616e636500030464436c61696d65642063726f77646c6f616e207265776172647304a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909c9010c18636f6d6d6f6e287072696d69746976657330526577617264526561736f6e0001142c556e737065636966696564000000444275794f6e426f6e64696e674375727665000100644c697175696469747950726f766973696f6e4661726d696e670002006c446570726563617465644d61726b65744d616b6572566f6c756d650003002443726f77646c6f616e00040000cd010c3c70616c6c65745f6964656e746974791870616c6c6574144576656e740404540001282c4964656e7469747953657404010c77686f000130543a3a4163636f756e744964000004ec41206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e3c4964656e74697479436c656172656408010c77686f000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000104cc41206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e384964656e746974794b696c6c656408010c77686f000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000204c441206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e484a756467656d656e7452657175657374656408010c77686f000130543a3a4163636f756e74496400013c7265676973747261725f696e646578100138526567697374726172496e6465780003049c41206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e504a756467656d656e74556e72657175657374656408010c77686f000130543a3a4163636f756e74496400013c7265676973747261725f696e646578100138526567697374726172496e6465780004048841206a756467656d656e74207265717565737420776173207265747261637465642e384a756467656d656e74476976656e080118746172676574000130543a3a4163636f756e74496400013c7265676973747261725f696e646578100138526567697374726172496e6465780005049441206a756467656d656e742077617320676976656e2062792061207265676973747261722e38526567697374726172416464656404013c7265676973747261725f696e646578100138526567697374726172496e646578000604584120726567697374726172207761732061646465642e405375624964656e7469747941646465640c010c737562000130543a3a4163636f756e7449640001106d61696e000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000704f441207375622d6964656e746974792077617320616464656420746f20616e206964656e7469747920616e6420746865206465706f73697420706169642e485375624964656e7469747952656d6f7665640c010c737562000130543a3a4163636f756e7449640001106d61696e000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000804090141207375622d6964656e74697479207761732072656d6f7665642066726f6d20616e206964656e7469747920616e6420746865206465706f7369742066726565642e485375624964656e746974795265766f6b65640c010c737562000130543a3a4163636f756e7449640001106d61696e000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000908190141207375622d6964656e746974792077617320636c65617265642c20616e642074686520676976656e206465706f7369742072657061747269617465642066726f6d20746865c86d61696e206964656e74697479206163636f756e7420746f20746865207375622d6964656e74697479206163636f756e742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909d1010c0c7873741870616c6c6574144576656e74040454000118545265666572656e636541737365744368616e67656404000d010130417373657449644f663c543e0000040d015265666572656e636520417373657420686173206265656e206368616e67656420666f7220706f6f6c2e205b4e6577205265666572656e63652041737365742049645d5453796e7468657469634173736574456e61626c656408000d010130417373657449644f663c543e0000d5010124543a3a53796d626f6c000104210153796e74686574696320617373657420686173206265656e20656e61626c65642e205b53796e7468657469632041737365742049642c205265666572656e63652053796d626f6c5d5853796e746865746963417373657444697361626c656404000d010130417373657449644f663c543e000204dc53796e74686574696320617373657420686173206265656e2064697361626c65642e205b53796e7468657469632041737365742049645d6053796e74686574696341737365744665654368616e67656408000d010130417373657449644f663c543e00003d01011446697865640003040d0153796e7468657469632061737365742066656520686173206265656e206368616e6765642e205b53796e7468657469632041737365742049642c204e6577204665655d8c53796e746865746963426173654173736574466c6f6f7250726963654368616e676564040018011c42616c616e63650004042d01466c6f6f72207072696365206f66207468652073796e746865746963206261736520617373657420686173206265656e206368616e6765642e205b4e657720466c6f6f722050726963655d5453796e746865746963417373657452656d6f76656408000d010130417373657449644f663c543e0000d5010124543a3a53796d626f6c000504210153796e74686574696320617373657420686173206265656e2072656d6f7665642e205b53796e7468657469632041737365742049642c205265666572656e63652053796d626f6c5d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909d5010c18636f6d6d6f6e287072696d6974697665732853796d626f6c4e616d650000040030011c5665633c75383e0000d9010c2c70726963655f746f6f6c731870616c6c6574144576656e7404045400010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909dd010c3463657265735f7374616b696e671870616c6c6574144576656e7404045400010c244465706f736974656408000001384163636f756e7449644f663c543e000018011c42616c616e6365000004784365726573206465706f73697465642e205b77686f2c20616d6f756e745d2457697468647261776e0c000001384163636f756e7449644f663c543e000018011c42616c616e6365000018011c42616c616e6365000104e85374616b656420436572657320616e6420726577617264732077697468647261776e2e205b77686f2c207374616b65642c20726577617264735d38526577617264734368616e676564040018011c42616c616e63650002046452657761726473206368616e676564205b62616c616e63655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909e1010c5863657265735f6c69717569646974795f6c6f636b65721870616c6c6574144576656e74040454000104184c6f636b65640c000001384163636f756e7449644f663c543e000018011c42616c616e63650000280124543a3a4d6f6d656e740000049446756e6473204c6f636b6564205b77686f2c20616d6f756e742c2074696d657374616d705d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909e5010c4863657265735f746f6b656e5f6c6f636b65721870616c6c6574144576656e7404045400010c184c6f636b65640c000001384163636f756e7449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e0000048446756e6473204c6f636b6564205b77686f2c20616d6f756e742c2061737365745d2457697468647261776e0c000001384163636f756e7449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e0001049046756e64732057697468647261776e205b77686f2c20616d6f756e742c2061737365745d284665654368616e67656408000001384163636f756e7449644f663c543e000018011c42616c616e636500020464466565204368616e676564205b77686f2c20616d6f756e745d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909e9010c6463657265735f676f7665726e616e63655f706c6174666f726d1870616c6c6574144576656e7404045400010c14566f74656414000001384163636f756e7449644f663c543e00002c011048323536000010010c75333200000d010130417373657449644f663c543e000018011c42616c616e6365000004a8566f74696e67205b77686f2c20706f6c6c2c206f7074696f6e2c2061737365742c2062616c616e63655d1c4372656174656414000001384163636f756e7449644f663c543e0000ed010170426f756e646564537472696e673c543a3a5469746c654c696d69743e00000d010130417373657449644f663c543e0000280124543a3a4d6f6d656e740000280124543a3a4d6f6d656e74000104110143726561746520706f6c6c205b77686f2c207469746c652c20706f6c6c5f61737365742c2073746172745f74696d657374616d702c20656e645f74696d657374616d705d2457697468647261776e10000001384163636f756e7449644f663c543e00002c01104832353600000d010130417373657449644f663c543e000018011c42616c616e63650002049457697468647261776e205b77686f2c20706f6c6c2c2061737365742c2062616c616e63655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909ed010c18636f6d6d6f6e287072696d69746976657334426f756e646564537472696e6704044e00000400f1010144426f756e6465645665633c75382c204e3e0000f101101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e0000f5010c3c63657265735f6c61756e63687061641870616c6c6574144576656e7404045400013028494c4f4372656174656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e0000045c494c4f2063726561746564205b77686f2c20776861745d2c436f6e74726962757465640c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650001047c436f6e74726962757465205b77686f2c20776861742c2062616c616e63655d48456d657267656e637957697468647261776e0c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650002049c456d657267656e6379207769746864726177205b77686f2c20776861742c2062616c616e63655d2c494c4f46696e697368656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00030460494c4f2066696e6973686564205b77686f2c20776861745d24436c61696d65644c5008000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e0004046c436c61696d204c5020546f6b656e73205b77686f2c20776861745d1c436c61696d656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00050460436c61696d20746f6b656e73205b77686f2c20776861745d284665654368616e676564040018011c42616c616e636500060454466565206368616e676564205b62616c616e63655d30436c61696d6564505357415000070434505357415020636c61696d65645857686974656c6973746564436f6e7472696275746f7204000001384163636f756e7449644f663c543e00080474436f6e7472696275746f722077686974656c6973746564205b77686f5d5c57686974656c6973746564496c6f4f7267616e697a657204000001384163636f756e7449644f663c543e0009047c494c4f206f7267616e697a65722077686974656c6973746564205b77686f5d7452656d6f76656457686974656c6973746564436f6e7472696275746f7204000001384163636f756e7449644f663c543e000a0464436f6e7472696275746f722072656d6f766564205b77686f5d7852656d6f76656457686974656c6973746564496c6f4f7267616e697a657204000001384163636f756e7449644f663c543e000b046c494c4f206f7267616e697a65722072656d6f766564205b77686f5d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909f9010c6064656d657465725f6661726d696e675f706c6174666f726d1870616c6c6574144576656e7404045400012c3c546f6b656e5265676973746572656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000470546f6b656e2072656769737465726564205b77686f2c20776861745d24506f6f6c416464656414000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000104fc506f6f6c206164646564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d5d3c52657761726457697468647261776e18000001384163636f756e7449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c00020435015265776172642057697468647261776e205b77686f2c20616d6f756e742c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d5d2457697468647261776e18000001384163636f756e7449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000304190157697468647261776e205b77686f2c20616d6f756e742c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d5d2c506f6f6c52656d6f76656414000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c0004040501506f6f6c2072656d6f766564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d5d244465706f736974656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000018011c42616c616e636500050419014465706f7369746564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d444d756c7469706c6965724368616e67656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000010010c7533320006043d014d756c7469706c696572204368616e676564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d444465706f7369744665654368616e67656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000018011c42616c616e636500070439014465706f7369744665654368616e676564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d40546f6b656e496e666f4368616e67656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00080478546f6b656e20696e666f206368616e676564205b77686f2c20776861745d48546f74616c546f6b656e734368616e67656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000018011c42616c616e63650009044501546f74616c20746f6b656e73206368616e676564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d2c496e666f4368616e67656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000018011c42616c616e6365000a042501496e666f206368616e676564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909fd010c4070616c6c65745f626167735f6c6973741870616c6c6574144576656e740804540004490001082052656261676765640c010c77686f000130543a3a4163636f756e74496400011066726f6d280120543a3a53636f7265000108746f280120543a3a53636f7265000004a44d6f76656420616e206163636f756e742066726f6d206f6e652062616720746f20616e6f746865722e3053636f72655570646174656408010c77686f000130543a3a4163636f756e7449640001246e65775f73636f7265280120543a3a53636f7265000104d855706461746564207468652073636f7265206f6620736f6d65206163636f756e7420746f2074686520676976656e20616d6f756e742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090901020c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144576656e7404045400011838536f6c7574696f6e53746f7265640c011c636f6d707574650502013c456c656374696f6e436f6d707574650001186f726967696e090201504f7074696f6e3c543a3a4163636f756e7449643e000130707265765f656a6563746564bc0110626f6f6c00001cb44120736f6c7574696f6e207761732073746f72656420776974682074686520676976656e20636f6d707574652e00510154686520606f726967696e6020696e6469636174657320746865206f726967696e206f662074686520736f6c7574696f6e2e20496620606f726967696e602069732060536f6d65284163636f756e74496429602c55017468652073746f72656420736f6c7574696f6e20776173207375626d6974656420696e20746865207369676e65642070686173652062792061206d696e657220776974682074686520604163636f756e744964602e25014f74686572776973652c2074686520736f6c7574696f6e207761732073746f7265642065697468657220647572696e672074686520756e7369676e6564207068617365206f722062794d0160543a3a466f7263654f726967696e602e205468652060626f6f6c6020697320607472756560207768656e20612070726576696f757320736f6c7574696f6e2077617320656a656374656420746f206d616b6548726f6f6d20666f722074686973206f6e652e44456c656374696f6e46696e616c697a656408011c636f6d707574650502013c456c656374696f6e436f6d7075746500011473636f72650d020134456c656374696f6e53636f7265000104190154686520656c656374696f6e20686173206265656e2066696e616c697a65642c20776974682074686520676976656e20636f6d7075746174696f6e20616e642073636f72652e38456c656374696f6e4661696c656400020c4c416e20656c656374696f6e206661696c65642e0001014e6f74206d7563682063616e20626520736169642061626f757420776869636820636f6d7075746573206661696c656420696e207468652070726f636573732e20526577617264656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0003042501416e206163636f756e7420686173206265656e20726577617264656420666f72207468656972207369676e6564207375626d697373696f6e206265696e672066696e616c697a65642e1c536c617368656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0004042101416e206163636f756e7420686173206265656e20736c617368656420666f72207375626d697474696e6720616e20696e76616c6964207369676e6564207375626d697373696f6e2e4450686173655472616e736974696f6e65640c011066726f6d1102015450686173653c543a3a426c6f636b4e756d6265723e000108746f1102015450686173653c543a3a426c6f636b4e756d6265723e000114726f756e6410010c753332000504b85468657265207761732061207068617365207472616e736974696f6e20696e206120676976656e20726f756e642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909090502089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653c456c656374696f6e436f6d707574650001141c4f6e436861696e000000185369676e656400010020556e7369676e65640002002046616c6c6261636b00030024456d657267656e637900040000090204184f7074696f6e04045401000108104e6f6e6500000010536f6d6504000000000100000d02084473705f6e706f735f656c656374696f6e7334456c656374696f6e53636f726500000c01346d696e696d616c5f7374616b6518013c457874656e64656442616c616e636500012473756d5f7374616b6518013c457874656e64656442616c616e636500014473756d5f7374616b655f7371756172656418013c457874656e64656442616c616e636500001102089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651450686173650408426e011001100c4f6666000000185369676e656400010020556e7369676e656404001502012828626f6f6c2c20426e2900020024456d657267656e637900030000150200000408bc100019020c1062616e641870616c6c6574144576656e7408045400044900010c3853796d626f6c7352656c6179656404001d0201645665633c28543a3a53796d626f6c2c2042616c616e6365293e000004d44e65772073796d626f6c2072617465732077657265207375636365737366756c6c792072656c617965642e205b73796d626f6c735d3452656c617965727341646465640400250201445665633c543a3a4163636f756e7449643e000104b84164646564206e657720747275737465642072656c61796572206163636f756e74732e205b72656c61796572735d3c52656c617965727352656d6f7665640400250201445665633c543a3a4163636f756e7449643e000204ec52656c61796572206163636f756e747320776572652072656d6f7665642066726f6d2074727573746564206c6973742e205b72656c61796572735d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909091d02000002210200210200000408d50118002502000002000029020c306f7261636c655f70726f78791870616c6c6574144576656e74040454000108344f7261636c65456e61626c656404002d0201184f7261636c65000004a44f7261636c6520776173207375636365737366756c6c7920656e61626c65642e205b6f7261636c655d384f7261636c6544697361626c656404002d0201184f7261636c65000104a84f7261636c6520776173207375636365737366756c6c792064697361626c65642e205b6f7261636c655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909092d020c18636f6d6d6f6e287072696d697469766573184f7261636c650001043442616e64436861696e466565640000000031020c686865726d65735f676f7665726e616e63655f706c6174666f726d1870616c6c6574144576656e7404045400011814566f7465640c000001384163636f756e7449644f663c543e00002c011048323536000035020174426f756e646564537472696e673c543a3a537472696e674c696d69743e00000468566f74696e67205b77686f2c20706f6c6c2c206f7074696f6e5d1c4372656174656410000001384163636f756e7449644f663c543e0000ed010170426f756e646564537472696e673c543a3a5469746c654c696d69743e0000280124543a3a4d6f6d656e740000280124543a3a4d6f6d656e74000104e043726561746520706f6c6c205b77686f2c207469746c652c2073746172745f74696d657374616d702c20656e645f74696d657374616d705d4c566f74657246756e647357697468647261776e08000001384163636f756e7449644f663c543e000018011c42616c616e636500020490566f7465722046756e64732057697468647261776e205b77686f2c2062616c616e63655d5443726561746f7246756e647357697468647261776e08000001384163636f756e7449644f663c543e000018011c42616c616e63650003049843726561746f722046756e64732057697468647261776e205b77686f2c2062616c616e63655d744d696e696d756d4865726d6573466f72566f74696e674368616e676564040018011c42616c616e6365000404a84368616e6765206d696e696d756d204865726d657320666f7220766f74696e67205b62616c616e63655d8c4d696e696d756d4865726d6573466f724372656174696e67506f6c6c4368616e676564040018011c42616c616e6365000504c44368616e6765206d696e696d756d204865726d657320666f72206372656174696e6720706f6c6c205b62616c616e63655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090935020c18636f6d6d6f6e287072696d69746976657334426f756e646564537472696e6704044e0000040039020144426f756e6465645665633c75382c204e3e00003902101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e00003d020c3c70616c6c65745f707265696d6167651870616c6c6574144576656e7404045400010c144e6f746564040110686173682c011c543a3a48617368000004684120707265696d61676520686173206265656e206e6f7465642e24526571756573746564040110686173682c011c543a3a48617368000104784120707265696d61676520686173206265656e207265717565737465642e1c436c6561726564040110686173682c011c543a3a486173680002046c4120707265696d616765206861732062656e20636c65617265642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090941020c286f726465725f626f6f6b1870616c6c6574144576656e74040454000138404f72646572426f6f6b437265617465640801346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e00011c63726561746f72090201504f7074696f6e3c543a3a4163636f756e7449643e0471026063726561746f726020636f6e7461696e7320616e206164647265737320696620746865206f7264657220626f6f6b206973206372656174656420666f7220616e20696e646976697369626c652061737365742062792074686520617373657420686f6c6465722c206f7220604e6f6e6560206966206974206973206372656174656420627920726f6f74202f207465636820636f6d6d69747465650004844e6577206f7264657220626f6f6b20697320637265617465642062792075736572404f72646572426f6f6b44656c657465640401346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e000104544f7264657220626f6f6b2069732064656c65746564584f72646572426f6f6b5374617475734368616e6765640801346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001286e65775f7374617475734902013c4f72646572426f6f6b537461747573000204704f7264657220626f6f6b20737461747573206973206368616e676564404f72646572426f6f6b557064617465640401346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e000304844f7264657220626f6f6b2061747472696275746573206172652075706461746564404c696d69744f72646572506c616365641c01346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e744964000110736964654d020130507269636556617269616e740001147072696365510201284f726465725072696365000118616d6f756e745102012c4f72646572566f6c756d650001206c69666574696d6528012c4d6f6d656e744f663c543e0004046c5573657220706c61636564206e6577206c696d6974206f72646572804c696d69744f72646572436f6e766572746564546f4d61726b65744f726465721401346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f776e65725f6964000130543a3a4163636f756e744964000124646972656374696f6e4d020130507269636556617269616e74000118616d6f756e745502012c4f72646572416d6f756e74000134617665726167655f7072696365510201284f726465725072696365000504a1015573657220747269656420746f20706c61636520746865206c696d6974206f72646572206f7574206f6620746865207370726561642e20546865206c696d6974206f7264657220697320636f6e76657274656420696e746f2061206d61726b6574206f726465722eb44c696d69744f72646572497353706c6974496e746f4d61726b65744f72646572416e644c696d69744f726465721801346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f776e65725f6964000130543a3a4163636f756e7449640001586d61726b65745f6f726465725f646972656374696f6e4d020130507269636556617269616e7400014c6d61726b65745f6f726465725f616d6f756e745502012c4f72646572416d6f756e740001686d61726b65745f6f726465725f617665726167655f7072696365510201284f7264657250726963650001386c696d69745f6f726465725f6964180128543a3a4f726465724964000608d85573657220747269656420746f20706c61636520746865206c696d6974206f72646572206f7574206f6620746865207370726561642ef5014f6e652070617274206f6620746865206c6971756964697479206f6620746865206c696d6974206f7264657220697320636f6e76657274656420696e746f2061206d61726b6574206f726465722c20616e6420746865206f74686572207061727420697320706c616365642061732061206c696d6974206f726465722e484c696d69744f7264657243616e63656c65641001346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e744964000118726561736f6e5902013043616e63656c526561736f6e0007045901557365722063616e63656c6564207468656972206c696d6974206f72646572206f7220746865206c696d6974206f726465722068617320726561636865642074686520656e64206f6620697473206c6966657370616e484c696d69744f7264657245786563757465641801346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e744964000110736964654d020130507269636556617269616e740001147072696365510201284f726465725072696365000118616d6f756e745502012c4f72646572416d6f756e74000804a8536f6d6520616d6f756e74206f6620746865206c696d6974206f72646572206973206578656375746564404c696d69744f7264657246696c6c65640c01346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e744964000904a4416c6c20616d6f756e74206f6620746865206c696d6974206f72646572206973206578656375746564444c696d69744f72646572557064617465641001346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e7449640001286e65775f616d6f756e745102012c4f72646572566f6c756d65000a0468546865206c696d6974206f7264657220697320757064617465644c4d61726b65744f7264657245786563757465641801346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f776e65725f6964000130543a3a4163636f756e744964000124646972656374696f6e4d020130507269636556617269616e74000118616d6f756e745502012c4f72646572416d6f756e74000134617665726167655f7072696365510201284f726465725072696365000108746f090201504f7074696f6e3c543a3a4163636f756e7449643e000b04a0557365722065786563757465732061206465616c20627920746865206d61726b6574206f726465724445787069726174696f6e4661696c7572650c01346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001146572726f7260013444697370617463684572726f72000c04784661696c656420746f2063616e63656c2065787069726564206f7264657240416c69676e6d656e744661696c7572650801346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001146572726f7260013444697370617463684572726f72000d04784661696c656420746f2063616e63656c2065787069726564206f7264657204a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090945020c286f726465725f626f6f6b1474797065732c4f72646572426f6f6b4964081c41737365744964010d011444455849640110000c01186465785f69641001144445584964000110626173650d01011c4173736574496400011471756f74650d01011c41737365744964000049020c286f726465725f626f6f6b1474797065733c4f72646572426f6f6b53746174757300011014547261646500000038506c616365416e6443616e63656c000100284f6e6c7943616e63656c0002001053746f70000300004d020c18636f6d6d6f6e287072696d69746976657330507269636556617269616e740001080c4275790000001053656c6c0001000051020c18636f6d6d6f6e3062616c616e63655f756e69742c42616c616e6365556e69740000080114696e6e657218011c42616c616e636500013069735f646976697369626c65bc0110626f6f6c000055020c286f726465725f626f6f6b1474797065732c4f72646572416d6f756e74000108104261736504005102012c4f72646572566f6c756d650000001451756f746504005102012c4f72646572566f6c756d650001000059020c286f726465725f626f6f6b1474797065733043616e63656c526561736f6e00010c184d616e75616c0000001c457870697265640001001c416c69676e6564000200005d020c346c6561665f70726f76696465721870616c6c6574144576656e7404045400010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090961020c306272696467655f70726f78791870616c6c6574144576656e740001084c5265717565737453746174757355706461746508002c0110483235360000650201344d65737361676553746174757300000030526566756e644661696c656404002c01104832353600010004684576656e747320666f722074686520455448206d6f64756c652e65020c306272696467655f7479706573147479706573344d6573736167655374617475730001181c496e517565756500000024436f6d6d697474656400010010446f6e65000200184661696c656400030020526566756e64656400040020417070726f76656400050000690210607375627374726174655f6272696467655f6368616e6e656c1c696e626f756e641870616c6c6574144576656e7404045400010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909096d0210607375627374726174655f6272696467655f6368616e6e656c206f7574626f756e641870616c6c6574144576656e740404540001083c4d65737361676541636365707465640c01286e6574776f726b5f6964710201305375624e6574776f726b496400012c62617463685f6e6f6e636528010c7536340001346d6573736167655f6e6f6e63652801304d6573736167654e6f6e63650000003c496e74657276616c55706461746564040120696e74657276616c100138543a3a426c6f636b4e756d62657200010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909710208306272696467655f7479706573305375624e6574776f726b49640001181c4d61696e6e6574000000184b7573616d6100010020506f6c6b61646f7400020018526f636f636f00030020416c7068616e6574000400244c696265726c616e640005000075020c2064697370617463681870616c6c6574144576656e7408045400044900010c444d65737361676544697370617463686564080079020130543a3a4d65737361676549640000a401384469737061746368526573756c74000004b84d65737361676520686173206265656e2064697370617463686564207769746820676976656e20726573756c742e3c4d65737361676552656a6563746564040079020130543a3a4d6573736167654964000104644d65737361676520686173206265656e2072656a65637465644c4d6573736167654465636f64654661696c6564040079020130543a3a4d6573736167654964000204c457652068617665206661696c656420746f206465636f646520612043616c6c2066726f6d20746865206d6573736167652e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090979020c306272696467655f7479706573147479706573244d6573736167654964000010011873656e6465727d02014047656e657269634e6574776f726b496400012072656365697665727d02014047656e657269634e6574776f726b496400012c62617463685f6e6f6e6365890201484f7074696f6e3c42617463684e6f6e63653e0001346d6573736167655f6e6f6e63652801304d6573736167654e6f6e636500007d0208306272696467655f74797065734047656e657269634e6574776f726b496400010c0c45564d04008102012845564d436861696e49640000000c5375620400710201305375624e6574776f726b49640001002445564d4c6567616379040010010c753332000200008102083c7072696d69746976655f7479706573105532353600000400850201205b7536343b20345d00008502000003040000002800890204184f7074696f6e04045401280108104e6f6e6500000010536f6d6504002800000100008d020c5070617261636861696e5f6272696467655f6170701870616c6c6574144576656e74040454000108184275726e65641400710201305375624e6574776f726b496400000d010130417373657449644f663c543e0000000130543a3a4163636f756e74496400009102014850617261636861696e4163636f756e744964000018013042616c616e63654f663c543e000004c45b6e6574776f726b5f69642c2061737365745f69642c2073656e6465722c20726563657069656e742c20616d6f756e745d184d696e7465641400710201305375624e6574776f726b496400000d010130417373657449644f663c543e0000d50201684f7074696f6e3c50617261636861696e4163636f756e7449643e0000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000104c45b6e6574776f726b5f69642c2061737365745f69642c2073656e6465722c20726563657069656e742c20616d6f756e745d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909099102080c78636d5856657273696f6e65644d756c74694c6f636174696f6e00010808563204009502014476323a3a4d756c74694c6f636174696f6e0001000856330400b902014476333a3a4d756c74694c6f636174696f6e000300009502100c78636d087632346d756c74696c6f636174696f6e344d756c74694c6f636174696f6e000008011c706172656e74730801087538000120696e746572696f72990201244a756e6374696f6e7300009902100c78636d087632346d756c74696c6f636174696f6e244a756e6374696f6e73000124104865726500000008583104009d0201204a756e6374696f6e00010008583208009d0201204a756e6374696f6e00009d0201204a756e6374696f6e0002000858330c009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00030008583410009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00040008583514009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00050008583618009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e0006000858371c009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00070008583820009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e00009d0201204a756e6374696f6e000800009d02100c78636d087632206a756e6374696f6e204a756e6374696f6e0001242450617261636861696e0400a102010c7533320000002c4163636f756e744964333208011c6e6574776f726ba50201244e6574776f726b496400010869640401205b75383b2033325d000100384163636f756e74496e646578363408011c6e6574776f726ba50201244e6574776f726b4964000114696e64657824010c753634000200304163636f756e744b6579323008011c6e6574776f726ba50201244e6574776f726b496400010c6b6579ad0201205b75383b2032305d0003003850616c6c6574496e7374616e6365040008010875380004003047656e6572616c496e6465780400fc0110753132380005002847656e6572616c4b65790400a90201805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e000600244f6e6c794368696c6400070024506c7572616c6974790801086964b1020118426f6479496400011070617274b5020120426f64795061727400080000a1020000061000a5020c0c78636d087632244e6574776f726b49640001100c416e79000000144e616d65640400a90201805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e00010020506f6c6b61646f74000200184b7573616d6100030000a902101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401080453000004003001185665633c543e0000ad02000003140000000800b1020c0c78636d08763218426f6479496400012810556e6974000000144e616d65640400a90201805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e00010014496e6465780400a102010c7533320002002445786563757469766500030024546563686e6963616c0004002c4c656769736c6174697665000500204a7564696369616c0006001c446566656e73650007003841646d696e697374726174696f6e00080020547265617375727900090000b5020c0c78636d08763220426f64795061727400011414566f6963650000001c4d656d62657273040114636f756e74a102010c753332000100204672616374696f6e08010c6e6f6da102010c75333200011464656e6f6da102010c7533320002004441744c6561737450726f706f7274696f6e08010c6e6f6da102010c75333200011464656e6f6da102010c753332000300484d6f72655468616e50726f706f7274696f6e08010c6e6f6da102010c75333200011464656e6f6da102010c75333200040000b902100c78636d087633346d756c74696c6f636174696f6e344d756c74694c6f636174696f6e000008011c706172656e74730801087538000120696e746572696f72bd0201244a756e6374696f6e730000bd02100c78636d087633246a756e6374696f6e73244a756e6374696f6e7300012410486572650000000858310400c10201204a756e6374696f6e0001000858320800c10201204a756e6374696f6e0000c10201204a756e6374696f6e0002000858330c00c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0003000858341000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0004000858351400c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0005000858361800c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0006000858371c00c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0007000858382000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e0000c10201204a756e6374696f6e00080000c102100c78636d087633206a756e6374696f6e204a756e6374696f6e0001282450617261636861696e0400a102010c7533320000002c4163636f756e744964333208011c6e6574776f726bc50201444f7074696f6e3c4e6574776f726b49643e00010869640401205b75383b2033325d000100384163636f756e74496e646578363408011c6e6574776f726bc50201444f7074696f6e3c4e6574776f726b49643e000114696e64657824010c753634000200304163636f756e744b6579323008011c6e6574776f726bc50201444f7074696f6e3c4e6574776f726b49643e00010c6b6579ad0201205b75383b2032305d0003003850616c6c6574496e7374616e6365040008010875380004003047656e6572616c496e6465780400fc0110753132380005002847656e6572616c4b65790801186c656e6774680801087538000110646174610401205b75383b2033325d000600244f6e6c794368696c6400070024506c7572616c6974790801086964cd020118426f6479496400011070617274d1020120426f6479506172740008003c476c6f62616c436f6e73656e7375730400c90201244e6574776f726b496400090000c50204184f7074696f6e04045401c9020108104e6f6e6500000010536f6d650400c9020000010000c902100c78636d087633206a756e6374696f6e244e6574776f726b496400012824427947656e6573697304000401205b75383b2033325d000000184279466f726b080130626c6f636b5f6e756d62657228010c753634000128626c6f636b5f686173680401205b75383b2033325d00010020506f6c6b61646f74000200184b7573616d610003001c57657374656e6400040018526f636f636f00050018576f636f636f00060020457468657265756d040120636861696e5f696424010c7536340007002c426974636f696e436f72650008002c426974636f696e4361736800090000cd02100c78636d087633206a756e6374696f6e18426f6479496400012810556e69740000001c4d6f6e696b6572040040011c5b75383b20345d00010014496e6465780400a102010c7533320002002445786563757469766500030024546563686e6963616c0004002c4c656769736c6174697665000500204a7564696369616c0006001c446566656e73650007003841646d696e697374726174696f6e00080020547265617375727900090000d102100c78636d087633206a756e6374696f6e20426f64795061727400011414566f6963650000001c4d656d62657273040114636f756e74a102010c753332000100204672616374696f6e08010c6e6f6da102010c75333200011464656e6f6da102010c7533320002004441744c6561737450726f706f7274696f6e08010c6e6f6da102010c75333200011464656e6f6da102010c753332000300484d6f72655468616e50726f706f7274696f6e08010c6e6f6da102010c75333200011464656e6f6da102010c75333200040000d50204184f7074696f6e0404540191020108104e6f6e6500000010536f6d65040091020000010000d9020c486272696467655f646174615f7369676e65721870616c6c6574144576656e740404540001142c496e697469616c697a65640801286e6574776f726b5f69647d02014047656e657269634e6574776f726b49640001147065657273dd020198426f756e6465645665633c65636473613a3a5075626c69632c20543a3a4d617850656572733e000000244164646564506565720801286e6574776f726b5f69647d02014047656e657269634e6574776f726b496400011070656572e102013465636473613a3a5075626c69630001002c52656d6f766564506565720801286e6574776f726b5f69647d02014047656e657269634e6574776f726b496400011070656572e102013465636473613a3a5075626c696300020040417070726f76616c41636365707465640c01286e6574776f726b5f69647d02014047656e657269634e6574776f726b4964000110646174612c0110483235360001247369676e6174757265ed02014065636473613a3a5369676e617475726500030020417070726f7665640c01286e6574776f726b5f69647d02014047656e657269634e6574776f726b4964000110646174612c0110483235360001287369676e617475726573f50201a4426f756e6465645665633c65636473613a3a5369676e61747572652c20543a3a4d617850656572733e00040004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909dd02101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401e102045300000400e90201185665633c543e0000e1020c1c73705f636f7265146563647361185075626c696300000400e50201205b75383b2033335d0000e502000003210000000800e902000002e10200ed020c1c73705f636f7265146563647361245369676e617475726500000400f10201205b75383b2036355d0000f102000003410000000800f502101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401ed02045300000400f90201185665633c543e0000f902000002ed0200fd020c446d756c74697369675f76657269666965721870616c6c6574144576656e74040454000110484e6574776f726b496e697469616c697a656404007d02014047656e657269634e6574776f726b496400000058566572696669636174696f6e5375636365737366756c04007d02014047656e657269634e6574776f726b4964000100245065657241646465640400e102013465636473613a3a5075626c69630002002c5065657252656d6f7665640400e102013465636473613a3a5075626c696300030004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090901030c2c70616c6c65745f7375646f1870616c6c6574144576656e7404045400010c14537564696404012c7375646f5f726573756c74a401384469737061746368526573756c740000048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d284b65794368616e6765640401286f6c645f7375646f6572090201504f7074696f6e3c543a3a4163636f756e7449643e0001043901546865205c5b7375646f65725c5d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c696564206966206f6e6520657869737465642e285375646f4173446f6e6504012c7375646f5f726573756c74a401384469737061746368526573756c740002048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090905030c186661756365741870616c6c6574144576656e740404540001082c5472616e7366657272656408000001384163636f756e7449644f663c543e000018011c42616c616e6365000000304c696d697455706461746564040018011c42616c616e636500010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909090308306672616d655f73797374656d14506861736500010c384170706c7945787472696e736963040010010c7533320000003046696e616c697a6174696f6e00010038496e697469616c697a6174696f6e000200000d030000022c001103000002a50100150308306672616d655f73797374656d584c61737452756e74696d6555706772616465496e666f0000080130737065635f76657273696f6ea102014c636f6465633a3a436f6d706163743c7533323e000124737065635f6e616d65b101016473705f72756e74696d653a3a52756e74696d65537472696e67000019030c306672616d655f73797374656d1870616c6c65741043616c6c0404540001201872656d61726b04011872656d61726b30011c5665633c75383e000014684d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002823203c7765696768743e202d20604f283129602c23203c2f7765696768743e387365745f686561705f7061676573040114706167657328010c753634000104f853657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040110636f646530011c5665633c75383e0002306453657420746865206e65772072756e74696d6520636f64652e002823203c7765696768743e31012d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656045012d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e60207768696368206973342020657870656e73697665292e842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e4d0154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c7920746869732069732076657279b8657870656e736976652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e2c23203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b73040110636f646530011c5665633c75383e000324190153657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002823203c7765696768743e8c2d20604f2843296020776865726520604360206c656e677468206f662060636f646560842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e550154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c48626c6f636b2e2023203c2f7765696768743e2c7365745f73746f726167650401146974656d731d0301345665633c4b657956616c75653e0004046853657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f726167650401106b657973250301205665633c4b65793e000504744b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697808011870726566697830010c4b657900011c7375626b65797310010c75333200061011014b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e0039012a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465723d0174686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e4472656d61726b5f776974685f6576656e7404011872656d61726b30011c5665633c75383e000704a44d616b6520736f6d65206f6e2d636861696e2072656d61726b20616e6420656d6974206576656e742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e1d030000022103002103000004083030002503000002300029030c306672616d655f73797374656d186c696d69747330426c6f636b5765696768747300000c0128626173655f626c6f636b2001185765696768740001246d61785f626c6f636b2001185765696768740001247065725f636c6173732d0301845065724469737061746368436c6173733c57656967687473506572436c6173733e00002d030c346672616d655f737570706f7274206469737061746368405065724469737061746368436c617373040454013103000c01186e6f726d616c310301045400012c6f7065726174696f6e616c31030104540001246d616e6461746f72793103010454000031030c306672616d655f73797374656d186c696d6974733c57656967687473506572436c6173730000100138626173655f65787472696e7369632001185765696768740001346d61785f65787472696e736963350301384f7074696f6e3c5765696768743e0001246d61785f746f74616c350301384f7074696f6e3c5765696768743e0001207265736572766564350301384f7074696f6e3c5765696768743e0000350304184f7074696f6e04045401200108104e6f6e6500000010536f6d65040020000001000039030c306672616d655f73797374656d186c696d6974732c426c6f636b4c656e677468000004010c6d61783d0301545065724469737061746368436c6173733c7533323e00003d030c346672616d655f737570706f7274206469737061746368405065724469737061746368436c6173730404540110000c01186e6f726d616c1001045400012c6f7065726174696f6e616c100104540001246d616e6461746f72791001045400004103082873705f776569676874733c52756e74696d65446257656967687400000801107265616428010c753634000114777269746528010c75363400004503082873705f76657273696f6e3852756e74696d6556657273696f6e0000200124737065635f6e616d65b101013452756e74696d65537472696e67000124696d706c5f6e616d65b101013452756e74696d65537472696e67000144617574686f72696e675f76657273696f6e10010c753332000130737065635f76657273696f6e10010c753332000130696d706c5f76657273696f6e10010c753332000110617069734903011c4170697356656300014c7472616e73616374696f6e5f76657273696f6e10010c75333200013473746174655f76657273696f6e080108753800004903040c436f77040454014d030004004d030000004d03000002510300510300000408150110005503000005040059030c306672616d655f73797374656d1870616c6c6574144572726f720404540001183c496e76616c6964537065634e616d650000081101546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e63726561736500010841015468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e00020cec4661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e0009014569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f73697465000304fc537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e74000404350154686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e3043616c6c46696c7465726564000504d0546865206f726967696e2066696c7465722070726576656e74207468652063616c6c20746f20626520646973706174636865642e046c4572726f7220666f72207468652053797374656d2070616c6c65745d03101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e646564566563080454016103045300000400690301185665633c543e00006103000004086503280065030c4473705f636f6e73656e7375735f626162650c617070185075626c696300000400ec013c737232353531393a3a5075626c6963000069030000026103006d03084873705f636f6e73656e7375735f736c6f747310536c6f740000040028010c753634000071030c4473705f636f6e73656e7375735f626162651c64696765737473504e657874436f6e66696744657363726970746f720001040856310801046375030128287536342c2075363429000134616c6c6f7765645f736c6f747379030130416c6c6f776564536c6f7473000100007503000004082828007903084473705f636f6e73656e7375735f6261626530416c6c6f776564536c6f747300010c305072696d617279536c6f7473000000745072696d617279416e645365636f6e64617279506c61696e536c6f74730001006c5072696d617279416e645365636f6e64617279565246536c6f7473000200007d03101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540104045300000400810301185665633c543e000081030000020400850304184f7074696f6e0404540189030108104e6f6e6500000010536f6d6504008903000001000089030c4473705f636f6e73656e7375735f626162651c646967657374732450726544696765737400010c1c5072696d61727904008d0301405072696d617279507265446967657374000100385365636f6e64617279506c61696e04009503015c5365636f6e64617279506c61696e507265446967657374000200305365636f6e646172795652460400990301545365636f6e64617279565246507265446967657374000300008d030c4473705f636f6e73656e7375735f626162651c64696765737473405072696d617279507265446967657374000010013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f746d030110536c6f740001287672665f6f75747075740401245652464f75747075740001247672665f70726f6f669103012056524650726f6f660000910300000340000000080095030c4473705f636f6e73656e7375735f626162651c646967657374735c5365636f6e64617279506c61696e507265446967657374000008013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f746d030110536c6f74000099030c4473705f636f6e73656e7375735f626162651c64696765737473545365636f6e64617279565246507265446967657374000010013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f746d030110536c6f740001287672665f6f75747075740401245652464f75747075740001247672665f70726f6f669103012056524650726f6f6600009d03084473705f636f6e73656e7375735f62616265584261626545706f6368436f6e66696775726174696f6e00000801046375030128287536342c2075363429000134616c6c6f7765645f736c6f747379030130416c6c6f776564536c6f74730000a1030c2c70616c6c65745f626162651870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f66a5030184426f783c45717569766f636174696f6e50726f6f663c543a3a4865616465723e3e00013c6b65795f6f776e65725f70726f6f66b1030140543a3a4b65794f776e657250726f6f6600001009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f66a5030184426f783c45717569766f636174696f6e50726f6f663c543a3a4865616465723e3e00013c6b65795f6f776e65725f70726f6f66b1030140543a3a4b65794f776e657250726f6f6600012009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e0d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e48706c616e5f636f6e6669675f6368616e6765040118636f6e666967710301504e657874436f6e66696744657363726970746f720002105d01506c616e20616e2065706f636820636f6e666967206368616e67652e205468652065706f636820636f6e666967206368616e6765206973207265636f7264656420616e642077696c6c20626520656e6163746564206f6e5101746865206e6578742063616c6c20746f2060656e6163745f65706f63685f6368616e6765602e2054686520636f6e6669672077696c6c20626520616374697661746564206f6e652065706f63682061667465722e59014d756c7469706c652063616c6c7320746f2074686973206d6574686f642077696c6c207265706c61636520616e79206578697374696e6720706c616e6e656420636f6e666967206368616e6765207468617420686164546e6f74206265656e20656e6163746564207965742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ea503084873705f636f6e73656e7375735f736c6f74734445717569766f636174696f6e50726f6f66081848656164657201a903084964016503001001206f6666656e646572650301084964000110736c6f746d030110536c6f7400013066697273745f686561646572a90301184865616465720001347365636f6e645f686561646572a90301184865616465720000a903102873705f72756e74696d651c67656e65726963186865616465721848656164657208184e756d6265720110104861736801ad030014012c706172656e745f686173682c0130486173683a3a4f75747075740001186e756d626572a10201184e756d62657200012873746174655f726f6f742c0130486173683a3a4f757470757400013c65787472696e736963735f726f6f742c0130486173683a3a4f75747075740001186469676573743401184469676573740000ad030c2873705f72756e74696d65187472616974732c426c616b6554776f32353600000000b103082873705f73657373696f6e3c4d656d6265727368697050726f6f6600000c011c73657373696f6e10013053657373696f6e496e646578000128747269655f6e6f646573250301305665633c5665633c75383e3e00013c76616c696461746f725f636f756e7410013856616c696461746f72436f756e740000b5030c2c70616c6c65745f626162651870616c6c6574144572726f7204045400011060496e76616c696445717569766f636174696f6e50726f6f660000043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c69644b65794f776e65727368697050726f6f66000104310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400020415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e50496e76616c6964436f6e66696775726174696f6e0003048c5375626d697474656420636f6e66696775726174696f6e20697320696e76616c69642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909b9030c4070616c6c65745f74696d657374616d701870616c6c65741043616c6c0404540001040c73657404010c6e6f77240124543a3a4d6f6d656e7400004054536574207468652063757272656e742074696d652e005501546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed470686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e0041015468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627940604d696e696d756d506572696f64602e00d4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002823203c7765696768743e31012d20604f2831296020284e6f7465207468617420696d706c656d656e746174696f6e73206f6620604f6e54696d657374616d7053657460206d75737420616c736f20626520604f283129602961012d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e402020606f6e5f66696e616c697a656029d42d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f736574602e204d75737420626520604f283129602e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ebd03101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401c103045300000400c90301185665633c543e0000c103083c70616c6c65745f62616c616e6365732c42616c616e63654c6f636b041c42616c616e63650118000c01086964150101384c6f636b4964656e746966696572000118616d6f756e7418011c42616c616e636500011c726561736f6e73c503011c526561736f6e730000c503083c70616c6c65745f62616c616e6365731c526561736f6e7300010c0c466565000000104d6973630001000c416c6c00020000c903000002c10300cd03101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401d103045300000400d50301185665633c543e0000d103083c70616c6c65745f62616c616e6365732c52657365727665446174610844526573657276654964656e74696669657201a81c42616c616e63650118000801086964a80144526573657276654964656e746966696572000118616d6f756e7418011c42616c616e63650000d503000002d10300d9030c3c70616c6c65745f62616c616e6365731870616c6c6574144572726f720804540004490001203856657374696e6742616c616e63650000049856657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e73000104c44163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c4c496e73756666696369656e7442616c616e63650002047842616c616e636520746f6f206c6f7720746f2073656e642076616c75652e484578697374656e7469616c4465706f736974000304e856616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650004048c5472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c65000504c8412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e740006048842656e6566696369617279206163636f756e74206d757374207072652d65786973743c546f6f4d616e795265736572766573000704ac4e756d626572206f66206e616d656420726573657276657320657863656564204d6178526573657276657304b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909dd03101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012c0453000004000d0301185665633c543e0000e103086870616c6c65745f7472616e73616374696f6e5f7061796d656e742052656c6561736573000108245631416e6369656e7400000008563200010000e5030000040810e90300e903082c7065726d697373696f6e731453636f70650001081c4c696d697465640400ed0301104835313200000024556e6c696d6974656400010000ed03083c7072696d69746976655f7479706573104835313200000400910301205b75383b2036345d0000f1030000040800e90300f5030000021000f9030c2c7065726d697373696f6e731870616c6c65741043616c6c040454000100042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632efd030c2c7065726d697373696f6e731870616c6c6574144572726f72040454000114485065726d697373696f6e4e6f74466f756e64000004884163636f756e7420646f65736e277420686f6c642061207065726d697373696f6e2e485065726d697373696f6e4e6f744f776e6564000104844163636f756e7420646f65736e2774206f776e2061207065726d697373696f6e2e5c5065726d697373696f6e416c7265616479457869737473000204a05065726d697373696f6e20616c72656164792065786973747320696e207468652073797374656d2e24466f7262696464656e000304bc546865206163636f756e742065697468657220646f65736e2774206861766520746865207065726d697373696f6e2e2c496e635265664572726f7200040488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a09090901040c24726566657272616c731870616c6c65741043616c6c04045400010c1c7265736572766504011c62616c616e636518011c42616c616e63650000048d015265736572766573207468652062616c616e63652066726f6d20746865206163636f756e7420666f722061207370656369616c2062616c616e636520746861742063616e206265207573656420746f2070617920726566657272616c7327206665657324756e7265736572766504011c62616c616e636518011c42616c616e6365000104ec556e7265736572766573207468652062616c616e636520616e64207472616e7366657273206974206261636b20746f20746865206163636f756e74307365745f72656665727265720401207265666572726572000130543a3a4163636f756e74496400020484536574732074686520726566657272657220666f7220746865206163636f756e74042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e05040c24726566657272616c731870616c6c6574144572726f7204045400010c48416c726561647948617352656665727265720000047c4163636f756e7420616c72656164792068617320612072656665727265722e2c496e635265664572726f7200010488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e6c5265666572726572496e73756666696369656e7442616c616e6365000204c0526566657272657220646f65736e2774206861766520656e6f756768206f662072657365727665642062616c616e636504b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909090904083c7072696d69746976655f7479706573104831363000000400ad0201205b75383b2032305d00000d04081c7265776172647328526577617264496e666f0000080124636c61696d61626c6518011c42616c616e6365000114746f74616c18011c42616c616e6365000011040000021800150400000209040019040000020d01001d040c1c726577617264731870616c6c65741043616c6c04045400010814636c61696d0401247369676e617475726530011c5665633c75383e00000480436c61696d20746865207265776172642077697468207369676e61747572652e546164645f756d695f6e66745f7265636569766572730401247265636569766572731504013c5665633c457468416464726573733e000108d046696e616c697a652074686520757064617465206f6620756e636c61696d65642056414c206461746120696e2073746f72616765c0416464206164647265737365732c2077686f2077696c6c207265636569766520554d49204e465420726577617264732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e21040c1c726577617264731870616c6c6574144572726f72040454000114384e6f7468696e67546f436c61696d0000041101546865206163636f756e7420686173206e6f20636c61696d61626c652072657761726473206174207468652074696d65206f6620636c61696d696e67207265717565737448416464726573734e6f74456c696769626c650001049c41646472657373206973206e6f7420656c696769626c6520666f7220616e792072657761726473405369676e6174757265496e76616c696400020460546865207369676e617475726520697320696e76616c69646c5369676e6174757265566572696669636174696f6e4661696c656400030484546865207369676e617475726520766572696669636174696f6e206661696c65642c496c6c6567616c43616c6c00040411014f636375727320696620616e20617474656d707420746f207265706561742074686520756e636c61696d65642056414c206461746120757064617465206973206d61646504b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a09090925040c1c786f725f6665651870616c6c65741043616c6c040454000104447570646174655f6d756c7469706c6965720401386e65775f6d756c7469706c6965728c0124466978656455313238000004cc55706461746520746865206d756c7469706c69657220666f7220776569676874202d3e2066656520636f6e76657273696f6e2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e2904083c70616c6c65745f6d756c74697369673c4d756c74697369674163636f756e7404244163636f756e74496401000008012c7369676e61746f72696573250201385665633c4163636f756e7449643e0001247468726573686f6c642d04011c50657263656e7400002d040c3473705f61726974686d65746963287065725f7468696e67731c50657263656e7400000400080108753800003104000004080004003504083c70616c6c65745f6d756c7469736967204d756c74697369670c2c426c6f636b4e756d62657201101c42616c616e63650118244163636f756e7449640100001001107768656e94017042726964676554696d65706f696e743c426c6f636b4e756d6265723e00011c6465706f73697418011c42616c616e63650001246465706f7369746f720001244163636f756e744964000124617070726f76616c73250201385665633c4163636f756e7449643e000039040000040c300018003d040000040804940041040c3c70616c6c65745f6d756c74697369671870616c6c65741043616c6c04045400011c4472656769737465725f6d756c746973696704012c7369676e61746f72696573250201445665633c543a3a4163636f756e7449643e00002c784372656174652061206e6577206d756c7469736967206163636f756e742eb0544f444f3a20757064617465207765696768747320666f72206072656769737465725f6d756c7469736967602823203c7765696768743e6c4b65793a204d202d206c656e677468206f66206d656d626572732c682d204f6e652073746f72616765207265616473202d204f283129942d204f6e652073656172636820696e20736f72746564206c697374202d204f286c6f674d29b42d20436f6e6669726d6174696f6e207468617420746865206c69737420697320736f72746564202d204f284d296c2d204f6e652073746f7261676520777269746573202d204f2831292c2d204f6e65206576656e7474546f74616c20436f6d706c65786974793a204f284d202b206c6f674d292823203c7765696768743e4072656d6f76655f7369676e61746f72790401247369676e61746f7279000130543a3a4163636f756e744964000128bc52656d6f766520746865207369676e61746f72792066726f6d20746865206d756c7469736967206163636f756e742ea443616e206f6e6c792062652063616c6c65642062792061206d756c7469736967206163636f756e742e00ac544f444f3a20757064617465207765696768747320666f72206072656d6f76655f7369676e61746f7279602823203c7765696768743eac4b65793a206c656e677468206f66206d656d6265727320696e206d756c7469736967436f6e6669673a204d682d204f6e652073746f72616765207265616473202d204f283129742d2072656d6f7665206974656d7320696e206c697374202d204f284d295c546f74616c20636f6d706c6578697479202d204f284d292823203c7765696768743e346164645f7369676e61746f72790401286e65775f6d656d626572000130543a3a4163636f756e74496400022cb04164642061206e6577207369676e61746f727920746f20746865206d756c7469736967206163636f756e742ea443616e206f6e6c792062652063616c6c65642062792061206d756c7469736967206163636f756e742e00a0544f444f3a20757064617465207765696768747320666f7220606164645f7369676e61746f7279602823203c7765696768743eac4b65793a206c656e677468206f66206d656d6265727320696e206d756c7469736967436f6e6669673a204d642d204f6e652073746f726167652072656164202d204f283129682d2073656172636820696e206d656d62657273202d204f284d29582d2053746f72616765207772697465202d204f284d295c546f74616c20636f6d706c6578697479202d204f284d292823203c7765696768743e5061735f6d756c74695f7468726573686f6c645f310c01086964000130543a3a4163636f756e74496400011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00012474696d65706f696e7494017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e0003445101496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003d012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f662074686501016d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e00b8526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e002823203c7765696768743e19014f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d902d2042617365205765696768743a2033332e3732202b20302e303032202a205a20c2b573442d204442205765696768743a204e6f6e65482d20506c75732043616c6c205765696768742c23203c2f7765696768743e2061735f6d756c74691401086964000130543a3a4163636f756e74496400013c6d617962655f74696d65706f696e74fd08019c4f7074696f6e3c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00011063616c6c3001284f706171756543616c6c00012873746f72655f63616c6cbc0110626f6f6c0001286d61785f7765696768742001185765696768740004cc5501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e001d014e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f20757365190160617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005901526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f746865727769736555016f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642cdc6d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002823203c7765696768743e502d20604f2853202b205a202b2043616c6c29602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e21012d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e6c2d2054686520776569676874206f6620746865206063616c6c602e2d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c207769746820618c20206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b02020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d382d2042617365205765696768743adc202020202d204372656174653a2020202020202020202034312e3839202b20302e313138202a2053202b202e303032202a205a20c2b573dc202020202d2043726561746520772f2053746f72653a2035332e3537202b20302e313139202a2053202b202e303033202a205a20c2b573dc202020202d20417070726f76653a20202020202020202033312e3339202b20302e313336202a2053202b202e303032202a205a20c2b573dc202020202d20436f6d706c6574653a202020202020202033392e3934202b20302e323620202a2053202b202e303032202a205a20c2b573302d204442205765696768743a2101202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c60292501202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c6029482d20506c75732043616c6c205765696768742c23203c2f7765696768743e40617070726f76655f61735f6d756c74691001086964000130543a3a4163636f756e74496400013c6d617962655f74696d65706f696e74fd08019c4f7074696f6e3c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00012463616c6c5f686173680401205b75383b2033325d0001286d61785f77656967687420011857656967687400059c5501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e0035014e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e2d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c207769746820618c20206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b02020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d382d2042617365205765696768743a7c202020202d204372656174653a2034342e3731202b20302e303838202a205380202020202d20417070726f76653a2033312e3438202b20302e313136202a2053302d204442205765696768743ab8202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dbc202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c23203c2f7765696768743e3c63616e63656c5f61735f6d756c74690c01086964000130543a3a4163636f756e74496400012474696d65706f696e7494017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e00012463616c6c5f686173680401205b75383b2033325d00066c550143616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c4666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e5d012d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c787472616e73616374696f6e20666f7220746869732064697370617463682ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e302d204f6e65206576656e742e842d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e702d2053746f726167653a2072656d6f766573206f6e65206974656d2e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d802d2042617365205765696768743a2033362e3037202b20302e313234202a2053302d204442205765696768743a1501202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c731901202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e450408446672616d656e6f64655f72756e74696d652c52756e74696d6543616c6c0001dc1853797374656d0400190301ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53797374656d2c2052756e74696d653e00000010426162650400a10301a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426162652c2052756e74696d653e000e002454696d657374616d700400b90301b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54696d657374616d702c2052756e74696d653e0001002c5065726d697373696f6e730400f90301c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5065726d697373696f6e732c2052756e74696d653e00060024526566657272616c730400010401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c526566657272616c732c2052756e74696d653e0007001c5265776172647304001d0401b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c526577617264732c2052756e74696d653e00080018586f724665650400250401ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c586f724665652c2052756e74696d653e000900384272696467654d756c74697369670400410401cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4272696467654d756c74697369672c2052756e74696d653e000a001c5574696c6974790400490401b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5574696c6974792c2052756e74696d653e000b001c5374616b696e670400710401b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5374616b696e672c2052756e74696d653e0011001c53657373696f6e0400890401b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53657373696f6e2c2052756e74696d653e000c001c4772616e6470610400950401b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4772616e6470612c2052756e74696d653e000f0020496d4f6e6c696e650400c10401b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c496d4f6e6c696e652c2052756e74696d653e0024002c54726164696e67506169720400e10401c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54726164696e67506169722c2052756e74696d653e001400184173736574730400e50401ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4173736574732c2052756e74696d653e0015007c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c0400f90401110273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c2c2052756e74696d653e00170024546563686e6963616c0400fd0401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c2c2052756e74696d653e0018001c506f6f6c58594b0400010501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f6f6c58594b2c2052756e74696d653e001900384c697175696469747950726f78790400050501cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4c697175696469747950726f78792c2052756e74696d653e001a001c436f756e63696c0400250501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f756e63696c2c2052756e74696d653e001b0048546563686e6963616c436f6d6d69747465650400310501dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c436f6d6d69747465652c2052756e74696d653e001c002444656d6f63726163790400350501b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c44656d6f63726163792c2052756e74696d653e001d00184445584150490400490501ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4445584150492c2052756e74696d653e001e002445746842726964676504004d0501b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4574684272696467652c2052756e74696d653e001f00445073776170446973747269627574696f6e0400d10501d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5073776170446973747269627574696f6e2c2052756e74696d653e002000204d756c74697369670400d50501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d756c74697369672c2052756e74696d653e002100245363686564756c65720400dd0501b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5363686564756c65722c2052756e74696d653e0022003849726f68614d6967726174696f6e0400e50501cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c49726f68614d6967726174696f6e2c2052756e74696d653e0023004c546563686e6963616c4d656d626572736869700400e90501e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c4d656d626572736869702c2052756e74696d653e00260044456c656374696f6e7350687261676d656e0400ed0501d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c456c656374696f6e7350687261676d656e2c2052756e74696d653e00270034566573746564526577617264730400f50501c90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c566573746564526577617264732c2052756e74696d653e002800204964656e7469747904001d0601b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4964656e746974792c2052756e74696d653e0029001c585354506f6f6c0400bd0601b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c585354506f6f6c2c2052756e74696d653e002b003043657265735374616b696e670400c10601c50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c43657265735374616b696e672c2052756e74696d653e002d005043657265734c69717569646974794c6f636b65720400c50601e50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c43657265734c69717569646974794c6f636b65722c2052756e74696d653e002e00404365726573546f6b656e4c6f636b65720400c90601d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4365726573546f6b656e4c6f636b65722c2052756e74696d653e002f005c4365726573476f7665726e616e6365506c6174666f726d0400cd0601f10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4365726573476f7665726e616e6365506c6174666f726d2c2052756e74696d653e0030003843657265734c61756e63687061640400e10601cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c43657265734c61756e63687061642c2052756e74696d653e0031005844656d657465724661726d696e67506c6174666f726d0400e50601ed0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c44656d657465724661726d696e67506c6174666f726d2c2052756e74696d653e00320020426167734c6973740400e90601b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426167734c6973742c2052756e74696d653e00330068456c656374696f6e50726f76696465724d756c746950686173650400ed0601fd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c456c656374696f6e50726f76696465724d756c746950686173652c2052756e74696d653e0034001042616e640400350801a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c42616e642c2052756e74696d653e0035002c4f7261636c6550726f78790400490801c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4f7261636c6550726f78792c2052756e74696d653e003600604865726d6573476f7665726e616e6365506c6174666f726d04004d0801f50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4865726d6573476f7665726e616e6365506c6174666f726d2c2052756e74696d653e00370020507265696d6167650400510801b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c507265696d6167652c2052756e74696d653e003800244f72646572426f6f6b0400550801b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4f72646572426f6f6b2c2052756e74696d653e0039002c42726964676550726f78790400610801c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c42726964676550726f78792c2052756e74696d653e00670074537562737472617465427269646765496e626f756e644368616e6e656c04006d0801090273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c537562737472617465427269646765496e626f756e644368616e6e656c2c2052756e74696d653e006a00785375627374726174654272696467654f7574626f756e644368616e6e656c0400ad08010d0273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5375627374726174654272696467654f7574626f756e644368616e6e656c2c2052756e74696d653e006b004850617261636861696e4272696467654170700400b10801dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50617261636861696e4272696467654170702c2052756e74696d653e006d0040427269646765446174615369676e65720400c10801d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c427269646765446174615369676e65722c2052756e74696d653e006e00404d756c746973696756657269666965720400c50801d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d756c746973696756657269666965722c2052756e74696d653e006f00105375646f0400c90801a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5375646f2c2052756e74696d653e000300184661756365740400cd0801ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4661756365742c2052756e74696d653e0050001c5141546f6f6c730400d10801b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5141546f6f6c732c2052756e74696d653e0070000049040c3870616c6c65745f7574696c6974791870616c6c65741043616c6c04045400011814626174636804011463616c6c734d04017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00004c7c53656e642061206261746368206f662064697370617463682063616c6c732e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e0055014966206f726967696e20697320726f6f74207468656e207468652063616c6c7320617265206469737061746368656420776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e005501546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e31016576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e207468655501604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d6164654d01616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c65746564604c6576656e74206973206465706f73697465642e3461735f64657269766174697665080114696e6465785503010c75313600011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000134dc53656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00550146696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368bc757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e0045014e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e61016265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e7451017468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f31607c696e20746865204d756c74697369672070616c6c657420696e73746561642e00f44e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2462617463685f616c6c04011463616c6c734d04017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000238ec53656e642061206261746368206f662064697370617463682063616c6c7320616e642061746f6d6963616c6c792065786563757465207468656d2e21015468652077686f6c65207472616e73616374696f6e2077696c6c20726f6c6c6261636b20616e64206661696c20696620616e79206f66207468652063616c6c73206661696c65642e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e0055014966206f726967696e20697320726f6f74207468656e207468652063616c6c7320617265206469737061746368656420776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e2c64697370617463685f617308012461735f6f726967696e51040154426f783c543a3a50616c6c6574734f726967696e3e00011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000328c84469737061746368657320612066756e6374696f6e2063616c6c207769746820612070726f7669646564206f726967696e2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292e1d012d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b20543a3a576569676874496e666f3a3a64697370617463685f617328292e2c23203c2f7765696768743e2c666f7263655f626174636804011463616c6c734d04017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0004387c53656e642061206261746368206f662064697370617463682063616c6c732ed4556e6c696b6520606261746368602c20697420616c6c6f7773206572726f727320616e6420776f6e277420696e746572727570742e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e004d014966206f726967696e20697320726f6f74207468656e207468652063616c6c732061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e2c776974685f77656967687408011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000118776569676874200118576569676874000518c4446973706174636820612066756e6374696f6e2063616c6c2077697468206120737065636966696564207765696768742e002d01546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b8526f6f74206f726967696e20746f20737065636966792074686520776569676874206f66207468652063616c6c2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e4d04000002450400510408446672616d656e6f64655f72756e74696d65304f726967696e43616c6c65720001141873797374656d0400550401746672616d655f73797374656d3a3a4f726967696e3c52756e74696d653e0000001c436f756e63696c0400590401010170616c6c65745f636f6c6c6563746976653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365313e001b0048546563686e6963616c436f6d6d697474656504005d0401010170616c6c65745f636f6c6c6563746976653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365323e001c004453756273747261746544697370617463680400610401b864697370617463683a3a4f726967696e3c52756e74696d652c2064697370617463683a3a496e7374616e6365323e006c0010566f696404006d0401110173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a566f69640004000055040c346672616d655f737570706f7274206469737061746368245261774f726967696e04244163636f756e7449640100010c10526f6f74000000185369676e656404000001244163636f756e744964000100104e6f6e65000200005904084470616c6c65745f636f6c6c656374697665245261774f726967696e08244163636f756e7449640100044900010c1c4d656d62657273080010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000000184d656d62657204000001244163636f756e744964000100205f5068616e746f6d000200005d04084470616c6c65745f636f6c6c656374697665245261774f726967696e08244163636f756e7449640100044900010c1c4d656d62657273080010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000000184d656d62657204000001244163636f756e744964000100205f5068616e746f6d00020000610408206469737061746368245261774f726967696e04304f726967696e4f7574707574016504000401186f726967696e650401304f726967696e4f7574707574000065040c306272696467655f74797065731474797065734043616c6c4f726967696e4f75747075740c244e6574776f726b4964017102244d6573736167654964012c284164646974696f6e616c01a8001001286e6574776f726b5f6964710201244e6574776f726b49640001286d6573736167655f69642c01244d657373616765496400012474696d65706f696e746904014047656e6572696354696d65706f696e740001286164646974696f6e616ca801284164646974696f6e616c0000690408306272696467655f74797065734047656e6572696354696d65706f696e740001140c45564d040028010c75363400000010536f7261040010010c7533320001002450617261636861696e040010010c7533320002001c50656e64696e670003001c556e6b6e6f776e000400006d04081c73705f636f726510566f6964000100007104103870616c6c65745f7374616b696e671870616c6c65741870616c6c65741043616c6c04045400016810626f6e640c0128636f6e74726f6c6c65720001504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565fc013042616c616e63654f663c543e00011470617965657504017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000044610154616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c80626520746865206163636f756e74207468617420636f6e74726f6c732069742e002d016076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e002101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e003c456d6974732060426f6e646564602e2823203c7765696768743ed02d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e1c2d204f2831292e642d20546872656520657874726120444220656e74726965732e004d014e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e65643d01756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e482d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c23203c2f7765696768743e28626f6e645f65787472610401386d61785f6164646974696f6e616cfc013042616c616e63654f663c543e00013c610141646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757030666f72207374616b696e672e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e004d01557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e5501556e6c696b65205b60626f6e64605d2853656c663a3a626f6e6429206f72205b60756e626f6e64605d2853656c663a3a756e626f6e642920746869732066756e6374696f6e20646f6573206e6f7420696d706f7365bc616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e003c456d6974732060426f6e646564602e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e1c2d204f2831292e2c23203c2f7765696768743e18756e626f6e6404011476616c7565fc013042616c616e63654f663c543e00024c51015363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64fc706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e2101543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0045014f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665bc7468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e0031014e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d6178556e6c6f636b696e674368756e6b736029410163616e20636f2d657869737473206174207468652073616d652074696d652e20496620746865726520617265206e6f20756e6c6f636b696e67206368756e6b7320736c6f747320617661696c61626c6545015b6043616c6c3a3a77697468647261775f756e626f6e646564605d2069732063616c6c656420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00390149662061207573657220656e636f756e74657273207468652060496e73756666696369656e74426f6e6460206572726f72207768656e2063616c6c696e6720746869732065787472696e7369632c1901746865792073686f756c642063616c6c20606368696c6c6020666972737420696e206f7264657220746f206672656520757020746865697220626f6e6465642066756e64732e0044456d6974732060556e626f6e646564602e009453656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e4477697468647261775f756e626f6e6465640401486e756d5f736c617368696e675f7370616e7310010c75333200033c290152656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e0031015468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4877686174657665722069742077616e74732e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722e0048456d697473206057697468647261776e602e006853656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002823203c7765696768743e0501436f6d706c6578697479204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f766509014e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e2c23203c2f7765696768743e2076616c69646174650401147072656673b4013856616c696461746f725072656673000414e44465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e206e6f6d696e61746504011c74617267657473250201645665633c4163636f756e7449644c6f6f6b75704f663c543e3e00052c0d014465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002823203c7765696768743e2d012d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e29050177686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d49542028543a3a4d61784e6f6d696e6174696f6e73292ed42d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e2c23203c2f7765696768743e146368696c6c00062cc44465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e502d20436f6e7461696e73206f6e6520726561642ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e2c23203c2f7765696768743e247365745f706179656504011470617965657504017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000740b42852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e242d2d2d2d2d2d2d2d2d382d205765696768743a204f283129302d204442205765696768743a48202020202d20526561643a204c656467657248202020202d2057726974653a2050617965652c23203c2f7765696768743e387365745f636f6e74726f6c6c6572040128636f6e74726f6c6c65720001504163636f756e7449644c6f6f6b75704f663c543e0008408c2852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e282d2d2d2d2d2d2d2d2d2d305765696768743a204f283129284442205765696768743af02d20526561643a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572f42d2057726974653a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c65722c23203c2f7765696768743e4c7365745f76616c696461746f725f636f756e7404010c6e6577a102010c75333200092090536574732074686520696465616c206e756d626572206f662076616c696461746f72732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e305765696768743a204f2831295857726974653a2056616c696461746f7220436f756e742c23203c2f7765696768743e60696e6372656173655f76616c696461746f725f636f756e740401286164646974696f6e616ca102010c753332000a20e4496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f7273207570746f206d6178696d756d206f668c60456c656374696f6e50726f7669646572426173653a3a4d617857696e6e657273602e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e9853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e2c23203c2f7765696768743e547363616c655f76616c696461746f725f636f756e74040118666163746f722d04011c50657263656e74000b200d015363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f72207570746f206d6178696d756d206f668c60456c656374696f6e50726f7669646572426173653a3a4d617857696e6e657273602e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e9853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e2c23203c2f7765696768743e34666f7263655f6e6f5f65726173000c3cac466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e3901546875732074686520656c656374696f6e2070726f63657373206d6179206265206f6e676f696e67207768656e20746869732069732063616c6c65642e20496e2074686973206361736520746865dc656c656374696f6e2077696c6c20636f6e74696e756520756e74696c20746865206e65787420657261206973207472696767657265642e002823203c7765696768743e3c2d204e6f20617267756d656e74732e382d205765696768743a204f283129442d2057726974653a20466f7263654572612c23203c2f7765696768743e34666f7263655f6e65775f657261000d404901466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c2062659c726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e002823203c7765696768743e3c2d204e6f20617267756d656e74732e382d205765696768743a204f283129402d20577269746520466f7263654572612c23203c2f7765696768743e447365745f696e76756c6e657261626c6573040134696e76756c6e657261626c6573250201445665633c543a3a4163636f756e7449643e000e0cc8536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e34666f7263655f756e7374616b650801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c753332000f0c0901466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e50666f7263655f6e65775f6572615f616c776179730010240101466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e5463616e63656c5f64656665727265645f736c61736808010c657261100120457261496e646578000134736c6173685f696e6469636573f50301205665633c7533323e0011149443616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e009843616e2062652063616c6c6564206279207468652060543a3a41646d696e4f726967696e602e000101506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e387061796f75745f7374616b65727308013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400010c657261100120457261496e6465780012540d01506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e0049012d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f2501202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e31012d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e005501546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e206966746974206973206e6f74206f6e65206f6620746865207374616b6572732e002823203c7765696768743efc2d2054696d6520636f6d706c65786974793a206174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292ec02d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e2c2d2d2d2d2d2d2d2d2d2d2d19014e20697320746865204e756d626572206f66207061796f75747320666f72207468652076616c696461746f722028696e636c7564696e67207468652076616c696461746f72291c5765696768743a842d205265776172642044657374696e6174696f6e205374616b65643a204f284e29c02d205265776172642044657374696e6174696f6e20436f6e74726f6c6c657220284372656174696e67293a204f284e29004d0120204e4f54453a20776569676874732061726520617373756d696e672074686174207061796f75747320617265206d61646520746f20616c697665207374617368206163636f756e7420285374616b6564292e55012020506179696e67206576656e2061206465616420636f6e74726f6c6c65722069732063686561706572207765696768742d776973652e20576520646f6e277420646f20616e7920726566756e647320686572652e2c23203c2f7765696768743e187265626f6e6404011476616c7565fc013042616c616e63654f663c543e001324dc5265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00d4546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722e002823203c7765696768743ed02d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b73882d20426f756e64656420627920604d6178556e6c6f636b696e674368756e6b73602ef02d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e2c23203c2f7765696768743e28726561705f73746173680801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c7533320014305d0152656d6f766520616c6c2064617461207374727563747572657320636f6e6365726e696e672061207374616b65722f7374617368206f6e636520697420697320617420612073746174652077686572652069742063616e0501626520636f6e736964657265642060647573746020696e20746865207374616b696e672073797374656d2e2054686520726571756972656d656e7473206172653a000501312e207468652060746f74616c5f62616c616e636560206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e1101322e206f722c2074686520606c65646765722e746f74616c60206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e00550154686520666f726d65722063616e2068617070656e20696e206361736573206c696b65206120736c6173683b20746865206c6174746572207768656e20612066756c6c7920756e626f6e646564206163636f756e7409016973207374696c6c20726563656976696e67207374616b696e67207265776172647320696e206052657761726444657374696e6174696f6e3a3a5374616b6564602e00310149742063616e2062652063616c6c656420627920616e796f6e652c206173206c6f6e672061732060737461736860206d65657473207468652061626f766520726571756972656d656e74732e00dc526566756e647320746865207472616e73616374696f6e20666565732075706f6e207375636365737366756c20657865637574696f6e2e106b69636b04010c77686f250201645665633c4163636f756e7449644c6f6f6b75704f663c543e3e00152ce052656d6f76652074686520676976656e206e6f6d696e6174696f6e732066726f6d207468652063616c6c696e672076616c696461746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e004d012d206077686f603a2041206c697374206f66206e6f6d696e61746f72207374617368206163636f756e74732077686f20617265206e6f6d696e6174696e6720746869732076616c696461746f72207768696368c0202073686f756c64206e6f206c6f6e676572206265206e6f6d696e6174696e6720746869732076616c696461746f722e0055014e6f74653a204d616b696e6720746869732063616c6c206f6e6c79206d616b65732073656e736520696620796f7520666972737420736574207468652076616c696461746f7220707265666572656e63657320746f78626c6f636b20616e792066757274686572206e6f6d696e6174696f6e732e4c7365745f7374616b696e675f636f6e666967731801486d696e5f6e6f6d696e61746f725f626f6e6479040158436f6e6669674f703c42616c616e63654f663c543e3e0001486d696e5f76616c696461746f725f626f6e6479040158436f6e6669674f703c42616c616e63654f663c543e3e00014c6d61785f6e6f6d696e61746f725f636f756e747d040134436f6e6669674f703c7533323e00014c6d61785f76616c696461746f725f636f756e747d040134436f6e6669674f703c7533323e00013c6368696c6c5f7468726573686f6c6481040144436f6e6669674f703c50657263656e743e0001386d696e5f636f6d6d697373696f6e85040144436f6e6669674f703c50657262696c6c3e001644ac5570646174652074686520766172696f7573207374616b696e6720636f6e66696775726174696f6e73202e0025012a20606d696e5f6e6f6d696e61746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f2062652061206e6f6d696e61746f722e25012a20606d696e5f76616c696461746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f20626520612076616c696461746f722e55012a20606d61785f6e6f6d696e61746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e2062652061206e6f6d696e61746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e55012a20606d61785f76616c696461746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e20626520612076616c696461746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e59012a20606368696c6c5f7468726573686f6c64603a2054686520726174696f206f6620606d61785f6e6f6d696e61746f725f636f756e7460206f7220606d61785f76616c696461746f725f636f756e74602077686963681901202073686f756c642062652066696c6c656420696e206f7264657220666f722074686520606368696c6c5f6f7468657260207472616e73616374696f6e20746f20776f726b2e61012a20606d696e5f636f6d6d697373696f6e603a20546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e207468617420656163682076616c696461746f7273206d757374206d61696e7461696e2e550120205468697320697320636865636b6564206f6e6c792075706f6e2063616c6c696e67206076616c6964617465602e204578697374696e672076616c696461746f727320617265206e6f742061666665637465642e00c452756e74696d654f726967696e206d75737420626520526f6f7420746f2063616c6c20746869732066756e6374696f6e2e0035014e4f54453a204578697374696e67206e6f6d696e61746f727320616e642076616c696461746f72732077696c6c206e6f742062652061666665637465642062792074686973207570646174652e1101746f206b69636b2070656f706c6520756e64657220746865206e6577206c696d6974732c20606368696c6c5f6f74686572602073686f756c642062652063616c6c65642e2c6368696c6c5f6f74686572040128636f6e74726f6c6c6572000130543a3a4163636f756e74496400176841014465636c61726520612060636f6e74726f6c6c65726020746f2073746f702070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e004101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2c206275742063616e2062652063616c6c656420627920616e796f6e652e0059014966207468652063616c6c6572206973207468652073616d652061732074686520636f6e74726f6c6c6572206265696e672074617267657465642c207468656e206e6f206675727468657220636865636b7320617265d8656e666f726365642c20616e6420746869732066756e6374696f6e2062656861766573206a757374206c696b6520606368696c6c602e005d014966207468652063616c6c657220697320646966666572656e74207468616e2074686520636f6e74726f6c6c6572206265696e672074617267657465642c2074686520666f6c6c6f77696e6720636f6e646974696f6e73306d757374206265206d65743a001d012a2060636f6e74726f6c6c657260206d7573742062656c6f6e6720746f2061206e6f6d696e61746f722077686f20686173206265636f6d65206e6f6e2d6465636f6461626c652c000c4f723a003d012a204120604368696c6c5468726573686f6c6460206d7573742062652073657420616e6420636865636b656420776869636820646566696e657320686f7720636c6f736520746f20746865206d6178550120206e6f6d696e61746f7273206f722076616c696461746f7273207765206d757374207265616368206265666f72652075736572732063616e207374617274206368696c6c696e67206f6e652d616e6f746865722e59012a204120604d61784e6f6d696e61746f72436f756e746020616e6420604d617856616c696461746f72436f756e7460206d75737420626520736574207768696368206973207573656420746f2064657465726d696e65902020686f7720636c6f73652077652061726520746f20746865207468726573686f6c642e5d012a204120604d696e4e6f6d696e61746f72426f6e646020616e6420604d696e56616c696461746f72426f6e6460206d7573742062652073657420616e6420636865636b65642c2077686963682064657465726d696e65735101202069662074686973206973206120706572736f6e20746861742073686f756c64206265206368696c6c6564206265636175736520746865792068617665206e6f74206d657420746865207468726573686f6c64402020626f6e642072657175697265642e005501546869732063616e2062652068656c7066756c20696620626f6e6420726571756972656d656e74732061726520757064617465642c20616e64207765206e65656420746f2072656d6f7665206f6c642075736572739877686f20646f206e6f74207361746973667920746865736520726571756972656d656e74732e68666f7263655f6170706c795f6d696e5f636f6d6d697373696f6e04013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400180c4501466f72636520612076616c696461746f7220746f2068617665206174206c6561737420746865206d696e696d756d20636f6d6d697373696f6e2e20546869732077696c6c206e6f74206166666563742061610176616c696461746f722077686f20616c726561647920686173206120636f6d6d697373696f6e2067726561746572207468616e206f7220657175616c20746f20746865206d696e696d756d2e20416e79206163636f756e743863616e2063616c6c20746869732e487365745f6d696e5f636f6d6d697373696f6e04010c6e6577b0011c50657262696c6c00191025015365747320746865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e207468617420656163682076616c696461746f7273206d757374206d61696e7461696e2e005901546869732063616c6c20686173206c6f7765722070726976696c65676520726571756972656d656e7473207468616e20607365745f7374616b696e675f636f6e6669676020616e642063616e2062652063616c6c6564cc6279207468652060543a3a41646d696e4f726967696e602e20526f6f742063616e20616c776179732063616c6c20746869732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e7504083870616c6c65745f7374616b696e674452657761726444657374696e6174696f6e04244163636f756e74496401000114185374616b656400000014537461736800010028436f6e74726f6c6c65720002001c4163636f756e7404000001244163636f756e744964000300104e6f6e65000400007904103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540118010c104e6f6f700000000c5365740400180104540001001852656d6f7665000200007d04103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540110010c104e6f6f700000000c5365740400100104540001001852656d6f7665000200008104103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f70040454012d04010c104e6f6f700000000c53657404002d040104540001001852656d6f7665000200008504103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f7004045401b0010c104e6f6f700000000c5365740400b00104540001001852656d6f76650002000089040c3870616c6c65745f73657373696f6e1870616c6c65741043616c6c040454000108207365745f6b6579730801106b6579738d04011c543a3a4b65797300011470726f6f6630011c5665633c75383e000038e453657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e1d01416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d0546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002823203c7765696768743e11012d20436f6d706c65786974793a20604f283129602e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f6698202060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a02d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b65797360802d204462526561647320706572206b65792069643a20604b65794f776e657260842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e2870757267655f6b657973000140c852656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e00c05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e005501546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265205369676e656420616e6420746865206163636f756e74206d757374206265206569746865722062655d01636f6e7665727469626c6520746f20612076616c696461746f72204944207573696e672074686520636861696e2773207479706963616c2061646472657373696e672073797374656d20287468697320757375616c6c7951016d65616e73206265696e67206120636f6e74726f6c6c6572206163636f756e7429206f72206469726563746c7920636f6e7665727469626c6520696e746f20612076616c696461746f722049442028776869636894757375616c6c79206d65616e73206265696e672061207374617368206163636f756e74292e002823203c7765696768743e61012d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468a420206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a02d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e7460842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e8d040c446672616d656e6f64655f72756e74696d65186f70617175652c53657373696f6e4b657973000010011062616265650301c43c42616265206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300011c6772616e647061dc01d03c4772616e647061206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c6963000124696d5f6f6e6c696e65e801d43c496d4f6e6c696e65206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c69630001146265656679910401c83c4265656679206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c6963000091040c2073705f62656566791863727970746f185075626c696300000400e102013465636473613a3a5075626c6963000095040c3870616c6c65745f6772616e6470611870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f66990401bc426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3e00013c6b65795f6f776e65725f70726f6f66b1030140543a3a4b65794f776e657250726f6f6600001009015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f66990401bc426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3e00013c6b65795f6f776e65725f70726f6f66b1030140543a3a4b65794f776e657250726f6f6600012409015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e000d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e306e6f74655f7374616c6c656408011464656c6179100138543a3a426c6f636b4e756d62657200016c626573745f66696e616c697a65645f626c6f636b5f6e756d626572100138543a3a426c6f636b4e756d6265720002303d014e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c6974792067616467657420686173207374616c6c65642e006101546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e67206f6620746865206e6578742073657373696f6e2c20746f6101626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e20546865206064656c6179602073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d654901746861742074686520626c6f636b207369676e616c6c696e672074686520666f72636564206368616e67652077696c6c206e6f742062652072652d6f7267656420652e672e203130303020626c6f636b732e5d0154686520626c6f636b2070726f64756374696f6e207261746520287768696368206d617920626520736c6f77656420646f776e2062656361757365206f662066696e616c697479206c616767696e67292073686f756c64510162652074616b656e20696e746f206163636f756e74207768656e2063686f6f73696e6720746865206064656c6179602e20546865204752414e44504120766f74657273206261736564206f6e20746865206e65775501617574686f726974792077696c6c20737461727420766f74696e67206f6e20746f70206f662060626573745f66696e616c697a65645f626c6f636b5f6e756d6265726020666f72206e65772066696e616c697a65644d01626c6f636b732e2060626573745f66696e616c697a65645f626c6f636b5f6e756d626572602073686f756c64206265207468652068696768657374206f6620746865206c61746573742066696e616c697a6564c4626c6f636b206f6620616c6c2076616c696461746f7273206f6620746865206e657720617574686f72697479207365742e00584f6e6c792063616c6c61626c6520627920726f6f742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e9904084c73705f66696e616c6974795f6772616e6470614445717569766f636174696f6e50726f6f66080448012c044e0110000801187365745f6964280114536574496400013065717569766f636174696f6e9d04014845717569766f636174696f6e3c482c204e3e00009d04084c73705f66696e616c6974795f6772616e6470613045717569766f636174696f6e080448012c044e011001081c507265766f74650400a1040139016772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c206772616e6470613a3a507265766f74653c482c204e3e2c0a417574686f726974795369676e61747572653e00000024507265636f6d6d69740400b5040141016772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c206772616e6470613a3a507265636f6d6d69743c482c204e3e2c0a417574686f726974795369676e61747572653e00010000a104084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401dc045601a504045301a90400100130726f756e645f6e756d62657228010c7536340001206964656e74697479dc010849640001146669727374b104011828562c2053290001187365636f6e64b104011828562c2053290000a504084066696e616c6974795f6772616e6470611c507265766f7465080448012c044e01100008012c7461726765745f686173682c0104480001347461726765745f6e756d6265721001044e0000a9040c4c73705f66696e616c6974795f6772616e6470610c617070245369676e617475726500000400ad040148656432353531393a3a5369676e61747572650000ad040c1c73705f636f72651c65643235353139245369676e617475726500000400910301205b75383b2036345d0000b10400000408a504a90400b504084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401dc045601b904045301a90400100130726f756e645f6e756d62657228010c7536340001206964656e74697479dc010849640001146669727374bd04011828562c2053290001187365636f6e64bd04011828562c2053290000b904084066696e616c6974795f6772616e64706124507265636f6d6d6974080448012c044e01100008012c7461726765745f686173682c0104480001347461726765745f6e756d6265721001044e0000bd0400000408b904a90400c1040c4070616c6c65745f696d5f6f6e6c696e651870616c6c65741043616c6c04045400010424686561727462656174080124686561727462656174c50401644865617274626561743c543a3a426c6f636b4e756d6265723e0001247369676e6174757265d90401bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e61747572650000242823203c7765696768743e61012d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020286865617274626561742e76616c696461746f72735f6c656e2920616e642045206973d820206c656e677468206f6620606865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f61646472657373608820202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60ac20202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e6774682060456039012d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c5820206052656365697665644865617274626561747360802d2044625772697465733a2060526563656976656448656172746265617473602c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec504084070616c6c65745f696d5f6f6e6c696e6524486561727462656174042c426c6f636b4e756d626572011000140130626c6f636b5f6e756d62657210012c426c6f636b4e756d6265720001346e6574776f726b5f7374617465c90401484f70617175654e6574776f726b537461746500013473657373696f6e5f696e64657810013053657373696f6e496e64657800013c617574686f726974795f696e64657810012441757468496e64657800013876616c696461746f72735f6c656e10010c7533320000c9040c1c73705f636f7265206f6666636861696e484f70617175654e6574776f726b5374617465000008011c706565725f6964cd0401304f706171756550656572496400014865787465726e616c5f616464726573736573d10401505665633c4f70617175654d756c7469616464723e0000cd04081c73705f636f7265304f70617175655065657249640000040030011c5665633c75383e0000d104000002d50400d5040c1c73705f636f7265206f6666636861696e3c4f70617175654d756c7469616464720000040030011c5665633c75383e0000d904104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139245369676e617475726500000400dd040148737232353531393a3a5369676e61747572650000dd040c1c73705f636f72651c73723235353139245369676e617475726500000400910301205b75383b2036345d0000e1040c3074726164696e675f706169721870616c6c65741043616c6c0404540001042072656769737465720c01186465785f6964100120543a3a4445584964000134626173655f61737365745f69640d010128543a3a4173736574496400013c7461726765745f61737365745f69640d010128543a3a417373657449640000189c52656769737465722074726164696e672070616972206f6e2074686520676976656e204445582e9043616e206265206f6e6c792063616c6c65642062792074686520444558206f776e65722e007c2d20606465785f6964603a204944206f66207468652065786368616e67652e842d2060626173655f61737365745f6964603a20626173652061737365742049442e942d20607461726765745f61737365745f6964603a207461726765742061737365742049442e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee5040c186173736574731870616c6c65741043616c6c0404540001202072656769737465721c011873796d626f6c2901012c417373657453796d626f6c0001106e616d653101012441737365744e616d65000138696e697469616c5f737570706c7918011c42616c616e636500012c69735f6d696e7461626c65bc0110626f6f6c00013869735f696e646976697369626c65bc0110626f6f6c00013c6f70745f636f6e74656e745f737263e90401544f7074696f6e3c436f6e74656e74536f757263653e0001206f70745f64657363f104014c4f7074696f6e3c4465736372697074696f6e3e0000147c506572666f726d7320616e20617373657420726567697374726174696f6e2e00bc526567697374657273206e65772060417373657449646020666f722074686520676976656e20606f726967696e602e6501417373657453796d626f6c2073686f756c6420726570726573656e7420737472696e672077697468206f6e6c7920757070657263617365206c6174696e2063686172732077697468206d6178206c656e677468206f6620372eed0141737365744e616d652073686f756c6420726570726573656e7420737472696e672077697468206f6e6c7920757070657263617365206f72206c6f77657263617365206c6174696e206368617273206f72206e756d62657273206f72207370616365732c2077697468206d6178206c656e677468206f662033332e207472616e736665720c012061737365745f69640d010128543a3a41737365744964000108746f000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500011888506572666f726d73206120636865636b6564204173736574207472616e736665722e0005012d20606f726967696e603a2063616c6c6572204163636f756e742c2066726f6d20776869636820417373657420616d6f756e742069732077697468647261776e2c982d206061737365745f6964603a204964206f66207472616e736665727265642041737365742ce82d2060746f603a204964206f66204163636f756e742c20746f20776869636820417373657420616d6f756e74206973206465706f73697465642c942d2060616d6f756e74603a207472616e7366657272656420417373657420616d6f756e742e106d696e740c012061737365745f69640d010128543a3a41737365744964000108746f000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500021cbc506572666f726d73206120636865636b6564204173736574206d696e742c2063616e206f6e6c7920626520646f6e6594627920636f72726573706f6e64696e67206173736574206f776e6572206163636f756e742e00dc2d20606f726967696e603a2063616c6c6572204163636f756e742c20776869636820697373756573204173736574206d696e74696e672c842d206061737365745f6964603a204964206f66206d696e7465642041737365742cdc2d2060746f603a204964206f66204163636f756e742c20746f20776869636820417373657420616d6f756e74206973206d696e7465642c802d2060616d6f756e74603a206d696e74656420417373657420616d6f756e742e28666f7263655f6d696e740c012061737365745f69640d010128543a3a41737365744964000108746f000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500032cc8506572666f726d7320616e20756e636865636b6564204173736574206d696e742c2063616e206f6e6c7920626520646f6e6540627920726f6f74206163636f756e742e009853686f756c6420626520757365642061732065787472696e7369632063616c6c206f6e6c792e55016043757272656e636965733a3a757064617465645f62616c616e63652829602073686f756c6420626520646570726563617465642e205573696e672060666f7263655f6d696e746020616c6c6f777320757320746f2d01706572666f726d20657874726120616374696f6e7320666f72206d696e74696e672c2073756368206173206275792d6261636b2c2065787472612d6d696e74696e6720616e64206574632e00dc2d20606f726967696e603a2063616c6c6572204163636f756e742c20776869636820697373756573204173736574206d696e74696e672c842d206061737365745f6964603a204964206f66206d696e7465642041737365742cdc2d2060746f603a204964206f66204163636f756e742c20746f20776869636820417373657420616d6f756e74206973206d696e7465642c802d2060616d6f756e74603a206d696e74656420417373657420616d6f756e742e106275726e08012061737365745f69640d010128543a3a41737365744964000118616d6f756e7418011c42616c616e6365000418bc506572666f726d73206120636865636b6564204173736574206275726e2c2063616e206f6e6c7920626520646f6e65b8627920636f72726573706f6e64696e67206173736574206f776e65722077697468206f776e206163636f756e742e00f82d20606f726967696e603a2063616c6c6572204163636f756e742c2066726f6d20776869636820417373657420616d6f756e74206973206275726e65642c842d206061737365745f6964603a204964206f66206275726e65642041737365742c802d2060616d6f756e74603a206275726e656420417373657420616d6f756e742e387570646174655f62616c616e63650c010c77686f000130543a3a4163636f756e74496400012c63757272656e63795f69640d01013c43757272656e637949644f663c543e000118616d6f756e744101012c416d6f756e744f663c543e00051cf8416464206f722072656d6f766520616273286062795f616d6f756e7460292066726f6d207468652062616c616e6365206f66206077686f6020756e646572fc6063757272656e63795f6964602e20496620706f736974697665206062795f616d6f756e74602c20646f206164642c20656c736520646f2072656d6f76652e00f84261736963616c6c7920612077726170706572206f6620604d756c746943757272656e6379457874656e6465643a3a7570646174655f62616c616e63656054666f722074657374696e6720707572706f7365732e00c4544f444f3a206d6f766520696e746f2074657374732065787472696e73696320636f6c6c656374696f6e2070616c6c6574407365745f6e6f6e5f6d696e7461626c6504012061737365745f69640d010128543a3a41737365744964000614450153657420676976656e20617373657420746f206265206e6f6e2d6d696e7461626c652c20692e652e2069742063616e206e6f206c6f6e676572206265206d696e7465642c206f6e6c79206275726e65642e704f7065726174696f6e2063616e206e6f7420626520756e646f6e652e00f02d20606f726967696e603a2063616c6c6572204163636f756e742c2073686f756c6420636f72726573706f6e6420746f204173736574206f776e6572842d206061737365745f6964603a204964206f66206275726e65642041737365742c2c7570646174655f696e666f0c012061737365745f69640d010128543a3a417373657449640001286e65775f73796d626f6c2501014c4f7074696f6e3c417373657453796d626f6c3e0001206e65775f6e616d652d0101444f7074696f6e3c41737365744e616d653e000718e04368616e676520696e666f726d6174696f6e2061626f75742061737365742e2043616e206f6e6c7920626520646f6e6520627920726f6f7400a82d20606f726967696e603a2063616c6c6572204163636f756e742c2073686f756c6420626520726f6f74902d206061737365745f6964603a204964206f6620617373657420746f206368616e67652c19012d20606e65775f73796d626f6c603a204e65772061737365742073796d626f6c2e204966204e6f6e652061737365742073796d626f6c2077696c6c206e6f74206368616e676501012d20606e65775f6e616d65603a204e6577206173736574206e616d652e204966204e6f6e65206173736574206e616d652077696c6c206e6f74206368616e6765042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee90404184f7074696f6e04045401ed040108104e6f6e6500000010536f6d650400ed040000010000ed040c18636f6d6d6f6e287072696d69746976657334436f6e74656e74536f757263650000040030011c5665633c75383e0000f10404184f7074696f6e04045401f5040108104e6f6e6500000010536f6d650400f5040000010000f5040c18636f6d6d6f6e287072696d6974697665732c4465736372697074696f6e0000040030011c5665633c75383e0000f9040c886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c1870616c6c65741043616c6c0404540001143c696e697469616c697a655f706f6f6c04014c636f6c6c61746572616c5f61737365745f69640d010128543a3a417373657449640000041101456e61626c652065786368616e67652070617468206f6e2074686520706f6f6c20666f722070616972204261736541737365742d436f6c6c61746572616c41737365742e4c7365745f7265666572656e63655f61737365740401487265666572656e63655f61737365745f69640d010128543a3a41737365744964000104b5014368616e6765207265666572656e6365206173736574207768696368206973207573656420746f2064657465726d696e6520636f6c6c61746572616c206173736574732076616c75652e20496e746564656420746f20626520652e672e20737461626c65636f696e204441492e787365745f6f7074696f6e616c5f7265776172645f6d756c7469706c69657208014c636f6c6c61746572616c5f61737365745f69640d010128543a3a417373657449640001286d756c7469706c696572390101344f7074696f6e3c46697865643e0002088101536574206d756c7469706c696572207768696368206973206170706c69656420746f20726577617264656420616d6f756e74207768656e206465706f736974696e6720706172746963756c617220636f6c6c61746572616c206173736574732e0101604e6f6e65602076616c756520696e646963617465732072657761726420776974686f7574206368616e67652c2073616d6520617320536f6d6528312e30292e387365745f70726963655f6269617304012870726963655f6269617318011c42616c616e636500030449014368616e6765732060696e697469616c5f7072696365602075736564206173206269617320696e20584f522d444149287265666572656e6365206173736574292070726963652063616c63756c6174696f6e5c7365745f70726963655f6368616e67655f636f6e66696708014470726963655f6368616e67655f7261746518011c42616c616e636500014470726963655f6368616e67655f7374657018011c42616c616e6365000404884368616e676573207072696365206368616e6765207261746520616e642073746570042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632efd040c24746563686e6963616c1870616c6c65741043616c6c040454000100042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e01050c20706f6f6c5f78796b1870616c6c65741043616c6c04045400010c446465706f7369745f6c69717569646974791c01186465785f696410012844455849644f663c543e000134696e7075745f61737365745f610d010130417373657449644f663c543e000134696e7075745f61737365745f620d010130417373657449644f663c543e00013c696e7075745f615f6465736972656418011c42616c616e636500013c696e7075745f625f6465736972656418011c42616c616e636500012c696e7075745f615f6d696e18011c42616c616e636500012c696e7075745f625f6d696e18011c42616c616e63650000004877697468647261775f6c69717569646974791801186465785f696410012844455849644f663c543e0001386f75747075745f61737365745f610d010130417373657449644f663c543e0001386f75747075745f61737365745f620d010130417373657449644f663c543e0001506d61726b65725f61737365745f6465736972656418011c42616c616e63650001306f75747075745f615f6d696e18011c42616c616e63650001306f75747075745f625f6d696e18011c42616c616e63650001003c696e697469616c697a655f706f6f6c0c01186465785f696410012844455849644f663c543e00011c61737365745f610d010130417373657449644f663c543e00011c61737365745f620d010130417373657449644f663c543e000200042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e05050c3c6c69717569646974795f70726f78791870616c6c65741043616c6c04045400011c10737761701801186465785f6964100120543a3a4445584964000138696e7075745f61737365745f69640d010128543a3a4173736574496400013c6f75747075745f61737365745f69640d010128543a3a4173736574496400012c737761705f616d6f756e740905014c53776170416d6f756e743c42616c616e63653e00015473656c65637465645f736f757263655f74797065730d0501605665633c4c6971756964697479536f75726365547970653e00012c66696c7465725f6d6f64651105012846696c7465724d6f64650000241d01506572666f726d2073776170206f6620746f6b656e732028696e7075742f6f757470757420646566696e6564207669612053776170416d6f756e7420646972656374696f6e292e0029012d20606f726967696e603a20746865206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642c25012d20606465785f6964603a2044455820494420666f72207768696368206c697175696469747920736f7572636573206167677265676174696f6e206973206265696e6720646f6e652cbc2d2060696e7075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720736f6c642cc82d20606f75747075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720626f756768742c59022d2060737761705f616d6f756e74603a2074686520657861637420616d6f756e7420746f20626520736f6c64202865697468657220696e20696e7075745f61737365745f6964206f72206f75747075745f61737365745f696420756e697473207769746820636f72726573706f6e64696e6720736c69707061676520746f6c6572616e6365206162736f6c75746520626f756e64292cc5012d206073656c65637465645f736f757263655f7479706573603a206c697374206f662073656c6563746564204c6971756964697479536f757263652074797065732c2073656c656374696f6e206566666563742069732064657465726d696e65642062792066696c7465725f6d6f64652c79012d206066696c7465725f6d6f6465603a20696e6469636174652065697468657220746f20616c6c6f77206f7220666f726269642073656c6563746564207479706573206f6e6c792c206f722064697361626c652066696c746572696e672e34737761705f7472616e736665721c01207265636569766572000130543a3a4163636f756e7449640001186465785f6964100120543a3a4445584964000138696e7075745f61737365745f69640d010128543a3a4173736574496400013c6f75747075745f61737365745f69640d010128543a3a4173736574496400012c737761705f616d6f756e740905014c53776170416d6f756e743c42616c616e63653e00015473656c65637465645f736f757263655f74797065730d0501605665633c4c6971756964697479536f75726365547970653e00012c66696c7465725f6d6f64651105012846696c7465724d6f64650001281d01506572666f726d2073776170206f6620746f6b656e732028696e7075742f6f757470757420646566696e6564207669612053776170416d6f756e7420646972656374696f6e292e0029012d20606f726967696e603a20746865206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642ccc2d20607265636569766572603a20746865206163636f756e74207468617420726563656976657320746865206f75747075742c25012d20606465785f6964603a2044455820494420666f72207768696368206c697175696469747920736f7572636573206167677265676174696f6e206973206265696e6720646f6e652cbc2d2060696e7075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720736f6c642cc82d20606f75747075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720626f756768742c59022d2060737761705f616d6f756e74603a2074686520657861637420616d6f756e7420746f20626520736f6c64202865697468657220696e20696e7075745f61737365745f6964206f72206f75747075745f61737365745f696420756e697473207769746820636f72726573706f6e64696e6720736c69707061676520746f6c6572616e6365206162736f6c75746520626f756e64292cc5012d206073656c65637465645f736f757263655f7479706573603a206c697374206f662073656c6563746564204c6971756964697479536f757263652074797065732c2073656c656374696f6e206566666563742069732064657465726d696e65642062792066696c7465725f6d6f64652c79012d206066696c7465725f6d6f6465603a20696e6469636174652065697468657220746f20616c6c6f77206f7220666f726269642073656c6563746564207479706573206f6e6c792c206f722064697361626c652066696c746572696e672e4c737761705f7472616e736665725f6261746368140130737761705f62617463686573150501d85665633c537761704261746368496e666f3c543a3a417373657449642c20543a3a44455849642c20543a3a4163636f756e7449643e3e000138696e7075745f61737365745f69640d010128543a3a417373657449640001406d61785f696e7075745f616d6f756e7418011c42616c616e636500015473656c65637465645f736f757263655f74797065730d0501605665633c4c6971756964697479536f75726365547970653e00012c66696c7465725f6d6f64651105012846696c7465724d6f6465000230450144697370617463686573206d756c7469706c6520737761702026207472616e73666572206f7065726174696f6e732e2060737761705f626174636865736020636f6e7461696e7320766563746f72206f664901537761704261746368496e666f20737472756374732c20776865726520656163682062617463682073706563696669657320776869636820617373657420494420616e64204445582049442073686f756c6449016265207573656420666f72207377617070696e672c207265636569766572206163636f756e747320616e642074686569722064657369726564206f7574636f6d6520616d6f756e7420696e2061737365742c8073706563696669656420666f72207468652063757272656e742062617463682e0029012d20606f726967696e603a20746865206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642c09012d2060737761705f62617463686573603a2074686520766563746f7220636f6e7461696e696e672074686520537761704261746368496e666f20737472756374732cbc2d2060696e7075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720736f6c642c19012d20606d61785f696e7075745f616d6f756e74603a20746865206d6178696d756d20616d6f756e7420746f20626520736f6c6420696e20696e7075745f61737365745f69642c59012d206073656c65637465645f736f757263655f7479706573603a206c697374206f662073656c6563746564204c6971756964697479536f757263652074797065732c2073656c656374696f6e20656666656374206973d420202020202020202020202020202020202020202020202020202064657465726d696e65642062792066696c7465725f6d6f64652c79012d206066696c7465725f6d6f6465603a20696e6469636174652065697468657220746f20616c6c6f77206f7220666f726269642073656c6563746564207479706573206f6e6c792c206f722064697361626c652066696c746572696e672e5c656e61626c655f6c69717569646974795f736f757263650401406c69717569646974795f736f757263656901014c4c6971756964697479536f757263655479706500030c90456e61626c657320585354206f7220544243206c697175696469747920736f757263652e00e42d20606c69717569646974795f736f75726365603a20746865206c697175696469747920736f7572636520746f20626520656e61626c65642e6064697361626c655f6c69717569646974795f736f757263650401406c69717569646974795f736f757263656901014c4c6971756964697479536f757263655479706500040c610144697361626c657320585354206f7220544243206c697175696469747920736f757263652e20546865206c697175696469747920736f75726365206265636f6d657320756e617661696c61626c6520666f7220737761702e00e82d20606c69717569646974795f736f75726365603a20746865206c697175696469747920736f7572636520746f2062652064697361626c65642e647365745f616461725f636f6d6d697373696f6e5f726174696f040140636f6d6d697373696f6e5f726174696f18011c42616c616e636500050040786f726c6573735f7472616e736665722401186465785f6964100120543a3a444558496400012061737365745f69640d010128543a3a417373657449640001207265636569766572000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e6365000148646573697265645f786f725f616d6f756e7418011c42616c616e63650001346d61785f616d6f756e745f696e18011c42616c616e636500015473656c65637465645f736f757263655f74797065730d0501605665633c4c6971756964697479536f75726365547970653e00012c66696c7465725f6d6f64651105012846696c7465724d6f646500013c6164646974696f6e616c5f646174616d0101c84f7074696f6e3c426f756e6465645665633c75382c20543a3a4d61784164646974696f6e616c446174614c656e6774683e3e000618b045787472696e73696320776869636820697320656e61626c6520584f526c657373207472616e73666572732ef501496e7465726e616c6c792069742773207377617073206061737365745f69646020746f2060646573697265645f786f725f616d6f756e7460206f662060584f526020616e64207472616e73666572732072656d61696e696e6720616d6f756e74206f66206061737365745f69646020746f20607265636569766572602ea901436c69656e7420617070732073686f756c6420737065636966792074686520584f5220616d6f756e742077686963682073686f756c64206265207061696420617320612066656520696e2060646573697265645f786f725f616d6f756e746020706172616d657465722e750149662073656e6465722077696c6c206e6f74206861766520656e6f75676820584f5220746f20706179206665657320616674657220657865637574696f6e2c207472616e73616374696f6e2077696c6c2062652072656a65637465642e8501546869732065787472696e73696320697320646f6e652061732074656d706f7261727920736f6c7574696f6e20666f7220584f526c657373207472616e73666572732c20696e2066757475726520697420776f756c642062652072656d6f7665640d01616e64206c6f67696320666f7220584f526c6573732065787472696e736963732073686f756c64206265206d6f76656420746f20786f722d6665652070616c6c65742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e09050c18636f6d6d6f6e2c737761705f616d6f756e742853776170416d6f756e740428416d6f756e745479706501180108405769746844657369726564496e707574080144646573697265645f616d6f756e745f696e180128416d6f756e74547970650001386d696e5f616d6f756e745f6f7574180128416d6f756e74547970650000004457697468446573697265644f7574707574080148646573697265645f616d6f756e745f6f7574180128416d6f756e74547970650001346d61785f616d6f756e745f696e180128416d6f756e7454797065000100000d0500000269010011050c18636f6d6d6f6e287072696d6974697665732846696c7465724d6f646500010c2044697361626c656400000038466f7262696453656c656374656400010034416c6c6f7753656c65637465640002000015050000021905001905083c6c69717569646974795f70726f787934537761704261746368496e666f0c1c41737365744964010d011444455849640110244163636f756e7449640100001001406f7574636f6d655f61737365745f69640d01011c4173736574496400014c6f7574636f6d655f61737365745f726575736518011c42616c616e63650001186465785f696410011444455849640001247265636569766572731d0501845665633c42617463685265636569766572496e666f3c4163636f756e7449643e3e00001d050000022105002105083c6c69717569646974795f70726f78794442617463685265636569766572496e666f04244163636f756e7449640100000801286163636f756e745f69640001244163636f756e7449640001347461726765745f616d6f756e7418011c42616c616e6365000025050c4470616c6c65745f636f6c6c6563746976651870616c6c65741043616c6c08045400044900011c2c7365745f6d656d626572730c012c6e65775f6d656d62657273250201445665633c543a3a4163636f756e7449643e0001147072696d65090201504f7074696f6e3c543a3a4163636f756e7449643e0001246f6c645f636f756e7410012c4d656d626572436f756e74000080805365742074686520636f6c6c6563746976652773206d656d626572736869702e0045012d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee02d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e59012d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652e205573656420666f7250202077656967687420657374696d6174696f6e2e0054526571756972657320726f6f74206f726967696e2e0051014e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c2062757421012020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002823205741524e494e473a005901546865206070616c6c65742d636f6c6c656374697665602063616e20616c736f206265206d616e61676564206279206c6f676963206f757473696465206f66207468652070616c6c6574207468726f75676820746865b8696d706c656d656e746174696f6e206f6620746865207472616974205b604368616e67654d656d62657273605d2e5501416e792063616c6c20746f20607365745f6d656d6265727360206d757374206265206361726566756c207468617420746865206d656d6265722073657420646f65736e277420676574206f7574206f662073796e63a477697468206f74686572206c6f676963206d616e6167696e6720746865206d656d626572207365742e002823203c7765696768743e24232320576569676874502d20604f284d50202b204e29602077686572653ae020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299820202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e64656429142d2044423a510120202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e67207468652c202020206d656d62657273ec20202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c73450120202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c5d0120202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e652c23203c2f7765696768743e1c6578656375746508012070726f706f73616c4504017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e64a102010c75333200012cf0446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00a84f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002823203c7765696768743e2423232057656967687455012d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e673020206070726f706f73616c60d42d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c60242d2031206576656e742c23203c2f7765696768743e1c70726f706f73650c01247468726573686f6c64a102012c4d656d626572436f756e7400012070726f706f73616c4504017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e64a102010c75333200026cf84164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e00845265717569726573207468652073656e64657220746f206265206d656d6265722e004101607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c20326029546f722070757420757020666f7220766f74696e672e002823203c7765696768743e24232320576569676874ac2d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c420202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af4202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029fc202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d20326029142d2044423ab420202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029a820202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0901202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029b8202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029d82020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e42020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029cc2020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029bc2020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d2960292c20202d2031206576656e742c23203c2f7765696768743e10766f74650c012070726f706f73616c2c011c543a3a48617368000114696e646578a102013450726f706f73616c496e64657800011c617070726f7665bc0110626f6f6c00033cf041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e008c5265717569726573207468652073656e64657220746f2062652061206d656d6265722e0049015472616e73616374696f6e20666565732077696c6c2062652077616976656420696620746865206d656d62657220697320766f74696e67206f6e20616e7920706172746963756c61722070726f706f73616c5101666f72207468652066697273742074696d6520616e64207468652063616c6c206973207375636365737366756c2e2053756273657175656e7420766f7465206368616e6765732077696c6c206368617267652061106665652e2823203c7765696768743e2423232057656967687409012d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429142d2044423aac20202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029b820202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d296029242d2031206576656e742c23203c2f7765696768743e40636c6f73655f6f6c645f77656967687410013470726f706f73616c5f686173682c011c543a3a48617368000114696e646578a102013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e64290501244f6c645765696768740001306c656e6774685f626f756e64a102010c7533320004804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e4c646973617070726f76655f70726f706f73616c04013470726f706f73616c5f686173682c011c543a3a486173680005385901446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e741873746174652e00884d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e002c506172616d65746572733a1d012a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002823203c7765696768743edc436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73284442205765696768743a482a2052656164733a2050726f706f73616c739c2a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f662c23203c2f7765696768743e14636c6f736510013470726f706f73616c5f686173682c011c543a3a48617368000114696e646578a102013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e642001185765696768740001306c656e6774685f626f756e64a102010c7533320006804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e29050000062d05002d05082873705f77656967687473244f6c645765696768740000040028010c753634000031050c4470616c6c65745f636f6c6c6563746976651870616c6c65741043616c6c08045400044900011c2c7365745f6d656d626572730c012c6e65775f6d656d62657273250201445665633c543a3a4163636f756e7449643e0001147072696d65090201504f7074696f6e3c543a3a4163636f756e7449643e0001246f6c645f636f756e7410012c4d656d626572436f756e74000080805365742074686520636f6c6c6563746976652773206d656d626572736869702e0045012d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee02d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e59012d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652e205573656420666f7250202077656967687420657374696d6174696f6e2e0054526571756972657320726f6f74206f726967696e2e0051014e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c2062757421012020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002823205741524e494e473a005901546865206070616c6c65742d636f6c6c656374697665602063616e20616c736f206265206d616e61676564206279206c6f676963206f757473696465206f66207468652070616c6c6574207468726f75676820746865b8696d706c656d656e746174696f6e206f6620746865207472616974205b604368616e67654d656d62657273605d2e5501416e792063616c6c20746f20607365745f6d656d6265727360206d757374206265206361726566756c207468617420746865206d656d6265722073657420646f65736e277420676574206f7574206f662073796e63a477697468206f74686572206c6f676963206d616e6167696e6720746865206d656d626572207365742e002823203c7765696768743e24232320576569676874502d20604f284d50202b204e29602077686572653ae020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299820202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e64656429142d2044423a510120202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e67207468652c202020206d656d62657273ec20202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c73450120202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c5d0120202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e652c23203c2f7765696768743e1c6578656375746508012070726f706f73616c4504017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e64a102010c75333200012cf0446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00a84f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002823203c7765696768743e2423232057656967687455012d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e673020206070726f706f73616c60d42d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c60242d2031206576656e742c23203c2f7765696768743e1c70726f706f73650c01247468726573686f6c64a102012c4d656d626572436f756e7400012070726f706f73616c4504017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e64a102010c75333200026cf84164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e00845265717569726573207468652073656e64657220746f206265206d656d6265722e004101607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c20326029546f722070757420757020666f7220766f74696e672e002823203c7765696768743e24232320576569676874ac2d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c420202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af4202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029fc202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d20326029142d2044423ab420202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029a820202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0901202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029b8202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029d82020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e42020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029cc2020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029bc2020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d2960292c20202d2031206576656e742c23203c2f7765696768743e10766f74650c012070726f706f73616c2c011c543a3a48617368000114696e646578a102013450726f706f73616c496e64657800011c617070726f7665bc0110626f6f6c00033cf041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e008c5265717569726573207468652073656e64657220746f2062652061206d656d6265722e0049015472616e73616374696f6e20666565732077696c6c2062652077616976656420696620746865206d656d62657220697320766f74696e67206f6e20616e7920706172746963756c61722070726f706f73616c5101666f72207468652066697273742074696d6520616e64207468652063616c6c206973207375636365737366756c2e2053756273657175656e7420766f7465206368616e6765732077696c6c206368617267652061106665652e2823203c7765696768743e2423232057656967687409012d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429142d2044423aac20202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029b820202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d296029242d2031206576656e742c23203c2f7765696768743e40636c6f73655f6f6c645f77656967687410013470726f706f73616c5f686173682c011c543a3a48617368000114696e646578a102013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e64290501244f6c645765696768740001306c656e6774685f626f756e64a102010c7533320004804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e4c646973617070726f76655f70726f706f73616c04013470726f706f73616c5f686173682c011c543a3a486173680005385901446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e741873746174652e00884d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e002c506172616d65746572733a1d012a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002823203c7765696768743edc436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73284442205765696768743a482a2052656164733a2050726f706f73616c739c2a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f662c23203c2f7765696768743e14636c6f736510013470726f706f73616c5f686173682c011c543a3a48617368000114696e646578a102013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e642001185765696768740001306c656e6774685f626f756e64a102010c7533320006804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e35050c4070616c6c65745f64656d6f63726163791870616c6c65741043616c6c0404540001481c70726f706f736508012070726f706f73616c39050140426f756e64656443616c6c4f663c543e00011476616c7565fc013042616c616e63654f663c543e0000249c50726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e001501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737480686176652066756e647320746f20636f76657220746865206465706f7369742e00d42d206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20707265696d6167652e15012d206076616c7565603a2054686520616d6f756e74206f66206465706f73697420286d757374206265206174206c6561737420604d696e696d756d4465706f73697460292e0044456d697473206050726f706f736564602e187365636f6e6404012070726f706f73616ca102012450726f70496e646578000118b45369676e616c732061677265656d656e742077697468206120706172746963756c61722070726f706f73616c2e000101546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e64657211016d75737420686176652066756e647320746f20636f76657220746865206465706f7369742c20657175616c20746f20746865206f726967696e616c206465706f7369742e00c82d206070726f706f73616c603a2054686520696e646578206f66207468652070726f706f73616c20746f207365636f6e642e10766f74650801247265665f696e646578a102013c5265666572656e64756d496e646578000110766f7465850101644163636f756e74566f74653c42616c616e63654f663c543e3e00021c3101566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bb86f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00dc2d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f20766f746520666f722e842d2060766f7465603a2054686520766f746520636f6e66696775726174696f6e2e40656d657267656e63795f63616e63656c0401247265665f696e64657810013c5265666572656e64756d496e6465780003204d015363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d652c7265666572656e64756d2e00f8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c6c6174696f6e4f726967696e602e00d02d607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e003c5765696768743a20604f283129602e4065787465726e616c5f70726f706f736504012070726f706f73616c39050140426f756e64656443616c6c4f663c543e0004182d015363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c2c7265666572656e64756d2e00e8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206045787465726e616c4f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e6465787465726e616c5f70726f706f73655f6d616a6f7269747904012070726f706f73616c39050140426f756e64656443616c6c4f663c543e00052c55015363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c655c616e2065787465726e616c207265666572656e64756d2e00ec546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c4d616a6f726974794f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004901556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061987072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e00385765696768743a20604f283129606065787465726e616c5f70726f706f73655f64656661756c7404012070726f706f73616c39050140426f756e64656443616c6c4f663c543e00062c45015363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f807363686564756c6520616e2065787465726e616c207265666572656e64756d2e00e8546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c44656661756c744f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004901556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061987072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e00385765696768743a20604f2831296028666173745f747261636b0c013470726f706f73616c5f686173682c011048323536000134766f74696e675f706572696f64100138543a3a426c6f636b4e756d62657200011464656c6179100138543a3a426c6f636b4e756d6265720007404d015363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c65646101696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65e8627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00d0546865206469737061746368206f6620746869732063616c6c206d757374206265206046617374547261636b4f726967696e602e00f42d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e5d012d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f88094d75737420626520616c776179732067726561746572207468616e207a65726f2e350109466f72206046617374547261636b4f726967696e60206d75737420626520657175616c206f722067726561746572207468616e206046617374547261636b566f74696e67506572696f64602e51012d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265b82020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e0040456d697473206053746172746564602e00385765696768743a20604f28312960347665746f5f65787465726e616c04013470726f706f73616c5f686173682c011048323536000824b85665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e00d8546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520605665746f4f726967696e602e002d012d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c20746f207665746f20616e6420626c61636b6c6973742e003c456d69747320605665746f6564602e00fc5765696768743a20604f2856202b206c6f6728562929602077686572652056206973206e756d626572206f6620606578697374696e67207665746f657273604463616e63656c5f7265666572656e64756d0401247265665f696e646578a102013c5265666572656e64756d496e64657800091c5052656d6f76652061207265666572656e64756d2e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00d42d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e004423205765696768743a20604f283129602e2064656c65676174650c0108746f0001504163636f756e7449644c6f6f6b75704f663c543e000128636f6e76696374696f6e41050128436f6e76696374696f6e00011c62616c616e636518013042616c616e63654f663c543e000a50390144656c65676174652074686520766f74696e6720706f77657220287769746820736f6d6520676976656e20636f6e76696374696f6e29206f66207468652073656e64696e67206163636f756e742e0055015468652062616c616e63652064656c656761746564206973206c6f636b656420666f72206173206c6f6e6720617320697427732064656c6567617465642c20616e64207468657265616674657220666f7220746865c874696d6520617070726f70726961746520666f722074686520636f6e76696374696f6e2773206c6f636b20706572696f642e005d01546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e696e67206163636f756e74206d757374206569746865723a7420202d2062652064656c65676174696e6720616c72656164793b206f72590120202d2068617665206e6f20766f74696e67206163746976697479202869662074686572652069732c207468656e2069742077696c6c206e65656420746f2062652072656d6f7665642f636f6e736f6c69646174656494202020207468726f7567682060726561705f766f746560206f722060756e766f746560292e0045012d2060746f603a20546865206163636f756e742077686f736520766f74696e6720746865206074617267657460206163636f756e74277320766f74696e6720706f7765722077696c6c20666f6c6c6f772e55012d2060636f6e76696374696f6e603a2054686520636f6e76696374696f6e20746861742077696c6c20626520617474616368656420746f207468652064656c65676174656420766f7465732e205768656e20746865410120206163636f756e7420697320756e64656c6567617465642c207468652066756e64732077696c6c206265206c6f636b656420666f722074686520636f72726573706f6e64696e6720706572696f642e61012d206062616c616e6365603a2054686520616d6f756e74206f6620746865206163636f756e7427732062616c616e636520746f206265207573656420696e2064656c65676174696e672e2054686973206d757374206e6f74b420206265206d6f7265207468616e20746865206163636f756e7427732063757272656e742062616c616e63652e0048456d697473206044656c656761746564602e003d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173c82020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e28756e64656c6567617465000b30cc556e64656c65676174652074686520766f74696e6720706f776572206f66207468652073656e64696e67206163636f756e742e005d01546f6b656e73206d617920626520756e6c6f636b656420666f6c6c6f77696e67206f6e636520616e20616d6f756e74206f662074696d6520636f6e73697374656e74207769746820746865206c6f636b20706572696f64dc6f662074686520636f6e76696374696f6e2077697468207768696368207468652064656c65676174696f6e20776173206973737565642e004501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742062655463757272656e746c792064656c65676174696e672e0050456d6974732060556e64656c656761746564602e003d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173c82020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e58636c6561725f7075626c69635f70726f706f73616c73000c1470436c6561727320616c6c207075626c69632070726f706f73616c732e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e003c5765696768743a20604f283129602e18756e6c6f636b0401187461726765740001504163636f756e7449644c6f6f6b75704f663c543e000d1ca0556e6c6f636b20746f6b656e732074686174206861766520616e2065787069726564206c6f636b2e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00b82d2060746172676574603a20546865206163636f756e7420746f2072656d6f766520746865206c6f636b206f6e2e00bc5765696768743a20604f2852296020776974682052206e756d626572206f6620766f7465206f66207461726765742e2c72656d6f76655f766f7465040114696e64657810013c5265666572656e64756d496e646578000e6c7c52656d6f7665206120766f746520666f722061207265666572656e64756d2e000c49663a882d20746865207265666572656e64756d207761732063616e63656c6c65642c206f727c2d20746865207265666572656e64756d206973206f6e676f696e672c206f72902d20746865207265666572656e64756d2068617320656e64656420737563682074686174fc20202d2074686520766f7465206f6620746865206163636f756e742077617320696e206f70706f736974696f6e20746f2074686520726573756c743b206f72d420202d20746865726520776173206e6f20636f6e76696374696f6e20746f20746865206163636f756e74277320766f74653b206f728420202d20746865206163636f756e74206d61646520612073706c697420766f74655d012e2e2e7468656e2074686520766f74652069732072656d6f76656420636c65616e6c7920616e64206120666f6c6c6f77696e672063616c6c20746f2060756e6c6f636b60206d617920726573756c7420696e206d6f72655866756e6473206265696e6720617661696c61626c652e00a849662c20686f77657665722c20746865207265666572656e64756d2068617320656e64656420616e643aec2d2069742066696e697368656420636f72726573706f6e64696e6720746f2074686520766f7465206f6620746865206163636f756e742c20616e64dc2d20746865206163636f756e74206d6164652061207374616e6461726420766f7465207769746820636f6e76696374696f6e2c20616e64bc2d20746865206c6f636b20706572696f64206f662074686520636f6e76696374696f6e206973206e6f74206f76657259012e2e2e7468656e20746865206c6f636b2077696c6c206265206167677265676174656420696e746f20746865206f766572616c6c206163636f756e742773206c6f636b2c207768696368206d617920696e766f6c766559012a6f7665726c6f636b696e672a20287768657265207468652074776f206c6f636b732061726520636f6d62696e656420696e746f20612073696e676c65206c6f636b207468617420697320746865206d6178696d756de46f6620626f74682074686520616d6f756e74206c6f636b656420616e64207468652074696d65206973206974206c6f636b656420666f72292e004901546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e6572206d7573742068617665206120766f7465887265676973746572656420666f72207265666572656e64756d2060696e646578602e00f42d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e0055015765696768743a20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2ed820205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652e4472656d6f76655f6f746865725f766f74650801187461726765740001504163636f756e7449644c6f6f6b75704f663c543e000114696e64657810013c5265666572656e64756d496e646578000f3c7c52656d6f7665206120766f746520666f722061207265666572656e64756d2e004d0149662074686520607461726765746020697320657175616c20746f20746865207369676e65722c207468656e20746869732066756e6374696f6e2069732065786163746c79206571756976616c656e7420746f2d016072656d6f76655f766f7465602e204966206e6f7420657175616c20746f20746865207369676e65722c207468656e2074686520766f7465206d757374206861766520657870697265642c5501656974686572206265636175736520746865207265666572656e64756d207761732063616e63656c6c65642c20626563617573652074686520766f746572206c6f737420746865207265666572656e64756d206f7298626563617573652074686520636f6e76696374696f6e20706572696f64206973206f7665722e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e004d012d2060746172676574603a20546865206163636f756e74206f662074686520766f746520746f2062652072656d6f7665643b2074686973206163636f756e74206d757374206861766520766f74656420666f725420207265666572656e64756d2060696e646578602ef42d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e0055015765696768743a20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2ed820205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652e24626c61636b6c69737408013470726f706f73616c5f686173682c01104832353600013c6d617962655f7265665f696e6465784505015c4f7074696f6e3c5265666572656e64756d496e6465783e00103c45015065726d616e656e746c7920706c61636520612070726f706f73616c20696e746f2074686520626c61636b6c6973742e20546869732070726576656e74732069742066726f6d2065766572206265696e673c70726f706f73656420616761696e2e00510149662063616c6c6564206f6e206120717565756564207075626c6963206f722065787465726e616c2070726f706f73616c2c207468656e20746869732077696c6c20726573756c7420696e206974206265696e67510172656d6f7665642e2049662074686520607265665f696e6465786020737570706c69656420697320616e20616374697665207265666572656e64756d2077697468207468652070726f706f73616c20686173682c687468656e2069742077696c6c2062652063616e63656c6c65642e00ec546865206469737061746368206f726967696e206f6620746869732063616c6c206d7573742062652060426c61636b6c6973744f726967696e602e00f82d206070726f706f73616c5f68617368603a205468652070726f706f73616c206861736820746f20626c61636b6c697374207065726d616e656e746c792e45012d20607265665f696e646578603a20416e206f6e676f696e67207265666572656e64756d2077686f73652068617368206973206070726f706f73616c5f68617368602c2077686963682077696c6c2062652863616e63656c6c65642e0041015765696768743a20604f28702960202874686f756768206173207468697320697320616e20686967682d70726976696c6567652064697370617463682c20776520617373756d65206974206861732061502020726561736f6e61626c652076616c7565292e3c63616e63656c5f70726f706f73616c04012870726f705f696e646578a102012450726f70496e64657800111c4852656d6f766520612070726f706f73616c2e000101546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c50726f706f73616c4f726967696e602e00d02d206070726f705f696e646578603a2054686520696e646578206f66207468652070726f706f73616c20746f2063616e63656c2e00e45765696768743a20604f28702960207768657265206070203d205075626c696350726f70733a3a3c543e3a3a6465636f64655f6c656e282960042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e390510346672616d655f737570706f72741874726169747324707265696d616765731c426f756e646564040454014504010c184c6567616379040110686173682c01104861736800000018496e6c696e6504003d050134426f756e646564496e6c696e65000100184c6f6f6b7570080110686173682c01104861736800010c6c656e10010c753332000200003d05101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e000041050c4070616c6c65745f64656d6f637261637928636f6e76696374696f6e28436f6e76696374696f6e00011c104e6f6e65000000204c6f636b65643178000100204c6f636b65643278000200204c6f636b65643378000300204c6f636b65643478000400204c6f636b65643578000500204c6f636b6564367800060000450504184f7074696f6e04045401100108104e6f6e6500000010536f6d65040010000001000049050c1c6465785f6170691870616c6c65741043616c6c0404540001085c656e61626c655f6c69717569646974795f736f75726365040118736f757263656901014c4c6971756964697479536f75726365547970650000006064697361626c655f6c69717569646974795f736f75726365040118736f757263656901014c4c6971756964697479536f7572636554797065000100042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e4d050c286574685f6272696467651870616c6c65741043616c6c0404540001443c72656769737465725f6272696467650c015c6272696467655f636f6e74726163745f616464726573730904012845746841646472657373000134696e697469616c5f7065657273250201445665633c543a3a4163636f756e7449643e0001447369676e61747572655f76657273696f6e510501584272696467655369676e617475726556657273696f6e0000185852656769737465722061206e6577206272696467652e002c506172616d65746572733a4d012d20606272696467655f636f6e74726163745f6164647265737360202d2061646472657373206f6620736d6172742d636f6e7472616374206465706c6f796564206f6e206120636f72726573706f6e64696e67206e6574776f726b2ecc2d2060696e697469616c5f706565727360202d206120736574206f6620696e697469616c206e6574776f726b2070656572732e246164645f617373657408012061737365745f69640d010130417373657449644f663c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00011cb841646420612054686973636861696e20617373657420746f20746865206272696467652077686974656c6973742e006c43616e206f6e6c792062652063616c6c656420627920726f6f742e002c506172616d65746572733aa82d206061737365745f696460202d2054686973636861696e206173736574206964656e7469666965722e1d012d20606e6574776f726b5f696460202d206e6574776f726b206964656e74696669657220746f207768696368207468652061737365742073686f756c642062652061646465642e4c6164645f73696465636861696e5f746f6b656e140134746f6b656e5f61646472657373090401284574684164647265737300011873796d626f6cb1010118537472696e670001106e616d65b1010118537472696e67000120646563696d616c7308010875380001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000220b841646420612053696465636861696e20746f6b656e20746f20746865206272696467652077686974656c6973742e002c506172616d65746572733aac2d2060746f6b656e5f6164647265737360202d20746f6b656e20636f6e747261637420616464726573732e8c2d206073796d626f6c60202d20746f6b656e2073796d626f6c20287469636b6572292e582d20606e616d6560202d20746f6b656e206e616d652e802d2060646563696d616c7360202d2020746f6b656e20707265636973696f6e2e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e547472616e736665725f746f5f73696465636861696e10012061737365745f69640d010130417373657449644f663c543e000108746f0904012845746841646472657373000118616d6f756e7418011c42616c616e63650001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000338f45472616e7366657220736f6d6520616d6f756e74206f662074686520676976656e20617373657420746f2053696465636861696e20616464726573732e0059014e6f74653a20696620746865206173736574206b696e64206973206053696465636861696e602c2074686520616d6f756e742073686f756c642066697420696e20746865206173736574277320707265636973696f6e49016f6e2073696465636861696e20286053696465636861696e4173736574507265636973696f6e602920776974686f7574206578747261206469676974732e20466f72206578616d706c652c20617373756d655901736f6d65204552432d323020286054602920746f6b656e206861732060646563696d616c733d36602c20616e642074686520636f72726573706f6e64696e67206173736574206f6e207375627374726174652068617355016037602e20416c69636527732062616c616e6365206f6e2074686973636861696e2069732060302e31303030303039602e20496620416c69636520776f756c642077616e7420746f207472616e7366657220616c6c5d0174686520616d6f756e742c207368652077696c6c2067657420616e206572726f7220604e6f6e5a65726f44757374602c2062656361757365206f6620746865206039602061742074686520656e642c20736f2c207468652d01636f727265637420616d6f756e7420776f756c642062652060302e3130303030306020286f6e6c792036206469676974732061667465722074686520646563696d616c20706f696e74292e002c506172616d65746572733a882d206061737365745f696460202d2074686973636861696e2061737365742069642e782d2060746f60202d2073696465636861696e206163636f756e742069642e842d2060616d6f756e7460202d20616d6f756e74206f66207468652061737365742e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e58726571756573745f66726f6d5f73696465636861696e0c012c6574685f74785f686173682c0110483235360001106b696e645505014c496e636f6d696e67526571756573744b696e640001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0004180d014c6f616420696e636f6d696e6720726571756573742066726f6d2053696465636861696e2062792074686520676976656e207472616e73616374696f6e20686173682e002c506172616d65746572733ac02d20606574685f74785f6861736860202d207472616e73616374696f6e2068617368206f6e2053696465636861696e2e842d20606b696e6460202d20696e636f6d696e67207265717565737420747970652e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e6466696e616c697a655f696e636f6d696e675f72657175657374080110686173682c0110483235360001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00051c290146696e616c697a6520696e636f6d696e6720726571756573742028736565206050616c6c65743a3a66696e616c697a655f696e636f6d696e675f726571756573745f696e6e657260292e00a443616e206265206f6e6c792063616c6c65642066726f6d206120627269646765206163636f756e742e002c506172616d65746572733a882d20607265717565737460202d20616e20696e636f6d696e6720726571756573742e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e206164645f706565720c01286163636f756e745f6964000130543a3a4163636f756e74496400011c6164647265737309040128457468416464726573730001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0006189c4164642061206e6577207065657220746f2074686520627269646765207065657273207365742e002c506172616d65746572733aa42d20606163636f756e745f696460202d206163636f756e74206964206f6e2074686973636861696e2e982d20606164647265737360202d206163636f756e74206964206f6e2073696465636861696e2e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e2c72656d6f76655f706565720c01286163636f756e745f6964000130543a3a4163636f756e744964000130706565725f61646472657373610501484f7074696f6e3c457468416464726573733e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000714a852656d6f766520706565722066726f6d207468652074686520627269646765207065657273207365742e002c506172616d65746572733aa42d20606163636f756e745f696460202d206163636f756e74206964206f6e2074686973636861696e2e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e54707265706172655f666f725f6d6967726174696f6e0401286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0008189c507265706172652074686520676976656e2062726964676520666f72206d6967726174696f6e2e008c43616e206f6e6c792062652063616c6c656420627920616e20617574686f726974792e002c506172616d65746572733aac2d20606e6574776f726b5f696460202d20627269646765206e6574776f726b206964656e7469666965722e1c6d6967726174651001506e65775f636f6e74726163745f61646472657373090401284574684164647265737300014c65726332305f6e61746976655f746f6b656e731504013c5665633c457468416464726573733e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0001546e65775f7369676e61747572655f76657273696f6e510501584272696467655369676e617475726556657273696f6e000920c44d6967726174652074686520676976656e2062726964676520746f2061206e657720736d6172742d636f6e74726163742e008c43616e206f6e6c792062652063616c6c656420627920616e20617574686f726974792e002c506172616d65746572733ae82d20606e65775f636f6e74726163745f6164647265737360202d206e65772073696465636861696e206f636e747261637420616464726573732eb82d206065726332305f6e61746976655f746f6b656e7360202d206d6967726174656420617373657473206964732eac2d20606e6574776f726b5f696460202d20627269646765206e6574776f726b206964656e7469666965722e6472656769737465725f696e636f6d696e675f72657175657374040140696e636f6d696e675f7265717565737465050148496e636f6d696e67526571756573743c543e000a18f052656769737465722074686520676976656e20696e636f6d696e67207265717565737420616e642061646420697420746f207468652071756575652e00610143616c6c73206076616c69646174656020616e6420607072657061726560206f6e2074686520726571756573742c206164647320697420746f2074686520717565756520616e64206d6170732069742077697468207468654101636f72726573706f6e64696e67206c6f61642d696e636f6d696e672d7265717565737420616e642072656d6f76657320746865206c6f61642d726571756573742066726f6d207468652071756575652e009c43616e206f6e6c792062652063616c6c6564206279206120627269646765206163636f756e742e5c696d706f72745f696e636f6d696e675f726571756573740801546c6f61645f696e636f6d696e675f72657175657374bd0501584c6f6164496e636f6d696e67526571756573743c543e00015c696e636f6d696e675f726571756573745f726573756c74c90501a4526573756c743c496e636f6d696e67526571756573743c543e2c2044697370617463684572726f723e000b1888496d706f72742074686520676976656e20696e636f6d696e6720726571756573742e0051015265676973746572277320746865206c6f616420726571756573742c207468656e2072656769737465727320616e642066696e616c697a65732074686520696e636f6d696e672072657175657374206966206974b47375636365656465642c206f74686572776973652061626f72747320746865206c6f616420726571756573742e009c43616e206f6e6c792062652063616c6c6564206279206120627269646765206163636f756e742e3c617070726f76655f726571756573741001286f63775f7075626c6963e102013465636473613a3a5075626c6963000110686173682c0110483235360001407369676e61747572655f706172616d73cd05013c5369676e6174757265506172616d730001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000c102501417070726f76652074686520676976656e206f7574676f696e6720726571756573742e205468652066756e6374696f6e2069732075736564206279206272696467652070656572732e004d015665726966696573207468652070656572207369676e6174757265206f662074686520676976656e207265717565737420616e64206164647320697420746f206052657175657374417070726f76616c73602e51014f6e63652071756f72756d20697320636f6c6c65637465642c20746865207265717565737420676574732066696e616c697a656420616e642072656d6f7665642066726f6d20726571756573742071756575652e3461626f72745f726571756573740c0110686173682c0110483235360001146572726f7260013444697370617463684572726f720001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000d187443616e63656c732061207265676973746572656420726571756573742e0045014c6f61647320726571756573742062792074686520676976656e206068617368602c2063616e63656c732069742c206368616e676573206974732073746174757320746f20604661696c65646020616e648c72656d6f7665732069742066726f6d207468652072657175657374207175657565732e00a443616e206f6e6c792062652063616c6c65642066726f6d206120627269646765206163636f756e742e38666f7263655f6164645f706565720c010c77686f000130543a3a4163636f756e74496400011c6164647265737309040128457468416464726573730001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000e0cf84164642074686520676976656e207065657220746f207468652070656572732073657420776974686f7574206164646974696f6e616c20636865636b732e009443616e206f6e6c792062652063616c6c6564206279206120726f6f74206163636f756e742e5872656d6f76655f73696465636861696e5f617373657408012061737365745f69640d010130417373657449644f663c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000f0c3052656d6f7665206173736574006c43616e206f6e6c792062652063616c6c656420627920726f6f742e8472656769737465725f6578697374696e675f73696465636861696e5f61737365740c012061737365745f69640d010130417373657449644f663c543e000134746f6b656e5f6164647265737309040128457468416464726573730001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00100c5c5265676973746572206578697374696e67206173736574006c43616e206f6e6c792062652063616c6c656420627920726f6f742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e510508286574685f627269646765584272696467655369676e617475726556657273696f6e00010c0856310000000856320001000856330002000055050c286574685f6272696467652072657175657374734c496e636f6d696e67526571756573744b696e640001082c5472616e73616374696f6e040059050178496e636f6d696e675472616e73616374696f6e526571756573744b696e64000000104d65746104005d05015c496e636f6d696e674d657461526571756573744b696e640001000059050c286574685f62726964676520726571756573747378496e636f6d696e675472616e73616374696f6e526571756573744b696e64000124205472616e736665720000002041646441737365740001001c416464506565720002002852656d6f7665506565720003004c50726570617265466f724d6967726174696f6e0004001c4d6967726174650005003441646450656572436f6d7061740006004052656d6f766550656572436f6d7061740007002c5472616e73666572584f52000800005d050c286574685f6272696467652072657175657374735c496e636f6d696e674d657461526571756573744b696e640001085443616e63656c4f7574676f696e6752657175657374000000284d61726b4173446f6e6500010000610504184f7074696f6e0404540109040108104e6f6e6500000010536f6d6504000904000001000065050c286574685f6272696467652072657175657374733c496e636f6d696e6752657175657374040454000120205472616e7366657204006905014c496e636f6d696e675472616e736665723c543e00000020416464546f6b656e04007105014c496e636f6d696e67416464546f6b656e3c543e0001002c4368616e67655065657273040075050158496e636f6d696e674368616e676550656572733c543e0002005443616e63656c4f7574676f696e6752657175657374040079050180496e636f6d696e6743616e63656c4f7574676f696e67526571756573743c543e000300284d61726b4173446f6e650400a9050170496e636f6d696e674d61726b4173446f6e65526571756573743c543e0004004c50726570617265466f724d6967726174696f6e0400ad050178496e636f6d696e6750726570617265466f724d6967726174696f6e3c543e0005001c4d6967726174650400b1050148496e636f6d696e674d6967726174653c543e000600444368616e67655065657273436f6d7061740400b5050170496e636f6d696e674368616e67655065657273436f6d7061743c543e00070000690510286574685f62726964676520726571756573747320696e636f6d696e6740496e636f6d696e675472616e7366657204045400002c011066726f6d0904012845746841646472657373000108746f000130543a3a4163636f756e74496400012061737365745f69640d010130417373657449644f663c543e00012861737365745f6b696e646d05012441737365744b696e64000118616d6f756e7418011c42616c616e6365000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00013c73686f756c645f74616b655f666565bc0110626f6f6c00006d050c286574685f6272696467652072657175657374732441737365744b696e6400010c2454686973636861696e0000002453696465636861696e0001003853696465636861696e4f776e656400020000710510286574685f62726964676520726571756573747320696e636f6d696e6740496e636f6d696e67416464546f6b656e0404540000280134746f6b656e5f61646472657373090401284574684164647265737300012061737365745f69640d010128543a3a41737365744964000124707265636973696f6e08014042616c616e6365507265636973696f6e00011873796d626f6c2901012c417373657453796d626f6c0001106e616d653101012441737365744e616d65000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000750510286574685f62726964676520726571756573747320696e636f6d696e674c496e636f6d696e674368616e67655065657273040454000020013c706565725f6163636f756e745f6964090201504f7074696f6e3c543a3a4163636f756e7449643e000130706565725f61646472657373090401284574684164647265737300011c72656d6f766564bc0110626f6f6c000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000790510286574685f62726964676520726571756573747320696e636f6d696e6774496e636f6d696e6743616e63656c4f7574676f696e675265717565737404045400002401406f7574676f696e675f726571756573747d0501484f7574676f696e67526571756573743c543e0001546f7574676f696e675f726571756573745f686173682c011048323536000150696e697469616c5f726571756573745f686173682c01104832353600012074785f696e70757430011c5665633c75383e000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00007d050c286574685f6272696467652072657175657374733c4f7574676f696e6752657175657374040454000124205472616e7366657204008105014c4f7574676f696e675472616e736665723c543e00000020416464417373657404008505014c4f7574676f696e6741646441737365743c543e00010020416464546f6b656e04008905014c4f7574676f696e67416464546f6b656e3c543e0002001c4164645065657204008d0501484f7574676f696e67416464506565723c543e0003002852656d6f7665506565720400910501544f7574676f696e6752656d6f7665506565723c543e0004004c50726570617265466f724d6967726174696f6e0400990501784f7574676f696e6750726570617265466f724d6967726174696f6e3c543e0005001c4d69677261746504009d0501484f7574676f696e674d6967726174653c543e0006003441646450656572436f6d7061740400a10501604f7574676f696e6741646450656572436f6d7061743c543e0007004052656d6f766550656572436f6d7061740400a505016c4f7574676f696e6752656d6f766550656572436f6d7061743c543e00080000810510286574685f627269646765207265717565737473206f7574676f696e67404f7574676f696e675472616e7366657204045400001c011066726f6d000130543a3a4163636f756e744964000108746f090401284574684164647265737300012061737365745f69640d010130417373657449644f663c543e000118616d6f756e7418011c42616c616e63650001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000850510286574685f627269646765207265717565737473206f7574676f696e67404f7574676f696e6741646441737365740404540000140118617574686f72000130543a3a4163636f756e74496400012061737365745f69640d010130417373657449644f663c543e0001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000890510286574685f627269646765207265717565737473206f7574676f696e67404f7574676f696e67416464546f6b656e0404540000200118617574686f72000130543a3a4163636f756e744964000134746f6b656e5f61646472657373090401284574684164647265737300011873796d626f6cb1010118537472696e670001106e616d65b1010118537472696e67000120646563696d616c7308010875380001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e00008d0510286574685f627269646765207265717565737473206f7574676f696e673c4f7574676f696e67416464506565720404540000180118617574686f72000130543a3a4163636f756e744964000130706565725f61646472657373090401284574684164647265737300013c706565725f6163636f756e745f6964000130543a3a4163636f756e7449640001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000910510286574685f627269646765207265717565737473206f7574676f696e67484f7574676f696e6752656d6f76655065657204045400001c0118617574686f72000130543a3a4163636f756e74496400013c706565725f6163636f756e745f6964000130543a3a4163636f756e744964000130706565725f6164647265737309040128457468416464726573730001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e00012c636f6d7061745f68617368950501304f7074696f6e3c483235363e0000950504184f7074696f6e040454012c0108104e6f6e6500000010536f6d6504002c0000010000990510286574685f627269646765207265717565737473206f7574676f696e676c4f7574676f696e6750726570617265466f724d6967726174696f6e0404540000100118617574686f72000130543a3a4163636f756e7449640001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e00009d0510286574685f627269646765207265717565737473206f7574676f696e673c4f7574676f696e674d69677261746504045400001c0118617574686f72000130543a3a4163636f756e7449640001506e65775f636f6e74726163745f61646472657373090401284574684164647265737300014c65726332305f6e61746976655f746f6b656e731504013c5665633c457468416464726573733e0001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001546e65775f7369676e61747572655f76657273696f6e510501584272696467655369676e617475726556657273696f6e0000a10510286574685f627269646765207265717565737473206f7574676f696e67544f7574676f696e6741646450656572436f6d7061740404540000180118617574686f72000130543a3a4163636f756e744964000130706565725f61646472657373090401284574684164647265737300013c706565725f6163636f756e745f6964000130543a3a4163636f756e7449640001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000a50510286574685f627269646765207265717565737473206f7574676f696e67604f7574676f696e6752656d6f766550656572436f6d7061740404540000180118617574686f72000130543a3a4163636f756e74496400013c706565725f6163636f756e745f6964000130543a3a4163636f756e744964000130706565725f6164647265737309040128457468416464726573730001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000a90510286574685f62726964676520726571756573747320696e636f6d696e6764496e636f6d696e674d61726b4173446f6e655265717565737404045400001801546f7574676f696e675f726571756573745f686173682c011048323536000150696e697469616c5f726571756573745f686173682c011048323536000118617574686f72000130543a3a4163636f756e74496400012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000ad0510286574685f62726964676520726571756573747320696e636f6d696e676c496e636f6d696e6750726570617265466f724d6967726174696f6e0404540000140118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000b10510286574685f62726964676520726571756573747320696e636f6d696e673c496e636f6d696e674d69677261746504045400001801506e65775f636f6e74726163745f616464726573730904012845746841646472657373000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000b50510286574685f62726964676520726571756573747320696e636f6d696e6764496e636f6d696e674368616e67655065657273436f6d706174040454000024013c706565725f6163636f756e745f6964000130543a3a4163636f756e744964000130706565725f6164647265737309040128457468416464726573730001146164646564bc0110626f6f6c000120636f6e7472616374b905014c4368616e67655065657273436f6e7472616374000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000b90510286574685f62726964676520726571756573747320696e636f6d696e674c4368616e67655065657273436f6e74726163740001080c584f520000000c56414c00010000bd050c286574685f6272696467652072657175657374734c4c6f6164496e636f6d696e67526571756573740404540001082c5472616e73616374696f6e0400c10501844c6f6164496e636f6d696e675472616e73616374696f6e526571756573743c543e000000104d6574610800c50501684c6f6164496e636f6d696e674d657461526571756573743c543e00002c01104832353600010000c1050c286574685f627269646765207265717565737473784c6f6164496e636f6d696e675472616e73616374696f6e526571756573740404540000140118617574686f72000130543a3a4163636f756e744964000110686173682c01104832353600012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001106b696e6459050178496e636f6d696e675472616e73616374696f6e526571756573744b696e640001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000c5050c286574685f6272696467652072657175657374735c4c6f6164496e636f6d696e674d657461526571756573740404540000140118617574686f72000130543a3a4163636f756e744964000110686173682c01104832353600012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001106b696e645d05015c496e636f6d696e674d657461526571756573744b696e640001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000c9050418526573756c74080454016505044501600108084f6b04006505000000000c4572720400600000010000cd050c286574685f627269646765206f6666636861696e3c5369676e6174757265506172616d7300000c0104720401205b75383b2033325d000104730401205b75383b2033325d0001047608010875380000d1050c4870737761705f646973747269627574696f6e1870616c6c65741043616c6c0404540001043c636c61696d5f696e63656e74697665000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed5050c3c70616c6c65745f6d756c74697369671870616c6c65741043616c6c0404540001105061735f6d756c74695f7468726573686f6c645f310801446f746865725f7369676e61746f72696573250201445665633c543a3a4163636f756e7449643e00011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0000405101496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003d012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f662074686501016d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e00b8526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e002823203c7765696768743e19014f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d442d204442205765696768743a204e6f6e65482d20506c75732043616c6c205765696768742c23203c2f7765696768743e2061735f6d756c74691401247468726573686f6c645503010c7531360001446f746865725f7369676e61746f72696573250201445665633c543a3a4163636f756e7449643e00013c6d617962655f74696d65706f696e74d90501844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0001286d61785f7765696768742001185765696768740001b45501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e001d014e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f20757365190160617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005901526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f746865727769736555016f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642cdc6d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002823203c7765696768743e502d20604f2853202b205a202b2043616c6c29602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e21012d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e6c2d2054686520776569676874206f6620746865206063616c6c602e4d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061206465706f7369741901202074616b656e20666f7220697473206c69666574696d65206f6620604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743abc202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dc0202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d482d20506c75732043616c6c205765696768742c23203c2f7765696768743e40617070726f76655f61735f6d756c74691401247468726573686f6c645503010c7531360001446f746865725f7369676e61746f72696573250201445665633c543a3a4163636f756e7449643e00013c6d617962655f74696d65706f696e74d90501844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00012463616c6c5f686173680401205b75383b2033325d0001286d61785f77656967687420011857656967687400028c5501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e0035014e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e4d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061206465706f7369741901202074616b656e20666f7220697473206c69666574696d65206f6620604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743ab8202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dbc202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c23203c2f7765696768743e3c63616e63656c5f61735f6d756c74691001247468726573686f6c645503010c7531360001446f746865725f7369676e61746f72696573250201445665633c543a3a4163636f756e7449643e00012474696d65706f696e749d01016454696d65706f696e743c543a3a426c6f636b4e756d6265723e00012463616c6c5f686173680401205b75383b2033325d000368550143616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c4666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e5d012d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c787472616e73616374696f6e20666f7220746869732064697370617463682ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e302d204f6e65206576656e742e842d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e702d2053746f726167653a2072656d6f766573206f6e65206974656d2e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743af8202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e74fc202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed90504184f7074696f6e040454019d010108104e6f6e6500000010536f6d6504009d010000010000dd050c4070616c6c65745f7363686564756c65721870616c6c65741043616c6c040454000118207363686564756c651001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963e10501a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00000470416e6f6e796d6f75736c79207363686564756c652061207461736b2e1863616e63656c0801107768656e100138543a3a426c6f636b4e756d626572000114696e64657810010c7533320001049443616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e387363686564756c655f6e616d656414010869640401205461736b4e616d650001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963e10501a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000204585363686564756c652061206e616d6564207461736b2e3063616e63656c5f6e616d656404010869640401205461736b4e616d650003047843616e63656c2061206e616d6564207363686564756c6564207461736b2e387363686564756c655f61667465721001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963e10501a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000414a8416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e002823203c7765696768743e5453616d65206173205b607363686564756c65605d2e2c23203c2f7765696768743e507363686564756c655f6e616d65645f616674657214010869640401205461736b4e616d650001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963e10501a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000514905363686564756c652061206e616d6564207461736b20616674657220612064656c61792e002823203c7765696768743ec453616d65206173205b607363686564756c655f6e616d6564605d2853656c663a3a7363686564756c655f6e616d6564292e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee10504184f7074696f6e04045401a5010108104e6f6e6500000010536f6d650400a5010000010000e5050c3c69726f68615f6d6967726174696f6e1870616c6c65741043616c6c0404540001041c6d6967726174650c013469726f68615f61646472657373b1010118537472696e6700014069726f68615f7075626c69635f6b6579b1010118537472696e6700013c69726f68615f7369676e6174757265b1010118537472696e67000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee9050c4470616c6c65745f6d656d626572736869701870616c6c65741043616c6c08045400044900011c286164645f6d656d62657204010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e00000c784164642061206d656d626572206077686f6020746f20746865207365742e009c4d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d62657204010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e00010c8c52656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d62657208011872656d6f76650001504163636f756e7449644c6f6f6b75704f663c543e00010c6164640001504163636f756e7449644c6f6f6b75704f663c543e000214bc53776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a04d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e000d015072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d6265727304011c6d656d62657273250201445665633c543a3a4163636f756e7449643e00031055014368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e64687061737320606d656d6265727360207072652d736f727465642e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b657904010c6e65770001504163636f756e7449644c6f6f6b75704f663c543e000414d453776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f04d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e001d015072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d6504010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e00050cbc53657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d6500060c9452656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eed050c6470616c6c65745f656c656374696f6e735f70687261676d656e1870616c6c65741043616c6c04045400011810766f7465080114766f746573250201445665633c543a3a4163636f756e7449643e00011476616c7565fc013042616c616e63654f663c543e00005c5901566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e20546869732063616e2062652063616c6c656420746fe07365742074686520696e697469616c20766f7465732c206f722075706461746520616c7265616479206578697374696e6720766f7465732e005d0155706f6e20696e697469616c20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e642061206465706f73697420616d6f756e742069734d0172657365727665642e20546865206465706f736974206973206261736564206f6e20746865206e756d626572206f6620766f74657320616e642063616e2062652075706461746564206f7665722074696d652e004c5468652060766f746573602073686f756c643a4420202d206e6f7420626520656d7074792e550120202d206265206c657373207468616e20746865206e756d626572206f6620706f737369626c652063616e646964617465732e204e6f7465207468617420616c6c2063757272656e74206d656d6265727320616e6411012020202072756e6e6572732d75702061726520616c736f206175746f6d61746963616c6c792063616e6469646174657320666f7220746865206e65787420726f756e642e0049014966206076616c756560206973206d6f7265207468616e206077686f60277320667265652062616c616e63652c207468656e20746865206d6178696d756d206f66207468652074776f20697320757365642e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265207369676e65642e002c232323205761726e696e6700550149742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f202a2a4e4f542a2a20706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865a86c6f636b20616e64206b65657020736f6d6520666f722066757274686572206f7065726174696f6e732e002823203c7765696768743e5101576520617373756d6520746865206d6178696d756d2077656967687420616d6f6e6720616c6c20332063617365733a20766f74655f657175616c2c20766f74655f6d6f726520616e6420766f74655f6c6573732e2c23203c2f7765696768743e3072656d6f76655f766f7465720001146c52656d6f766520606f726967696e60206173206120766f7465722e00b8546869732072656d6f76657320746865206c6f636b20616e642072657475726e7320746865206465706f7369742e00fc546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265207369676e656420616e64206265206120766f7465722e407375626d69745f63616e64696461637904013c63616e6469646174655f636f756e74a102010c75333200023c11015375626d6974206f6e6573656c6620666f722063616e6469646163792e204120666978656420616d6f756e74206f66206465706f736974206973207265636f726465642e005d01416c6c2063616e64696461746573206172652077697065642061742074686520656e64206f6620746865207465726d2e205468657920656974686572206265636f6d652061206d656d6265722f72756e6e65722d75702ccc6f72206c65617665207468652073797374656d207768696c65207468656972206465706f73697420697320736c61736865642e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265207369676e65642e002c232323205761726e696e67005d014576656e20696620612063616e64696461746520656e6473207570206265696e672061206d656d6265722c2074686579206d7573742063616c6c205b6043616c6c3a3a72656e6f756e63655f63616e646964616379605d5901746f20676574207468656972206465706f736974206261636b2e204c6f73696e67207468652073706f7420696e20616e20656c656374696f6e2077696c6c20616c77617973206c65616420746f206120736c6173682e002823203c7765696768743e0901546865206e756d626572206f662063757272656e742063616e64696461746573206d7573742062652070726f7669646564206173207769746e65737320646174612e2c23203c2f7765696768743e4872656e6f756e63655f63616e64696461637904012872656e6f756e63696e67f105012852656e6f756e63696e670003484d0152656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c3c6f7574636f6d65732065786973743a0049012d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c20746865206465706f736974206973f02020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e61012d20606f726967696e6020697320612063757272656e742072756e6e65722d75702e20496e207468697320636173652c20746865206465706f73697420697320756e72657365727665642c2072657475726e656420616e648c20206f726967696e2069732072656d6f76656420617320612072756e6e65722d75702e55012d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c20746865206465706f73697420697320756e726573657276656420616e64206f726967696e2069735501202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e6101202053696d696c617220746f205b6072656d6f76655f6d656d626572605d2853656c663a3a72656d6f76655f6d656d626572292c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865795901202061726520696d6d6564696174656c7920757365642e20496620746865207072696d652069732072656e6f756e63696e672c207468656e206e6f207072696d652077696c6c20657869737420756e74696c207468653420206e65787420726f756e642e004501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265207369676e65642c20616e642068617665206f6e65206f66207468652061626f766520726f6c65732e002823203c7765696768743ee05468652074797065206f662072656e6f756e63696e67206d7573742062652070726f7669646564206173207769746e65737320646174612e2c23203c2f7765696768743e3472656d6f76655f6d656d6265720c010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e000128736c6173685f626f6e64bc0110626f6f6c000138726572756e5f656c656374696f6ebc0110626f6f6c000448590152656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f667c746865206f7574676f696e67206d656d62657220697320736c61736865642e005501496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c616365732074686555016f7574676f696e67206d656d6265722e204f74686572776973652c2069662060726572756e5f656c656374696f6e60206973206074727565602c2061206e65772070687261676d656e20656c656374696f6e2069737c737461727465642c20656c73652c206e6f7468696e672068617070656e732e00590149662060736c6173685f626f6e64602069732073657420746f20747275652c2074686520626f6e64206f6620746865206d656d626572206265696e672072656d6f76656420697320736c61736865642e20456c73652c3c69742069732072657475726e65642e00b8546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520726f6f742e0041014e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002823203c7765696768743e5101496620776520686176652061207265706c6163656d656e742c20776520757365206120736d616c6c207765696768742e20456c73652c2073696e63652074686973206973206120726f6f742063616c6c20616e64d077696c6c20676f20696e746f2070687261676d656e2c20776520617373756d652066756c6c20626c6f636b20666f72206e6f772e2c23203c2f7765696768743e50636c65616e5f646566756e63745f766f746572730801286e756d5f766f7465727310010c75333200012c6e756d5f646566756e637410010c7533320005284501436c65616e20616c6c20766f746572732077686f2061726520646566756e63742028692e652e207468657920646f206e6f7420736572766520616e7920707572706f736520617420616c6c292e20546865ac6465706f736974206f66207468652072656d6f76656420766f74657273206172652072657475726e65642e0001015468697320697320616e20726f6f742066756e6374696f6e20746f2062652075736564206f6e6c7920666f7220636c65616e696e67207468652073746174652e00b8546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520726f6f742e002823203c7765696768743e5d0154686520746f74616c206e756d626572206f6620766f7465727320616e642074686f736520746861742061726520646566756e6374206d7573742062652070726f7669646564206173207769746e65737320646174612e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ef105086470616c6c65745f656c656374696f6e735f70687261676d656e2852656e6f756e63696e6700010c184d656d6265720000002052756e6e657255700001002443616e6469646174650400a102010c75333200020000f5050c387665737465645f726577617264731870616c6c65741043616c6c04045400011034636c61696d5f726577617264730000041901436c61696d20616c6c20617661696c61626c652050535741502072657761726473206279206163636f756e74207369676e696e672074686973207472616e73616374696f6e2e5c636c61696d5f63726f77646c6f616e5f7265776172647304012463726f77646c6f616ef905013043726f77646c6f616e546167000100387570646174655f7265776172647304011c72657761726473fd0501dc42547265654d61703c543a3a4163636f756e7449642c2042547265654d61703c526577617264526561736f6e2c2042616c616e63653e3e0002004872656769737465725f63726f77646c6f616e14010c746167f905013043726f77646c6f616e54616700012c73746172745f626c6f636b100138543a3a426c6f636b4e756d6265720001186c656e677468100138543a3a426c6f636b4e756d62657200011c72657761726473150601685665633c28543a3a417373657449642c2042616c616e6365293e000134636f6e747269627574696f6e73bd0101705665633c28543a3a4163636f756e7449642c2042616c616e6365293e000300042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ef9050c18636f6d6d6f6e287072696d6974697665733043726f77646c6f616e546167000004003d0501c8426f756e6465645665633c75382c20436f6e73745533323c43524f57444c4f414e5f5441475f4d41585f4c454e4754483e3e0000fd05042042547265654d617008044b010004560101060004000d060000000106042042547265654d617008044b01c9010456011800040005060000000506000002090600090600000408c90118000d060000021106001106000004080001060015060000021906001906000004080d0118001d060c3c70616c6c65745f6964656e746974791870616c6c65741043616c6c04045400013c346164645f72656769737472617204011c6163636f756e740001504163636f756e7449644c6f6f6b75704f663c543e0000347841646420612072656769737472617220746f207468652073797374656d2e00fc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060543a3a5265676973747261724f726967696e602e00a82d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e0094456d6974732060526567697374726172416464656460206966207375636365737366756c2e002823203c7765696768743e25012d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e64656420616e6420636f64652d626f756e646564292e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e302d204f6e65206576656e742e2c23203c2f7765696768743e307365745f6964656e74697479040110696e666f210601a4426f783c4964656e74697479496e666f3c543a3a4d61784164646974696f6e616c4669656c64733e3e00014c290153657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e005501496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e7450666f7220746865206e6577206465706f7369742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e008c2d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e0088456d69747320604964656e7469747953657460206966207375636365737366756c2e002823203c7765696768743e442d20604f2858202b205827202b205229601d0120202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e64656429e020202d20776865726520605260206a756467656d656e74732d636f756e7420287265676973747261722d636f756e742d626f756e64656429802d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e21012d204f6e652073746f72616765206d75746174696f6e2028636f6465632d7265616420604f285827202b205229602c20636f6465632d777269746520604f2858202b20522960292e302d204f6e65206576656e742e2c23203c2f7765696768743e207365745f7375627304011073756273a90601645665633c28543a3a4163636f756e7449642c2044617461293e0002548c53657420746865207375622d6163636f756e7473206f66207468652073656e6465722e0055015061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e65642d01616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520612072656769737465726564246964656e746974792e00b02d206073756273603a20546865206964656e74697479277320286e657729207375622d6163636f756e74732e002823203c7765696768743e302d20604f2850202b20532960e420202d20776865726520605060206f6c642d737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292ed420202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e842d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e732e142d2044423adc20202d206050202b2053602073746f72616765206d75746174696f6e732028636f64656320636f6d706c657869747920604f2831296029bc20202d204f6e652073746f7261676520726561642028636f64656320636f6d706c657869747920604f28502960292ec020202d204f6e652073746f726167652077726974652028636f64656320636f6d706c657869747920604f28532960292ed020202d204f6e652073746f726167652d6578697374732028604964656e746974794f663a3a636f6e7461696e735f6b657960292e2c23203c2f7765696768743e38636c6561725f6964656e746974790003483901436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e747320616e642072657475726e20616c6c206465706f736974732e00ec5061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520612072656769737465726564246964656e746974792e0098456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002823203c7765696768743e402d20604f2852202b2053202b20582960cc20202d20776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292ed420202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e210120202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292e882d204f6e652062616c616e63652d756e72657365727665206f7065726174696f6e2ec82d206032602073746f7261676520726561647320616e64206053202b2032602073746f726167652064656c6574696f6e732e302d204f6e65206576656e742e2c23203c2f7765696768743e44726571756573745f6a756467656d656e740801247265675f696e646578a1020138526567697374726172496e64657800011c6d61785f666565fc013042616c616e63654f663c543e00045c94526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e0055015061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e7418676976656e2e003501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520615072656769737465726564206964656e746974792e001d012d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e55012d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a00306060606e6f636f6d70696c65b853656c663a3a7265676973747261727328292e676574287265675f696e646578292e756e7772617028292e6665650c60606000a4456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002823203c7765696768743e342d20604f2852202b205829602e802d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2eb82d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e302d204f6e65206576656e742e2c23203c2f7765696768743e3863616e63656c5f726571756573740401247265675f696e646578100138526567697374726172496e6465780005446843616e63656c20612070726576696f757320726571756573742e00f85061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e003501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520615072656769737465726564206964656e746974792e0045012d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00ac456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002823203c7765696768743e342d20604f2852202b205829602e802d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e882d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e2c2d204f6e65206576656e742c23203c2f7765696768743e1c7365745f666565080114696e646578a1020138526567697374726172496e64657800010c666565fc013042616c616e63654f663c543e0006341901536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a06f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f42d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e542d2060666565603a20746865206e6577206665652e002823203c7765696768743e242d20604f285229602e782d204f6e652073746f72616765206d75746174696f6e20604f285229602ee42d2042656e63686d61726b3a20372e333135202b2052202a20302e33323920c2b57320286d696e207371756172657320616e616c79736973292c23203c2f7765696768743e387365745f6163636f756e745f6964080114696e646578a1020138526567697374726172496e64657800010c6e65770001504163636f756e7449644c6f6f6b75704f663c543e000734bc4368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a06f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f42d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e702d20606e6577603a20746865206e6577206163636f756e742049442e002823203c7765696768743e242d20604f285229602e782d204f6e652073746f72616765206d75746174696f6e20604f285229602ee02d2042656e63686d61726b3a20382e383233202b2052202a20302e333220c2b57320286d696e207371756172657320616e616c79736973292c23203c2f7765696768743e287365745f6669656c6473080114696e646578a1020138526567697374726172496e6465780001186669656c6473b10601384964656e746974794669656c6473000834a853657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a06f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f42d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e0d012d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002823203c7765696768743e242d20604f285229602e782d204f6e652073746f72616765206d75746174696f6e20604f285229602ee42d2042656e63686d61726b3a20372e343634202b2052202a20302e33323520c2b57320286d696e207371756172657320616e616c79736973292c23203c2f7765696768743e4470726f766964655f6a756467656d656e741001247265675f696e646578a1020138526567697374726172496e6465780001187461726765740001504163636f756e7449644c6f6f6b75704f663c543e0001246a756467656d656e74b906015c4a756467656d656e743c42616c616e63654f663c543e3e0001206964656e746974792c011c543a3a48617368000950b850726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b06f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e0021012d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e55012d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e747420207769746820612072656769737465726564206964656e746974792e49012d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e49012d20606964656e74697479603a205468652068617368206f6620746865205b604964656e74697479496e666f605d20666f72207468617420746865206a756467656d656e742069732070726f76696465642e0094456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002823203c7765696768743e342d20604f2852202b205829602e842d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e942d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2eb82d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e302d204f6e65206576656e742e2c23203c2f7765696768743e346b696c6c5f6964656e746974790401187461726765740001504163636f756e7449644c6f6f6b75704f663c543e000a4c410152656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e0061015061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c6564206279450160536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c6564806d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00f8546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206d617463682060543a3a466f7263654f726967696e602e0055012d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e747420207769746820612072656769737465726564206964656e746974792e0094456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002823203c7765696768743e442d20604f2852202b2053202b205829602e802d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e702d206053202b2032602073746f72616765206d75746174696f6e732e302d204f6e65206576656e742e2c23203c2f7765696768743e1c6164645f73756208010c7375620001504163636f756e7449644c6f6f6b75704f663c543e000110646174612d06011044617461000b1cac4164642074686520676976656e206163636f756e7420746f207468652073656e646572277320737562732e005d015061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c20626520726570617472696174656438746f207468652073656e6465722e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656458737562206964656e74697479206f662060737562602e2872656e616d655f73756208010c7375620001504163636f756e7449644c6f6f6b75704f663c543e000110646174612d06011044617461000c10cc416c74657220746865206173736f636961746564206e616d65206f662074686520676976656e207375622d6163636f756e742e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656458737562206964656e74697479206f662060737562602e2872656d6f76655f73756204010c7375620001504163636f756e7449644c6f6f6b75704f663c543e000d1cc052656d6f76652074686520676976656e206163636f756e742066726f6d207468652073656e646572277320737562732e005d015061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c20626520726570617472696174656438746f207468652073656e6465722e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656458737562206964656e74697479206f662060737562602e20717569745f737562000e288c52656d6f7665207468652073656e6465722061732061207375622d6163636f756e742e005d015061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c206265207265706174726961746564b4746f207468652073656e64657220282a6e6f742a20746865206f726967696e616c206465706f7369746f72292e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265643c73757065722d6964656e746974792e0045014e4f54453a20546869732073686f756c64206e6f74206e6f726d616c6c7920626520757365642c206275742069732070726f766964656420696e207468652063617365207468617420746865206e6f6e2d1101636f6e74726f6c6c6572206f6620616e206163636f756e74206973206d616c6963696f75736c7920726567697374657265642061732061207375622d6163636f756e742e04704964656e746974792070616c6c6574206465636c61726174696f6e2e21060c3c70616c6c65745f6964656e74697479147479706573304964656e74697479496e666f04284669656c644c696d697400002401286164646974696f6e616c25060190426f756e6465645665633c28446174612c2044617461292c204669656c644c696d69743e00011c646973706c61792d060110446174610001146c6567616c2d0601104461746100010c7765622d0601104461746100011072696f742d06011044617461000114656d61696c2d0601104461746100013c7067705f66696e6765727072696e74a50601404f7074696f6e3c5b75383b2032305d3e000114696d6167652d0601104461746100011c747769747465722d0601104461746100002506101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012906045300000400a10601185665633c543e00002906000004082d062d06002d060c3c70616c6c65745f6964656e746974791474797065731044617461000198104e6f6e65000000105261773004003106000001001052617731040035060000020010526177320400390600000300105261773304003d060000040010526177340400400000050010526177350400410600000600105261773604004506000007001052617737040049060000080010526177380400150100000900105261773904004d0600000a001452617731300400510600000b001452617731310400550600000c001452617731320400590600000d0014526177313304005d0600000e001452617731340400610600000f0014526177313504006506000010001452617731360400c800001100145261773137040069060000120014526177313804006d060000130014526177313904007106000014001452617732300400ad02000015001452617732310400750600001600145261773232040079060000170014526177323304007d060000180014526177323404008106000019001452617732350400850600001a001452617732360400890600001b0014526177323704008d0600001c001452617732380400910600001d001452617732390400950600001e001452617733300400990600001f0014526177333104009d0600002000145261773332040004000021002c426c616b6554776f323536040004000022001853686132353604000400002300244b656363616b323536040004000024002c536861546872656532353604000400002500003106000003000000000800350600000301000000080039060000030200000008003d060000030300000008004106000003050000000800450600000306000000080049060000030700000008004d0600000309000000080051060000030a000000080055060000030b000000080059060000030c00000008005d060000030d000000080061060000030e000000080065060000030f000000080069060000031100000008006d060000031200000008007106000003130000000800750600000315000000080079060000031600000008007d060000031700000008008106000003180000000800850600000319000000080089060000031a00000008008d060000031b000000080091060000031c000000080095060000031d000000080099060000031e00000008009d060000031f0000000800a106000002290600a50604184f7074696f6e04045401ad020108104e6f6e6500000010536f6d650400ad020000010000a906000002ad0600ad0600000408002d0600b1060c3c70616c6c65745f6964656e7469747914747970657320426974466c61677304045401b5060004002801344964656e746974794669656c640000b5060c3c70616c6c65745f6964656e74697479147479706573344964656e746974794669656c640001201c446973706c6179000100144c6567616c0002000c5765620004001052696f7400080014456d61696c0010003850677046696e6765727072696e7400200014496d6167650040001c5477697474657200800000b9060c3c70616c6c65745f6964656e74697479147479706573244a756467656d656e74041c42616c616e63650118011c1c556e6b6e6f776e0000001c46656550616964040018011c42616c616e636500010028526561736f6e61626c65000200244b6e6f776e476f6f64000300244f75744f6644617465000400284c6f775175616c697479000500244572726f6e656f757300060000bd060c0c7873741870616c6c65741043616c6c04045400011c4c7365745f7265666572656e63655f61737365740401487265666572656e63655f61737365745f69640d010128543a3a4173736574496400001429014368616e6765207265666572656e6365206173736574207768696368206973207573656420746f2064657465726d696e6520636f6c6c61746572616c206173736574732076616c75652e90496e74656e64656420746f20626520652e672e2c20737461626c65636f696e204441492e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642cf02d20607265666572656e63655f61737365745f6964603a206173736574206964206f6620746865206e6577207265666572656e63652061737365742e58656e61626c655f73796e7468657469635f61737365740c012061737365745f69640d010128543a3a417373657449640001407265666572656e63655f73796d626f6cd5010124543a3a53796d626f6c0001246665655f726174696f3d01011446697865640001006072656769737465725f73796e7468657469635f617373657410013061737365745f73796d626f6c2901012c417373657453796d626f6c00012861737365745f6e616d653101012441737365744e616d650001407265666572656e63655f73796d626f6cd5010124543a3a53796d626f6c0001246665655f726174696f3d01011446697865640002043501526567697374657220616e6420656e61626c65206e65772073796e746865746963206173736574207769746820607265666572656e63655f73796d626f6c602070726963652062696e64696e675c64697361626c655f73796e7468657469635f617373657404013c73796e7468657469635f61737365740d010128543a3a4173736574496400031c6044697361626c652073796e7468657469632061737365742e008452656d6f7665732073796e7468657469632066726f6d2065786368616e67696e671101616e642072656d6f76657320585354506f6f6c206c697175696469747920736f7572636520666f7220636f72726573706f6e64696e672074726164696e6720706169722e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642ccc2d206073796e7468657469635f6173736574603a2073796e74686574696320617373657420696420746f2064697361626c652e5872656d6f76655f73796e7468657469635f617373657404013c73796e7468657469635f61737365740d010128543a3a41737365744964000404f8456e746972656c792072656d6f76652073796e7468657469632061737365742028696e636c7564696e67206c696e6b65642073796d626f6c20696e666f295c7365745f73796e7468657469635f61737365745f66656508013c73796e7468657469635f61737365740d010128543a3a417373657449640001246665655f726174696f3d0101144669786564000520605365742073796e746865746963206173736574206665652e00590154686973206665652077696c6c206265207573656420746f2064657465726d696e652074686520616d6f756e74206f662073796e74686574696320626173652061737365742028652e672e205853542920746f206265986275726e6564207768656e207573657220627579732073796e7468657469632061737365742e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642cdc2d206073796e7468657469635f6173736574603a2073796e74686574696320617373657420696420746f207365742066656520666f722c51012d20606665655f726174696f603a2066656520726174696f207769746820707265636973696f6e203d2031382c20736f2031303030303030303030303030303030303030203d2031203d2031303025206665652e907365745f73796e7468657469635f626173655f61737365745f666c6f6f725f707269636504012c666c6f6f725f707269636518011c42616c616e6365000610b053657420666c6f6f7220707269636520666f72207468652073796e746865746963206261736520617373657400602d20606f726967696e603a20726f6f74206163636f756e74e42d2060666c6f6f725f7072696365603a20666c6f6f7220707269636520666f72207468652073796e7468657469632062617365206173736574042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec1060c3463657265735f7374616b696e671870616c6c65741043616c6c04045400010c1c6465706f736974040118616d6f756e7418011c42616c616e6365000000207769746864726177000100606368616e67655f726577617264735f72656d61696e696e67040144726577617264735f72656d61696e696e6718011c42616c616e63650002045c4368616e6765205265776172647352656d61696e696e67042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec5060c5863657265735f6c69717569646974795f6c6f636b65721870616c6c65741043616c6c040454000108386c6f636b5f6c697175696469747914011c61737365745f610d010130417373657449644f663c543e00011c61737365745f620d010130417373657449644f663c543e00014c756e6c6f636b696e675f74696d657374616d70280124543a3a4d6f6d656e7400016470657263656e746167655f6f665f706f6f6c5f746f6b656e7318011c42616c616e63650001186f7074696f6ebc0110626f6f6c000004384c6f636b206c6971756964697479406368616e67655f63657265735f66656504012463657265735f66656518011c42616c616e6365000104404368616e676520434552455320666565042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec9060c4863657265735f746f6b656e5f6c6f636b65721870616c6c65741043616c6c04045400010c2c6c6f636b5f746f6b656e730c012061737365745f69640d010130417373657449644f663c543e00014c756e6c6f636b696e675f74696d657374616d70280124543a3a4d6f6d656e740001406e756d6265725f6f665f746f6b656e7318011c42616c616e63650000042c4c6f636b20746f6b656e733c77697468647261775f746f6b656e730c012061737365745f69640d010130417373657449644f663c543e00014c756e6c6f636b696e675f74696d657374616d70280124543a3a4d6f6d656e740001406e756d6265725f6f665f746f6b656e7318011c42616c616e63650001043c576974686472617720746f6b656e73286368616e67655f66656504011c6e65775f66656518011c42616c616e6365000204284368616e676520666565042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ecd060c6463657265735f676f7665726e616e63655f706c6174666f726d1870616c6c65741043616c6c04045400010c10766f74650c011c706f6c6c5f69642c011048323536000134766f74696e675f6f7074696f6e10010c75333200013c6e756d6265725f6f665f766f74657318011c42616c616e636500000444566f74696e6720666f72206f7074696f6e2c6372656174655f706f6c6c180128706f6c6c5f61737365740d010130417373657449644f663c543e000150706f6c6c5f73746172745f74696d657374616d70280124543a3a4d6f6d656e74000148706f6c6c5f656e645f74696d657374616d70280124543a3a4d6f6d656e740001147469746c65ed010170426f756e646564537472696e673c543a3a5469746c654c696d69743e00012c6465736372697074696f6ed1060188426f756e646564537472696e673c543a3a4465736372697074696f6e4c696d69743e00011c6f7074696f6e73d90601e8426f756e6465645665633c426f756e646564537472696e673c543a3a537472696e674c696d69743e2c20543a3a4f7074696f6e734c696d69743e0001042c43726561746520706f6c6c20776974686472617704011c706f6c6c5f69642c01104832353600020454576974686472617720766f74696e672066756e6473042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed1060c18636f6d6d6f6e287072696d69746976657334426f756e646564537472696e6704044e00000400d5060144426f756e6465645665633c75382c204e3e0000d506101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e0000d906101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454013502045300000400dd0601185665633c543e0000dd06000002350200e1060c3c63657265735f6c61756e63687061641870616c6c65741043616c6c040454000138286372656174655f696c6f580128626173655f61737365740d010130417373657449644f663c543e00012061737365745f69640d010130417373657449644f663c543e000138746f6b656e735f666f725f696c6f18011c42616c616e6365000150746f6b656e735f666f725f6c697175696469747918011c42616c616e6365000124696c6f5f707269636518011c42616c616e6365000120736f66745f63617018011c42616c616e6365000120686172645f63617018011c42616c616e63650001406d696e5f636f6e747269627574696f6e18011c42616c616e63650001406d61785f636f6e747269627574696f6e18011c42616c616e636500012c726566756e645f74797065bc0110626f6f6c0001446c69717569646974795f70657263656e7418011c42616c616e63650001346c697374696e675f707269636518011c42616c616e636500012c6c6f636b75705f6461797310010c75333200013c73746172745f74696d657374616d70280124543a3a4d6f6d656e74000134656e645f74696d657374616d70280124543a3a4d6f6d656e740001647465616d5f76657374696e675f746f74616c5f746f6b656e7318011c42616c616e63650001887465616d5f76657374696e675f66697273745f72656c656173655f70657263656e7418011c42616c616e636500014c7465616d5f76657374696e675f706572696f64280124543a3a4d6f6d656e740001507465616d5f76657374696e675f70657263656e7418011c42616c616e636500015466697273745f72656c656173655f70657263656e7418011c42616c616e636500013876657374696e675f706572696f64280124543a3a4d6f6d656e7400013c76657374696e675f70657263656e7418011c42616c616e63650000042843726561746520494c4f28636f6e7472696275746508012061737365745f69640d010130417373657449644f663c543e00014c66756e64735f746f5f636f6e7472696275746518011c42616c616e636500010428436f6e7472696275746548656d657267656e63795f776974686472617704012061737365745f69640d010130417373657449644f663c543e00020448456d657267656e63792077697468647261772866696e6973685f696c6f04012061737365745f69640d010130417373657449644f663c543e0003042846696e69736820494c4f3c636c61696d5f6c705f746f6b656e7304012061737365745f69640d010130417373657449644f663c543e0004043c436c61696d204c5020746f6b656e7314636c61696d04012061737365745f69640d010130417373657449644f663c543e00050430436c61696d20746f6b656e738c6368616e67655f6665655f70657263656e745f666f725f7261697365645f66756e647304012c6665655f70657263656e7418011c42616c616e6365000604d04368616e6765206665652070657263656e74206f6e207261697365642066756e647320696e207375636365737366756c20494c4f546368616e67655f63657265735f6275726e5f66656504012463657265735f66656518011c42616c616e6365000704544368616e6765204345524553206275726e20666565746368616e67655f63657265735f636f6e747269627574696f6e5f66656504012463657265735f66656518011c42616c616e6365000804744368616e676520434552455320636f6e747269627574696f6e206665654c636c61696d5f70737761705f726577617264730009044c436c61696d20505357415020726577617264736c6164645f77686974656c69737465645f636f6e7472696275746f7204012c636f6e7472696275746f720001384163636f756e7449644f663c543e000a046c4164642077686974656c697374656420636f6e7472696275746f727872656d6f76655f77686974656c69737465645f636f6e7472696275746f7204012c636f6e7472696275746f720001384163636f756e7449644f663c543e000b047852656d6f76652077686974656c697374656420636f6e7472696275746f72746164645f77686974656c69737465645f696c6f5f6f7267616e697a6572040134696c6f5f6f7267616e697a65720001384163636f756e7449644f663c543e000c04744164642077686974656c697374656420494c4f206f7267616e697a65728072656d6f76655f77686974656c69737465645f696c6f5f6f7267616e697a6572040134696c6f5f6f7267616e697a65720001384163636f756e7449644f663c543e000d048052656d6f76652077686974656c697374656420494c4f206f7267616e697a6572042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee5060c6064656d657465725f6661726d696e675f706c6174666f726d1870616c6c65741043616c6c04045400012c3872656769737465725f746f6b656e180128706f6f6c5f61737365740d010130417373657449644f663c543e00013c746f6b656e5f7065725f626c6f636b18011c42616c616e63650001406661726d735f616c6c6f636174696f6e18011c42616c616e63650001487374616b696e675f616c6c6f636174696f6e18011c42616c616e636500013c7465616d5f616c6c6f636174696f6e18011c42616c616e63650001307465616d5f6163636f756e740001384163636f756e7449644f663c543e00000468526567697374657220746f6b656e20666f72206661726d696e67206164645f706f6f6c1c0128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c0001286d756c7469706c69657210010c75333200012c6465706f7369745f66656518011c42616c616e636500011c69735f636f7265bc0110626f6f6c0001042041646420706f6f6c1c6465706f736974140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c000134706f6f6c65645f746f6b656e7318011c42616c616e63650002043c4465706f73697420746f20706f6f6c2c6765745f72657761726473100128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c0003042c4765742072657761726473207769746864726177140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e000134706f6f6c65645f746f6b656e7318011c42616c616e636500011c69735f6661726dbc0110626f6f6c0004042057697468647261772c72656d6f76655f706f6f6c100128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c0005042c52656d6f766520706f6f6c586368616e67655f706f6f6c5f6d756c7469706c696572140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c0001386e65775f6d756c7469706c69657210010c753332000604584368616e676520706f6f6c206d756c7469706c6965724c6368616e67655f746f74616c5f746f6b656e73140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c000130746f74616c5f746f6b656e7318011c42616c616e63650007044c4368616e676520746f74616c20746f6b656e732c6368616e67655f696e666f1801306368616e6765645f757365720001384163636f756e7449644f663c543e000128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c00012c706f6f6c5f746f6b656e7318011c42616c616e63650008042c4368616e676520696e666f5c6368616e67655f706f6f6c5f6465706f7369745f666565140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c00012c6465706f7369745f66656518011c42616c616e63650009045c4368616e676520706f6f6c206465706f73697420666565446368616e67655f746f6b656e5f696e666f180128706f6f6c5f61737365740d010130417373657449644f663c543e00013c746f6b656e5f7065725f626c6f636b18011c42616c616e63650001406661726d735f616c6c6f636174696f6e18011c42616c616e63650001487374616b696e675f616c6c6f636174696f6e18011c42616c616e636500013c7465616d5f616c6c6f636174696f6e18011c42616c616e63650001307465616d5f6163636f756e740001384163636f756e7449644f663c543e000a04444368616e676520746f6b656e20696e666f042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee9060c4070616c6c65745f626167735f6c6973741870616c6c65741043616c6c0804540004490001081472656261670401286469736c6f63617465640001504163636f756e7449644c6f6f6b75704f663c543e00002859014465636c617265207468617420736f6d6520606469736c6f636174656460206163636f756e74206861732c207468726f7567682072657761726473206f722070656e616c746965732c2073756666696369656e746c7951016368616e676564206974732073636f726520746861742069742073686f756c642070726f7065726c792066616c6c20696e746f206120646966666572656e7420626167207468616e206974732063757272656e74106f6e652e001d01416e796f6e652063616e2063616c6c20746869732066756e6374696f6e2061626f757420616e7920706f74656e7469616c6c79206469736c6f6361746564206163636f756e742e00490157696c6c20616c7761797320757064617465207468652073746f7265642073636f7265206f6620606469736c6f63617465646020746f2074686520636f72726563742073636f72652c206261736564206f6e406053636f726550726f7669646572602e00d4496620606469736c6f63617465646020646f6573206e6f74206578697374732c2069742072657475726e7320616e206572726f722e3c7075745f696e5f66726f6e745f6f6604011c6c6967687465720001504163636f756e7449644c6f6f6b75704f663c543e000120d04d6f7665207468652063616c6c65722773204964206469726563746c7920696e2066726f6e74206f6620606c696768746572602e005901546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642063616e206f6e6c792062652063616c6c656420627920746865204964206f66a0746865206163636f756e7420676f696e6720696e2066726f6e74206f6620606c696768746572602e00344f6e6c7920776f726b73206966942d20626f7468206e6f646573206172652077697468696e207468652073616d65206261672cd02d20616e6420606f726967696e602068617320612067726561746572206053636f726560207468616e20606c696768746572602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eed060c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c65741043616c6c0404540001143c7375626d69745f756e7369676e65640801307261775f736f6c7574696f6ef10601b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e00011c7769746e65737321080158536f6c7574696f6e4f72536e617073686f7453697a65000038a45375626d6974206120736f6c7574696f6e20666f722074686520756e7369676e65642070686173652e00c8546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f6e6f6e655f5f2e003d0154686973207375626d697373696f6e20697320636865636b6564206f6e2074686520666c792e204d6f72656f7665722c207468697320756e7369676e656420736f6c7574696f6e206973206f6e6c79550176616c696461746564207768656e207375626d697474656420746f2074686520706f6f6c2066726f6d20746865202a2a6c6f63616c2a2a206e6f64652e204566666563746976656c792c2074686973206d65616e735d0174686174206f6e6c79206163746976652076616c696461746f72732063616e207375626d69742074686973207472616e73616374696f6e207768656e20617574686f72696e67206120626c6f636b202873696d696c617240746f20616e20696e686572656e74292e005901546f2070726576656e7420616e7920696e636f727265637420736f6c7574696f6e2028616e642074687573207761737465642074696d652f776569676874292c2074686973207472616e73616374696f6e2077696c6c4d0170616e69632069662074686520736f6c7574696f6e207375626d6974746564206279207468652076616c696461746f7220697320696e76616c696420696e20616e79207761792c206566666563746976656c799c70757474696e6720746865697220617574686f72696e6720726577617264206174207269736b2e00e04e6f206465706f736974206f7220726577617264206973206173736f63696174656420776974682074686973207375626d697373696f6e2e6c7365745f6d696e696d756d5f756e747275737465645f73636f72650401406d617962655f6e6578745f73636f7265250801544f7074696f6e3c456c656374696f6e53636f72653e000114b05365742061206e65772076616c756520666f7220604d696e696d756d556e7472757374656453636f7265602e00d84469737061746368206f726967696e206d75737420626520616c69676e656420776974682060543a3a466f7263654f726967696e602e00f05468697320636865636b2063616e206265207475726e6564206f66662062792073657474696e67207468652076616c756520746f20604e6f6e65602e747365745f656d657267656e63795f656c656374696f6e5f726573756c74040120737570706f72747329080158537570706f7274733c543a3a4163636f756e7449643e0002205901536574206120736f6c7574696f6e20696e207468652071756575652c20746f2062652068616e646564206f757420746f2074686520636c69656e74206f6620746869732070616c6c657420696e20746865206e6578748863616c6c20746f2060456c656374696f6e50726f76696465723a3a656c656374602e004501546869732063616e206f6e6c79206265207365742062792060543a3a466f7263654f726967696e602c20616e64206f6e6c79207768656e207468652070686173652069732060456d657267656e6379602e00610154686520736f6c7574696f6e206973206e6f7420636865636b656420666f7220616e7920666561736962696c69747920616e6420697320617373756d656420746f206265207472757374776f727468792c20617320616e795101666561736962696c69747920636865636b20697473656c662063616e20696e207072696e6369706c652063617573652074686520656c656374696f6e2070726f6365737320746f206661696c202864756520746f686d656d6f72792f77656967687420636f6e73747261696e73292e187375626d69740401307261775f736f6c7574696f6ef10601b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e0003249c5375626d6974206120736f6c7574696f6e20666f7220746865207369676e65642070686173652e00d0546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f7369676e65645f5f2e005d0154686520736f6c7574696f6e20697320706f74656e7469616c6c79207175657565642c206261736564206f6e2074686520636c61696d65642073636f726520616e642070726f6365737365642061742074686520656e64506f6620746865207369676e65642070686173652e005d0141206465706f73697420697320726573657276656420616e64207265636f7264656420666f722074686520736f6c7574696f6e2e204261736564206f6e20746865206f7574636f6d652c2074686520736f6c7574696f6e15016d696768742062652072657761726465642c20736c61736865642c206f722067657420616c6c206f7220612070617274206f6620746865206465706f736974206261636b2e4c676f7665726e616e63655f66616c6c6261636b0801406d617962655f6d61785f766f746572734505012c4f7074696f6e3c7533323e0001446d617962655f6d61785f746172676574734505012c4f7074696f6e3c7533323e00041080547269676765722074686520676f7665726e616e63652066616c6c6261636b2e004901546869732063616e206f6e6c792062652063616c6c6564207768656e205b6050686173653a3a456d657267656e6379605d20697320656e61626c65642c20617320616e20616c7465726e617469766520746fc063616c6c696e67205b6043616c6c3a3a7365745f656d657267656e63795f656c656374696f6e5f726573756c74605d2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ef106089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173652c526177536f6c7574696f6e04045301f506000c0120736f6c7574696f6ef50601045300011473636f72650d020134456c656374696f6e53636f7265000114726f756e6410010c7533320000f50608446672616d656e6f64655f72756e74696d65544e706f73436f6d70616374536f6c7574696f6e32340000600118766f74657331f90600000118766f74657332050700000118766f74657333190700000118766f74657334250700000118766f74657335310700000118766f746573363d0700000118766f74657337490700000118766f74657338550700000118766f7465733961070000011c766f74657331306d070000011c766f746573313179070000011c766f746573313285070000011c766f746573313391070000011c766f74657331349d070000011c766f7465733135a9070000011c766f7465733136b5070000011c766f7465733137c1070000011c766f7465733138cd070000011c766f7465733139d9070000011c766f7465733230e5070000011c766f7465733231f1070000011c766f7465733232fd070000011c766f746573323309080000011c766f74657332341508000000f906000002fd0600fd0600000408a1020107000107000006550300050700000209070009070000040ca1020d070107000d07000004080107110700110700000615070015070c3473705f61726974686d65746963287065725f7468696e677318506572553136000004005503010c753136000019070000021d07001d070000040ca10221070107002107000003020000000d0700250700000229070029070000040ca1022d070107002d07000003030000000d0700310700000235070035070000040ca10239070107003907000003040000000d07003d0700000241070041070000040ca10245070107004507000003050000000d070049070000024d07004d070000040ca10251070107005107000003060000000d0700550700000259070059070000040ca1025d070107005d07000003070000000d0700610700000265070065070000040ca10269070107006907000003080000000d07006d0700000271070071070000040ca10275070107007507000003090000000d070079070000027d07007d070000040ca102810701070081070000030a0000000d0700850700000289070089070000040ca1028d070107008d070000030b0000000d0700910700000295070095070000040ca102990701070099070000030c0000000d07009d07000002a10700a1070000040ca102a507010700a5070000030d0000000d0700a907000002ad0700ad070000040ca102b107010700b1070000030e0000000d0700b507000002b90700b9070000040ca102bd07010700bd070000030f0000000d0700c107000002c50700c5070000040ca102c907010700c907000003100000000d0700cd07000002d10700d1070000040ca102d507010700d507000003110000000d0700d907000002dd0700dd070000040ca102e107010700e107000003120000000d0700e507000002e90700e9070000040ca102ed07010700ed07000003130000000d0700f107000002f50700f5070000040ca102f907010700f907000003140000000d0700fd0700000201080001080000040ca10205080107000508000003150000000d070009080000020d08000d080000040ca10211080107001108000003160000000d0700150800000219080019080000040ca1021d080107001d08000003170000000d07002108089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736558536f6c7574696f6e4f72536e617073686f7453697a650000080118766f74657273a102010c75333200011c74617267657473a102010c7533320000250804184f7074696f6e040454010d020108104e6f6e6500000010536f6d6504000d02000001000029080000022d08002d0800000408003108003108084473705f6e706f735f656c656374696f6e731c537570706f727404244163636f756e744964010000080114746f74616c18013c457874656e64656442616c616e6365000118766f74657273bd0101845665633c284163636f756e7449642c20457874656e64656442616c616e6365293e000035080c1062616e641870616c6c65741043616c6c0804540004490001141472656c61790c01147261746573390801c0426f756e6465645665633c28543a3a53796d626f6c2c20753634292c20543a3a4d617852656c617953796d626f6c733e0001307265736f6c76655f74696d6528010c753634000128726571756573745f696428010c753634000030b50152656c61792061206c697374206f662073796d626f6c7320616e64207468656972206173736f63696174656420726174657320616c6f6e67207769746820746865207265736f6c76652074696d6520616e642072657175657374206964206f6e206042616e64436861696e602e0028436865636b732069663a682d205468652063616c6c657220697320612072656c617965723bb5012d2054686520607265736f6c76655f74696d656020666f72206120706172746963756c61722073796d626f6c206973206e6f74206c6f776572207468616e2070726576696f75732073617665642076616c75652c2069676e6f7265732074686973207261746520696620736f3b0029014966206072617465736020636f6e7461696e73206475706c6963617465642073796d626f6c732c207468656e20746865206c61737420726174652077696c6c2062652073746f7265642e0049012d20606f726967696e603a207468652072656c61796572206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642c4d012d20607261746573603a2073796d626f6c73207769746820726174657320696e2055534420726570726573656e74656420617320666978656420706f696e74207769746820707265636973696f6e203d20392ccc2d20607265736f6c76655f74696d65603a2073796d626f6c73207768696368207261746573206172652070726f76696465642c41012d2060726571756573745f6964603a206964206f662074686520726571756573742073656e7420746f20746865202a42616e64436861696e2a20746f207265747269657665207468697320646174612e2c666f7263655f72656c61790c01147261746573390801c0426f756e6465645665633c28543a3a53796d626f6c2c20753634292c20543a3a4d617852656c617953796d626f6c733e0001307265736f6c76655f74696d6528010c753634000128726571756573745f696428010c753634000124e853696d696c617220746f205b6072656c61792829605d2062757420776974686f757420746865207265736f6c76652074696d652067756172642e000d0153686f756c64206265207573656420696e20656d657267656e637920736974756174696f6e7320692e652e207468656e2070726576696f75732076616c7565207761739072656c617965642062792061206661756c74792f6d616c6963696f7573206163746f722e0049012d20606f726967696e603a207468652072656c61796572206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642c4d012d20607261746573603a2073796d626f6c73207769746820726174657320696e2055534420726570726573656e74656420617320666978656420706f696e74207769746820707265636973696f6e203d20392ccc2d20607265736f6c76655f74696d65603a2073796d626f6c73207768696368207261746573206172652070726f76696465642c41012d2060726571756573745f6964603a206964206f662074686520726571756573742073656e7420746f20746865202a42616e64436861696e2a20746f207265747269657665207468697320646174612e306164645f72656c617965727304012c6163636f756e745f696473250201445665633c543a3a4163636f756e7449643e000220c841646420606163636f756e745f6964736020746f20746865206c697374206f6620747275737465642072656c61796572732e00ac49676e6f726573207265706561746564206163636f756e747320696e20606163636f756e745f696473602e61014966206f6e65206f66206163636f756e7420697320616c7265616479206120747275737465642072656c6179657220616e205b604572726f723a3a416c7265616479415472757374656452656c61796572605d2077696c6c3062652072657475726e65642e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642cd42d20606163636f756e745f696473603a206c697374206f66206e657720747275737465642072656c617965727320746f206164642e3c72656d6f76655f72656c617965727304012c6163636f756e745f696473250201445665633c543a3a4163636f756e7449643e000320dc52656d6f766520606163636f756e745f696473602066726f6d20746865206c697374206f6620747275737465642072656c61796572732e00ac49676e6f726573207265706561746564206163636f756e747320696e20606163636f756e745f696473602e51014966206f6e65206f66206163636f756e74206973206e6f74206120747275737465642072656c6179657220616e205b604572726f723a3a416c7265616479415472757374656452656c61796572605d2077696c6c3062652072657475726e65642e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642cb02d20606163636f756e745f696473603a206c697374206f662072656c617965727320746f2072656d6f76652e687365745f64796e616d69635f6665655f706172616d65746572730401386665655f706172616d65746572734508016046656543616c63756c6174696f6e506172616d6574657273000400042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e3908101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454013d08045300000400410801185665633c543e00003d0800000408d501280041080000023d08004508081062616e646046656543616c63756c6174696f6e506172616d657465727300000c011464656361793d010114466978656400011c6d696e5f6665653d0101144669786564000124646576696174696f6e3d0101144669786564000049080c306f7261636c655f70726f78791870616c6c65741043616c6c04045400010834656e61626c655f6f7261636c650401186f7261636c652d0201184f7261636c6500001868456e61626c6573206120737065636966696564206f7261636c650070436865636b73206966207468652063616c6c657220697320726f6f7400702d20606f726967696e603a20746865207375646f206163636f756e74c82d20606f7261636c65603a206f7261636c652076617269616e742077686963682073686f756c6420626520656e61626c65643864697361626c655f6f7261636c650401186f7261636c652d0201184f7261636c650001186c44697361626c6573206120737065636966696564206f7261636c650070436865636b73206966207468652063616c6c657220697320726f6f7400702d20606f726967696e603a20746865207375646f206163636f756e74cc2d20606f7261636c65603a206f7261636c652076617269616e742077686963682073686f756c642062652064697361626c6564042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e4d080c686865726d65735f676f7665726e616e63655f706c6174666f726d1870616c6c65741043616c6c04045400011810766f746508011c706f6c6c5f69642c011048323536000134766f74696e675f6f7074696f6e35020174426f756e646564537472696e673c543a3a537472696e674c696d69743e00000450566f746520666f7220736f6d65206f7074696f6e2c6372656174655f706f6c6c140150706f6c6c5f73746172745f74696d657374616d70280124543a3a4d6f6d656e74000148706f6c6c5f656e645f74696d657374616d70280124543a3a4d6f6d656e740001147469746c65ed010170426f756e646564537472696e673c543a3a5469746c654c696d69743e00012c6465736372697074696f6ed1060188426f756e646564537472696e673c543a3a4465736372697074696f6e4c696d69743e00011c6f7074696f6e73d90601e8426f756e6465645665633c426f756e646564537472696e673c543a3a537472696e674c696d69743e2c20543a3a4f7074696f6e734c696d69743e0001042c43726561746520706f6c6c5077697468647261775f66756e64735f766f74657204011c706f6c6c5f69642c0110483235360002045057697468647261772066756e647320766f7465725877697468647261775f66756e64735f63726561746f7204011c706f6c6c5f69642c0110483235360003045857697468647261772066756e64732063726561746f72706368616e67655f6d696e5f6865726d65735f666f725f766f74696e670401346865726d65735f616d6f756e7418011c42616c616e6365000404804368616e6765206d696e696d756d204865726d657320666f7220766f74696e678c6368616e67655f6d696e5f6865726d65735f666f725f6372656174696e675f706f6c6c0401346865726d65735f616d6f756e7418011c42616c616e6365000504a44368616e6765206d696e696d756d204865726d657320666f72206372656174696e67206120706f6c6c042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e51080c3c70616c6c65745f707265696d6167651870616c6c65741043616c6c040454000110346e6f74655f707265696d616765040114627974657330011c5665633c75383e000010745265676973746572206120707265696d616765206f6e2d636861696e2e00550149662074686520707265696d616765207761732070726576696f75736c79207265717565737465642c206e6f2066656573206f72206465706f73697473206172652074616b656e20666f722070726f766964696e67550174686520707265696d6167652e204f74686572776973652c2061206465706f7369742069732074616b656e2070726f706f7274696f6e616c20746f207468652073697a65206f662074686520707265696d6167652e3c756e6e6f74655f707265696d616765040110686173682c011c543a3a48617368000118dc436c65617220616e20756e72657175657374656420707265696d6167652066726f6d207468652072756e74696d652073746f726167652e00fc496620606c656e602069732070726f76696465642c207468656e2069742077696c6c2062652061206d7563682063686561706572206f7065726174696f6e2e0001012d206068617368603a205468652068617368206f662074686520707265696d61676520746f2062652072656d6f7665642066726f6d207468652073746f72652eb82d20606c656e603a20546865206c656e677468206f662074686520707265696d616765206f66206068617368602e40726571756573745f707265696d616765040110686173682c011c543a3a48617368000210410152657175657374206120707265696d6167652062652075706c6f6164656420746f2074686520636861696e20776974686f757420706179696e6720616e792066656573206f72206465706f736974732e00550149662074686520707265696d6167652072657175657374732068617320616c7265616479206265656e2070726f7669646564206f6e2d636861696e2c20776520756e7265736572766520616e79206465706f7369743901612075736572206d6179206861766520706169642c20616e642074616b652074686520636f6e74726f6c206f662074686520707265696d616765206f7574206f662074686569722068616e64732e48756e726571756573745f707265696d616765040110686173682c011c543a3a4861736800030cbc436c65617220612070726576696f75736c79206d616465207265717565737420666f72206120707265696d6167652e002d014e4f54453a2054484953204d555354204e4f542042452043414c4c4544204f4e20606861736860204d4f52452054494d4553205448414e2060726571756573745f707265696d616765602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e55080c286f726465725f626f6f6b1870616c6c65741043616c6c040454000120406372656174655f6f72646572626f6f6b1401346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001247469636b5f73697a6518011c42616c616e6365000134737465705f6c6f745f73697a6518011c42616c616e63650001306d696e5f6c6f745f73697a6518011c42616c616e63650001306d61785f6c6f745f73697a6518011c42616c616e63650000004064656c6574655f6f72646572626f6f6b0401346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e000100407570646174655f6f72646572626f6f6b1401346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001247469636b5f73697a6518011c42616c616e6365000134737465705f6c6f745f73697a6518011c42616c616e63650001306d696e5f6c6f745f73697a6518011c42616c616e63650001306d61785f6c6f745f73697a6518011c42616c616e63650002005c6368616e67655f6f72646572626f6f6b5f7374617475730801346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001187374617475734902013c4f72646572426f6f6b53746174757300030044706c6163655f6c696d69745f6f726465721401346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e000114707269636518011c42616c616e6365000118616d6f756e7418011c42616c616e6365000110736964654d020130507269636556617269616e740001206c6966657370616e8902014c4f7074696f6e3c4d6f6d656e744f663c543e3e0004004863616e63656c5f6c696d69745f6f726465720801346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640005006463616e63656c5f6c696d69745f6f72646572735f62617463680401586c696d69745f6f72646572735f746f5f63616e63656c590801ec5665633c284f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e2c205665633c543a3a4f7264657249643e293e00060050657865637574655f6d61726b65745f6f726465720c01346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e000124646972656374696f6e4d020130507269636556617269616e74000118616d6f756e7418011c42616c616e6365000700042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e59080000025d08005d0800000408450211040061080c306272696467655f70726f78791870616c6c65741043616c6c040454000110106275726e1001286e6574776f726b5f69647d02014047656e657269634e6574776f726b496400012061737365745f69640d010128543a3a41737365744964000124726563697069656e746508017047656e657269634163636f756e743c543a3a4163636f756e7449643e000118616d6f756e7418013042616c616e63654f663c543e000000446164645f6c696d697465645f617373657404012061737365745f69640d010128543a3a417373657449640001005072656d6f76655f6c696d697465645f617373657404012061737365745f69640d010128543a3a41737365744964000200547570646174655f7472616e736665725f6c696d697404012073657474696e6773690801a05472616e736665724c696d697453657474696e67733c426c6f636b4e756d626572466f723c543e3e000300042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e650808306272696467655f74797065733847656e657269634163636f756e7404244163636f756e744964010001140c45564d0400090401104831363000000010536f726104000001244163636f756e7449640001002450617261636861696e04009102016c78636d3a3a56657273696f6e65644d756c74694c6f636174696f6e0002001c556e6b6e6f776e00030010526f6f7400040000690808306272696467655f70726f7879545472616e736665724c696d697453657474696e6773042c426c6f636b4e756d6265720110000801286d61785f616d6f756e7418011c42616c616e6365000134706572696f645f626c6f636b7310012c426c6f636b4e756d62657200006d0810607375627374726174655f6272696467655f6368616e6e656c1c696e626f756e641870616c6c65741043616c6c040454000104187375626d69740c01286e6574776f726b5f6964710201305375624e6574776f726b4964000128636f6d6d69746d656e7471080151016272696467655f74797065733a3a47656e65726963436f6d6d69746d656e743c543a3a4d61784d65737361676573506572436f6d6d69742c20543a3a0a4d61784d6573736167655061796c6f616453697a652c3e00011470726f6f66990801803c543a3a56657269666965722061732056657269666965723e3a3a50726f6f66000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e710808306272696467655f74797065734447656e65726963436f6d6d69746d656e74082c4d61784d6573736167657300284d61785061796c6f61640001080c5375620400750801b87375627374726174653a3a436f6d6d69746d656e743c4d61784d657373616765732c204d61785061796c6f61643e0000000c45564d0400890801a065766d3a3a436f6d6d69746d656e743c4d61784d657373616765732c204d61785061796c6f61643e0001000075080c306272696467655f74797065732473756273747261746528436f6d6d69746d656e74082c4d61784d6573736167657300284d61785061796c6f616400000801206d65737361676573790801c8426f756e6465645665633c4272696467654d6573736167653c4d61785061796c6f61643e2c204d61784d657373616765733e0001146e6f6e636528010c75363400007908101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454017d08045300000400850801185665633c543e00007d080c306272696467655f747970657324737562737472617465344272696467654d65737361676504284d61785061796c6f6164000008011c7061796c6f616481080168426f756e6465645665633c75382c204d61785061796c6f61643e00012474696d65706f696e746904014047656e6572696354696d65706f696e7400008108101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e000085080000027d080089080c306272696467655f74797065730c65766d28436f6d6d69746d656e74082c4d61784d6573736167657300284d61785061796c6f616400000c01146e6f6e636528010c753634000134746f74616c5f6d61785f67617381020110553235360001206d657373616765738d0801b0426f756e6465645665633c4d6573736167653c4d61785061796c6f61643e2c204d61784d657373616765733e00008d08101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454019108045300000400950801185665633c543e000091080c306272696467655f74797065730c65766d1c4d65737361676504284d61785061796c6f616400000c0118746172676574090401104831363000011c6d61785f676173810201105532353600011c7061796c6f616481080168426f756e6465645665633c75382c204d61785061796c6f61643e00009508000002910800990808446672616d656e6f64655f72756e74696d65284d756c746950726f6f66000104204d756c746973696704009d0801943c4d756c746973696756657269666965722061732056657269666965723e3a3a50726f6f66000100009d0808446d756c74697369675f76657269666965721450726f6f660000080118646967657374a108013c417578696c6961727944696765737400011470726f6f66f90201545665633c65636473613a3a5369676e61747572653e0000a1080c306272696467655f74797065731474797065733c417578696c6961727944696765737400000401106c6f6773a50801605665633c417578696c696172794469676573744974656d3e0000a508000002a90800a9080c306272696467655f74797065731474797065734c417578696c696172794469676573744974656d00010428436f6d6d69746d656e7408007d02014047656e657269634e6574776f726b496400002c01104832353600000000ad0810607375627374726174655f6272696467655f6368616e6e656c206f7574626f756e641870616c6c65741043616c6c0404540001043c7570646174655f696e74657276616c0401306e65775f696e74657276616c100138543a3a426c6f636b4e756d626572000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eb1080c5070617261636861696e5f6272696467655f6170701870616c6c65741043616c6c040454000124106d696e7410012061737365745f69640d010130417373657449644f663c543e00011873656e646572d50201684f7074696f6e3c50617261636861696e4163636f756e7449643e000124726563697069656e74000130543a3a4163636f756e744964000118616d6f756e741801384d61696e6e657442616c616e63650000006c66696e616c697a655f61737365745f726567697374726174696f6e08012061737365745f69640d010130417373657449644f663c543e00012861737365745f6b696e64b508012441737365744b696e64000100106275726e1001286e6574776f726b5f6964710201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e000124726563697069656e749102014850617261636861696e4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0002006072656769737465725f74686973636861696e5f61737365741401286e6574776f726b5f6964710201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e00013c73696465636861696e5f6173736574b908014050617261636861696e41737365744964000148616c6c6f7765645f70617261636861696e73f50301205665633c7533323e0001486d696e696d616c5f78636d5f616d6f756e7418013042616c616e63654f663c543e0003006072656769737465725f73696465636861696e5f61737365741c01286e6574776f726b5f6964710201305375624e6574776f726b496400013c73696465636861696e5f6173736574b908014050617261636861696e4173736574496400011873796d626f6c29010140417373657453796d626f6c4f663c543e0001106e616d653101013841737365744e616d654f663c543e000120646563696d616c730801087538000148616c6c6f7765645f70617261636861696e73f50301205665633c7533323e0001486d696e696d616c5f78636d5f616d6f756e7418013042616c616e63654f663c543e000400486164645f617373657469645f7061726169640c01286e6574776f726b5f6964710201305375624e6574776f726b496400011c706172615f696410010c75333200012061737365745f69640d010130417373657449644f663c543e0005005472656d6f76655f617373657469645f7061726169640c01286e6574776f726b5f6964710201305375624e6574776f726b496400011c706172615f696410010c75333200012061737365745f69640d010130417373657449644f663c543e000600647570646174655f7472616e73616374696f6e5f7374617475730801286d6573736167655f69642c01104832353600013c7472616e736665725f737461747573bd08015058434d4170705472616e73666572537461747573000700907365745f6d696e696d756d5f78636d5f696e636f6d696e675f61737365745f636f756e740c01286e6574776f726b5f6964710201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e0001486d696e696d616c5f78636d5f616d6f756e7418013042616c616e63654f663c543e000800042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eb5080c306272696467655f74797065731474797065732441737365744b696e640001082454686973636861696e0000002453696465636861696e00010000b908100c78636d087633286d756c746961737365741c4173736574496400010820436f6e63726574650400b90201344d756c74694c6f636174696f6e00000020416273747261637404000401205b75383b2033325d00010000bd080c306272696467655f7479706573247375627374726174655058434d4170705472616e736665725374617475730001081c537563636573730000004058434d5472616e736665724572726f7200010000c1080c486272696467655f646174615f7369676e65721870616c6c65741043616c6c0404540001184072656769737465725f6e6574776f726b0801286e6574776f726b5f69647d02014047656e657269634e6574776f726b49640001147065657273dd020198426f756e6465645665633c65636473613a3a5075626c69632c20543a3a4d617850656572733e0000001c617070726f76650c01286e6574776f726b5f69647d02014047656e657269634e6574776f726b4964000110646174612c0110483235360001247369676e6174757265ed02014065636473613a3a5369676e6174757265000100206164645f706565720801286e6574776f726b5f69647d02014047656e657269634e6574776f726b496400011070656572e102013465636473613a3a5075626c69630002002c72656d6f76655f706565720801286e6574776f726b5f69647d02014047656e657269634e6574776f726b496400011070656572e102013465636473613a3a5075626c69630003004866696e6973685f72656d6f76655f7065657204011070656572e102013465636473613a3a5075626c69630004003c66696e6973685f6164645f7065657204011070656572e102013465636473613a3a5075626c6963000500042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec5080c446d756c74697369675f76657269666965721870616c6c65741043616c6c04045400010c28696e697469616c697a650801286e6574776f726b5f69647d02014047656e657269634e6574776f726b49640001147065657273dd020198426f756e6465645665633c65636473613a3a5075626c69632c20543a3a4d617850656572733e000000206164645f7065657204011070656572e102013465636473613a3a5075626c69630001002c72656d6f76655f7065657204011070656572e102013465636473613a3a5075626c6963000200042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec9080c2c70616c6c65745f7375646f1870616c6c65741043616c6c040454000110107375646f04011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000028350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292ec42d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e2c23203c2f7765696768743e547375646f5f756e636865636b65645f77656967687408011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000118776569676874200118576569676874000128350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e2d01546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b05375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292ecc2d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e2c23203c2f7765696768743e1c7365745f6b657904010c6e65770001504163636f756e7449644c6f6f6b75704f663c543e0002285d0141757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f106b65792e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e402d204f6e65204442206368616e67652e2c23203c2f7765696768743e1c7375646f5f617308010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e00011063616c6c4504017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00032c4d0141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d406120676976656e206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292ec42d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ecd080c186661756365741870616c6c65741043616c6c04045400010c207472616e736665720c012061737365745f69640d010128543a3a417373657449640001187461726765740001384163636f756e7449644f663c543e000118616d6f756e7418011c42616c616e636500002005015472616e7366657273207468652073706563696669656420616d6f756e74206f6620617373657420746f2074686520737065636966696564206163636f756e742ea854686520737570706f7274656420617373657473206172653a20584f522c2056414c2c2050535741502e002023204572726f727300590141737365744e6f74537570706f727465642069732072657475726e6564206966206061737365745f69646020697320736f6d657468696e67207468652066756e6374696f6e20646f65736e277420737570706f72742e7901416d6f756e7441626f76654c696d69742069732072657475726e65642069662060746172676574602068617320616c7265616479207265636569766564207468656972206461696c79206c696d6974206f66206061737365745f6964602e19014e6f74456e6f75676852657365727665732069732072657475726e65642069662060616d6f756e74602069732067726561746572207468616e207468652072657365727665733472657365745f72657761726473000100307570646174655f6c696d69740401246e65775f6c696d697418011c42616c616e6365000200042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed1080c2071615f746f6f6c731870616c6c65741043616c6c040454000108806f726465725f626f6f6b5f6372656174655f616e645f66696c6c5f62617463680c0128626964735f6f776e6572000130543a3a4163636f756e74496400012861736b735f6f776e6572000130543a3a4163636f756e74496400012073657474696e6773d5080109025665633c0a284f72646572426f6f6b49643c543a3a417373657449642c20543a3a44455849643e2c2073657474696e67733a3a4f72646572426f6f6b417474726962757465732c0a73657474696e67733a3a4f72646572426f6f6b46696c6c3c4d6f6d656e744f663c543e2c20426c6f636b4e756d626572466f723c543e3e2c293e0000307501437265617465206d756c7469706c65206d616e79206f7264657220626f6f6b73207769746820706172616d657465727320616e642066696c6c207468656d206163636f7264696e6720746f20676976656e20706172616d65746572732e00250142616c616e636520666f7220706c6163696e6720746865206f7264657273206973206d696e746564206175746f6d61746963616c6c792c2074726164696e67207061697273206172654863726561746564206966206e65656465642e000d01496e206f7264657220746f2063726561746520656d707479206f7264657220626f6f6b732c206f6e652063616e206c656176652073657474696e677320656d7074792e002c506172616d65746572733a402d20606f726967696e603a20726f6f7411012d2060626964735f6f776e6572603a2043726561746f72206f662074686520627579206f726465727320706c61636564206f6e20746865206f7264657220626f6f6b732c15012d206061736b735f6f776e6572603a2043726561746f72206f66207468652073656c6c206f726465727320706c61636564206f6e20746865206f7264657220626f6f6b732c89012d206073657474696e6773603a20506172616d657465727320666f72206372656174696f6e206f6620746865206f7264657220626f6f6b20616e6420706c6163696e6720746865206f726465727320696e2065616368206f7264657220626f6f6b2e546f726465725f626f6f6b5f66696c6c5f62617463680c0128626964735f6f776e6572000130543a3a4163636f756e74496400012861736b735f6f776e6572000130543a3a4163636f756e74496400012073657474696e6773f5080191015665633c0a284f72646572426f6f6b49643c543a3a417373657449642c20543a3a44455849643e2c2073657474696e67733a3a4f72646572426f6f6b46696c6c3c0a4d6f6d656e744f663c543e2c20426c6f636b4e756d626572466f723c543e3e2c293e000124cc46696c6c20746865206f7264657220626f6f6b73206163636f7264696e6720746f20676976656e20706172616d65746572732e00dc42616c616e636520666f7220706c6163696e6720746865206f7264657273206973206d696e746564206175746f6d61746963616c6c792e002c506172616d65746572733a402d20606f726967696e603a20726f6f7411012d2060626964735f6f776e6572603a2043726561746f72206f662074686520627579206f726465727320706c61636564206f6e20746865206f7264657220626f6f6b732c15012d206061736b735f6f776e6572603a2043726561746f72206f66207468652073656c6c206f726465727320706c61636564206f6e20746865206f7264657220626f6f6b732c0d012d206073657474696e6773603a20506172616d657465727320666f7220706c6163696e6720746865206f726465727320696e2065616368206f7264657220626f6f6b2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed508000002d90800d9080000040c4502dd08e10800dd08142071615f746f6f6c733070616c6c65745f746f6f6c73286f726465725f626f6f6b2073657474696e67734c4f72646572426f6f6b4174747269627574657300001001247469636b5f73697a6518011c42616c616e6365000134737465705f6c6f745f73697a6518011c42616c616e63650001306d696e5f6c6f745f73697a6518011c42616c616e63650001306d61785f6c6f745f73697a6518011c42616c616e63650000e108142071615f746f6f6c733070616c6c65745f746f6f6c73286f726465725f626f6f6b2073657474696e6773344f72646572426f6f6b46696c6c08184d6f6d656e7401282c426c6f636b4e756d6265720110000c011061736b73e50801604f7074696f6e3c5369646546696c6c3c4d6f6d656e743e3e00011062696473e50801604f7074696f6e3c5369646546696c6c3c4d6f6d656e743e3e00012c72616e646f6d5f736565644505014c4f7074696f6e3c426c6f636b4e756d6265723e0000e50804184f7074696f6e04045401e9080108104e6f6e6500000010536f6d650400e9080000010000e908142071615f746f6f6c733070616c6c65745f746f6f6c73286f726465725f626f6f6b2073657474696e6773205369646546696c6c04184d6f6d656e74012800180134686967686573745f707269636518011c42616c616e63650001306c6f776573745f707269636518011c42616c616e636500012870726963655f7374657018011c42616c616e63650001406f72646572735f7065725f707269636510010c7533320001206c6966657370616e890201384f7074696f6e3c4d6f6d656e743e000158616d6f756e745f72616e67655f696e636c7573697665ed0801504f7074696f6e3c52616e646f6d416d6f756e743e0000ed0804184f7074696f6e04045401f1080108104e6f6e6500000010536f6d650400f1080000010000f108142071615f746f6f6c733070616c6c65745f746f6f6c73286f726465725f626f6f6b2073657474696e67733052616e646f6d416d6f756e74000008010c6d696e18011c42616c616e636500010c6d617818011c42616c616e63650000f508000002f90800f908000004084502e10800fd0804184f7074696f6e04045401940108104e6f6e6500000010536f6d65040094000001000001090c3c70616c6c65745f6d756c74697369671870616c6c6574144572726f72040454000154404d696e696d756d5468726573686f6c640000047c5468726573686f6c64206d7573742062652032206f7220677265617465722e3c416c7265616479417070726f766564000104ac43616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e444e6f417070726f76616c734e65656465640002049c43616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e44546f6f4665775369676e61746f72696573000304a854686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e48546f6f4d616e795369676e61746f72696573000404ac54686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e545369676e61746f726965734f75744f664f726465720005040d01546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e5853656e6465724e6f74496e5369676e61746f7269657300060411015468652073656e646572207761736e277420636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e2062652e404e6f74496e5369676e61746f72696573000704e454686520676976656e206163636f756e74204944206973206e6f742070726573656e74656420696e20746865207369676e61746f726965732e50416c7265616479496e5369676e61746f72696573000804f454686520676976656e206163636f756e7420494420697320616c72656164792070726573656e74656420696e20746865207369676e61746f726965732e204e6f74466f756e64000904dc4d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e204e6f744f776e6572000a042d014f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e2c4e6f54696d65706f696e74000b041d014e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e3857726f6e6754696d65706f696e74000c042d014120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e4c556e657870656374656454696d65706f696e74000d04f4412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e34416c726561647953746f726564000e04a0546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e30576569676874546f6f4c6f77000f04d0546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e345a65726f5468726573686f6c64001004745468726573686f6c642073686f756c64206e6f74206265207a65726f2e544d756c7469736967416c7265616479457869737473001104ac546865206d756c7469736967206163636f756e7420697320616c726561647920726567697374657265642e58556e6b6e6f776e4d756c74697369674163636f756e74001204b0436f72726573706f6e64696e67206d756c7469736967206163636f756e74207761736e277420666f756e642e885369676e61746f726965734172654e6f74556e697175654f72556e6f726465726564001304e85369676e61746f72696573206c69737420756e6f726465726564206f7220636f6e7461696e73206475706c69636174656420656e74726965732e44416c726561647944697370617463686564001404c043616c6c20776974682074686520676976656e20686173682077617320616c726561647920646973706174636865642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a09090905090c3870616c6c65745f7574696c6974791870616c6c6574144572726f7204045400010430546f6f4d616e7943616c6c730000045c546f6f206d616e792063616c6c7320626174636865642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a09090909090c3870616c6c65745f7374616b696e6710736f72613c4475726174696f6e5772617070657200000801107365637328010c7536340001146e616e6f7310010c75333200000d09083870616c6c65745f7374616b696e67345374616b696e674c656467657204045400001401147374617368000130543a3a4163636f756e744964000114746f74616cfc013042616c616e63654f663c543e000118616374697665fc013042616c616e63654f663c543e000124756e6c6f636b696e67110901f0426f756e6465645665633c556e6c6f636b4368756e6b3c42616c616e63654f663c543e3e2c20543a3a4d6178556e6c6f636b696e674368756e6b733e00013c636c61696d65645f726577617264731d090194426f756e6465645665633c457261496e6465782c20543a3a486973746f727944657074683e00001109101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454011509045300000400190901185665633c543e00001509083870616c6c65745f7374616b696e672c556e6c6f636b4368756e6b041c42616c616e636501180008011476616c7565fc011c42616c616e636500010c657261a1020120457261496e646578000019090000021509001d09101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540110045300000400f50301185665633c543e00002109083870616c6c65745f7374616b696e672c4e6f6d696e6174696f6e7304045400000c011c74617267657473250901ac426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61784e6f6d696e6174696f6e733e0001307375626d69747465645f696e100120457261496e64657800012873757070726573736564bc0110626f6f6c00002509101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400250201185665633c543e00002909083870616c6c65745f7374616b696e6734416374697665457261496e666f0000080114696e646578100120457261496e64657800011473746172748902012c4f7074696f6e3c7536343e00002d09000004081000003109083870616c6c65745f7374616b696e673c457261526577617264506f696e747304244163636f756e744964010000080114746f74616c10012c526577617264506f696e74000128696e646976696475616c3509018042547265654d61703c4163636f756e7449642c20526577617264506f696e743e00003509042042547265654d617008044b010004560110000400390900000039090000023d09003d090000040800100041090000024509004509083870616c6c65745f7374616b696e6738556e6170706c696564536c61736808244163636f756e74496401001c42616c616e636501180014012476616c696461746f720001244163636f756e74496400010c6f776e18011c42616c616e63650001186f7468657273bd0101645665633c284163636f756e7449642c2042616c616e6365293e0001247265706f7274657273250201385665633c4163636f756e7449643e0001187061796f757418011c42616c616e63650000490900000408b018004d090c3870616c6c65745f7374616b696e6720736c617368696e6734536c617368696e675370616e7300001001287370616e5f696e6465781001245370616e496e6465780001286c6173745f7374617274100120457261496e6465780001486c6173745f6e6f6e7a65726f5f736c617368100120457261496e6465780001147072696f72f50301345665633c457261496e6465783e000051090c3870616c6c65745f7374616b696e6720736c617368696e67285370616e5265636f7264041c42616c616e636501180008011c736c617368656418011c42616c616e6365000120706169645f6f757418011c42616c616e63650000550900000259090059090000040810bc005d09103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144572726f72040454000164344e6f74436f6e74726f6c6c6572000004644e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f745374617368000104504e6f742061207374617368206163636f756e742e34416c7265616479426f6e64656400020460537461736820697320616c726561647920626f6e6465642e34416c726561647950616972656400030474436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d7074795461726765747300040460546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e646578000504404475706c696361746520696e6465782e44496e76616c6964536c617368496e64657800060484536c617368207265636f726420696e646578206f7574206f6620626f756e64732e40496e73756666696369656e74426f6e6400070c590143616e6e6f74206861766520612076616c696461746f72206f72206e6f6d696e61746f7220726f6c652c20776974682076616c7565206c657373207468616e20746865206d696e696d756d20646566696e65642062793d01676f7665726e616e6365202873656520604d696e56616c696461746f72426f6e646020616e6420604d696e4e6f6d696e61746f72426f6e6460292e20496620756e626f6e64696e67206973207468651501696e74656e74696f6e2c20606368696c6c6020666972737420746f2072656d6f7665206f6e65277320726f6c652061732076616c696461746f722f6e6f6d696e61746f722e304e6f4d6f72654368756e6b730008049043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b000904a043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e646564546172676574000a04c8417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264000b0458496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73000c0478496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e69717565000d04804974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564000e0409015265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e54496e636f7272656374486973746f72794465707468000f04c0496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e73001004b0496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e2042616453746174650011043901496e7465726e616c20737461746520686173206265636f6d6520736f6d65686f7720636f7272757074656420616e6420746865206f7065726174696f6e2063616e6e6f7420636f6e74696e75652e38546f6f4d616e795461726765747300120494546f6f206d616e79206e6f6d696e6174696f6e207461726765747320737570706c6965642e244261645461726765740013043d0141206e6f6d696e6174696f6e207461726765742077617320737570706c69656420746861742077617320626c6f636b6564206f72206f7468657277697365206e6f7420612076616c696461746f722e4043616e6e6f744368696c6c4f74686572001404550154686520757365722068617320656e6f75676820626f6e6420616e6420746875732063616e6e6f74206265206368696c6c656420666f72636566756c6c7920627920616e2065787465726e616c20706572736f6e2e44546f6f4d616e794e6f6d696e61746f72730015084d0154686572652061726520746f6f206d616e79206e6f6d696e61746f727320696e207468652073797374656d2e20476f7665726e616e6365206e6565647320746f2061646a75737420746865207374616b696e67b473657474696e677320746f206b656570207468696e6773207361666520666f72207468652072756e74696d652e44546f6f4d616e7956616c696461746f7273001608550154686572652061726520746f6f206d616e792076616c696461746f722063616e6469646174657320696e207468652073797374656d2e20476f7665726e616e6365206e6565647320746f2061646a75737420746865d47374616b696e672073657474696e677320746f206b656570207468696e6773207361666520666f72207468652072756e74696d652e40436f6d6d697373696f6e546f6f4c6f77001704e0436f6d6d697373696f6e20697320746f6f206c6f772e204d757374206265206174206c6561737420604d696e436f6d6d697373696f6e602e2c426f756e644e6f744d657400180458536f6d6520626f756e64206973206e6f74206d65742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a09090961090c2873705f7374616b696e671c6f6666656e6365384f6666656e636544657461696c7308205265706f727465720100204f6666656e64657201f4000801206f6666656e646572f401204f6666656e6465720001247265706f7274657273250201345665633c5265706f727465723e0000650900000408c8300069090000026d09006d0900000408008d04007109000004087509300075090c1c73705f636f72651863727970746f244b65795479706549640000040040011c5b75383b20345d000079090c3870616c6c65745f73657373696f6e1870616c6c6574144572726f7204045400011430496e76616c696450726f6f6600000460496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f7249640001049c4e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b65790002046452656769737465726564206475706c6963617465206b65792e184e6f4b657973000304a44e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e244e6f4163636f756e7400040419014b65792073657474696e67206163636f756e74206973206e6f74206c6976652c20736f206974277320696d706f737369626c6520746f206173736f6369617465206b6579732e04744572726f7220666f72207468652073657373696f6e2070616c6c65742e7d09083870616c6c65745f6772616e6470612c53746f726564537461746504044e01100110104c6976650000003050656e64696e6750617573650801307363686564756c65645f61741001044e00011464656c61791001044e000100185061757365640002003450656e64696e67526573756d650801307363686564756c65645f61741001044e00011464656c61791001044e000300008109083870616c6c65745f6772616e6470614c53746f72656450656e64696e674368616e676508044e0110144c696d697400001001307363686564756c65645f61741001044e00011464656c61791001044e0001406e6578745f617574686f7269746965738509016c426f756e646564417574686f726974794c6973743c4c696d69743e000118666f72636564450501244f7074696f6e3c4e3e00008509101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401d8045300000400d401185665633c543e000089090c3870616c6c65745f6772616e6470611870616c6c6574144572726f7204045400011c2c50617573654661696c65640000080501417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a42865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c65640001081101417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e67000204e8417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e000304bc43616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f66000404310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f660005043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400060415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909098d09101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401e8045300000400910901185665633c543e00009109000002e800950910346672616d655f737570706f727418747261697473106d69736334577261707065724f7061717565040454019909000800a102000000990901045400009909084070616c6c65745f696d5f6f6e6c696e6564426f756e6465644f70617175654e6574776f726b53746174650c4c506565724964456e636f64696e674c696d697400584d756c746941646472456e636f64696e674c696d697400384164647265737365734c696d6974000008011c706565725f69649d09019c5765616b426f756e6465645665633c75382c20506565724964456e636f64696e674c696d69743e00014865787465726e616c5f616464726573736573a109012d015765616b426f756e6465645665633c5765616b426f756e6465645665633c75382c204d756c746941646472456e636f64696e674c696d69743e2c204164647265737365734c696d69740a3e00009d09101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401080453000004003001185665633c543e0000a109101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e646564566563080454019d09045300000400a50901185665633c543e0000a5090000029d0900a9090c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144572726f7204045400010828496e76616c69644b6579000004604e6f6e206578697374656e74207075626c6963206b65792e4c4475706c696361746564486561727462656174000104544475706c696361746564206865617274626561742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909ad0900000408000d0100b109101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401b509045300000400b90901185665633c543e0000b509082c6f726d6c5f746f6b656e732c42616c616e63654c6f636b041c42616c616e63650118000801086964150101384c6f636b4964656e746966696572000118616d6f756e7418011c42616c616e63650000b909000002b50900bd09082c6f726d6c5f746f6b656e732c4163636f756e7444617461041c42616c616e63650118000c01106672656518011c42616c616e6365000120726573657276656418011c42616c616e636500011866726f7a656e18011c42616c616e63650000c109101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401c509045300000400c90901185665633c543e0000c509082c6f726d6c5f746f6b656e732c52657365727665446174610844526573657276654964656e74696669657201a81c42616c616e63650118000801086964a80144526573657276654964656e746966696572000118616d6f756e7418011c42616c616e63650000c909000002c50900cd090c2c6f726d6c5f746f6b656e73186d6f64756c65144572726f720404540001203442616c616e6365546f6f4c6f77000004585468652062616c616e636520697320746f6f206c6f775c416d6f756e74496e746f42616c616e63654661696c65640001049c43616e6e6f7420636f6e7665727420416d6f756e7420696e746f2042616c616e63652074797065544c69717569646974795265737472696374696f6e73000204d04661696c65642062656361757365206c6971756964697479207265737472696374696f6e732064756520746f206c6f636b696e67404d61784c6f636b734578636565646564000304b44661696c6564206265636175736520746865206d6178696d756d206c6f636b7320776173206578636565646564244b656570416c6976650004048c5472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e74484578697374656e7469616c4465706f736974000504e856616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f7369742c446561644163636f756e740006048842656e6566696369617279206163636f756e74206d757374207072652d65786973743c546f6f4d616e79526573657276657300070004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909d1090c3c6f726d6c5f63757272656e63696573186d6f64756c65144572726f7204045400010c5c416d6f756e74496e746f42616c616e63654661696c6564000004bc556e61626c6520746f20636f6e766572742074686520416d6f756e74207479706520696e746f2042616c616e63652e3442616c616e6365546f6f4c6f770001044c42616c616e636520697320746f6f206c6f772e344465706f7369744661696c6564000204784465706f73697420726573756c74206973206e6f7420657870656374656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909d50900000408101d0100d909042042547265655365740404540169010004000d05000000dd090c3074726164696e675f706169721870616c6c6574144572726f720404540001104454726164696e6750616972457869737473000004a05265676973746572696e672074726164696e67207061697220616c7265616479206578697374732e50466f7262696464656e4261736541737365744964000104010154686520737065636966696564206261736520617373657420494420666f72207468652074726164696e672070616972206973206e6f7420616c6c6f7765642e444964656e746963616c4173736574496473000204ec546865207370656369666965642062617365206173736574204944206973207468652073616d65206173207461726765742061737365742049442e5854726164696e6750616972446f65736e744578697374000304bc54726164696e672070616972206973206e6f74207265676973746572656420666f7220676976656e2044455849642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909e109000004182901310108bce904f10400e50908186173736574732c41737365745265636f726404045400012818417269747930000000184172697479310400e909014441737365745265636f72644172673c543e000100184172697479320800e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e000200184172697479330c00e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e000300184172697479341000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e000400184172697479351400e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e000500184172697479361800e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e000600184172697479371c00e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e000700184172697479382000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e000800184172697479392400e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e0000e909014441737365745265636f72644172673c543e00090000e90908186173736574733841737365745265636f72644172670404540001242847656e657269634933320400ed09010c6933320000002847656e65726963553634040028010c7536340001002c47656e65726963553132380400180110753132380002003047656e65726963553878333204000401205b75383b2033325d0003002c47656e657269634832353604002c0110483235360004002c47656e65726963483531320400ed030110483531320005002c4c6561664173736574496404000d010130417373657449644f663c543e0006004841737365745265636f72644173736574496404000d010130417373657449644f663c543e0007001445787472610400f1090158543a3a457874726141737365745265636f726441726700080000ed090000050b00f1090c18636f6d6d6f6e287072696d6974697665736841737365744964457874726141737365745265636f72644172670c1444455849640110144c73744964016901244163636f756e7449640104010c14444558496404001001144445584964000000144c737449640400690101144c73744964000100244163636f756e74496404000401244163636f756e74496400020000f5090c186173736574731870616c6c6574144572726f720404540001345041737365744964416c7265616479457869737473000004a0416e2061737365742077697468206120676976656e20494420616c7265616479206578697374732e40417373657449644e6f7445786973747300010490416e2061737365742077697468206120676976656e204944206e6f74206578697374732e4c496e73756666696369656e7442616c616e6365000204b441206e756d626572206973206f7574206f662072616e6765206f66207468652062616c616e636520747970652e48496e76616c6964417373657453796d626f6c0003049d0153796d626f6c206973206e6f742076616c69642e204974206d75737420636f6e7461696e206f6e6c7920757070657263617365206c6174696e2063686172616374657273206f72206e756d626572732c206c656e6774682069732066726f6d203120746f20372e40496e76616c696441737365744e616d65000404f5014e616d65206973206e6f742076616c69642e204974206d75737420636f6e7461696e206f6e6c7920757070657263617365206f72206c6f77657263617365206c6174696e2063686172616374657273206f72206e756d62657273206f72207370616365732c206c656e6774682069732066726f6d203120746f2033332e40496e76616c6964507265636973696f6e0005048d01507265636973696f6e2076616c7565206973206e6f742076616c69642c2069742073686f756c6420726570726573656e742061206e756d626572206f6620646563696d616c20706c6163657320666f72206e756d6265722c206d61782069732033302e604173736574537570706c7949734e6f744d696e7461626c65000604b04d696e74696e6720666f7220706172746963756c61722061737365742069642069732064697361626c65642e44496e76616c696441737365744f776e65720007049043616c6c657220646f6573206e6f74206f776e207265717565737465642061737365742e2c496e635265664572726f7200080488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e50496e76616c6964436f6e74656e74536f75726365000904e101436f6e74656e7420736f75726365206973206e6f742076616c69642e204974206d757374206265206173636969206f6e6c7920616e642060636f6d6d6f6e3a3a41535345545f434f4e54454e545f534f555243455f4d41585f4c454e475448602063686172616374657273206c6f6e67206174206d61782e48496e76616c69644465736372697074696f6e000a048d014465736372697074696f6e206973206e6f742076616c69642e204974206d7573742062652060636f6d6d6f6e3a3a41535345545f4445534352495054494f4e5f4d41585f4c454e475448602063686172616374657273206c6f6e67206174206d61782e24446561644173736574000b04dc546865206173736574206973206e6f74206d696e7461626c6520616e642069747320696e697469616c2062616c616e636520697320302e204f766572666c6f77000c0454436f6d7075746174696f6e206f766572666c6f772e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909f9090c18636f6d6d6f6e287072696d6974697665731c444558496e666f041c41737365744964010d01000c0134626173655f61737365745f69640d01011c4173736574496400015c73796e7468657469635f626173655f61737365745f69640d01011c4173736574496400012469735f7075626c6963bc0110626f6f6c0000fd090c2c6465785f6d616e616765721870616c6c6574144572726f72040454000110484445584964416c7265616479457869737473000004a0444558207769746820676976656e20696420697320616c726561647920726567697374657265642e3c444558446f65734e6f74457869737400010490444558207769746820676976656e204964206973206e6f7420726567697374657265642e3c496e76616c696446656556616c756500020429014e756d657269632076616c75652070726f766964656420617320666565206973206e6f742076616c69642c20652e672e206f7574206f662062617369732d706f696e742072616e67652e40496e76616c69644163636f756e744964000304a04163636f756e74207769746820676976656e204964206973206e6f7420726567697374657265642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909010a08886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c50446973747269627574696f6e4163636f756e7473045c446973747269627574696f6e4163636f756e744461746101050a00140138786f725f616c6c6f636174696f6e050a015c446973747269627574696f6e4163636f756e744461746100012c76616c5f686f6c64657273050a015c446973747269627574696f6e4163636f756e7444617461000134736f72615f636974697a656e73050a015c446973747269627574696f6e4163636f756e744461746100014073746f7265735f616e645f73686f7073050a015c446973747269627574696f6e4163636f756e744461746100012070726f6a65637473050a015c446973747269627574696f6e4163636f756e74446174610000050a08886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c5c446973747269627574696f6e4163636f756e7444617461044c446973747269627574696f6e4163636f756e7401090a0008011c6163636f756e74090a014c446973747269627574696f6e4163636f756e7400012c636f656666696369656e743d01011446697865640000090a08886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c4c446973747269627574696f6e4163636f756e7408244163636f756e744964010034546563684163636f756e744964014d0101081c4163636f756e7404000001244163636f756e7449640000002c546563684163636f756e7404004d010134546563684163636f756e744964000100000d0a04204254726565536574040454010d010004001904000000110a00000408181800150a0c886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c1870616c6c6574144572726f7204045400013c58507269636543616c63756c6174696f6e4661696c6564000004b8416e206572726f72206f63637572726564207768696c652063616c63756c6174696e67207468652070726963652e8c4661696c6564546f43616c63756c6174655072696365576974686f7574496d706163740001042d014661696c757265207768696c652063616c63756c6174696e672070726963652069676e6f72696e67206e6f6e2d6c696e656172697479206f66206c697175696469747920736f757263652e5843616e6e6f7445786368616e67655769746853656c66000204a854686520706f6f6c2063616e277420706572666f726d2065786368616e6765206f6e20697473656c662e444e6f74456e6f7567685265736572766573000304f849742773206e6f7420656e6f75676820726573657276657320696e2074686520706f6f6c20746f20706572666f726d20746865206f7065726174696f6e2e74506f6f6c416c7265616479496e697469616c697a6564466f7250616972000404e0417474656d707420746f20696e697469616c697a6520706f6f6c20666f722070616972207468617420616c7265616479206578697374732e48506f6f6c4e6f74496e697469616c697a6564000504ac417474656d707420746f2067657420696e666f20666f7220756e696e697469616c697a656420706f6f6c2e54536c6970706167654c696d697445786365656465640006043101496e64696361746564206c696d69747320666f7220736c69707061676520686173206e6f74206265656e206d657420647572696e67207472616e73616374696f6e20657865637574696f6e2e384e6f7468696e67546f436c61696d0007043901456974686572207573657220686173206e6f2070656e64696e672072657761726473206f722063757272656e74206c696d697420697320657863656564656420617420746865206d6f6d656e742e5452657761726473537570706c7953686f7274616765000804290155736572206861732070656e64696e67207265776172642c20627574207265776172647320737570706c7920697320696e73756666696369656e7420617420746865206d6f6d656e742e70556e737570706f72746564436f6c6c61746572616c41737365744964000904cc496e6469636174656420636f6c6c61746572616c206173736574206973206e6f7420656e61626c656420666f7220706f6f6c2e5046656543616c63756c6174696f6e4661696c6564000a04bc436f756c64206e6f742063616c63756c6174652066656520696e636c7564696e672073656c6c2070656e616c74792e3043616e7445786368616e6765000b0435014c697175696469747920736f757263652063616e27742065786368616e67652061737365747320776974682074686520676976656e20494473206f6e2074686520676976656e2044455849642e2c496e635265664572726f72000c0488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e3c41726974686d657469634572726f72000d04c0416e206572726f72206f63637572656420647572696e672062616c616e6365207479706520636f6e76657273696f6e2e644672656552657365727665734163636f756e744e6f74536574000e048046726565207265736572766573206163636f756e74206973206e6f742073657404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909190a0c24746563686e6963616c1870616c6c6574144572726f720404540001543c53746f726167654f766572666c6f77000004f84572726f72732073686f756c6420686176652068656c7066756c20646f63756d656e746174696f6e206173736f6369617465642077697468207468656d2e4c496e73756666696369656e7442616c616e63650001047842616c616e636520746f6f206c6f7720746f2073656e642076616c75652e30416c72656164794578697374000204505377617020616c7265616479206578697374732e30496e76616c696450726f6f6600030458537761702070726f6f6620697320696e76616c69642e38536f757263654d69736d6174636800040458536f7572636520646f6573206e6f74206d617463682e38416c7265616479436c61696d656400050478537761702068617320616c7265616479206265656e20636c61696d65642e4c436c61696d416374696f6e4d69736d6174636800060458436c61696d20616374696f6e206d69736d617463682e444475726174696f6e4e6f74506173736564000704e44475726174696f6e20686173206e6f74207965742070617373656420666f7220746865207377617020746f2062652063616e63656c6c65642e404f6e6c79526567756c617241737365740008042d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c7920726567756c61722076616c75657320696e7369646520697420697320616c6c6f776564484f6e6c79526567756c61724163636f756e740009042d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c7920726567756c61722076616c75657320696e7369646520697420697320616c6c6f776564484f6e6c79526567756c617242616c616e6365000a042d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c7920726567756c61722076616c75657320696e7369646520697420697320616c6c6f776564604f6e6c7950757265546563686e6963616c4163636f756e74000b042d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c7920726567756c61722076616c75657320696e7369646520697420697320616c6c6f776564204f766572666c6f77000c0474476f7420616e206f766572666c6f7720616674657220616464696e672e5c546563684163636f756e7449644d757374426550757265000d041d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c79207075726520746563686e6963616c2076616c756520697320616c6c6f77656480556e61626c65546f4765745265707246726f6d546563684163636f756e744964000e0819014974206973206e6f7420706f7369626c6520746f206578747261637420636f64652066726f6d20604163636f756e74496433326020617320726570726573656e746174696f6e586f722066696e6420697420696e2073746f726167652e74526570726573656e7461746976654d7573744265537570706f72746564000f04110154797065206d7573742073706f7274206d617070696e672066726f6d206861736820746f207370656369616c20737562736574206f6620604163636f756e74496433326070546563684163636f756e74496449734e6f745265676973746572656400100859014974206973206e6f7420706f7369626c6520746f2066696e64207265636f726420696e2073746f72616765206d61702061626f757420604163636f756e74496433326020726570726573656e746174696f6e20666f7248746563686e6963616c206163636f756e742e384e6f74496d706c656d656e746564001104cc546869732066756e6374696f6e206f722061626c696c697479206973207374696c6c206e6f7420696d706c656d656e7465642e544465636f64654163636f756e7449644661696c6564001204a44661696c656420746f206465636f646520604163636f756e744964602066726f6d206120686173682e6c4173736f6369617465644163636f756e7449644e6f74466f756e640013040d014173736f63696174656420604163636f756e74496460206e6f7420666f756e642077697468206120676976656e2060546563686e6963616c4163636f756e744964602ea04f7065726174696f6e576974684162737472616374436865636b696e674973496d706f7369626c65001404bc4f7065726174696f6e207769746820616273747261637420636865636b696e6720697320696d706f737369626c652e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909091d0a000004080d010d0100210a00000408000000250a0c20706f6f6c5f78796b1870616c6c6574144572726f720404540001f850556e61626c65546f43616c63756c6174654665650000044d01497420697320696d706f737369626c6520746f2063616c63756c6174652066656520666f7220736f6d6520706169722073776170206f7065726174696f6e2c206f72206f74686572206f7065726174696f6e2e8c4661696c6564546f43616c63756c6174655072696365576974686f7574496d706163740001042d014661696c757265207768696c652063616c63756c6174696e672070726963652069676e6f72696e67206e6f6e2d6c696e656172697479206f66206c697175696469747920736f757263652e48556e61626c65546f47657442616c616e636500020480497320697320696d706f737369626c6520746f206765742062616c616e63652e88496d706f737369626c65546f446563696465417373657450616972416d6f756e7473000304a0496d706f737369626c6520746f20646563696465206173736574207061697220616d6f756e74732ea0506f6f6c50616972526174696f416e645061697253776170526174696f4973446966666572656e74000404c8506f6f6c207061697220726174696f20616e642070616972207377617020726174696f2061726520646966666572656e742ea45061697253776170416374696f6e4665654973536d616c6c65725468616e5265636f6d6d656e646564000504c450616972207377617020616374696f6e2066656520697320736d616c6c6572207468616e207265636f6d6d656e6465642e74536f7572636542616c616e636549734e6f744c61726765456e6f7567680006048c536f757263652062616c616e6365206973206e6f74206c6172676520656e6f7567682e7454617267657442616c616e636549734e6f744c61726765456e6f7567680007048c5461726765742062616c616e6365206973206e6f74206c6172676520656e6f7567682e60556e61626c65546f4465726976654665654163636f756e74000804a44974206973206e6f7420706f737369626c6520746f2064657269766520666565206163636f756e742e4c4665654163636f756e744973496e76616c69640009046c54686520666565206163636f756e7420697320696e76616c69642e9c536f75726365416e64436c69656e744163636f756e74446f4e6f744d617463684173457175616c000a04c4536f7572636520616e6420636c69656e74206163636f756e747320646f206e6f74206d6174636820617320657175616c2e4c4173736574734d7573744e6f74426553616d65000b0494496e2074686973206361736520617373657473206d757374206e6f742062652073616d652ea4496d706f737369626c65546f4465636964654465706f7369744c6971756964697479416d6f756e7473000c04bc496d706f737369626c6520746f20646563696465206465706f736974206c697175696469747920616d6f756e74732e9c496e76616c69644465706f7369744c697175696469747942617369634173736574416d6f756e74000d04b0496e76616c6964206465706f736974206c6971756964697479206261736520617373657420616d6f756e742ea0496e76616c69644465706f7369744c69717569646974795461726765744173736574416d6f756e74000e04b8496e76616c6964206465706f736974206c69717569646974792074617267657420617373657420616d6f756e742ed85061697253776170416374696f6e4d696e696d756d4c69717569646974794973536d616c6c65725468616e5265636f6d6d656e646564000f04fc50616972207377617020616374696f6e206d696e696d756d206c697175696469747920697320736d616c6c6572207468616e207265636f6d6d656e6465642eb044657374696e6174696f6e416d6f756e744f664c697175696469747949734e6f744c61726765456e6f756768001004d044657374696e6174696f6e20616d6f756e74206f66206c6971756964697479206973206e6f74206c6172676520656e6f7567682e80536f7572636542617365416d6f756e7449734e6f744c61726765456e6f7567680011049c536f75726365206261736520616d6f756e74206973206e6f74206c6172676520656e6f7567682e8054617267657442617365416d6f756e7449734e6f744c61726765456e6f7567680012049c546172676574206261736520616d6f756e74206973206e6f74206c6172676520656e6f7567682e34506f6f6c4973496e76616c6964001304a45468652062616c616e636520737472756374757265206f6620706f6f6c20697320696e76616c69642e2c506f6f6c4973456d7074790014047454686520706f6f6c2068617320656d707479206c69717569646974792e685a65726f56616c7565496e416d6f756e74506172616d65746572001504bc416d6f756e7420706172616d6574657220686173207a65726f2076616c75652c20697420697320696e76616c69642e5c4163636f756e7442616c616e63654973496e76616c69640016047c546865206163636f756e742062616c616e636520697320696e76616c69642ea0496e76616c69644465706f7369744c697175696469747944657374696e6174696f6e416d6f756e74001704b4496e76616c6964206465706f736974206c69717569646974792064657374696e6174696f6e20616d6f756e742ea0496e697469616c4c697175646974794465706f736974526174696f4d7573744265446566696e6564001804c0496e697469616c206c6971756964697479206465706f73697420726174696f206d75737420626520646566696e65642e6c54656368417373657449734e6f74526570726573656e7461626c6500190494546563686e6963616c206173736574206973206e6f7420726570726573656e7461626c652e64556e61626c65546f4465636964654d61726b65724173736574001a04b0556e61626c65206f7220696d706f737369626c6520746f20646563696465206d61726b65722061737365742e50556e61626c65546f476574417373657452657072001b04c4556e61626c65206f7220696d706f737369626c6520746f2067657420617373657420726570726573656e746174696f6e2ea8496d706f737369626c65546f44656369646557697468647261774c6971756964697479416d6f756e7473001c04c0496d706f737369626c6520746f20646563696465207769746864726177206c697175696469747920616d6f756e74732ea0496e76616c696457697468647261774c697175696469747942617369634173736574416d6f756e74001d04b4496e76616c6964207769746864726177206c6971756964697479206261736520617373657420616d6f756e742ea4496e76616c696457697468647261774c69717569646974795461726765744173736574416d6f756e74001e04bc496e76616c6964207769746864726177206c69717569646974792074617267657420617373657420616d6f756e742e68536f7572636542617365416d6f756e744973546f6f4c61726765001f0480536f75726365206261736520616d6f756e7420697320746f6f206c617267652eb8536f7572636542616c616e63654f664c6971756964697479546f6b656e7349734e6f744c61726765456e6f756768002004c0536f757263652062616c616e6365206f66206c6971756964697479206973206e6f74206c6172676520656e6f7567682e9844657374696e6174696f6e4261736542616c616e636549734e6f744c61726765456e6f756768002104b444657374696e6174696f6e20626173652062616c616e6365206973206e6f74206c6172676520656e6f7567682ea044657374696e6174696f6e54617267657442616c616e636549734e6f744c61726765456e6f756768002204b444657374696e6174696f6e20626173652062616c616e6365206973206e6f74206c6172676520656e6f7567682e7c496e76616c69644173736574466f724c69717569646974794d61726b696e670023049c417373657420666f72206c6971756964697479206d61726b696e6720697320696e76616c69642e4841737365744465636f64696e674572726f72002404604572726f7220696e206173736574206465636f64696e672e8c43616c63756c6174656456616c756549734f75744f6644657369726564426f756e6473002504a843616c63756c617465642076616c7565206973206f7574206f66206465736972656420626f756e64732ea842617365417373657449734e6f744d61746368656457697468416e794173736574417267756d656e7473002604dc5468652062617365206173736574206973206e6f74206d617463686564207769746820616e7920617373657420617267756d656e74732e6c44657374696e6174696f6e416d6f756e744d757374426553616d650027040501536f6d652076616c756573206e65656420746f2062652073616d652c207468652064657374696e6174696f6e20616d6f756e74206d7573742062652073616d652e58536f75726365416d6f756e744d757374426553616d65002804f0536f6d652076616c756573206e65656420746f2062652073616d652c2074686520736f7572636520616d6f756e74206d7573742062652073616d652e6c506f6f6c496e697469616c697a6174696f6e4973496e76616c6964002904c854686520706f6f6c20696e697469616c697a6174696f6e20697320696e76616c696420616e6420686173206661696c65642e60506f6f6c4973416c7265616479496e697469616c697a6564002a048054686520706f6f6c20697320616c726561647920696e697469616c697a65642e84496e76616c69644d696e696d756d426f756e6456616c75654f6642616c616e6365002b04c0546865206d696e696d756d20626f756e642076616c756573206f662062616c616e63652061726520696e76616c69642ed4496d706f737369626c65546f44656369646556616c69645061697256616c75657346726f6d52616e6765466f7254686973506f6f6c002c041901497420697320696d706f737369626c6520746f206465636964652076616c696420706169722076616c7565732066726f6d2072616e676520666f72207468697320706f6f6c2e5052616e676556616c7565734973496e76616c6964002d04e8546869732072616e67652076616c756573206973206e6f742076616c6964792062792072756c6573206f6620636f72726563742072616e67652eac43616c63756c6174656456616c756549734e6f744d656574735265717569726564426f756e646172696573002e04f05468652076616c75657320746861742069732063616c63756c61746564206973206f7574206f7574206f6620726571756972656420626f756e64732e9447657474696e6746656546726f6d44657374696e6174696f6e4973496d706f737369626c65002f04e0496e207468697320636173652067657474696e67206665652066726f6d2064657374696e6174696f6e20697320696d706f737369626c652e7446697865645772617070657243616c63756c6174696f6e4661696c6564003004e84d6174682063616c63756c6174696f6e2077697468206669786564206e756d62657220686173206661696c656420746f20636f6d706c6574652e58546869734361736549734e6f74537570706f72746564003104fc546869732063617365206966206e6f7420737570706f72746564206279206c6f676963206f6620706f6f6c206f662076616c69646174696f6e20636f64652e7c506f6f6c426563616d65496e76616c696441667465724f7065726174696f6e00320494506f6f6c206265636f6d657320696e76616c6964206166746572206f7065726174696f6e2e84556e61626c65546f436f6e766572744173736574546f5465636841737365744964003304a4556e61626c6520746f20636f6e7665727420617373657420746f20746563682061737365742069642e84556e61626c65546f476574584f525061727446726f6d4d61726b65724173736574003404a4556e61626c6520746f2067657420584f5220706172742066726f6d206d61726b65722061737365742e5c506f6f6c546f6b656e537570706c794f766572666c6f77003504c4506f6f6c20746f6b656e20737570706c79206861732072656163686564206c696d6974206f66206461746120747970652e2c496e635265664572726f720036082101436f756c646e277420696e637265617365207265666572656e636520636f756e74657220666f7220746865206163636f756e7420746861742061646473206c69717569646974792ec901497420697320657870656374656420746f206e657665722068617070656e206265636175736520696620746865206163636f756e74206861732066756e647320746f20616464206c69717569646974792c2069742068617320612070726f76696465722066726f6d2062616c616e6365732e84556e61626c65546f4465706f736974586f724c6573735468616e4d696e696d756d0037046501556e61626c6520746f2070726f76696465206c697175696469747920626563617573652069747320584f522070617274206973206c6573736572207468616e20746865206d696e696d756d2076616c75652028302e3030372950556e737570706f7274656451756f7465506174680038045501417474656d707420746f2071756f74652076696120756e737570706f7274656420706174682c20692e652e20626f7468206f757470757420616e6420696e70757420746f6b656e7320617265206e6f7420584f522e684e6f74456e6f756768556e6c6f636b65644c6971756964697479003904a44e6f7420656e6f75676820756e6c6f636b6564206c697175696469747920746f2077697468647261779c556e61626c65546f437265617465506f6f6c57697468496e646976697369626c65417373657473003a04b043616e6e6f7420637265617465206120706f6f6c207769746820696e646976697369626c652061737365747390556e61626c65546f4f70657261746557697468496e646976697369626c65417373657473003b04cc556e61626c6520746f2070726f63656564206f7065726174696f6e207769746820696e646976697369626c6520617373657473784e6f74456e6f7567684c69717569646974794f75744f664661726d696e67003c04bc4e6f7420656e6f756768206c6971756964697479206f7574206f66206661726d696e6720746f2077697468647261775c5461726765744173736574497352657374726963746564003d04c443616e6e6f7420637265617465206120706f6f6c207769746820726573747269637465642074617267657420617373657404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909290a0c3c6c69717569646974795f70726f78791870616c6c6574144572726f7204045400014c5c556e617661696c61626c6545786368616e67655061746800000425014e6f20726f7574652065786973747320696e206120676976656e2044455820666f7220676976656e20706172616d657465727320746f206361727279206f7574207468652073776170384d61784665654578636565646564000104404d6178206665652065786365656465643c496e76616c696446656556616c7565000204d84665652076616c7565206f757473696465206f662074686520626173697320706f696e74732072616e6765205b302e2e31303030305d54496e73756666696369656e744c6971756964697479000304e84e6f6e65206f662074686520736f75726365732068617320656e6f75676820726573657276657320746f20657865637574652061207472616465404167677265676174696f6e4572726f7200040489015061746820657869737473206275742069742773206e6f7420706f737369626c6520746f20706572666f726d2065786368616e676520776974682063757272656e746c7920617661696c61626c65206c6971756964697479206f6e20706f6f6c732e4043616c63756c6174696f6e4572726f72000504b453706563696669656420706172616d6574657273206c65616420746f2061726974686d65746963206572726f7250536c6970706167654e6f74546f6c6572617465640006043101536c697070616765206569746865722065786365656473206d696e696d756d20746f6c657261746564206f7574707574206f72206d6178696d756d20746f6c65726174656420696e7075742e3c466f7262696464656e46696c746572000704a853656c65637465642066696c746572696e672072657175657374206973206e6f7420616c6c6f7765642e8c4661696c6564546f43616c63756c6174655072696365576974686f7574496d706163740008042d014661696c757265207768696c652063616c63756c6174696e672070726963652069676e6f72696e67206e6f6e2d6c696e656172697479206f66206c697175696469747920736f757263652e74556e61626c65546f53776170496e646976697369626c6541737365747300090484556e61626c6520746f207377617020696e646976697369626c652061737365747374556e61626c65546f456e61626c654c6971756964697479536f75726365000a0484556e61626c6520746f20656e61626c65206c697175696469747920736f75726365744c6971756964697479536f75726365416c7265616479456e61626c6564000b048c4c697175696469747920736f7572636520697320616c726561647920656e61626c656478556e61626c65546f44697361626c654c6971756964697479536f75726365000c0488556e61626c6520746f2064697361626c65206c697175696469747920736f75726365784c6971756964697479536f75726365416c726561647944697361626c6564000d04904c697175696469747920736f7572636520697320616c72656164792064697361626c656450496e76616c6964526563656976657273496e666f000e00784661696c6564546f5472616e7366657241646172436f6d6d697373696f6e000f0068496e76616c696441444152436f6d6d697373696f6e526174696f0010004c496e73756666696369656e7442616c616e63650011006054686553616d6553656e646572416e64526563656976657200120004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909092d0a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012c0453000004000d0301185665633c543e0000310a084470616c6c65745f636f6c6c65637469766514566f74657308244163636f756e74496401002c426c6f636b4e756d626572011000140114696e64657810013450726f706f73616c496e6465780001247468726573686f6c6410012c4d656d626572436f756e7400011061796573250201385665633c4163636f756e7449643e0001106e617973250201385665633c4163636f756e7449643e00010c656e6410012c426c6f636b4e756d6265720000350a0c4470616c6c65745f636f6c6c6563746976651870616c6c6574144572726f72080454000449000128244e6f744d656d6265720000045c4163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0001047c4475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e670002044c50726f706f73616c206d7573742065786973742857726f6e67496e646578000304404d69736d61746368656420696e646578344475706c6963617465566f7465000404584475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a6564000504804d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c79000604010154686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c73000704fc54686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c576569676874000804d054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e677468000904d054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909390a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012c0453000004000d0301185665633c543e00003d0a0c4470616c6c65745f636f6c6c6563746976651870616c6c6574144572726f72080454000449000128244e6f744d656d6265720000045c4163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0001047c4475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e670002044c50726f706f73616c206d7573742065786973742857726f6e67496e646578000304404d69736d61746368656420696e646578344475706c6963617465566f7465000404584475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a6564000504804d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c79000604010154686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c73000704fc54686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c576569676874000804d054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e677468000904d054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909410a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401450a045300000400490a01185665633c543e0000450a0000040c1039050000490a000002450a004d0a00000408510a1800510a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400250201185665633c543e0000550a0c4070616c6c65745f64656d6f6372616379147479706573385265666572656e64756d496e666f0c2c426c6f636b4e756d62657201102050726f706f73616c0139051c42616c616e6365011801081c4f6e676f696e670400590a01c05265666572656e64756d5374617475733c426c6f636b4e756d6265722c2050726f706f73616c2c2042616c616e63653e0000002046696e6973686564080120617070726f766564bc0110626f6f6c00010c656e6410012c426c6f636b4e756d62657200010000590a0c4070616c6c65745f64656d6f6372616379147479706573405265666572656e64756d5374617475730c2c426c6f636b4e756d62657201102050726f706f73616c0139051c42616c616e636501180014010c656e6410012c426c6f636b4e756d62657200012070726f706f73616c3905012050726f706f73616c0001247468726573686f6c6481010134566f74655468726573686f6c6400011464656c617910012c426c6f636b4e756d62657200011474616c6c795d0a013854616c6c793c42616c616e63653e00005d0a0c4070616c6c65745f64656d6f63726163791474797065731454616c6c79041c42616c616e63650118000c01106179657318011c42616c616e63650001106e61797318011c42616c616e636500011c7475726e6f757418011c42616c616e63650000610a0c4070616c6c65745f64656d6f637261637910766f746518566f74696e67101c42616c616e63650118244163636f756e74496401002c426c6f636b4e756d6265720110204d6178566f746573000108184469726563740c0114766f746573650a01f4426f756e6465645665633c285265666572656e64756d496e6465782c204163636f756e74566f74653c42616c616e63653e292c204d6178566f7465733e00012c64656c65676174696f6e73710a015044656c65676174696f6e733c42616c616e63653e0001147072696f72750a017c5072696f724c6f636b3c426c6f636b4e756d6265722c2042616c616e63653e0000002844656c65676174696e6714011c62616c616e636518011c42616c616e63650001187461726765740001244163636f756e744964000128636f6e76696374696f6e41050128436f6e76696374696f6e00012c64656c65676174696f6e73710a015044656c65676174696f6e733c42616c616e63653e0001147072696f72750a017c5072696f724c6f636b3c426c6f636b4e756d6265722c2042616c616e63653e00010000650a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401690a0453000004006d0a01185665633c543e0000690a00000408108501006d0a000002690a00710a0c4070616c6c65745f64656d6f63726163791474797065732c44656c65676174696f6e73041c42616c616e6365011800080114766f74657318011c42616c616e636500011c6361706974616c18011c42616c616e63650000750a0c4070616c6c65745f64656d6f637261637910766f7465245072696f724c6f636b082c426c6f636b4e756d62657201101c42616c616e6365011800080010012c426c6f636b4e756d626572000018011c42616c616e63650000790a0000040839058101007d0a0000040810810a00810a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400250201185665633c543e0000850a0c4070616c6c65745f64656d6f63726163791870616c6c6574144572726f7204045400015c2056616c75654c6f770000043456616c756520746f6f206c6f773c50726f706f73616c4d697373696e670001045c50726f706f73616c20646f6573206e6f742065786973743c416c726561647943616e63656c65640002049443616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c0003045450726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c69737465640004046850726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f72697479000504a84e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c69644861736800060430496e76616c69642068617368284e6f50726f706f73616c000704504e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564000804984964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365445265666572656e64756d496e76616c696400090484566f746520676976656e20666f7220696e76616c6964207265666572656e64756d2c4e6f6e6557616974696e67000a04504e6f2070726f706f73616c732077616974696e67204e6f74566f746572000b04c454686520676976656e206163636f756e7420646964206e6f7420766f7465206f6e20746865207265666572656e64756d2e304e6f5065726d697373696f6e000c04c8546865206163746f7220686173206e6f207065726d697373696f6e20746f20636f6e647563742074686520616374696f6e2e44416c726561647944656c65676174696e67000d0488546865206163636f756e7420697320616c72656164792064656c65676174696e672e44496e73756666696369656e7446756e6473000e04fc546f6f206869676820612062616c616e6365207761732070726f7669646564207468617420746865206163636f756e742063616e6e6f74206166666f72642e344e6f7444656c65676174696e67000f04a0546865206163636f756e74206973206e6f742063757272656e746c792064656c65676174696e672e28566f74657345786973740010085501546865206163636f756e742063757272656e746c792068617320766f74657320617474616368656420746f20697420616e6420746865206f7065726174696f6e2063616e6e6f74207375636365656420756e74696ce87468657365206172652072656d6f7665642c20656974686572207468726f7567682060756e766f746560206f722060726561705f766f7465602e44496e7374616e744e6f74416c6c6f776564001104d854686520696e7374616e74207265666572656e64756d206f726967696e2069732063757272656e746c7920646973616c6c6f7765642e204e6f6e73656e73650012049444656c65676174696f6e20746f206f6e6573656c66206d616b6573206e6f2073656e73652e3c57726f6e675570706572426f756e6400130450496e76616c696420757070657220626f756e642e3c4d6178566f74657352656163686564001404804d6178696d756d206e756d626572206f6620766f74657320726561636865642e1c546f6f4d616e79001504804d6178696d756d206e756d626572206f66206974656d7320726561636865642e3c566f74696e67506572696f644c6f7700160454566f74696e6720706572696f6420746f6f206c6f7704b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909890a0c1c6465785f6170691870616c6c6574144572726f72040454000108744c6971756964697479536f75726365416c7265616479456e61626c65640000048c4c697175696469747920736f7572636520697320616c726561647920656e61626c6564784c6971756964697479536f75726365416c726561647944697361626c6564000104904c697175696469747920736f7572636520697320616c72656164792064697361626c656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909098d0a00000408102c00910a0c286574685f6272696467652072657175657374733c4f6666636861696e5265717565737404045400010c204f7574676f696e6708007d0501484f7574676f696e67526571756573743c543e00002c011048323536000000304c6f6164496e636f6d696e670400bd0501584c6f6164496e636f6d696e67526571756573743c543e00010020496e636f6d696e67080065050148496e636f6d696e67526571756573743c543e00002c01104832353600020000950a0c286574685f62726964676520726571756573747334526571756573745374617475730001181c50656e64696e670000001846726f7a656e00010038417070726f76616c735265616479000200184661696c6564040060013444697370617463684572726f7200030010446f6e650004001842726f6b656e080060013444697370617463684572726f72000060013444697370617463684572726f7200050000990a0420425472656553657404045401cd050004009d0a0000009d0a000002cd0500a10a0000028d0a00a50a00000408100d0100a90a0000040810090400ad0a0420425472656553657404045401000004002502000000b10a10286574685f627269646765207265717565737473206f7574676f696e6730457468506565727353796e6300000c013c69735f6272696467655f7265616479bc0110626f6f6c00013069735f786f725f7265616479bc0110626f6f6c00013069735f76616c5f7265616479bc0110626f6f6c0000b50a08286574685f627269646765304272696467655374617475730001082c496e697469616c697a6564000000244d6967726174696e6700010000b90a0c286574685f6272696467651870616c6c6574144572726f720404540001590144487474704665746368696e674572726f72000004504572726f72206665746368696e6720485454502e3c4163636f756e744e6f74466f756e64000104484163636f756e74206e6f7420666f756e642e24466f7262696464656e00020428466f7262696464656e2e68526571756573744973416c726561647952656769737465726564000304785265717565737420697320616c726561647920726567697374657265642e5c4661696c6564546f4c6f61645472616e73616374696f6e000404944661696c656420746f206c6f61642073696465636861696e207472616e73616374696f6e2e544661696c6564546f4c6f6164507265636973696f6e0005047c4661696c656420746f206c6f616420746f6b656e20707265636973696f6e2e3c556e6b6e6f776e4d6574686f64496400060448556e6b6e6f776e206d6574686f642049442e50496e76616c696446756e6374696f6e496e70757400070480496e76616c696420636f6e74726163742066756e6374696f6e20696e7075742e40496e76616c69645369676e61747572650008045c496e76616c69642070656572207369676e61747572652e2c496e76616c696455696e740009044c496e76616c69642075696e742076616c75652e34496e76616c6964416d6f756e74000a0454496e76616c696420616d6f756e742076616c75652e38496e76616c696442616c616e6365000b0458496e76616c69642062616c616e63652076616c75652e34496e76616c6964537472696e67000c0454496e76616c696420737472696e672076616c75652e2c496e76616c696442797465000d044c496e76616c696420627974652076616c75652e38496e76616c696441646472657373000e0458496e76616c696420616464726573732076616c75652e38496e76616c696441737365744964000f045c496e76616c69642061737365742069642076616c75652e40496e76616c69644163636f756e74496400100464496e76616c6964206163636f756e742069642076616c75652e2c496e76616c6964426f6f6c0011044c496e76616c696420626f6f6c2076616c75652e2c496e76616c6964483235360012044c496e76616c696420683235362076616c75652e30496e76616c6964417272617900130450496e76616c69642061727261792076616c75652e30556e6b6e6f776e4576656e740014045c556e6b6e6f776e20636f6e7472616374206576656e742e4c556e6b6e6f776e546f6b656e4164647265737300150458556e6b6e6f776e20746f6b656e20616464726573732e604e6f4c6f63616c4163636f756e74466f725369676e696e670016049c4e6f206c6f63616c206163636f756e7420666f72207369676e696e6720617661696c61626c652e48556e737570706f727465644173736574496400170454556e737570706f727465642061737365742069642e4c4661696c6564546f5369676e4d6573736167650018045c4661696c656420746f207369676e206d6573736167652e744661696c6564546f53656e645369676e65645472616e73616374696f6e001904784661696c656420746f2073656e64207369676e6564206d6573736167652e68546f6b656e49734e6f744f776e65644279546865417574686f72001a0484546f6b656e206973206e6f74206f776e65642062792074686520617574686f722e4c546f6b656e4973416c72656164794164646564001b045c546f6b656e20697320616c72656164792061646465642e444475706c69636174656452657175657374001c044c4475706c69636174656420726571756573742e40556e737570706f72746564546f6b656e001d0454546f6b656e20697320756e737570706f727465642e48556e6b6e6f776e5065657241646472657373001e0454556e6b6e6f776e207065657220616464726573732e4c457468416269456e636f64696e674572726f72001f0470457468657265756d2041424920656e636f64696e67206572726f722e4c4574684162694465636f64696e674572726f7200200470457468657265756d20414249206465636f64696e67206572726f722e584574685472616e73616374696f6e49734661696c65640021047c457468657265756d207472616e73616374696f6e206973206661696c65642e644574685472616e73616374696f6e497353756363656564656400220488457468657265756d207472616e73616374696f6e206973207375636365656465642e5c4574685472616e73616374696f6e497350656e64696e6700230480457468657265756d207472616e73616374696f6e2069732070656e64696e672e404574684c6f6757617352656d6f76656400240464457468657265756d206c6f67207761732072656d6f7665642e344e6f50656e64696e6750656572002504404e6f2070656e64696e6720706565722e4057726f6e6750656e64696e67506565720026044c57726f6e672070656e64696e6720706565722e4c546f6f4d616e7950656e64696e6750656572730027045c546f6f206d616e792070656e64696e672070656572732e504661696c6564546f476574417373657442794964002804744661696c656420746f2067657420616e2061737365742062792069642e4043616e744164644d6f726550656572730029045443616e277420616464206d6f72652070656572732e4c43616e7452656d6f76654d6f72655065657273002a046043616e27742072656d6f7665206d6f72652070656572732e48506565724973416c72656164794164646564002b04585065657220697320616c72656164792061646465642e34556e6b6e6f776e506565724964002c0440556e6b6e6f776e20706565722069642e4043616e745265736572766546756e6473002d045043616e277420726573657276652066756e64732e38416c7265616479436c61696d6564002e046846756e64732061726520616c726561647920636c61696d65642e5c4661696c6564546f4c6f6164426c6f636b486561646572002f04984661696c656420746f206c6f61642073756273747261746520626c6f636b206865616465722e644661696c6564546f4c6f616446696e616c697a656448656164003004a04661696c656420746f206c6f6164207375627374726174652066696e616c697a656420686561642e58556e6b6e6f776e436f6e74726163744164647265737300310464556e6b6e6f776e20636f6e747261637420616464726573732e50496e76616c6964436f6e7472616374496e7075740032045c496e76616c696420636f6e747261637420696e7075742e705265717565737449734e6f744f776e65644279546865417574686f720033048c52657175657374206973206e6f74206f776e65642062792074686520617574686f722e644661696c6564546f5061727365547848617368496e43616c6c003404ac4661696c656420746f207061727365207472616e73616374696f6e206861736820696e20612063616c6c2e445265717565737449734e6f7452656164790035045452657175657374206973206e6f742072656164792e38556e6b6e6f776e5265717565737400360440556e6b6e6f776e20726571756573742e78526571756573744e6f7446696e616c697a65644f6e53696465636861696e0037049852657175657374206973206e6f742066696e616c697a6564206f6e2053696465636861696e2e38556e6b6e6f776e4e6574776f726b00380440556e6b6e6f776e206e6574776f726b2e68436f6e74726163744973496e4d6967726174696f6e53746167650039047c436f6e747261637420697320696e206d6967726174696f6e2073746167652e74436f6e747261637449734e6f74496e4d6967726174696f6e5374616765003a048c436f6e7472616374206973206e6f74206f6e206d6967726174696f6e2073746167652e84436f6e74726163744973416c7265616479496e4d6967726174696f6e5374616765003b049c436f6e747261637420697320616c726561647920696e206d6967726174696f6e2073746167652e2c556e617661696c61626c65003c047446756e6374696f6e616c69747920697320756e617661696c61626c652e444661696c6564546f556e72657365727665003d04684661696c656420746f20756e726573657276652061737365742e8453696465636861696e41737365744973416c726561647952656769737465726564003e04a45468652073696465636861696e20617373657420697320616c7265647920726567697374657265642e5c45787065637465644f7574676f696e6752657175657374003f0474457870656374656420616e206f7574676f696e6720726571756573742e5c4578706563746564496e636f6d696e675265717565737400400474457870656374656420616e20696e636f6d696e6720726571756573742e38556e6b6e6f776e4173736574496400410444556e6b6e6f776e2061737365742069642e584a736f6e53657269616c697a6174696f6e4572726f72004204644661696c656420746f2073657269616c697a65204a534f4e2e604a736f6e446573657269616c697a6174696f6e4572726f720043046c4661696c656420746f20646573657269616c697a65204a534f4e2e7c4661696c6564546f4c6f616453696465636861696e4e6f6465506172616d73004404a44661696c656420746f206c6f61642073696465636861696e206e6f646520706172616d65746572732e884661696c6564546f4c6f616443757272656e7453696465636861696e486569676874004504a04661696c656420746f206c6f61642063757272656e742073696465636861696e206865696768742e484661696c6564546f4c6f6164497355736564004604a84661696c656420746f2071756572792073696465636861696e20277573656427207661726961626c652e9c5472616e73616374696f6e4d69676874486176654661696c6564447565546f4761734c696d6974004704e453696465636861696e207472616e73616374696f6e206d696768742068617665206661696c65642064756520746f20676173206c696d69742e4c4578706563746564584f525472616e736665720048047c41207472616e73666572206f6620584f52207761732065787065637465642e3c556e61626c65546f5061794665657300490470556e61626c6520746f20706179207472616e7366657220666565732e2443616e63656c6c6564004a049054686520726571756573742077617320707572706f73656c792063616e63656c6c65642e64556e737570706f727465644173736574507265636973696f6e004b0470556e737570706f7274656420617373657420707265636973696f6e2e2c4e6f6e5a65726f44757374004c04384e6f6e2d7a65726f20647573742e2c496e635265664572726f72004d0488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e144f74686572004e0438556e6b6e6f776e206572726f722e58457870656374656450656e64696e6752657175657374004f046445787065637465642070656e64696e6720726571756573742e4845787065637465644574684e6574776f726b00500468457870656374656420457468657265756d206e6574776f726b2e4852656d6f766564416e64526566756e6465640051048452657175657374207761732072656d6f76656420616e6420726566756e6465642e58417574686f726974794163636f756e744e6f7453657400520474417574686f72697479206163636f756e74206973206e6f74207365742e384e6f74456e6f7567685065657273005304a84e6f7420656e6f7567682070656572732070726f76696465642c206e656564206174206c656173742031405265616453746f726167654572726f72005404ac4661696c656420746f20726561642076616c75652066726f6d206f6666636861696e2073746f726167652e3c556e736166654d6967726174696f6e0055040501427269646765206e6565647320746f2068617665206174206c65617374203320706565727320666f72206d6967726174696f6e2e20416464206e6577207065657204b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909bd0a000004101000101000c10a000004083d013d0100c50a0c4870737761705f646973747269627574696f6e1870616c6c6574144572726f720404540001184043616c63756c6174696f6e4572726f720000042d014572726f72206f6363757272656420647572696e672063616c63756c6174696f6e2c20652e672e20756e646572666c6f772f6f766572666c6f77206f6620736861726520616d6f756e742e48537562736372697074696f6e41637469766500010421014572726f72207768696c6520617474656d7074696e6720746f20737562736372696265204163636f756e7420776869636820697320616c726561647920737562736372696265642e4c556e6b6e6f776e537562736372697074696f6e00020419014572726f72207768696c6520617474656d7074696e6720746f20756e737562736372696265204163636f756e74207768696368206973206e6f7420737562736372696265642e40496e76616c69644672657175656e637900030465014572726f72207768696c652073657474696e67206672657175656e63792c20737562736372697074696f6e2063616e206f6e6c7920626520696e766f6b656420666f72206672657175656e63792076616c7565203e3d20312e5c5a65726f436c61696d61626c65496e63656e7469766573000404190143616e277420636c61696d20696e63656e7469766573206173206e6f6e6520697320617661696c61626c6520666f72206163636f756e7420617420746865206d6f6d656e742e2c496e635265664572726f7200050488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909c90a083c70616c6c65745f6d756c7469736967204d756c7469736967102c426c6f636b4e756d62657201101c42616c616e63650118244163636f756e7449640100304d6178417070726f76616c7300001001107768656e9d01015854696d65706f696e743c426c6f636b4e756d6265723e00011c6465706f73697418011c42616c616e63650001246465706f7369746f720001244163636f756e744964000124617070726f76616c73cd0a018c426f756e6465645665633c4163636f756e7449642c204d6178417070726f76616c733e0000cd0a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400250201185665633c543e0000d10a0c3c70616c6c65745f6d756c74697369671870616c6c6574144572726f72040454000138404d696e696d756d5468726573686f6c640000047c5468726573686f6c64206d7573742062652032206f7220677265617465722e3c416c7265616479417070726f766564000104ac43616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e444e6f417070726f76616c734e65656465640002049c43616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e44546f6f4665775369676e61746f72696573000304a854686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e48546f6f4d616e795369676e61746f72696573000404ac54686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e545369676e61746f726965734f75744f664f726465720005040d01546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e4c53656e646572496e5369676e61746f726965730006040d015468652073656e6465722077617320636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e27742062652e204e6f74466f756e64000704dc4d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e204e6f744f776e65720008042d014f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e2c4e6f54696d65706f696e740009041d014e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e3857726f6e6754696d65706f696e74000a042d014120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e4c556e657870656374656454696d65706f696e74000b04f4412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e3c4d6178576569676874546f6f4c6f77000c04d0546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e34416c726561647953746f726564000d04a0546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909d50a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401d90a045300000400e10a01185665633c543e0000d90a04184f7074696f6e04045401dd0a0108104e6f6e6500000010536f6d650400dd0a0000010000dd0a084070616c6c65745f7363686564756c6572245363686564756c656414104e616d6501041043616c6c0139052c426c6f636b4e756d62657201103450616c6c6574734f726967696e015104244163636f756e7449640100001401206d617962655f6964a90101304f7074696f6e3c4e616d653e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c3905011043616c6c0001386d617962655f706572696f646963e10501944f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d6265723e3e0001186f726967696e5104013450616c6c6574734f726967696e0000e10a000002d90a00e50a0c4070616c6c65745f7363686564756c65721870616c6c6574144572726f72040454000114404661696c6564546f5363686564756c65000004644661696c656420746f207363686564756c6520612063616c6c204e6f74466f756e640001047c43616e6e6f742066696e6420746865207363686564756c65642063616c6c2e5c546172676574426c6f636b4e756d626572496e50617374000204a4476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e4852657363686564756c654e6f4368616e6765000304f052657363686564756c65206661696c6564206265636175736520697420646f6573206e6f74206368616e6765207363686564756c65642074696d652e144e616d6564000404d0417474656d707420746f207573652061206e6f6e2d6e616d65642066756e6374696f6e206f6e2061206e616d6564207461736b2e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909e90a000002ed0a00ed0a00000408bcb10100f10a083c69726f68615f6d6967726174696f6e5850656e64696e674d756c74697369674163636f756e740404540000080148617070726f76696e675f6163636f756e7473250201445665633c543a3a4163636f756e7449643e0001286d6967726174655f6174450501584f7074696f6e3c543a3a426c6f636b4e756d6265723e0000f50a0c3c69726f68615f6d6967726174696f6e1870616c6c6574144572726f72040454000128585075626c69634b657950617273696e674661696c6564000004684661696c656420746f207061727365207075626c6963206b6579585369676e617475726550617273696e674661696c6564000104644661696c656420746f207061727365207369676e61747572656c5369676e6174757265566572696669636174696f6e4661696c6564000204684661696c656420746f20766572696679207369676e61747572653c4163636f756e744e6f74466f756e640003046849726f6861206163636f756e74206973206e6f7420666f756e64445075626c69634b65794e6f74466f756e640004045c5075626c6963206b6579206973206e6f7420666f756e64505075626c69634b6579416c726561647955736564000504685075626c6963206b657920697320616c72656164792075736564584163636f756e74416c72656164794d696772617465640006048449726f6861206163636f756e7420697320616c7265616479206d696772617465645c526566657272616c4d6967726174696f6e4661696c656400070464526566657272616c206d6967726174696f6e206661696c6564584d756c74695369674372656174696f6e4661696c65640008049c4d696c74692d7369676e6174757265206163636f756e74206372656174696f6e206661696c65645c5369676e61746f72794164646974696f6e4661696c6564000904d05369676e61746f7279206164646974696f6e20746f206d756c74692d7369676e6174757265206163636f756e74206661696c656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909f90a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400250201185665633c543e0000fd0a0c4470616c6c65745f6d656d626572736869701870616c6c6574144572726f7208045400044900010c34416c72656164794d656d62657200000444416c72656164792061206d656d6265722e244e6f744d656d626572000104344e6f742061206d656d6265722e38546f6f4d616e794d656d6265727300020444546f6f206d616e79206d656d626572732e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909010b000002050b00050b086470616c6c65745f656c656374696f6e735f70687261676d656e2853656174486f6c64657208244163636f756e74496401001c42616c616e63650118000c010c77686f0001244163636f756e7449640001147374616b6518011c42616c616e636500011c6465706f73697418011c42616c616e63650000090b086470616c6c65745f656c656374696f6e735f70687261676d656e14566f74657208244163636f756e74496401001c42616c616e63650118000c0114766f746573250201385665633c4163636f756e7449643e0001147374616b6518011c42616c616e636500011c6465706f73697418011c42616c616e636500000d0b0c6470616c6c65745f656c656374696f6e735f70687261676d656e1870616c6c6574144572726f7204045400014430556e61626c65546f566f7465000004c043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f746573000104944d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f7465730002048443616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f74657345786365656465640003049843616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e6365000404c443616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e6400050478566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f746572000604404d757374206265206120766f7465722e4c4475706c69636174656443616e646964617465000704804475706c6963617465642063616e646964617465207375626d697373696f6e2e44546f6f4d616e7943616e6469646174657300080498546f6f206d616e792063616e646964617465732068617665206265656e20637265617465642e304d656d6265725375626d6974000904884d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3852756e6e657255705375626d6974000a048852756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e6473000b049443616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e244e6f744d656d626572000c04344e6f742061206d656d6265722e48496e76616c69645769746e65737344617461000d04e05468652070726f766964656420636f756e74206f66206e756d626572206f662063616e6469646174657320697320696e636f72726563742e40496e76616c6964566f7465436f756e74000e04cc5468652070726f766964656420636f756e74206f66206e756d626572206f6620766f74657320697320696e636f72726563742e44496e76616c696452656e6f756e63696e67000f04fc5468652072656e6f756e63696e67206f726967696e2070726573656e74656420612077726f6e67206052656e6f756e63696e676020706172616d657465722e48496e76616c69645265706c6163656d656e74001004fc50726564696374696f6e20726567617264696e67207265706c6163656d656e74206166746572206d656d6265722072656d6f76616c2069732077726f6e672e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909110b08387665737465645f7265776172647328526577617264496e666f00000c01146c696d697418011c42616c616e636500013c746f74616c5f617661696c61626c6518011c42616c616e636500011c726577617264730106017c42547265654d61703c526577617264526561736f6e2c2042616c616e63653e0000150b08387665737465645f726577617264733443726f77646c6f616e496e666f0c1c41737365744964010d012c426c6f636b4e756d6265720110244163636f756e744964010000140148746f74616c5f636f6e747269627574696f6e18011c42616c616e636500011c726577617264731506015c5665633c28417373657449642c2042616c616e6365293e00012c73746172745f626c6f636b10012c426c6f636b4e756d6265720001186c656e67746810012c426c6f636b4e756d62657200011c6163636f756e740001244163636f756e7449640000190b0000040800f905001d0b08387665737465645f726577617264734443726f77646c6f616e55736572496e666f041c41737365744964010d0100080130636f6e747269627574696f6e18011c42616c616e636500012072657761726465641506015c5665633c28417373657449642c2042616c616e6365293e0000210b0c387665737465645f726577617264731870616c6c6574144572726f72040454000140384e6f7468696e67546f436c61696d000004a04163636f756e7420686173206e6f2070656e64696e67207265776172647320746f20636c61696d2e48436c61696d4c696d69744578636565646564000104ec4163636f756e74206861732070656e64696e6720726577617264732062757420697420686173206e6f74206265656e20766573746564207965742e4c556e68616e646c656452657761726454797065000204dc417474656d707420746f20636c61696d2072657761726473206f6620747970652c207768696368206973206e6f742068616e646c65642e5452657761726473537570706c7953686f727461676500030849014163636f756e7420686f6c64696e67206465646963617465642072657761726420726573657276657320697320656d7074792e2054686973206c696b656c79206d65616e73207468617420736f6d65206f66807265776172642070726f6772616d6d657320686176652066696e69736865642e2c496e635265664572726f7200040488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e5043616e745375627472616374536e617073686f74000504f0417474656d707420746f207375627472616374206d6f72652076696120736e617073686f74207468616e2061737369676e656420746f20757365722e4c43616e7443616c63756c617465526577617264000604944661696c656420746f20706572666f726d207265776172642063616c63756c6174696f6e2e444e6f52657761726473466f72417373657400070498546865726520617265206e6f207265776172647320666f72207468652061737365742049442e3c41726974686d657469634572726f720008041101536f6d657468696e672069732077726f6e6720776974682061726974686d65746963202d206f766572666c6f772068617070656e65642c20666f72206578616d706c652e544e756d626572436f6e76657273696f6e4572726f72000904150154686973206572726f722061707065617273206f6e2077726f6e6720636f6e76657273696f6e206f662061206e756d62657220696e746f20616e6f7468657220747970652e64556e61626c65546f4765744261736541737365745072696365000a046501556e61626c6520746f20676574206261736520617373657420707269636520696e20584f522e20584f522d6261736520617373657420706169722073686f756c64206578697374206f6e20506f6c6b6173776170204445582e5843726f77646c6f616e416c7265616479457869737473000b04ac43726f77646c6f616e207769746820676976656e2074616720616c726561647920726567697374657265644857726f6e6743726f77646c6f616e496e666f000c046c57726f6e672063726f77646c6f616e2064617461207061737365649843726f77646c6f616e52657761726473446973747269627574696f6e4e6f7453746172746564000d04b443726f77646c6f616e207265776172647320646973747269627574696f6e206973206e6f7420737461727465645843726f77646c6f616e446f65734e6f74457869737473000e046443726f77646c6f616e20646f6573206e6f74206578697374735c4e6f7443726f77646c6f616e5061727469636970616e74000f048455736572206973206e6f742063726f77646c6f616e207061727469636970616e7404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909250b0c3c70616c6c65745f6964656e7469747914747970657330526567697374726174696f6e0c1c42616c616e63650118344d61784a756467656d656e7473004c4d61784164646974696f6e616c4669656c647300000c01286a756467656d656e7473290b01fc426f756e6465645665633c28526567697374726172496e6465782c204a756467656d656e743c42616c616e63653e292c204d61784a756467656d656e74733e00011c6465706f73697418011c42616c616e6365000110696e666f210601844964656e74697479496e666f3c4d61784164646974696f6e616c4669656c64733e0000290b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012d0b045300000400310b01185665633c543e00002d0b0000040810b90600310b0000022d0b00350b0000040818390b00390b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400250201185665633c543e00003d0b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401410b045300000400490b01185665633c543e0000410b04184f7074696f6e04045401450b0108104e6f6e6500000010536f6d650400450b0000010000450b0c3c70616c6c65745f6964656e7469747914747970657334526567697374726172496e666f081c42616c616e63650118244163636f756e7449640100000c011c6163636f756e740001244163636f756e74496400010c66656518011c42616c616e63650001186669656c6473b10601384964656e746974794669656c64730000490b000002410b004d0b0c3c70616c6c65745f6964656e746974791870616c6c6574144572726f7204045400014848546f6f4d616e795375624163636f756e74730000045c546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e64000104504163636f756e742069736e277420666f756e642e204e6f744e616d6564000204504163636f756e742069736e2774206e616d65642e28456d707479496e64657800030430456d70747920696e6465782e284665654368616e6765640004043c466565206973206368616e6765642e284e6f4964656e74697479000504484e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e7400060444537469636b79206a756467656d656e742e384a756467656d656e74476976656e000704404a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e7400080448496e76616c6964206a756467656d656e742e30496e76616c6964496e6465780009045454686520696e64657820697320696e76616c69642e34496e76616c6964546172676574000a04585468652074617267657420697320696e76616c69642e34546f6f4d616e794669656c6473000b046c546f6f206d616e79206164646974696f6e616c206669656c64732e44546f6f4d616e7952656769737472617273000c04e84d6178696d756d20616d6f756e74206f66207265676973747261727320726561636865642e2043616e6e6f742061646420616e79206d6f72652e38416c7265616479436c61696d6564000d04704163636f756e7420494420697320616c7265616479206e616d65642e184e6f74537562000e047053656e646572206973206e6f742061207375622d6163636f756e742e204e6f744f776e6564000f04885375622d6163636f756e742069736e2774206f776e65642062792073656e6465722e744a756467656d656e74466f72446966666572656e744964656e74697479001004d05468652070726f7669646564206a756467656d656e742077617320666f72206120646966666572656e74206964656e746974792e584a756467656d656e745061796d656e744661696c6564001104f84572726f722074686174206f6363757273207768656e20746865726520697320616e20697373756520706179696e6720666f72206a756467656d656e742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909510b000002550b00550b081c6661726d696e6728506f6f6c4661726d657204045400000c011c6163636f756e74000130543a3a4163636f756e744964000114626c6f636b100138543a3a426c6f636b4e756d62657200011877656967687418011c42616c616e63650000590b0c1c6661726d696e671870616c6c6574144572726f720404540001042c496e635265664572726f7200000488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909095d0b080c7873743453796e746865746963496e666f041853796d626f6c01d501000801407265666572656e63655f73796d626f6cd501011853796d626f6c0001246665655f726174696f3d01011446697865640000610b0c0c7873741870616c6c6574144572726f7204045400013058507269636543616c63756c6174696f6e4661696c6564000004b8416e206572726f72206f63637572726564207768696c652063616c63756c6174696e67207468652070726963652e54536c6970706167654c696d697445786365656465640001043101496e64696361746564206c696d69747320666f7220736c69707061676520686173206e6f74206265656e206d657420647572696e67207472616e73616374696f6e20657865637574696f6e2e3043616e7445786368616e676500020435014c697175696469747920736f757263652063616e27742065786368616e67652061737365747320776974682074686520676976656e20494473206f6e2074686520676976656e2044455849642e5453796e746865746963446f65734e6f7445786973740003047c53796e74686574696320617373657420646f6573206e6f742065786973742e4853796d626f6c446f65734e6f744578697374000404e4417474656d707420746f20656e61626c652073796e746865746963206173736574207769746820696e6578697374656e742073796d626f6c2e8853796d626f6c416c72656164795265666572656e636564546f53796e746865746963000508b4417474656d707420746f20656e61626c652073796e74686574696320617373657420776974682073796d626f6cc07468617420697320616c7265616479207265666572656e63656420746f20616e6f746865722073796e7468657469632e5453796e74686574696349734e6f74456e61626c6564000604dc417474656d707420746f2064697361626c652073796e7468657469632061737365742074686174206973206e6f7420656e61626c65642e404f7261636c6551756f74654572726f72000704804572726f722071756f74696e672070726963652066726f6d206f7261636c652e3c496e76616c6964466565526174696f00080460496e76616c69642066656520726174696f2076616c75652e64496e646976697369626c655265666572656e63654173736574000904845265666572656e6365206173736574206d75737420626520646976697369626c656843616e74456e61626c65496e646976697369626c654173736574000a048453796e746865746963206173736574206d75737420626520646976697369626c658453796e7468657469634261736542757953656c6c4c696d69744578636565646564000b04f4496e7075742f6f757470757420616d6f756e74206f662073796e7468657469632062617365206173736574206578636565647320746865206c696d697404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909650b082c70726963655f746f6f6c734c416767726567617465645072696365496e666f000008010c627579690b01245072696365496e666f00011073656c6c690b01245072696365496e666f0000690b082c70726963655f746f6f6c73245072696365496e666f000014013870726963655f6661696c7572657310010c75333200012c73706f745f7072696365731104014456656344657175653c42616c616e63653e000134617665726167655f707269636518011c42616c616e63650001306e656564735f757064617465bc0110626f6f6c00013c6c6173745f73706f745f707269636518011c42616c616e636500006d0b0c2c70726963655f746f6f6c731870616c6c6574144572726f7204045400011c7441766572616765507269636543616c63756c6174696f6e4661696c6564000004984661696c656420746f2063616c63756c617465206e657720617665726167652070726963652e80557064617465417665726167655769746853706f7450726963654661696c6564000104a04661696c656420746f20616464206e65772073706f7420707269636520746f20617665726167652e64496e73756666696369656e7453706f7450726963654461746100020855014569746865722073706f74207072696365207265636f72647320686173206265656e207265736574206f72206e6f7420696e697469616c697a6564207965742e20576169742074696c6c2073706f74207072696365b071756f7465206973207265636f766572656420616e64207370616e20697320726563616c63756c617465642e50556e737570706f7274656451756f746550617468000304985265717565737465642071756f74652070617468206973206e6f7420737570706f727465642e644661696c6564546f51756f7465417665726167655072696365000404b44661696c656420746f20706572666f726d2071756f746520746f2067657420617665726167652070726963652e584173736574416c726561647952656769737465726564000504904173736574496420686173206265656e20616c726561647920726567697374657265642e5843616e744475706c69636174654c6173745072696365000604450153706f7420707269636520666f7220617373657420686173206e6f74206368616e6765642062757420696e666f20666f72206c6173742073706f7420707269636520697320756e617661696c61626c652e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909710b083463657265735f7374616b696e672c5374616b696e67496e666f00000801246465706f736974656418011c42616c616e636500011c7265776172647318011c42616c616e63650000750b0c3463657265735f7374616b696e671870616c6c6574144572726f72040454000108445374616b696e67506f6f6c497346756c6c000004505374616b696e6720706f6f6c2069732066756c6c30556e617574686f72697a656400010430556e617574686f72697a656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909790b085863657265735f6c69717569646974795f6c6f636b65723853746f7261676556657273696f6e000108085631000000085632000100007d0b000002810b00810b085863657265735f6c69717569646974795f6c6f636b6572204c6f636b496e666f0c1c42616c616e63650118184d6f6d656e7401281c41737365744964010d010010012c706f6f6c5f746f6b656e7318011c42616c616e636500014c756e6c6f636b696e675f74696d657374616d702801184d6f6d656e7400011c61737365745f610d01011c4173736574496400011c61737365745f620d01011c417373657449640000850b0c5863657265735f6c69717569646974795f6c6f636b65721870616c6c6574144572726f7204045400011440506f6f6c446f65734e6f7445786973740000044c506f6f6c20646f6573206e6f742065786973746c496e73756666696369656e744c6971756964697479546f4c6f636b00010478496e73756666696369656e74206c697175696469747920746f206c6f636b44496e76616c696450657263656e746167650002047050657263656e746167652067726561746572207468616e203130302530556e617574686f72697a65640003044c556e617574686f72697a65642061636365737364496e76616c6964556e6c6f636b696e6754696d657374616d7000040480556e6c6f636b696e6720646174652063616e6e6f7420626520696e207061737404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909890b084863657265735f746f6b656e5f6c6f636b65723853746f7261676556657273696f6e000108085631000000085632000100008d0b000002910b00910b084863657265735f746f6b656e5f6c6f636b657234546f6b656e4c6f636b496e666f0c1c42616c616e63650118184d6f6d656e7401281c41737365744964010d01000c0118746f6b656e7318011c42616c616e636500014c756e6c6f636b696e675f74696d657374616d702801184d6f6d656e7400012061737365745f69640d01011c417373657449640000950b0c4863657265735f746f6b656e5f6c6f636b65721870616c6c6574144572726f7204045400011854496e76616c69644e756d6265724f66546f6b656e73000004704e756d626572206f6620746f6b656e7320657175616c73207a65726f30556e617574686f72697a65640001044c556e617574686f72697a65642061636365737364496e76616c6964556e6c6f636b696e6754696d657374616d7000020480556e6c6f636b696e6720646174652063616e6e6f7420626520696e2070617374384e6f74456e6f75676846756e6473000304404e6f7420656e6f7567682066756e6473384e6f74556e6c6f636b65645965740004045c546f6b656e73206e6f7420756e6c6f636b656420796574504c6f636b496e666f446f65734e6f744578697374000504604c6f636b20696e666f20646f6573206e6f7420657869737404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909990b000004082c00009d0b086463657265735f676f7665726e616e63655f706c6174666f726d28566f74696e67496e666f00000c0134766f74696e675f6f7074696f6e10010c75333200013c6e756d6265725f6f665f766f74657318011c42616c616e636500013c61737365745f77697468647261776ebc0110626f6f6c0000a10b086463657265735f676f7665726e616e63655f706c6174666f726d20506f6c6c496e666f181c41737365744964010d01184d6f6d656e7401282c537472696e674c696d697400304f7074696f6e734c696d697400285469746c654c696d697400404465736372697074696f6e4c696d69740000180128706f6c6c5f61737365740d01011c41737365744964000150706f6c6c5f73746172745f74696d657374616d702801184d6f6d656e74000148706f6c6c5f656e645f74696d657374616d702801184d6f6d656e740001147469746c65ed010164426f756e646564537472696e673c5469746c654c696d69743e00012c6465736372697074696f6ed106017c426f756e646564537472696e673c4465736372697074696f6e4c696d69743e00011c6f7074696f6e73d90601d0426f756e6465645665633c426f756e646564537472696e673c537472696e674c696d69743e2c204f7074696f6e734c696d69743e0000a50b086463657265735f676f7665726e616e63655f706c6174666f726d3853746f7261676556657273696f6e00010c08563100000008563200010008563300020000a90b0c6463657265735f676f7665726e616e63655f706c6174666f726d1870616c6c6574144572726f7204045400014038506f6c6c497346696e697368656400000440506f6c6c2069732066696e697368656440506f6c6c49734e6f74537461727465640001044c506f6c6c206973206e6f742073746172746564384e6f74456e6f75676846756e6473000204404e6f7420656e6f7567682066756e647328566f746544656e6965640003042c566f74652064656e69656454496e76616c6964537461727454696d657374616d700004045c496e76616c69642073746172742074696d657374616d704c496e76616c6964456e6454696d657374616d7000050454496e76616c696420656e642074696d657374616d7044506f6c6c49734e6f7446696e697368656400060450506f6c6c206973206e6f742066696e697368656450496e76616c69644e756d6265724f66566f7465730007045c496e76616c6964206e756d626572206f6620766f7465735446756e6473416c726561647957697468647261776e0008046046756e647320616c72656164792077697468647261776e2c50496e76616c6964566f74696e674f7074696f6e7300090458496e76616c696420766f74696e67206f7074696f6e7350546f6f4d616e79566f74696e674f7074696f6e73000a045c546f6f206d616e7920766f74696e67206f7074696f6e73404475706c69636174654f7074696f6e73000b04444475706c6963617465206f7074696f6e7340506f6c6c446f65734e6f744578697374000c044c506f6c6c20646f6573206e6f7420657869737434496e76616c69644f7074696f6e000d0438496e76616c6964206f7074696f6e204e6f74566f746564000e04244e6f7420766f74656430556e617574686f72697a6564000f0430556e617574686f72697a656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909ad0b083c63657265735f6c61756e63687061641c494c4f496e666f101c42616c616e63650118244163636f756e7449640100184d6f6d656e7401281c41737365744964010d0100600134696c6f5f6f7267616e697a65720001244163636f756e744964000138746f6b656e735f666f725f696c6f18011c42616c616e6365000150746f6b656e735f666f725f6c697175696469747918011c42616c616e6365000124696c6f5f707269636518011c42616c616e6365000120736f66745f63617018011c42616c616e6365000120686172645f63617018011c42616c616e63650001406d696e5f636f6e747269627574696f6e18011c42616c616e63650001406d61785f636f6e747269627574696f6e18011c42616c616e636500012c726566756e645f74797065bc0110626f6f6c0001446c69717569646974795f70657263656e7418011c42616c616e63650001346c697374696e675f707269636518011c42616c616e636500012c6c6f636b75705f6461797310010c75333200013c73746172745f74696d657374616d702801184d6f6d656e74000134656e645f74696d657374616d702801184d6f6d656e74000150636f6e7472696275746f72735f76657374696e67b10b0190436f6e7472696275746f727356657374696e673c42616c616e63652c204d6f6d656e743e0001307465616d5f76657374696e67b50b01705465616d56657374696e673c42616c616e63652c204d6f6d656e743e00012c736f6c645f746f6b656e7318011c42616c616e636500013066756e64735f72616973656418011c42616c616e6365000124737563636565646564bc0110626f6f6c0001186661696c6564bc0110626f6f6c0001246c705f746f6b656e7318011c42616c616e6365000144636c61696d65645f6c705f746f6b656e73bc0110626f6f6c00014066696e6973685f74696d657374616d702801184d6f6d656e74000128626173655f61737365740d01011c417373657449640000b10b083c63657265735f6c61756e63687061644c436f6e7472696275746f727356657374696e67081c42616c616e63650118184d6f6d656e740128000c015466697273745f72656c656173655f70657263656e7418011c42616c616e636500013876657374696e675f706572696f642801184d6f6d656e7400013c76657374696e675f70657263656e7418011c42616c616e63650000b50b083c63657265735f6c61756e63687061642c5465616d56657374696e67081c42616c616e63650118184d6f6d656e740128001001647465616d5f76657374696e675f746f74616c5f746f6b656e7318011c42616c616e63650001887465616d5f76657374696e675f66697273745f72656c656173655f70657263656e7418011c42616c616e636500014c7465616d5f76657374696e675f706572696f642801184d6f6d656e740001507465616d5f76657374696e675f70657263656e7418011c42616c616e63650000b90b000004080d010000bd0b083c63657265735f6c61756e636870616440436f6e747269627574696f6e496e666f041c42616c616e636501180014014466756e64735f636f6e747269627574656418011c42616c616e6365000134746f6b656e735f626f7567687418011c42616c616e6365000138746f6b656e735f636c61696d656418011c42616c616e6365000144636c61696d696e675f66696e6973686564bc0110626f6f6c0001406e756d6265725f6f665f636c61696d7310010c7533320000c10b0c3c63657265735f6c61756e63687061641870616c6c6574144572726f720404540001a840494c4f416c726561647945786973747300000470494c4f20666f7220746f6b656e20616c7265616479206578697374734c506172616d6574657243616e7442655a65726f0001045c506172616d657465722063616e2774206265207a65726f38496e76616c6964536f6674436170000204a8536f6674206361702073686f756c64206265206d696e696d756d20353025206f6620686172642063617068496e76616c69644d696e696d756d436f6e747269627574696f6e00030425014d696e696d756d20636f6e747269627574696f6e206d75737420626520657175616c206f722067726561746572207468616e20302e3031206261736520617373657420746f6b656e7368496e76616c69644d6178696d756d436f6e747269627574696f6e000404f84d6178696d756d20636f6e747269627574696f6e206d7573742062652067726561746572207468616e206d696e696d756d20636f6e747269627574696f6e5c496e76616c69644c697175696469747950657263656e74000504c04d696e696d756d20353125206f66207261697365642066756e6473206d75737420676f20746f206c697175696469747944496e76616c69644c6f636b757044617973000604784c6f636b75702064617973206d757374206265206d696e696d756d20333054496e76616c6964537461727454696d657374616d700007047053746172742074696d657374616d7020626520696e206675747572654c496e76616c6964456e6454696d657374616d70000804c8456e642074696d657374616d70206d7573742062652067726561746572207468616e2073746172742074696d657374616d7030496e76616c69645072696365000904b04c697374696e67207072696365206d7573742062652067726561746572207468616e20494c4f20707269636584496e76616c69644e756d6265724f66546f6b656e73466f724c6971756964697479000a0498496e76616c6964206e756d626572206f6620746f6b656e7320666f72206c69717569646974796c496e76616c69644e756d6265724f66546f6b656e73466f72494c4f000b0480496e76616c6964206e756d626572206f6620746f6b656e7320666f7220494c4f68496e76616c6964466972737452656c6561736550657263656e74000c048c46697273742072656c656173652070657263656e742063616e2774206265207a65726f54496e76616c696456657374696e6750657263656e74000d045c496e76616c69642076657374696e672070657263656e7450496e76616c696456657374696e67506572696f64000e047056657374696e6720706572696f642063616e2774206265207a65726f384e6f74456e6f7567684365726573000f04404e6f7420656e6f7567682043455245533c4e6f74456e6f756768546f6b656e73001004544e6f7420656e6f75676820494c4f20746f6b656e7334494c4f4e6f74537461727465640011043c494c4f206e6f74207374617274656434494c4f497346696e697368656400120440494c4f2069732066696e69736865642c4c43616e74436f6e74726962757465496e494c4f0013045c43616e277420636f6e7472696275746520696e20494c4f304861726443617049734869740014043c486172642063617020697320686974504e6f74456e6f756768546f6b656e73546f427579001504604e6f7420656e6f75676820746f6b656e7320746f2062757968436f6e747269627574696f6e49734c6f7765725468656e4d696e00160478436f6e747269627574696f6e206973206c6f776572207468616e206d696e6c436f6e747269627574696f6e49734269676765725468656e4d61780017047c436f6e747269627574696f6e20697320626967676572207468616e206d6178384e6f74456e6f75676846756e6473001804404e6f7420656e6f7567682066756e64733c494c4f446f65734e6f74457869737400190470494c4f20666f7220746f6b656e20646f6573206e6f7420657869737440494c4f49734e6f7446696e6973686564001a044c494c4f206973206e6f742066696e697368656440506f6f6c446f65734e6f744578697374001b044c506f6f6c20646f6573206e6f7420657869737430556e617574686f72697a6564001c0430556e617574686f72697a65644443616e74436c61696d4c50546f6b656e73001d045443616e277420636c61696d204c5020746f6b656e734c46756e6473416c7265616479436c61696d6564001e045446756e647320616c726561647920636c61696d6564384e6f7468696e67546f436c61696d001f04404e6f7468696e6720746f20636c61696d2c494c4f49734661696c656400200434494c4f206973206661696c656438494c4f497353756363656564656400210440494c4f206973207375636365656465646c43616e74437265617465494c4f466f724c6973746564546f6b656e0022048443616e27742063726561746520494c4f20666f72206c697374656420746f6b656e5c4163636f756e7449734e6f7457686974656c6973746564002304684163636f756e74206973206e6f742077686974656c697374656478496e76616c69645465616d466972737452656c6561736550657263656e74002404a05465616d2066697273742072656c656173652070657263656e742063616e2774206265207a65726f64496e76616c69645465616d56657374696e6750657263656e74002504705465616d20696e76616c69642076657374696e672070657263656e7460496e76616c69645465616d56657374696e67506572696f64002604845465616d2076657374696e6720706572696f642063616e2774206265207a65726f644e6f74456e6f7567685465616d546f6b656e73546f4c6f636b002704784e6f7420656e6f756768207465616d20746f6b656e7320746f206c6f636b44496e76616c696446656550657263656e740028048c496e76616c6964206665652070657263656e74206f6e207261697365642066756e6473544261736541737365744e6f74537570706f72746564002904d8417373657420696e2077686963682066756e647320617265206265696e6720726169736564206973206e6f7420737570706f7274656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909c50b086064656d657465725f6661726d696e675f706c6174666f726d24546f6b656e496e666f04244163636f756e7449640100001c01586661726d735f746f74616c5f6d756c7469706c69657210010c7533320001607374616b696e675f746f74616c5f6d756c7469706c69657210010c75333200013c746f6b656e5f7065725f626c6f636b18011c42616c616e63650001406661726d735f616c6c6f636174696f6e18011c42616c616e63650001487374616b696e675f616c6c6f636174696f6e18011c42616c616e636500013c7465616d5f616c6c6f636174696f6e18011c42616c616e63650001307465616d5f6163636f756e740001244163636f756e7449640000c90b000002cd0b00cd0b086064656d657465725f6661726d696e675f706c6174666f726d2055736572496e666f041c41737365744964010d0100180128626173655f61737365740d01011c41737365744964000128706f6f6c5f61737365740d01011c417373657449640001307265776172645f61737365740d01011c4173736574496400011c69735f6661726dbc0110626f6f6c000134706f6f6c65645f746f6b656e7318011c42616c616e636500011c7265776172647318011c42616c616e63650000d10b000002d50b00d50b086064656d657465725f6661726d696e675f706c6174666f726d20506f6f6c44617461041c41737365744964010d01002401286d756c7469706c69657210010c75333200012c6465706f7369745f66656518011c42616c616e636500011c69735f636f7265bc0110626f6f6c00011c69735f6661726dbc0110626f6f6c000150746f74616c5f746f6b656e735f696e5f706f6f6c18011c42616c616e636500011c7265776172647318011c42616c616e6365000164726577617264735f746f5f62655f646973747269627574656418011c42616c616e636500012869735f72656d6f766564bc0110626f6f6c000128626173655f61737365740d01011c417373657449640000d90b086064656d657465725f6661726d696e675f706c6174666f726d3853746f7261676556657273696f6e00010808563100000008563200010000dd0b0c6064656d657465725f6661726d696e675f706c6174666f726d1870616c6c6574144572726f7204045400013458546f6b656e416c7265616479526567697374657265640000046c546f6b656e20697320616c726561647920726567697374657265645c546f6b656e506572426c6f636b43616e7442655a65726f00010474546f6b656e2070657220626c6f636b2063616e2774206265207a65726f6c496e76616c6964416c6c6f636174696f6e506172616d657465727300020474496e76616c696420616c6c6f636174696f6e20706172616d657465727344496e76616c69644d756c7469706c696572000304a04d756c7469706c696572206d7573742062652067726561746572206f7220657175616c20746f203144496e76616c69644465706f7369744665650004044c496e76616c6964206465706f7369742066656568526577617264546f6b656e49734e6f74526567697374657265640005045c546f6b656e206973206e6f74207265676973746572656444506f6f6c416c72656164794578697374730006044c506f6f6c20616c72656164792065786973747344496e73756666696369656e7446756e647300070448496e73756666696369656e742046756e64732c5a65726f52657761726473000804305a65726f205265776172647340506f6f6c446f65734e6f7445786973740009044c506f6f6c20646f6573206e6f7420657869737450496e73756666696369656e744c50546f6b656e73000a0458496e73756666696369656e74204c5020746f6b656e7358506f6f6c446f65734e6f744861766552657761726473000b046c506f6f6c20646f6573206e6f74206861766520726577617264732c30556e617574686f72697a6564000c0430556e617574686f72697a656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909e10b0c4070616c6c65745f626167735f6c697374106c697374104e6f646508045400044900001401086964000130543a3a4163636f756e74496400011070726576090201504f7074696f6e3c543a3a4163636f756e7449643e0001106e657874090201504f7074696f6e3c543a3a4163636f756e7449643e0001246261675f7570706572280120543a3a53636f726500011473636f7265280120543a3a53636f72650000e50b0c4070616c6c65745f626167735f6c697374106c6973740c426167080454000449000008011068656164090201504f7074696f6e3c543a3a4163636f756e7449643e0001107461696c090201504f7074696f6e3c543a3a4163636f756e7449643e0000e90b0000022800ed0b0c4070616c6c65745f626167735f6c6973741870616c6c6574144572726f72080454000449000104104c6973740400f10b01244c6973744572726f72000004b441206572726f7220696e20746865206c69737420696e7465726661636520696d706c656d656e746174696f6e2e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909f10b0c4070616c6c65745f626167735f6c697374106c697374244c6973744572726f72000110244475706c6963617465000000284e6f7448656176696572000100304e6f74496e53616d65426167000200304e6f64654e6f74466f756e6400030000f50b089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365345265616479536f6c7574696f6e04045400000c0120737570706f727473f90b01b0426f756e646564537570706f7274733c543a3a4163636f756e7449642c20543a3a4d617857696e6e6572733e00011473636f72650d020134456c656374696f6e53636f726500011c636f6d707574650502013c456c656374696f6e436f6d707574650000f90b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012d08045300000400290801185665633c543e0000fd0b089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736534526f756e64536e617073686f740404540000080118766f74657273010c013c5665633c566f7465724f663c543e3e00011c74617267657473250201445665633c543a3a4163636f756e7449643e0000010c000002050c00050c0000040c0028250900090c101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454010d0c045300000400110c01185665633c543e00000d0c0000040c0d02101000110c0000020d0c00150c0c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365187369676e6564405369676e65645375626d697373696f6e0c244163636f756e74496401001c42616c616e6365011820536f6c7574696f6e01f5060010010c77686f0001244163636f756e74496400011c6465706f73697418011c42616c616e63650001307261775f736f6c7574696f6ef1060154526177536f6c7574696f6e3c536f6c7574696f6e3e00012063616c6c5f66656518011c42616c616e63650000190c0c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144572726f720404540001386850726544697370617463684561726c795375626d697373696f6e000004645375626d697373696f6e2077617320746f6f206561726c792e6c507265446973706174636857726f6e6757696e6e6572436f756e740001048857726f6e67206e756d626572206f662077696e6e6572732070726573656e7465642e6450726544697370617463685765616b5375626d697373696f6e000204905375626d697373696f6e2077617320746f6f207765616b2c2073636f72652d776973652e3c5369676e6564517565756546756c6c0003044901546865207175657565207761732066756c6c2c20616e642074686520736f6c7574696f6e20776173206e6f7420626574746572207468616e20616e79206f6620746865206578697374696e67206f6e65732e585369676e656443616e6e6f745061794465706f73697400040494546865206f726967696e206661696c656420746f2070617920746865206465706f7369742e505369676e6564496e76616c69645769746e657373000504a05769746e657373206461746120746f20646973706174636861626c6520697320696e76616c69642e4c5369676e6564546f6f4d756368576569676874000604b8546865207369676e6564207375626d697373696f6e20636f6e73756d657320746f6f206d756368207765696768743c4f637743616c6c57726f6e67457261000704984f4357207375626d697474656420736f6c7574696f6e20666f722077726f6e6720726f756e645c4d697373696e67536e617073686f744d65746164617461000804a8536e617073686f74206d657461646174612073686f756c6420657869737420627574206469646e27742e58496e76616c69645375626d697373696f6e496e646578000904d06053656c663a3a696e736572745f7375626d697373696f6e602072657475726e656420616e20696e76616c696420696e6465782e3843616c6c4e6f74416c6c6f776564000a04985468652063616c6c206973206e6f7420616c6c6f776564206174207468697320706f696e742e3846616c6c6261636b4661696c6564000b044c5468652066616c6c6261636b206661696c65642c426f756e644e6f744d6574000c0448536f6d6520626f756e64206e6f74206d657438546f6f4d616e7957696e6e657273000d049c5375626d697474656420736f6c7574696f6e2068617320746f6f206d616e792077696e6e657273040d014572726f72206f66207468652070616c6c657420746861742063616e2062652072657475726e656420696e20726573706f6e736520746f20646973706174636865732e1d0c04184f7074696f6e04045401210c0108104e6f6e6500000010536f6d650400210c0000010000210c081062616e642042616e6452617465042c426c6f636b4e756d62657201100014011476616c756518011c42616c616e63650001306c6173745f7570646174656428010c7536340001486c6173745f757064617465645f626c6f636b10012c426c6f636b4e756d626572000128726571756573745f696428010c75363400012c64796e616d69635f6665653d01011446697865640000250c0000040810d50100290c0c1062616e641870616c6c6574144572726f720804540004490001204c556e617574686f72697a656452656c61796572000004a4416e20756e74727573746564206163636f756e7420747269656420746f2072656c617920646174612e58416c7265616479415472757374656452656c61796572000104390141207265717565737420746f2061646420616e206163636f756e742c20776869636820697320616c7265616479206120747275737465642072656c617965722c2077617320737570706c6965642e344e6f5375636852656c61796572000204350141207265717565737420746f2072656d6f766520616e206163636f756e742c207768696368206973206e6f74206120747275737465642072656c617965722c2077617320737570706c6965642e5852617465436f6e76657273696f6e4f766572666c6f77000304cc52656c61796564207261746520697320746f6f2062696720746f2062652073746f72656420696e207468652070616c6c65742e5c52617465486173496e76616c696454696d657374616d700004046c526174652068617320696e76616c69642074696d657374616d702e2c5261746545787069726564000504d052617465206973206578706972656420616e642063616e2774206265207573656420756e74696c206e657874207570646174652e6844796e616d696346656543616c63756c6174696f6e4572726f72000604904572726f7220647572696e672064796e616d6963206665652063616c63756c6174696f6e6c496e76616c696444796e616d6963466565506172616d65746572730007048c44796e616d69632066656520706172616d65746572732061726520696e76616c69642c04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909092d0c04204254726565536574040454012d02000400310c000000310c0000022d0200350c0c306f7261636c655f70726f78791870616c6c6574144572726f72040454000108504f7261636c65416c7265616479456e61626c6564000000544f7261636c65416c726561647944697361626c656400010004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909390c08686865726d65735f676f7665726e616e63655f706c6174666f726d404865726d6573566f74696e67496e666f042c537472696e674c696d697400000c0134766f74696e675f6f7074696f6e35020168426f756e646564537472696e673c537472696e674c696d69743e0001406e756d6265725f6f665f6865726d657318011c42616c616e63650001406865726d65735f77697468647261776ebc0110626f6f6c00003d0c08686865726d65735f676f7665726e616e63655f706c6174666f726d384865726d6573506f6c6c496e666f18244163636f756e7449640100184d6f6d656e7401282c537472696e674c696d697400304f7074696f6e734c696d697400285469746c654c696d697400404465736372697074696f6e4c696d6974000020011c63726561746f720001244163636f756e7449640001346865726d65735f6c6f636b656418011c42616c616e6365000150706f6c6c5f73746172745f74696d657374616d702801184d6f6d656e74000148706f6c6c5f656e645f74696d657374616d702801184d6f6d656e740001147469746c65ed010164426f756e646564537472696e673c5469746c654c696d69743e00012c6465736372697074696f6ed106017c426f756e646564537472696e673c4465736372697074696f6e4c696d69743e00016063726561746f725f6865726d65735f77697468647261776ebc0110626f6f6c00011c6f7074696f6e73d90601d0426f756e6465645665633c426f756e646564537472696e673c537472696e674c696d69743e2c204f7074696f6e734c696d69743e0000410c08686865726d65735f676f7665726e616e63655f706c6174666f726d3853746f7261676556657273696f6e00010808563100000008563200010000450c0c686865726d65735f676f7665726e616e63655f706c6174666f726d1870616c6c6574144572726f7204045400014c40506f6c6c49734e6f74537461727465640000044c506f6c6c204973204e6f74205374617274656438506f6c6c497346696e697368656400010440506f6c6c2049732046696e697368656454496e76616c6964537461727454696d657374616d700002045c496e76616c69642053746172742054696d657374616d704c496e76616c6964456e6454696d657374616d7000030458496e76616c696420456e642054696d657374616d702c784e6f74456e6f7567684865726d6573466f724372656174696e67506f6c6c0004048c4e6f7420456e6f756768204865726d657320466f72204372656174696e6720506f6c6c5446756e6473416c726561647957697468647261776e0005045c46756e647320416c72656164792057697468647261776e44506f6c6c49734e6f7446696e697368656400060450506f6c6c204973204e6f742046696e697368656440596f754172654e6f7443726561746f720007044c596f7520417265204e6f742043726561746f7230556e617574686f72697a656400080430556e617574686f72697a656440506f6c6c446f65734e6f74457869737400090450506f6c6c20446f6573204e6f742045786973742c604e6f74456e6f7567684865726d6573466f72566f74696e67000a04704e6f7420456e6f756768204865726d657320466f7220566f74696e6730416c7265616479566f746564000b0434416c7265616479566f7465642c70496e76616c69644d696e696d756d4475726174696f6e4f66506f6c6c000c0480496e76616c6964204d696e696d756d204475726174696f6e204f6620506f6c6c70496e76616c69644d6178696d756d4475726174696f6e4f66506f6c6c000d0480496e76616c6964204d6178696d756d204475726174696f6e204f6620506f6c6c204e6f74566f746564000e04244e6f7420566f74656450496e76616c6964566f74696e674f7074696f6e73000f0458496e76616c696420566f74696e67204f7074696f6e7350546f6f4d616e79566f74696e674f7074696f6e730010045c546f6f204d616e7920566f74696e67204f7074696f6e7334496e76616c69644f7074696f6e00110438496e76616c6964204f7074696f6e404475706c69636174654f7074696f6e73001204444475706c6963617465206f7074696f6e7304b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909490c083c70616c6c65745f707265696d616765345265717565737453746174757308244163636f756e74496401001c42616c616e6365011801082c556e72657175657374656408011c6465706f736974c1010150284163636f756e7449642c2042616c616e63652900010c6c656e10010c753332000000245265717565737465640c011c6465706f7369744d0c01704f7074696f6e3c284163636f756e7449642c2042616c616e6365293e000114636f756e7410010c75333200010c6c656e4505012c4f7074696f6e3c7533323e000100004d0c04184f7074696f6e04045401c1010108104e6f6e6500000010536f6d650400c1010000010000510c000004082c1000550c101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e0000590c0c3c70616c6c65745f707265696d6167651870616c6c6574144572726f7204045400011818546f6f426967000004a0507265696d61676520697320746f6f206c6172676520746f2073746f7265206f6e2d636861696e2e30416c72656164794e6f746564000104a4507265696d6167652068617320616c7265616479206265656e206e6f746564206f6e2d636861696e2e344e6f74417574686f72697a6564000204c85468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e2e204e6f744e6f746564000304fc54686520707265696d6167652063616e6e6f742062652072656d6f7665642073696e636520697420686173206e6f7420796574206265656e206e6f7465642e2452657175657374656400040409014120707265696d616765206d6179206e6f742062652072656d6f766564207768656e20746865726520617265206f75747374616e64696e672072657175657374732e304e6f745265717565737465640005042d0154686520707265696d61676520726571756573742063616e6e6f742062652072656d6f7665642073696e6365206e6f206f75747374616e64696e672072657175657374732065786973742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909095d0c0c286f726465725f626f6f6b286f726465725f626f6f6b244f72646572426f6f6b04045400002001346f726465725f626f6f6b5f69644502018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001187374617475734902013c4f72646572426f6f6b5374617475730001346c6173745f6f726465725f6964180128543a3a4f7264657249640001247469636b5f73697a65510201284f726465725072696365000134737465705f6c6f745f73697a655102012c4f72646572566f6c756d650001306d696e5f6c6f745f73697a655102012c4f72646572566f6c756d650001306d61785f6c6f745f73697a655102012c4f72646572566f6c756d6500012c746563685f737461747573610c014c4f72646572426f6f6b546563685374617475730000610c0c286f726465725f626f6f6b1474797065734c4f72646572426f6f6b54656368537461747573000108145265616479000000205570646174696e6700010000650c0000040845021800690c0c286f726465725f626f6f6b2c6c696d69745f6f72646572284c696d69744f7264657204045400002401086964180128543a3a4f7264657249640001146f776e6572000130543a3a4163636f756e744964000110736964654d020130507269636556617269616e740001147072696365510201284f72646572507269636500013c6f726967696e616c5f616d6f756e745102012c4f72646572566f6c756d65000118616d6f756e745102012c4f72646572566f6c756d6500011074696d6528012c4d6f6d656e744f663c543e0001206c6966657370616e28012c4d6f6d656e744f663c543e000128657870697265735f6174100144426c6f636b4e756d626572466f723c543e00006d0c000004084502510200710c101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540118045300000400110401185665633c543e0000750c101c73705f636f72651c626f756e64656444626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b0151020456015102045300000400790c013842547265654d61703c4b2c20563e0000790c042042547265654d617008044b01510204560151020004007d0c0000007d0c000002810c00810c000004085102510200850c0000040800450200890c101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401650c0453000004008d0c01185665633c543e00008d0c000002650c00910c0c286f726465725f626f6f6b1870616c6c6574144572726f720404540001b440556e6b6e6f776e4f72646572426f6f6b000004bc4f7264657220626f6f6b20646f6573206e6f7420657869737420666f7220746869732074726164696e67207061697248496e76616c69644f72646572426f6f6b496400010454496e76616c6964206f7264657220626f6f6b206964584f72646572426f6f6b416c7265616479457869737473000204bc4f7264657220626f6f6b20616c72656164792065786973747320666f7220746869732074726164696e67207061697244556e6b6e6f776e4c696d69744f72646572000304f44c696d6974206f7264657220646f6573206e6f7420657869737420666f7220746869732074726164696e67207061697220616e64206f726465722069645c4c696d69744f72646572416c7265616479457869737473000404f44c696d6974206f7264657220616c72656164792065786973747320666f7220746869732074726164696e67207061697220616e64206f72646572206964644c696d69744f7264657253746f726167654f766572666c6f770005043d01497420697320696d706f737369626c6520746f20696e7365727420746865206c696d6974206f7264657220626563617573652074686520626f756e64732068617665206265656e2072656163686564545570646174654c696d69744f726465724572726f72000604a8497420697320696d706f737369626c6520746f2075706461746520746865206c696d6974206f726465725444656c6574654c696d69744f726465724572726f72000704a8497420697320696d706f737369626c6520746f2064656c65746520746865206c696d6974206f7264657244426c6f636b5363686564756c6546756c6c000804c045787069726174696f6e207363686564756c6520666f722065787069726174696f6e20626c6f636b2069732066756c6c4845787069726174696f6e4e6f74466f756e64000904c4436f756c64206e6f742066696e642065787069726174696f6e20696e20676976656e20626c6f636b207363686564756c65384e6f44617461466f725072696365000a0490546865726520617265206e6f20626964732f61736b7320666f7220746865207072696365404e6f4167677265676174656444617461000b04d0546865726520617265206e6f206167677265676174656420626964732f61736b7320666f7220746865206f7264657220626f6f6b744e6f74456e6f7567684c6971756964697479496e4f72646572426f6f6b000c0405015468657265206973206e6f7420656e6f756768206c697175696469747920696e20746865206f7264657220626f6f6b20746f20636f76657220746865206465616ca0466f7262696464656e546f4372656174654f72646572426f6f6b5769746853616d65417373657473000d04e843616e6e6f7420637265617465206f7264657220626f6f6b207769746820657175616c206261736520616e642074617267657420617373657473504e6f74416c6c6f77656451756f74654173736574000e048501546865206173736574206973206e6f7420616c6c6f77656420746f2062652071756f74652e204f6e6c79207468652064657820626173652061737365742063616e20626520612071756f746520617373657420666f72206f7264657220626f6f6b3c4e6f74416c6c6f7765644445584964000f04bc4f72646572626f6f6b732063616e6e6f742062652063726561746564207769746820676976656e206465782069642e6453796e74686574696341737365744973466f7262696464656e001004b853796e746865746963206173736574732061726520666f7262696464656e20666f72206f7264657220626f6f6b2e30557365724861734e6f4e66740011040101557365722063616e6e6f742063726561746520616e206f7264657220626f6f6b2077697468204e4654206966207468657920646f6e27742068617665204e46543c496e76616c69644c6966657370616e0012047c4c6966657370616e206578636565647320646566696e6564206c696d69747348496e76616c69644f72646572416d6f756e740013040501546865206f7264657220616d6f756e7420286c696d6974206f72206d61726b65742920646f6573206e6f74206d6565742074686520726571756972656d656e747358496e76616c69644c696d69744f726465725072696365001404d0546865206c696d6974206f7264657220707269636520646f6573206e6f74206d6565742074686520726571756972656d656e7473844c696d69744f7264657250726963654973546f6f46617246726f6d5370726561640015042501557365722063616e6e6f742073657420746865207072696365206f66206c696d6974206f7264657220746f6f206661722066726f6d2061637475616c206d61726b65742070726963654854726164696e674973466f7262696464656e001604f4417420746865206d6f6d656e742c2054726164696e6720697320666f7262696464656e20696e207468652063757272656e74206f7264657220626f6f6b84506c6163656d656e744f664c696d69744f72646572734973466f7262696464656e0017043101417420746865206d6f6d656e742c2055736572732063616e6e6f7420706c616365206e6577206c696d6974206f726465727320696e207468652063757272656e74206f7264657220626f6f6b9043616e63656c6c6174696f6e4f664c696d69744f72646572734973466f7262696464656e0018043d01417420746865206d6f6d656e742c2055736572732063616e6e6f742063616e63656c207468656972206c696d6974206f726465727320696e207468652063757272656e74206f7264657220626f6f6b74557365724861734d6178436f756e744f664f70656e65644f72646572730019043d01557365722068617320746865206d617820617661696c61626c6520636f756e74206f66206f70656e206c696d6974206f726465727320696e207468652063757272656e74206f7264657220626f6f6b845072696365526561636865644d6178436f756e744f664c696d69744f7264657273001a04e901497420697320696d706f737369626c6520746f20706c61636520746865206c696d6974206f72646572206265636175736520626f756e6473206f6620746865206d617820636f756e74206f66206f7264657273206174207468652063757272656e742070726963652068617665206265656e20726561636865649c4f72646572426f6f6b526561636865644d6178436f756e744f66507269636573466f7253696465001b04c901497420697320696d706f737369626c6520746f20706c61636520746865206c696d6974206f72646572206265636175736520626f756e6473206f6620746865206d617820636f756e74206f662070726963657320666f722074686520736964652068617665206265656e20726561636865645c416d6f756e7443616c63756c6174696f6e4661696c6564001c04b8416e206572726f72206f63637572726564207768696c652063616c63756c6174696e672074686520616d6f756e7458507269636543616c63756c6174696f6e4661696c6564001d04b4416e206572726f72206f63637572726564207768696c652063616c63756c6174696e672074686520707269636530556e617574686f72697a6564001e044c556e617574686f72697a656420616374696f6e30496e76616c69644173736574001f0434496e76616c69642061737365743c496e76616c69645469636b53697a6500200444496e76616c6964207469636b2073697a6548496e76616c6964537465704c6f7453697a6500210454496e76616c69642073746570206c6f742073697a6544496e76616c69644d696e4c6f7453697a6500220450496e76616c6964206d696e206c6f742073697a6544496e76616c69644d61784c6f7453697a6500230450496e76616c6964206d6178206c6f742073697a657c5469636b53697a65416e64537465704c6f7453697a65417265546f6f42696700240441015469636b2073697a6520262073746570206c6f742073697a652061726520746f6f2062696720616e64207468656972206d756c7469706c69636174696f6e206f766572666c6f77732042616c616e63658c5469636b53697a65416e64537465704c6f7453697a654c6f7365507265636973696f6e002504590350726f64756374206f66207469636b20616e642073746570206c6f742073697a657320676f6573206f7574206f6620707265636973696f6e2e204974206d7573742062652061636375726174656c7920726570726573656e7465642062792066697865642d707265636973696f6e20666c6f617420746f2070726576656e7420726f756e64696e67206572726f72732e20492e652e207468652070726f647563742073686f756c64206e6f742068617665206d6f7265207468616e203138206469676974732061667465722074686520636f6d6d612e7c4d61784c6f7453697a6549734d6f72655468616e546f74616c537570706c79002604ec4d6178206c6f742073697a652063616e6e6f74206265206d6f7265207468617420746f74616c20737570706c79206f66206261736520617373657454536c6970706167654c696d697445786365656465640027042d01496e64696361746564206c696d697420666f7220736c69707061676520686173206e6f74206265656e206d657420647572696e67207472616e73616374696f6e20657865637574696f6e2eac4d61726b65744f7264657273416c6c6f7765644f6e6c79466f72496e646976697369626c65417373657473002804d44d61726b6574206f72646572732061726520616c6c6f776564206f6e6c7920666f7220696e646976697369626c652061737365747380466f7262696464656e537461747573546f44656c6574654f72646572426f6f6b0029044501497420697320706f737369626c6520746f2064656c65746520616e206f726465722d626f6f6b206f6e6c792077697468207468652073746174757365733a204f6e6c7943616e63656c206f722053746f704c4f72646572426f6f6b49734e6f74456d707479002a04b8497420697320706f737369626c6520746f2064656c657465206f6e6c7920656d707479206f726465722d626f6f6b80466f7262696464656e537461747573546f5570646174654f72646572426f6f6b002b044501497420697320706f737369626c6520746f2075706461746520616e206f726465722d626f6f6b206f6e6c792077697468207468652073746174757365733a204f6e6c7943616e63656c206f722053746f70444f72646572426f6f6b49734c6f636b6564002c0401014f7264657220426f6f6b206973206c6f636b656420666f7220746563686e6963616c206d61696e74656e616e63652e2054727920616761696e206c617465722e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909950c00000408990c2c00990c000004087d0200009d0c08306272696467655f70726f7879344272696467655265717565737408244163636f756e74496401001c41737365744964010d0100200118736f757263656508016447656e657269634163636f756e743c4163636f756e7449643e000110646573746508016447656e657269634163636f756e743c4163636f756e7449643e00012061737365745f69640d01011c41737365744964000118616d6f756e7418011c42616c616e6365000118737461747573650201344d65737361676553746174757300013c73746172745f74696d65706f696e746904014047656e6572696354696d65706f696e74000134656e645f74696d65706f696e746904014047656e6572696354696d65706f696e74000124646972656374696f6ea10c01404d657373616765446972656374696f6e0000a10c0c306272696467655f7479706573147479706573404d657373616765446972656374696f6e0001081c496e626f756e64000000204f7574626f756e6400010000a50c000004087d022c00a90c000004087d02090400ad0c000004087d020d0100b10c0c306272696467655f70726f78791870616c6c6574144572726f72040454000120485061746849734e6f74417661696c61626c650000004057726f6e674163636f756e744b696e64000100604e6f74456e6f7567684c6f636b65644c6971756964697479000200204f766572666c6f77000300505472616e736665724c696d6974526561636865640004004c4173736574416c72656164794c696d697465640005003c41737365744e6f744c696d697465640006004857726f6e674c696d697453657474696e677300070004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909b50c10607375627374726174655f6272696467655f6368616e6e656c1c696e626f756e641870616c6c6574144572726f7204045400011c38496e76616c69644e6574776f726b000004944d6573736167652063616d652066726f6d20616e20696e76616c6964206e6574776f726b2e50496e76616c6964536f757263654368616e6e656c0001040d014d6573736167652063616d652066726f6d20616e20696e76616c6964206f7574626f756e64206368616e6e656c206f6e2074686520457468657265756d20736964652e44496e76616c6964436f6d6d69746d656e74000204885375626d697474656420696e76616c696420636f6d6d69746d656e7420747970652e30496e76616c69644e6f6e6365000304804d6573736167652068617320616e20756e6578706563746564206e6f6e63652e54496e76616c69645265776172644672616374696f6e00040464496e636f727265637420726577617264206672616374696f6e38436f6e7472616374457869737473000504705468697320636f6e747261637420616c7265616479206578697374734043616c6c456e636f64654661696c65640006045443616c6c20656e636f64696e67206661696c65642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909b90c0c306272696467655f74797065731474797065736847656e65726963436f6d6d69746d656e7457697468426c6f636b0c2c426c6f636b4e756d62657201102c4d61784d6573736167657300284d61785061796c6f61640000080130626c6f636b5f6e756d62657210012c426c6f636b4e756d626572000128636f6d6d69746d656e74710801c463726174653a3a47656e65726963436f6d6d69746d656e743c4d61784d657373616765732c204d61785061796c6f61643e0000bd0c10607375627374726174655f6272696467655f6368616e6e656c206f7574626f756e641870616c6c6574144572726f7204045400011c3c5061796c6f6164546f6f4c617267650000049c546865206d657373616765207061796c6f616420657863656564732062797465206c696d69742e54517565756553697a654c696d69745265616368656400010421014e6f206d6f7265206d657373616765732063616e2062652071756575656420666f7220746865206368616e6e656c20647572696e67207468697320636f6d6d6974206379636c652e304d6178476173546f6f426967000204ac4d6178696d756d2067617320666f72207175657565642062617463682065786365656473206c696d69742e1c4e6f46756e64730003049c43616e6e6f7420706179207468652066656520746f207375626d69742061206d6573736167652e204f766572666c6f770004045843616e6e6f7420696e6372656d656e74206e6f6e6365344368616e6e656c4578697374730005046c54686973206368616e6e656c20616c726561647920657869737473305a65726f496e74657276616c00060460496e74657276616c2063616e6e6f74206265207a65726f2e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909c10c0000040871020d0100c50c0000040871021000c90c0c5070617261636861696e5f6272696467655f6170701870616c6c6574144572726f7204045400014050546f6b656e49734e6f74526567697374657265640000004841707049734e6f7452656769737465726564000100384e6f74456e6f75676846756e647300020038496e76616c69644e6574776f726b00030058546f6b656e416c72656164795265676973746572656400040050417070416c7265616479526567697374657265640005004043616c6c456e636f64654661696c65640006045443616c6c20656e636f64696e67206661696c65642e2c57726f6e67416d6f756e7400070448416d6f756e74206d757374206265203e2030505472616e736665724c696d69745265616368656400080040556e6b6e6f776e507265636973696f6e000900444d65737361676549644e6f74466f756e64000a006c496e76616c696444657374696e6174696f6e50617261636861696e000b0060496e76616c696444657374696e6174696f6e506172616d73000c007052656c6179636861696e41737365744e6f7452656769737465726564000d00644e6f7452656c61795472616e7366657261626c654173736574000e006452656c6179636861696e417373657452656769737465726564000f0004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909cd0c101c73705f636f72651c626f756e64656444626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401e102045300000400d10c012c42547265655365743c543e0000d10c0420425472656553657404045401e102000400e902000000d50c101c73705f636f72651c626f756e64656444626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b01e102045601ed02045300000400d90c013842547265654d61703c4b2c20563e0000d90c042042547265654d617008044b01e102045601ed02000400dd0c000000dd0c000002e10c00e10c00000408e102ed0200e50c0c486272696467655f646174615f7369676e65721870616c6c6574144572726f720404540001384450616c6c6574496e697469616c697a65640000005050616c6c65744e6f74496e697469616c697a6564000100285065657245786973747300020034506565724e6f7445786973747300030030546f6f4d75636850656572730004005c4661696c6564546f5665726966795369676e617475726500050030506565724e6f74466f756e6400060040546f6f4d756368417070726f76616c7300070044417070726f76616c734e6f74466f756e64000800485369676e6174757265734e6f74466f756e640009005048617350656e64696e6750656572557064617465000a0068446f6e744861766550656e64696e675065657255706461746573000b004c4e6574776f726b4e6f74537570706f72746564000c00585369676e6174757265416c7265616479457869737473000d0004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909e90c0c446d756c74697369675f76657269666965721870616c6c6574144572726f7204045400012c44496e76616c6964496e6974506172616d7300000030546f6f4d7563685065657273000100544e6574776f726b4e6f74496e697469616c697a656400020064496e76616c69644e756d6265724f665369676e61747572657300030040496e76616c69645369676e61747572650004005c4e6f7454727573746564506565725369676e61747572650005002850656572457869737473000600284e6f537563685065657200070040496e76616c69644e6574776f726b496400080068436f6d6d69746d656e744e6f74466f756e64496e446967657374000900384475706c69636174656450656572000a0004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909ed0c101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454019104045300000400f10c01185665633c543e0000f10c000002910400f50c0c2c70616c6c65745f7375646f1870616c6c6574144572726f720404540001042c526571756972655375646f0000047c53656e646572206d75737420626520746865205375646f206163636f756e7404644572726f7220666f7220746865205375646f2070616c6c6574f90c0c186661756365741870616c6c6574144572726f7204045400010c4441737365744e6f74537570706f727465640000045c4173736574206973206e6f7420737570706f727465642e40416d6f756e7441626f76654c696d697400010458416d6f756e742069732061626f7665206c696d69742e444e6f74456e6f7567685265736572766573000204504e6f7420656e6f7567682072657365727665732e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909fd0c0c2071615f746f6f6c731870616c6c6574144572726f720404540001283457686974656c69737446756c6c000004c443616e6e6f742061646420616e206163636f756e7420746f207468652077686974656c6973743a20697427732066756c6c48416c7265616479496e57686974656c6973740001049c546865206163636f756e7420697320616c726561647920696e207468652077686974656c697374384e6f74496e57686974656c697374000204d0546865206163636f756e7420696e74656e64656420666f722072656d6f76616c206973206e6f7420696e2077686974656c6973746843616e6e6f7446696c6c556e6b6e6f776e4f72646572426f6f6b0003046d01446964206e6f742066696e6420616e206f7264657220626f6f6b207769746820676976656e20696420746f2066696c6c2e204c696b656c7920616e206572726f722077697468206f7264657220626f6f6b206372656174696f6e2e584f72646572426f6f6b416c7265616479457869737473000404644f7264657220426f6f6b20616c72656164792065786973747338496e636f72726563745072696365000504dd01507269636520737465702c20626573742070726963652c20616e6420776f727374207072696365206d7573742062652061206d756c7469706c65206f66206f7264657220626f6f6b2773207469636b2073697a652e2050726963652073746570206d75737420616c736f206265206e6f6e2d7a65726f2e40456d70747952616e646f6d52616e6765000604610150726f76696465642072616e676520697320696e636f72726563742c20636865636b2074686174206c6f77657220626f756e64206973206c657373206f7220657175616c207468616e20746865207570706572206f6e652e584f75744f66426f756e647352616e646f6d52616e67650007044d015468652072616e676520666f722067656e65726174696e67206f7264657220616d6f756e7473206d7573742062652077697468696e206f7264657220626f6f6b27732061636365707465642076616c7565732e34546f6f4d616e794f7264657273000804a454686520636f756e74206f662063726561746564206f726465727320697320746f6f206c617267652e34546f6f4d616e79507269636573000904a454686520636f756e74206f662070726963657320746f2066696c6c20697320746f6f206c617267652e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909010d102873705f72756e74696d651c67656e657269634c756e636865636b65645f65787472696e73696348556e636865636b656445787472696e736963101c4164647265737301001043616c6c014504245369676e617475726501050d14457874726101090d00040030000000050d082873705f72756e74696d65384d756c74695369676e617475726500010c1c456432353531390400ad040148656432353531393a3a5369676e61747572650000001c537232353531390400dd040148737232353531393a3a5369676e61747572650001001445636473610400ed02014065636473613a3a5369676e617475726500020000090d0000041c0d0d110d150d190d210d250d290d000d0d10306672616d655f73797374656d28657874656e73696f6e7348636865636b5f737065635f76657273696f6e40436865636b5370656356657273696f6e04045400000000110d10306672616d655f73797374656d28657874656e73696f6e7340636865636b5f74785f76657273696f6e38436865636b547856657273696f6e04045400000000150d10306672616d655f73797374656d28657874656e73696f6e7334636865636b5f67656e6573697330436865636b47656e6573697304045400000000190d10306672616d655f73797374656d28657874656e73696f6e733c636865636b5f6d6f7274616c69747938436865636b4d6f7274616c697479040454000004001d0d010c45726100001d0d102873705f72756e74696d651c67656e657269630c6572610c4572610001010420496d6d6f7274616c0000001c4d6f7274616c31040008000001001c4d6f7274616c32040008000002001c4d6f7274616c33040008000003001c4d6f7274616c34040008000004001c4d6f7274616c35040008000005001c4d6f7274616c36040008000006001c4d6f7274616c37040008000007001c4d6f7274616c38040008000008001c4d6f7274616c3904000800000900204d6f7274616c313004000800000a00204d6f7274616c313104000800000b00204d6f7274616c313204000800000c00204d6f7274616c313304000800000d00204d6f7274616c313404000800000e00204d6f7274616c313504000800000f00204d6f7274616c313604000800001000204d6f7274616c313704000800001100204d6f7274616c313804000800001200204d6f7274616c313904000800001300204d6f7274616c323004000800001400204d6f7274616c323104000800001500204d6f7274616c323204000800001600204d6f7274616c323304000800001700204d6f7274616c323404000800001800204d6f7274616c323504000800001900204d6f7274616c323604000800001a00204d6f7274616c323704000800001b00204d6f7274616c323804000800001c00204d6f7274616c323904000800001d00204d6f7274616c333004000800001e00204d6f7274616c333104000800001f00204d6f7274616c333204000800002000204d6f7274616c333304000800002100204d6f7274616c333404000800002200204d6f7274616c333504000800002300204d6f7274616c333604000800002400204d6f7274616c333704000800002500204d6f7274616c333804000800002600204d6f7274616c333904000800002700204d6f7274616c343004000800002800204d6f7274616c343104000800002900204d6f7274616c343204000800002a00204d6f7274616c343304000800002b00204d6f7274616c343404000800002c00204d6f7274616c343504000800002d00204d6f7274616c343604000800002e00204d6f7274616c343704000800002f00204d6f7274616c343804000800003000204d6f7274616c343904000800003100204d6f7274616c353004000800003200204d6f7274616c353104000800003300204d6f7274616c353204000800003400204d6f7274616c353304000800003500204d6f7274616c353404000800003600204d6f7274616c353504000800003700204d6f7274616c353604000800003800204d6f7274616c353704000800003900204d6f7274616c353804000800003a00204d6f7274616c353904000800003b00204d6f7274616c363004000800003c00204d6f7274616c363104000800003d00204d6f7274616c363204000800003e00204d6f7274616c363304000800003f00204d6f7274616c363404000800004000204d6f7274616c363504000800004100204d6f7274616c363604000800004200204d6f7274616c363704000800004300204d6f7274616c363804000800004400204d6f7274616c363904000800004500204d6f7274616c373004000800004600204d6f7274616c373104000800004700204d6f7274616c373204000800004800204d6f7274616c373304000800004900204d6f7274616c373404000800004a00204d6f7274616c373504000800004b00204d6f7274616c373604000800004c00204d6f7274616c373704000800004d00204d6f7274616c373804000800004e00204d6f7274616c373904000800004f00204d6f7274616c383004000800005000204d6f7274616c383104000800005100204d6f7274616c383204000800005200204d6f7274616c383304000800005300204d6f7274616c383404000800005400204d6f7274616c383504000800005500204d6f7274616c383604000800005600204d6f7274616c383704000800005700204d6f7274616c383804000800005800204d6f7274616c383904000800005900204d6f7274616c393004000800005a00204d6f7274616c393104000800005b00204d6f7274616c393204000800005c00204d6f7274616c393304000800005d00204d6f7274616c393404000800005e00204d6f7274616c393504000800005f00204d6f7274616c393604000800006000204d6f7274616c393704000800006100204d6f7274616c393804000800006200204d6f7274616c393904000800006300244d6f7274616c31303004000800006400244d6f7274616c31303104000800006500244d6f7274616c31303204000800006600244d6f7274616c31303304000800006700244d6f7274616c31303404000800006800244d6f7274616c31303504000800006900244d6f7274616c31303604000800006a00244d6f7274616c31303704000800006b00244d6f7274616c31303804000800006c00244d6f7274616c31303904000800006d00244d6f7274616c31313004000800006e00244d6f7274616c31313104000800006f00244d6f7274616c31313204000800007000244d6f7274616c31313304000800007100244d6f7274616c31313404000800007200244d6f7274616c31313504000800007300244d6f7274616c31313604000800007400244d6f7274616c31313704000800007500244d6f7274616c31313804000800007600244d6f7274616c31313904000800007700244d6f7274616c31323004000800007800244d6f7274616c31323104000800007900244d6f7274616c31323204000800007a00244d6f7274616c31323304000800007b00244d6f7274616c31323404000800007c00244d6f7274616c31323504000800007d00244d6f7274616c31323604000800007e00244d6f7274616c31323704000800007f00244d6f7274616c31323804000800008000244d6f7274616c31323904000800008100244d6f7274616c31333004000800008200244d6f7274616c31333104000800008300244d6f7274616c31333204000800008400244d6f7274616c31333304000800008500244d6f7274616c31333404000800008600244d6f7274616c31333504000800008700244d6f7274616c31333604000800008800244d6f7274616c31333704000800008900244d6f7274616c31333804000800008a00244d6f7274616c31333904000800008b00244d6f7274616c31343004000800008c00244d6f7274616c31343104000800008d00244d6f7274616c31343204000800008e00244d6f7274616c31343304000800008f00244d6f7274616c31343404000800009000244d6f7274616c31343504000800009100244d6f7274616c31343604000800009200244d6f7274616c31343704000800009300244d6f7274616c31343804000800009400244d6f7274616c31343904000800009500244d6f7274616c31353004000800009600244d6f7274616c31353104000800009700244d6f7274616c31353204000800009800244d6f7274616c31353304000800009900244d6f7274616c31353404000800009a00244d6f7274616c31353504000800009b00244d6f7274616c31353604000800009c00244d6f7274616c31353704000800009d00244d6f7274616c31353804000800009e00244d6f7274616c31353904000800009f00244d6f7274616c3136300400080000a000244d6f7274616c3136310400080000a100244d6f7274616c3136320400080000a200244d6f7274616c3136330400080000a300244d6f7274616c3136340400080000a400244d6f7274616c3136350400080000a500244d6f7274616c3136360400080000a600244d6f7274616c3136370400080000a700244d6f7274616c3136380400080000a800244d6f7274616c3136390400080000a900244d6f7274616c3137300400080000aa00244d6f7274616c3137310400080000ab00244d6f7274616c3137320400080000ac00244d6f7274616c3137330400080000ad00244d6f7274616c3137340400080000ae00244d6f7274616c3137350400080000af00244d6f7274616c3137360400080000b000244d6f7274616c3137370400080000b100244d6f7274616c3137380400080000b200244d6f7274616c3137390400080000b300244d6f7274616c3138300400080000b400244d6f7274616c3138310400080000b500244d6f7274616c3138320400080000b600244d6f7274616c3138330400080000b700244d6f7274616c3138340400080000b800244d6f7274616c3138350400080000b900244d6f7274616c3138360400080000ba00244d6f7274616c3138370400080000bb00244d6f7274616c3138380400080000bc00244d6f7274616c3138390400080000bd00244d6f7274616c3139300400080000be00244d6f7274616c3139310400080000bf00244d6f7274616c3139320400080000c000244d6f7274616c3139330400080000c100244d6f7274616c3139340400080000c200244d6f7274616c3139350400080000c300244d6f7274616c3139360400080000c400244d6f7274616c3139370400080000c500244d6f7274616c3139380400080000c600244d6f7274616c3139390400080000c700244d6f7274616c3230300400080000c800244d6f7274616c3230310400080000c900244d6f7274616c3230320400080000ca00244d6f7274616c3230330400080000cb00244d6f7274616c3230340400080000cc00244d6f7274616c3230350400080000cd00244d6f7274616c3230360400080000ce00244d6f7274616c3230370400080000cf00244d6f7274616c3230380400080000d000244d6f7274616c3230390400080000d100244d6f7274616c3231300400080000d200244d6f7274616c3231310400080000d300244d6f7274616c3231320400080000d400244d6f7274616c3231330400080000d500244d6f7274616c3231340400080000d600244d6f7274616c3231350400080000d700244d6f7274616c3231360400080000d800244d6f7274616c3231370400080000d900244d6f7274616c3231380400080000da00244d6f7274616c3231390400080000db00244d6f7274616c3232300400080000dc00244d6f7274616c3232310400080000dd00244d6f7274616c3232320400080000de00244d6f7274616c3232330400080000df00244d6f7274616c3232340400080000e000244d6f7274616c3232350400080000e100244d6f7274616c3232360400080000e200244d6f7274616c3232370400080000e300244d6f7274616c3232380400080000e400244d6f7274616c3232390400080000e500244d6f7274616c3233300400080000e600244d6f7274616c3233310400080000e700244d6f7274616c3233320400080000e800244d6f7274616c3233330400080000e900244d6f7274616c3233340400080000ea00244d6f7274616c3233350400080000eb00244d6f7274616c3233360400080000ec00244d6f7274616c3233370400080000ed00244d6f7274616c3233380400080000ee00244d6f7274616c3233390400080000ef00244d6f7274616c3234300400080000f000244d6f7274616c3234310400080000f100244d6f7274616c3234320400080000f200244d6f7274616c3234330400080000f300244d6f7274616c3234340400080000f400244d6f7274616c3234350400080000f500244d6f7274616c3234360400080000f600244d6f7274616c3234370400080000f700244d6f7274616c3234380400080000f800244d6f7274616c3234390400080000f900244d6f7274616c3235300400080000fa00244d6f7274616c3235310400080000fb00244d6f7274616c3235320400080000fc00244d6f7274616c3235330400080000fd00244d6f7274616c3235340400080000fe00244d6f7274616c3235350400080000ff0000210d10306672616d655f73797374656d28657874656e73696f6e732c636865636b5f6e6f6e636528436865636b4e6f6e636504045400000400a1020120543a3a496e6465780000250d10306672616d655f73797374656d28657874656e73696f6e7330636865636b5f7765696768742c436865636b57656967687404045400000000290d0c1c786f725f66656524657874656e73696f6e604368617267655472616e73616374696f6e5061796d656e74040454000004010c746970fc013042616c616e63654f663c543e00002d0d08446672616d656e6f64655f72756e74696d651c52756e74696d650000000015011853797374656d011853797374656d401c4163636f756e7401010402000c4101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e74000010040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b57656967687401001c180000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e000010040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010405102c8000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101040510300400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d6265720100101000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801002c80000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e18446967657374010034040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301004404001ca0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e001d01204e4f54453a20546865206974656d20697320756e626f756e6420616e642073686f756c64207468657265666f7265206e657665722062652072656164206f6e20636861696e2ed020497420636f756c64206f746865727769736520696e666c6174652074686520506f562073697a65206f66206120626c6f636b2e002d01204576656e747320686176652061206c6172676520696e2d6d656d6f72792073697a652e20426f7820746865206576656e747320746f206e6f7420676f206f75742d6f662d6d656d6f7279fc206a75737420696e206361736520736f6d656f6e65207374696c6c207265616473207468656d2066726f6d2077697468696e207468652072756e74696d652e284576656e74436f756e74010010100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f70696373010104022c11030400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000150304000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e545570677261646564546f553332526566436f756e740100bc0400044d012054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e605570677261646564546f547269706c65526566436f756e740100bc0400085d012054727565206966207765206861766520757067726164656420736f2074686174204163636f756e74496e666f20636f6e7461696e73207468726565207479706573206f662060526566436f756e74602e2046616c736548202864656661756c7429206966206e6f742e38457865637574696f6e506861736500000903040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01190301501830426c6f636b576569676874732903f901624fd75a000b00204aa9d10113ffffffffffffffff02c0cd1700010b0098d4e853011347e17a14ae47e1ba010b0098f73e5d0113ffffffffffffffbf01000002c0cd1700010b00202753c8011347e17a14ae47e1fa010b00204aa9d10113ffffffffffffffff01070088526a7413000000000000004002c0cd170000000004d020426c6f636b20262065787472696e7369637320776569676874733a20626173652076616c75657320616e64206c696d6974732e2c426c6f636b4c656e67746839033000005400000070000000700004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e38426c6f636b48617368436f756e741010fa000000045501204d6178696d756d206e756d626572206f6620626c6f636b206e756d62657220746f20626c6f636b2068617368206d617070696e677320746f206b65657020286f6c64657374207072756e6564206669727374292e20446257656967687441034040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e1c56657273696f6e4503a10538736f72612d73756273747261746538736f72612d73756273747261746501000000480000000100000068df6acb689907609b0400000037e397fc7c91f5e40100000040fe3ad401f8959a06000000d2bc9897eed08f1503000000f78b278be53f454c02000000ab3c0572291feb8b0100000037c8bb1350a9a2a80300000049a15104d14de433010000003c174d7764069e61010000007b08daa9d117c89b01000000d83dc51e16a813fc01000000f8e0c25200c466cc010000007714ae7197b0467401000000fa5dc115e8dd759b020000008fd89fd41faef87601000000c890b8837395d703010000005cb928f4410f41fc01000000cbca25e39f14238702000000bc9d89904f5b923f0100000049eaaf1b548a0cb00100000091d5df18b0d2cf5801000000ed99c5acb25eedf503000000eb4d485ae89fbcb5010000008e688fe9454ac970010000004ee6f974cd3d43f90200000098deaed7652aeff90100000048000000000484204765742074686520636861696e27732063757272656e742076657273696f6e2e2853533538507265666978550308450014a8205468652064657369676e61746564205353353820707265666978206f66207468697320636861696e2e0039012054686973207265706c6163657320746865202273733538466f726d6174222070726f7065727479206465636c6172656420696e2074686520636861696e20737065632e20526561736f6e20697331012074686174207468652072756e74696d652073686f756c64206b6e6f772061626f7574207468652070726566697820696e206f7264657220746f206d616b6520757365206f662069742061737020616e206964656e746966696572206f662074686520636861696e2e015903001042616265011042616265402845706f6368496e64657801002820000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301005d030400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401006d0320000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401006d0320000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e65737301000480000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e6050656e64696e6745706f6368436f6e6669674368616e67650000710304000461012050656e64696e672065706f636820636f6e66696775726174696f6e206368616e676520746861742077696c6c206265206170706c696564207768656e20746865206e6578742065706f636820697320656e61637465642e384e65787452616e646f6d6e657373010004800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e3c4e657874417574686f72697469657301005d0304000460204e6578742065706f636820617574686f7269746965732e305365676d656e74496e6465780100101000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f8205765206d616b6520612074726164652d6f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e01010405107d0304000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a65640000850304000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e4c417574686f7256726652616e646f6d6e6573730100a90104001015012054686973206669656c642073686f756c6420616c7761797320626520706f70756c6174656420647572696e6720626c6f636b2070726f63657373696e6720756e6c6573731901207365636f6e6461727920706c61696e20736c6f74732061726520656e61626c65642028776869636820646f6e277420636f6e7461696e206120565246206f7574707574292e0049012049742069732073657420696e20606f6e5f66696e616c697a65602c206265666f72652069742077696c6c20636f6e7461696e207468652076616c75652066726f6d20746865206c61737420626c6f636b2e2845706f636853746172740100a501200000000000000000145d012054686520626c6f636b206e756d62657273207768656e20746865206c61737420616e642063757272656e742065706f6368206861766520737461727465642c20726573706563746976656c7920604e2d316020616e641420604e602e4901204e4f54453a20576520747261636b207468697320697320696e206f7264657220746f20616e6e6f746174652074686520626c6f636b206e756d626572207768656e206120676976656e20706f6f6c206f66590120656e74726f7079207761732066697865642028692e652e20697420776173206b6e6f776e20746f20636861696e206f6273657276657273292e2053696e63652065706f6368732061726520646566696e656420696e590120736c6f74732c207768696368206d617920626520736b69707065642c2074686520626c6f636b206e756d62657273206d6179206e6f74206c696e6520757020776974682074686520736c6f74206e756d626572732e204c6174656e657373010010100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e2c45706f6368436f6e66696700009d0304000861012054686520636f6e66696775726174696f6e20666f72207468652063757272656e742065706f63682e2053686f756c64206e6576657220626520604e6f6e656020617320697420697320696e697469616c697a656420696e242067656e657369732e3c4e65787445706f6368436f6e66696700009d030400082d012054686520636f6e66696775726174696f6e20666f7220746865206e6578742065706f63682c20604e6f6e65602069662074686520636f6e6669672077696c6c206e6f74206368616e6765e82028796f752063616e2066616c6c6261636b20746f206045706f6368436f6e6669676020696e737465616420696e20746861742063617365292e01a103000c3445706f63684475726174696f6e282058020000000000000cec2054686520616d6f756e74206f662074696d652c20696e20736c6f74732c207468617420656163682065706f63682073686f756c64206c6173742e1901204e4f54453a2043757272656e746c79206974206973206e6f7420706f737369626c6520746f206368616e6765207468652065706f6368206475726174696f6e20616674657221012074686520636861696e2068617320737461727465642e20417474656d7074696e6720746f20646f20736f2077696c6c20627269636b20626c6f636b2070726f64756374696f6e2e444578706563746564426c6f636b54696d652820701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e384d6178417574686f7269746965731010a08601000488204d6178206e756d626572206f6620617574686f72697469657320616c6c6f77656401b5030e2454696d657374616d70012454696d657374616d70080c4e6f7701002820000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e244469645570646174650100bc040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01b9030004344d696e696d756d506572696f642820b80b000000000000104d0120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a5d0120706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c5d012067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c206265a020646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e00012042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010018400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e40496e61637469766549737375616e636501001840000000000000000000000000000000000409012054686520746f74616c20756e697473206f66206f75747374616e64696e672064656163746976617465642062616c616e636520696e207468652073797374656d2e1c4163636f756e74010104020014010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600901205468652042616c616e6365732070616c6c6574206578616d706c65206f662073746f72696e67207468652062616c616e6365206f6620616e206163636f756e742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b19022020202074797065204163636f756e7453746f7265203d2053746f726167654d61705368696d3c53656c663a3a4163636f756e743c52756e74696d653e2c206672616d655f73797374656d3a3a50726f76696465723c52756e74696d653e2c204163636f756e7449642c2053656c663a3a4163636f756e74446174613c42616c616e63653e3e0c20207d102060606000150120596f752063616e20616c736f2073746f7265207468652062616c616e6365206f6620616e206163636f756e7420696e20746865206053797374656d602070616c6c65742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b7420202074797065204163636f756e7453746f7265203d2053797374656d0c20207d102060606000510120427574207468697320636f6d657320776974682074726164656f6666732c2073746f72696e67206163636f756e742062616c616e63657320696e207468652073797374656d2070616c6c65742073746f7265736d0120606672616d655f73797374656d60206461746120616c6f6e677369646520746865206163636f756e74206461746120636f6e747261727920746f2073746f72696e67206163636f756e742062616c616e63657320696e207468652901206042616c616e636573602070616c6c65742c20776869636820757365732061206053746f726167654d61706020746f2073746f72652062616c616e6365732064617461206f6e6c792e4101204e4f54453a2054686973206973206f6e6c79207573656420696e207468652063617365207468617420746869732070616c6c6574206973207573656420746f2073746f72652062616c616e6365732e144c6f636b730101040200bd03040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e2052657365727665730101040200cd03040004a4204e616d6564207265736572766573206f6e20736f6d65206163636f756e742062616c616e6365732e0001740c484578697374656e7469616c4465706f73697418400000000000000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e204d61784c6f636b7310103200000008f420546865206d6178696d756d206e756d626572206f66206c6f636b7320746861742073686f756c64206578697374206f6e20616e206163636f756e742edc204e6f74207374726963746c7920656e666f726365642c20627574207573656420666f722077656967687420657374696d6174696f6e2e2c4d61785265736572766573101000000000040d0120546865206d6178696d756d206e756d626572206f66206e616d656420726573657276657320746861742063616e206578697374206f6e20616e206163636f756e742e01d903026052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100dd0304000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e0000000004485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c69657201008c40000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e0100e10304000000017c04604f7065726174696f6e616c4665654d756c7469706c696572080405545901204120666565206d756c6974706c69657220666f7220604f7065726174696f6e616c602065787472696e7369637320746f20636f6d7075746520227669727475616c207469702220746f20626f6f73742074686569722c20607072696f7269747960004d0120546869732076616c7565206973206d756c7469706c656420627920746865206066696e616c5f6665656020746f206f627461696e206120227669727475616c20746970222074686174206973206c61746572f420616464656420746f20612074697020636f6d706f6e656e7420696e20726567756c617220607072696f72697479602063616c63756c6174696f6e732e4d01204974206d65616e732074686174206120604e6f726d616c60207472616e73616374696f6e2063616e2066726f6e742d72756e20612073696d696c61726c792d73697a656420604f7065726174696f6e616c6041012065787472696e736963202877697468206e6f20746970292c20627920696e636c7564696e672061207469702076616c75652067726561746572207468616e20746865207669727475616c207469702e003c20606060727573742c69676e6f726540202f2f20466f7220604e6f726d616c608c206c6574207072696f72697479203d207072696f726974795f63616c6328746970293b0054202f2f20466f7220604f7065726174696f6e616c601101206c6574207669727475616c5f746970203d2028696e636c7573696f6e5f666565202b2074697029202a204f7065726174696f6e616c4665654d756c7469706c6965723bc4206c6574207072696f72697479203d207072696f726974795f63616c6328746970202b207669727475616c5f746970293b1020606060005101204e6f746520746861742073696e636520776520757365206066696e616c5f6665656020746865206d756c7469706c696572206170706c69657320616c736f20746f2074686520726567756c61722060746970605d012073656e74207769746820746865207472616e73616374696f6e2e20536f2c206e6f74206f6e6c7920646f657320746865207472616e73616374696f6e206765742061207072696f726974792062756d702062617365646101206f6e207468652060696e636c7573696f6e5f666565602c2062757420776520616c736f20616d706c6966792074686520696d70616374206f662074697073206170706c69656420746f20604f7065726174696f6e616c6038207472616e73616374696f6e732e00052c5065726d697373696f6e73012c5065726d697373696f6e7308184f776e6572730101080101e50325020400002c5065726d697373696f6e730101080101f103f50304000001f90301800001fd030624526566657272616c730124526566657272616c730c2452656665727265727300010402000004000040526566657272657242616c616e63657300010402001804000024526566657272616c73010104020025020400000101040000010504071c52657761726473011c52657761726473342c526573657276657341636301004d010404002456616c4f776e6572730101040609040d048000000000000000000000000000000000000000000000000000000000000000000475012041206d617020457468416464726573736573202d3e20526577617264496e666f2c207468617420697320636c61696d61626c6520616e642072656d61696e696e672076657374656420616d6f756e74732070657220616464726573733c50737761704661726d4f776e6572730101040609041840000000000000000000000000000000000040507377617057616966754f776e657273010104060904184000000000000000000000000000000000003c556d694e667452656365697665727301010406090411040400046820554d49204e4654207265636569766572732073746f726167656456616c4275726e656453696e63654c61737456657374696e67010018400000000000000000000000000000000004a020416d6f756e74206f662056414c206275726e65642073696e6365206c6173742076657374696e674c43757272656e74436c61696d61626c6556616c010018400000000000000000000000000000000004710120416d6f756e74206f662056414c2063757272656e746c79206265696e6720766573746564202861676772656761746564206f766572207468652070726576696f757320706572696f64206f662031342c34303020626c6f636b73293045746841646472657373657301010406101504040004750120416c6c20616464726573736573206172652073706c697420696e20626174636865732c2060416464726573734261746368657360206d617073206261746368206e756d62657220746f206120736574206f66206164647265737365733c546f74616c56616c52657761726473010018400000000000000000000000000000000004310120546f74616c20616d6f756e74206f662056414c20726577617264732065697468657220636c61696d61626c65206e6f77206f7220736f6d652074696d6520696e207468652066757475726544546f74616c436c61696d61626c6556616c010018400000000000000000000000000000000004290120546f74616c20616d6f756e74206f662056414c20746861742063616e20626520636c61696d65642062792075736572732061742063757272656e7420706f696e7420696e2074696d65404d6967726174696f6e50656e64696e670100bc0400042101204120666c616720696e6469636174696e6720776865746865722056414c20726577617264732064617461206d6967726174696f6e20686173206265656e2066696e616c697a65641c556d694e667473010019040400048c205468652073746f72616765206f6620617661696c61626c6520554d49204e4654732e34556d694e6674436c61696d6564010104060904bc040004e02053746f7265732077686574686572206164647265737320616c726561647920636c61696d656420554d49204e465420726577617264732e011d040184000121040818586f724665650118586f724665650820586f72546f56616c01001840000000000000000000000000000000000445012054686520616d6f756e74206f6620584f5220746f2062652072656d696e74656420616e642065786368616e67656420666f722056414c2061742074686520656e64206f66207468652073657373696f6e284d756c7469706c69657201008c40000000c7c147af100e7f000000000000000125040188000009384272696467654d756c746973696701384272696467654d756c746973696710204163636f756e74730001040500290404000464204d756c74697369676e6174757265206163636f756e74732e244d756c746973696773000108050231043504040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e1443616c6c73000104060439040400003c4469737061746368656443616c6c7301010806053d04a800000141040190000101090a1c5574696c6974790001490401a0044c626174636865645f63616c6c735f6c696d69741010aa2a000004a820546865206c696d6974206f6e20746865206e756d626572206f6620626174636865642063616c6c732e0105090b28417574686f72736869700128417574686f72736869700418417574686f720000000400046420417574686f72206f662063757272656e7420626c6f636b2e00000000101c5374616b696e67011c5374616b696e679c4054696d6553696e636547656e657369730100090930000000000000000000000000040501205468652074696d65207370616e2073696e63652067656e657369732c20696e6372656d656e7465642061742074686520656e64206f662065616368206572612e3856616c696461746f72436f756e740100101000000000049c2054686520696465616c206e756d626572206f66206163746976652076616c696461746f72732e544d696e696d756d56616c696461746f72436f756e740100101000000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100250204000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010405000004000c0101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e404d696e4e6f6d696e61746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f662061206e6f6d696e61746f722e404d696e56616c696461746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f6620612076616c696461746f722e484d696e696d756d4163746976655374616b65010018400000000000000000000000000000000004110120546865206d696e696d756d20616374697665206e6f6d696e61746f72207374616b65206f6620746865206c617374207375636365737366756c20656c656374696f6e2e344d696e436f6d6d697373696f6e0100b010000000000ce820546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e20746861742076616c696461746f72732063616e207365742e00802049662073657420746f206030602c206e6f206c696d6974206578697374732e184c656467657200010402000d090400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e1450617965650101040500750404010ce42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e2856616c696461746f72730101040500b40800000c450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e50436f756e746572466f7256616c696461746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d617856616c696461746f7273436f756e7400001004000c310120546865206d6178696d756d2076616c696461746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e284e6f6d696e61746f727300010405002109040048750120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f207468656972206e6f6d696e6174696f6e20707265666572656e6365732c206e616d656c79207468652076616c696461746f72732074686174582074686579207769736820746f20737570706f72742e003901204e6f7465207468617420746865206b657973206f6620746869732073746f72616765206d6170206d69676874206265636f6d65206e6f6e2d6465636f6461626c6520696e2063617365207468656d01205b60436f6e6669673a3a4d61784e6f6d696e6174696f6e73605d20636f6e66696775726174696f6e206973206465637265617365642e20496e2074686973207261726520636173652c207468657365206e6f6d696e61746f7273650120617265207374696c6c206578697374656e7420696e2073746f726167652c207468656972206b657920697320636f727265637420616e64207265747269657661626c652028692e652e2060636f6e7461696e735f6b657960710120696e6469636174657320746861742074686579206578697374292c206275742074686569722076616c75652063616e6e6f74206265206465636f6465642e205468657265666f72652c20746865206e6f6e2d6465636f6461626c656d01206e6f6d696e61746f72732077696c6c206566666563746976656c79206e6f742d65786973742c20756e74696c20746865792072652d7375626d697420746865697220707265666572656e6365732073756368207468617420697401012069732077697468696e2074686520626f756e6473206f6620746865206e65776c79207365742060436f6e6669673a3a4d61784e6f6d696e6174696f6e73602e006101205468697320696d706c696573207468617420603a3a697465725f6b65797328292e636f756e7428296020616e6420603a3a6974657228292e636f756e74282960206d696768742072657475726e20646966666572656e746d012076616c75657320666f722074686973206d61702e204d6f72656f7665722c20746865206d61696e20603a3a636f756e7428296020697320616c69676e656420776974682074686520666f726d65722c206e616d656c79207468656c206e756d626572206f66206b65797320746861742065786973742e006d01204c6173746c792c20696620616e79206f6620746865206e6f6d696e61746f7273206265636f6d65206e6f6e2d6465636f6461626c652c20746865792063616e206265206368696c6c656420696d6d6564696174656c7920766961b8205b6043616c6c3a3a6368696c6c5f6f74686572605d20646973706174636861626c6520627920616e796f6e652e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e50436f756e746572466f724e6f6d696e61746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d61784e6f6d696e61746f7273436f756e7400001004000c310120546865206d6178696d756d206e6f6d696e61746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e2843757272656e744572610000100400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e2441637469766545726100002909040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e0059012054686520616374697665206572612069732074686520657261206265696e672063757272656e746c792072657761726465642e2056616c696461746f7220736574206f66207468697320657261206d757374206265ac20657175616c20746f205b6053657373696f6e496e746572666163653a3a76616c696461746f7273605d2e5445726173537461727453657373696f6e496e6465780001040510100400103101205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e006101204e6f74653a205468697320747261636b7320746865207374617274696e672073657373696f6e2028692e652e2073657373696f6e20696e646578207768656e20657261207374617274206265696e672061637469766529f020666f7220746865206572617320696e20605b43757272656e74457261202d20484953544f52595f44455054482c2043757272656e744572615d602e2c457261735374616b65727301010805052d09f80c0000001878204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e48457261735374616b657273436c697070656401010805052d09f80c0000002c9820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865dc2060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e484572617356616c696461746f72507265667301010805052d09b40800001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4c4572617356616c696461746f7252657761726400010405101804000c09012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e74730101040510310914000000000008ac205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3045726156616c4275726e6564010018400000000000000000000000000000000004a82054686520616d6f756e74206f662056414c206275726e656420647572696e672074686973206572612e3845726173546f74616c5374616b65010104051018400000000000000000000000000000000008ec2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f7263654572610100c004000454204d6f6465206f662065726120666f7263696e672e4c536c6173685265776172644672616374696f6e0100b010000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401001840000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010405104109040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100110304001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e45726100010805052d094909040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100010805052d0918040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010405004d090400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c617368010104053d095109800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e5443757272656e74506c616e6e656453657373696f6e01001010000000000ce820546865206c61737420706c616e6e65642073657373696f6e207363686564756c6564206279207468652073657373696f6e2070616c6c65742e0071012054686973206973206261736963616c6c7920696e2073796e632077697468207468652063616c6c20746f205b6070616c6c65745f73657373696f6e3a3a53657373696f6e4d616e616765723a3a6e65775f73657373696f6e605d2e4c4f6666656e64696e6756616c696461746f727301005509040024690120496e6469636573206f662076616c696461746f727320746861742068617665206f6666656e64656420696e20746865206163746976652065726120616e6420776865746865722074686579206172652063757272656e746c79282064697361626c65642e00690120546869732076616c75652073686f756c642062652061207375706572736574206f662064697361626c65642076616c696461746f72732073696e6365206e6f7420616c6c206f6666656e636573206c65616420746f2074686571012076616c696461746f72206265696e672064697361626c65642028696620746865726520776173206e6f20736c617368292e2054686973206973206e656564656420746f20747261636b207468652070657263656e74616765206f6649012076616c696461746f727320746861742068617665206f6666656e64656420696e207468652063757272656e74206572612c20656e737572696e672061206e65772065726120697320666f72636564206966750120604f6666656e64696e6756616c696461746f72735468726573686f6c646020697320726561636865642e205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e6471012077686574686572206120676976656e2076616c696461746f72206861732070726576696f75736c79206f6666656e646564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e38207468652065726120656e64732e384368696c6c5468726573686f6c6400002d0404000c510120546865207468726573686f6c6420666f72207768656e2075736572732063616e2073746172742063616c6c696e6720606368696c6c5f6f746865726020666f72206f746865722076616c696461746f7273202f5901206e6f6d696e61746f72732e20546865207468726573686f6c6420697320636f6d706172656420746f207468652061637475616c206e756d626572206f662076616c696461746f7273202f206e6f6d696e61746f72732901202860436f756e74466f722a602920696e207468652073797374656d20636f6d706172656420746f2074686520636f6e66696775726564206d61782028604d61782a436f756e7460292e01710401ac1c384d61784e6f6d696e6174696f6e7310101800000004b4204d6178696d756d206e756d626572206f66206e6f6d696e6174696f6e7320706572206e6f6d696e61746f722e30486973746f72794465707468101054000000508c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00e820466f6c6c6f77696e6720696e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d090120486973746f727944657074682c2063757272656e745f6572615d603a2060457261735374616b657273602c2060457261735374616b657273436c6970706564602c050120604572617356616c696461746f725072656673602c20604572617356616c696461746f72526577617264602c206045726173526577617264506f696e7473602cac206045726173546f74616c5374616b65602c206045726173537461727453657373696f6e496e646578602c8420605374616b696e674c65646765722e636c61696d65645f72657761726473602e00e4204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e2ef820492e652e2061637469766520657261206d75737420616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203ec42063757272656e745f657261202d20686973746f72795f646570746860206d7573742062652067756172616e746565642e001101204966206d6967726174696e6720616e206578697374696e672070616c6c65742066726f6d2073746f726167652076616c756520746f20636f6e6669672076616c75652cec20746869732073686f756c642062652073657420746f2073616d652076616c7565206f72206772656174657220617320696e2073746f726167652e001501204e6f74653a2060486973746f727944657074686020697320757365642061732074686520757070657220626f756e6420666f72207468652060426f756e646564566563601101206974656d20605374616b696e674c65646765722e636c61696d65645f72657761726473602e2053657474696e6720746869732076616c7565206c6f776572207468616ed820746865206578697374696e672076616c75652063616e206c65616420746f20696e636f6e73697374656e6369657320696e20746865150120605374616b696e674c65646765726020616e642077696c6c206e65656420746f2062652068616e646c65642070726f7065726c7920696e2061206d6967726174696f6e2ef020546865207465737420607265647563696e675f686973746f72795f64657074685f616272757074602073686f77732074686973206566666563742e3853657373696f6e735065724572611010060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e10101c00000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e10101b000000100101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e000d0120546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2053657420746f203020696620736c617368657315012073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f7220696e74657276656e74696f6e2e804d61784e6f6d696e61746f72526577617264656450657256616c696461746f7210100001000010f820546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e00510120466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e390120636c61696d207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e484d6178556e6c6f636b696e674368756e6b7310102000000028050120546865206d6178696d756d206e756d626572206f662060756e6c6f636b696e6760206368756e6b732061205b605374616b696e674c6564676572605d2063616e090120686176652e204566666563746976656c792064657465726d696e657320686f77206d616e7920756e6971756520657261732061207374616b6572206d61792062653820756e626f6e64696e6720696e2e00f8204e6f74653a20604d6178556e6c6f636b696e674368756e6b736020697320757365642061732074686520757070657220626f756e6420666f722074686501012060426f756e64656456656360206974656d20605374616b696e674c65646765722e756e6c6f636b696e67602e2053657474696e6720746869732076616c75650501206c6f776572207468616e20746865206578697374696e672076616c75652063616e206c65616420746f20696e636f6e73697374656e6369657320696e20746865090120605374616b696e674c65646765726020616e642077696c6c206e65656420746f2062652068616e646c65642070726f7065726c7920696e20612072756e74696d650501206d6967726174696f6e2e20546865207465737420607265647563696e675f6d61785f756e6c6f636b696e675f6368756e6b735f616272757074602073686f7773342074686973206566666563742e015d0911204f6666656e63657301204f6666656e6365730c1c5265706f727473000104052c6109040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e646578010108050565090d030400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e64657801010405c830040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e0001c400002528486973746f726963616c00000000000d1c53657373696f6e011c53657373696f6e1c2856616c696461746f7273010025020400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e646578010010100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e6765640100bc040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b657973010069090400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100f5030400148020496e6469636573206f662064697361626c65642076616c696461746f72732e003d01205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e642077686574686572206120676976656e2076616c696461746f722069733d012064697361626c6564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e73642061206e657720736574206f66206964656e7469746965732e204e6578744b65797300010405008d040400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010405710900040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e01890401cc000179090c1c4772616e647061011c4772616e6470611814537461746501007d0904000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008109040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000010040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c65640000a5010400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e745365744964010028200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e00010405281004002859012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e0045012054686973206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e2070726f6f66732e20416e2065717569766f636174696f6e2070726f6f66206d7573744d0120636f6e7461696e732061206b65792d6f776e6572736869702070726f6f6620666f72206120676976656e2073657373696f6e2c207468657265666f7265207765206e65656420612077617920746f20746965450120746f6765746865722073657373696f6e7320616e64204752414e44504120736574206964732c20692e652e207765206e65656420746f2076616c6964617465207468617420612076616c696461746f7241012077617320746865206f776e6572206f66206120676976656e206b6579206f6e206120676976656e2073657373696f6e2c20616e642077686174207468652061637469766520736574204944207761735420647572696e6720746861742073657373696f6e2e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e01950401d008384d6178417574686f7269746965731010a0860100045c204d617820417574686f72697469657320696e20757365584d6178536574496453657373696f6e456e74726965732820a80000000000000018390120546865206d6178696d756d206e756d626572206f6620656e747269657320746f206b65657020696e207468652073657420696420746f2073657373696f6e20696e646578206d617070696e672e0031012053696e6365207468652060536574496453657373696f6e60206d6170206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e73207468697329012076616c75652073686f756c642072656c61746520746f2074686520626f6e64696e67206475726174696f6e206f66207768617465766572207374616b696e672073797374656d2069733501206265696e6720757365642028696620616e79292e2049662065717569766f636174696f6e2068616e646c696e67206973206e6f7420656e61626c6564207468656e20746869732076616c7565342063616e206265207a65726f2e0189090f20496d4f6e6c696e650120496d4f6e6c696e651038486561727462656174416674657201001010000000002c1d012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e207468652063757272656e74242073657373696f6e2e0025012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c642066616c6c350120726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e20546865206964656120697320746f206669727374207761697420666f721901207468652076616c696461746f727320746f2070726f64756365206120626c6f636b20696e207468652063757272656e742073657373696f6e2c20736f207468617420746865a820686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e00390120546869732076616c75652077696c6c206f6e6c79206265207573656420617320612066616c6c6261636b206966207765206661696c20746f2067657420612070726f7065722073657373696f6e2d012070726f677265737320657374696d6174652066726f6d20604e65787453657373696f6e526f746174696f6e602c2061732074686f736520657374696d617465732073686f756c642062650101206d6f7265206163637572617465207468656e207468652076616c75652077652063616c63756c61746520666f7220604865617274626561744166746572602e104b65797301008d09040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730001080505a50195090400083d0120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206053657373696f6e496e6465786020616e64206041757468496e6465786020746fb02060577261707065724f70617175653c426f756e6465644f70617175654e6574776f726b53746174653e602e38417574686f726564426c6f636b7301010805052d0910100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206056616c696461746f7249643c543e6020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e01c10401e40440556e7369676e65645072696f726974792820ffffffffffffffff10f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e0015012054686973206973206578706f73656420736f20746861742069742063616e2062652074756e656420666f7220706172746963756c61722072756e74696d652c207768656eb4206d756c7469706c652070616c6c6574732073656e6420756e7369676e6564207472616e73616374696f6e732e01a9092418546f6b656e730118546f6b656e731034546f74616c49737375616e6365010104050d0118400000000000000000000000000000000004902054686520746f74616c2069737375616e6365206f66206120746f6b656e20747970652e144c6f636b730101080205ad09b109040008d820416e79206c6971756964697479206c6f636b73206f66206120746f6b656e207479706520756e64657220616e206163636f756e742e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e204163636f756e74730101080205ad09bd09c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018b8205468652062616c616e6365206f66206120746f6b656e207479706520756e64657220616e206163636f756e742e00fc204e4f54453a2049662074686520746f74616c2069732065766572207a65726f2c206465637265617365206163636f756e7420726566206163636f756e742e001901204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f7265282062616c616e6365732e2052657365727665730101080205ad09c109040004a4204e616d6564207265736572766573206f6e20736f6d65206163636f756e742062616c616e6365732e0001090108204d61784c6f636b73101000000000002c4d61785265736572766573101000000000040d0120546865206d6178696d756d206e756d626572206f66206e616d656420726573657276657320746861742063616e206578697374206f6e20616e206163636f756e742e01cd09122843757272656e63696573000000044c4765744e617469766543757272656e637949640d018002000000000000000000000000000000000000000000000000000000000000000001d109132c54726164696e6750616972012c54726164696e67506169720838456e61626c6564536f75726365730001080502d509d909040000584c6f636b65644c6971756964697479536f757263657301000d0504000001e1040119010001dd09141841737365747301184173736574730c2c41737365744f776e657273000104050d010004000474204173736574204964202d3e204f776e6572204163636f756e74204964284173736574496e666f73010104050d01e109381054455354105465737400000000044101204173736574204964202d3e202853796d626f6c2c204e616d652c20507265636973696f6e2c204973204d696e7461626c652c20436f6e74656e7420536f757263652c204465736372697074696f6e294841737365745265636f726441737365744964000104050d01e5090400046c204173736574204964202d3e2041737365745265636f72643c543e01e5040121010001f50915284445584d616e6167657201284445584d616e616765720420444558496e666f730001040510f90904000000000001fd09167c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c017c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c4c2c526573657276657341636301004d01040404cc20546563686e6963616c206163636f756e74207573656420746f2073746f726520636f6c6c61746572616c20746f6b656e732e544672656552657365727665734163636f756e7449640000000400004c50656e64696e674672656552657365727665730100150604000030496e697469616c507269636501003d01400000a88dec78845e220000000000000004190120427579207072696365207374617274696e6720636f6e7374616e742e2054686973206973207468652070726963652075736572732070617920666f72206e657720584f522e3c50726963654368616e67655374657001003d01400000443945309a7a4800000000000000048c20436f6666696369656e747320696e206275792070726963652066756e6374696f6e2e3c50726963654368616e67655261746501003d0140000064a7b3b6e00d0000000000000000005053656c6c5072696365436f656666696369656e7401003d0140000050ecc22b1a0b000000000000000004a1012053657473207468652073656c6c2066756e6374696f6e2061732061206672616374696f6e206f6620746865206275792066756e6374696f6e2c20736f207468657265206973206d617267696e206265747765656e207468652074776f2066756e6374696f6e732e6c416c7761797344697374726962757465436f656666696369656e7401003d0140000014bbf08ac6020000000000000000087d0120436f656666696369656e742077686963682064657465726d696e657320746865206672616374696f6e206f6620696e70757420636f6c6c61746572616c20746f6b656e20746f2062652065786368616e67656420746f20584f5220616e64850120626520646973747269627574656420746f20707265646566696e6564206163636f756e74732e2052656c6576616e7420666f7220746865204275792066756e6374696f6e20287768656e206120757365722062757973206e657720584f52292e1c4261736546656501003d0140008053ee7ba80a00000000000000000004350120426173652066656520696e20584f52207768696368206973206465647563746564206f6e20616c6c207472616465732c2063757272656e746c792069742773206275726e65643a20302e332564446973747269627574696f6e4163636f756e7473456e7472790100010a6901010400000000000000000000000000000000010400000000000000000000000000000000010400000000000000000000000000000000010400000000000000000000000000000000010400000000000000000000000000000000043901204163636f756e74732074686174207265636569766520323025206275792f73656c6c206d617267696e206163636f7264696e6720746f20707265646566696e65642070726f706f7274696f6e7338456e61626c65645461726765747301000d0a040004010120436f6c6c61746572616c2041737365747320616c6c6f77656420746f20626520736f6c642062792074686520746f6b656e20626f6e64696e67206375727665405265666572656e63654173736574496401000d018002000000000000000000000000000000000000000000000000000000000000000411012041737365742074686174206973207573656420746f20636f6d7061726520636f6c6c61746572616c206173736574732062792076616c75652c20652e672e2c204441491c526577617264730101040200110a80000000000000000000000000000000000000000000000000000000000000000004990120526567697374727920746f2073746f726520696e666f726d6174696f6e2061626f75742072657761726473206f776e656420627920757365727320696e2050535741502e2028636c61696d5f6c696d69742c20617661696c61626c655f726577617264732930546f74616c52657761726473010018400000000000000000000000000000000004a020546f74616c20616d6f756e74206f66205053574150206f776e6564206279206163636f756e747364496e63656e7469766973656443757272656e636965734e756d010010100000000004e501204e756d626572206f6620726573657276652063757272656e636965732073656c6c696e6720776869636820757365722077696c6c2067657420726577617264732c206e616d656c7920616c6c207265676973746572656420636f6c6c61746572616c732065786365707420505357415020616e642056414c4c496e63656e74697665734163636f756e744964000000040004dc204163636f756e742077686963682073746f7265732061637475616c20505357415020696e74656e64656420666f72207265776172647388417373657473576974684f7074696f6e616c5265776172644d756c7469706c696572000104050d013d01040004150120526577617264206d756c7469706c6965727320666f72207370656369616c206173736574732e204173736574204964203d3e20526577617264204d756c7469706c69657264496e697469616c507377617052657761726473537570706c7901001840000000449840898f97f313080000000008d90120416d6f756e74206f6620505357415020696e697469616c6c792073746f72656420696e206163636f756e742064656469636174656420666f722054424320726577617264732e2041637475616c206163636f756e742062616c616e63652077696c6c206465706c657465206f7665722074696d652c9820686f7765766572207468697320636f6e7374616e74206973206e6f74206d6f64696669656448436f6c6c61746572616c5265736572766573010104050d01184000000000000000000000000000000000042d012043757272656e742072657365727665732062616c616e636520666f7220636f6c6c61746572616c20746f6b656e732c207573656420666f7220636c69656e742075736162696c6974792e01f9040135010001150a1724546563686e6963616c0124546563686e6963616c0430546563684163636f756e747300010402004d010400047d01205265676973746572656420746563686e6963616c206163636f756e74206964656e746966696572732e204d61702066726f6d207265707220604163636f756e7449646020696e746f20707572652060546563684163636f756e744964602e01fd040145010001190a181c506f6f6c58594b011c506f6f6c58594b1420526573657276657301010802021d0a110a80000000000000000000000000000000000000000000000000000000000000000018bc2055706461746564206166746572206c617374206c6971756964697479206368616e6765206f7065726174696f6e2e3101205b426173652041737365742049642028584f5229202d3e20546172676574204173736574204964203d3e2028426173652042616c616e63652c205461726765742042616c616e6365295d2e5d0120546869732073746f72616765207265636f726473206973206e6f74207573656420617320736f75726365206f6620696e666f726d6174696f6e2c20627574207573656420617320717569636b20636163686520666f72250120696e666f726d6174696f6e207468617420636f6d65732066726f6d2062616c616e63657320666f72206173736574732066726f6d20746563686e6963616c206163636f756e74732e750120466f72206578616d706c652c20636f6d6d756e69636174696f6e207769746820746563686e6963616c206163636f756e747320616e642074686569722073746f72616765206973206e6f74206e65656465642c20616e642074686973ac207061697220746f2062616c616e63652063616368652063616e206265207573656420717569636b6c792e34506f6f6c50726f7669646572730001080606210a18040008a0204c69717569646974792070726f766964657273206f6620706172746963756c617220706f6f6c2e050120506f6f6c206163636f756e74203d3e204c69717569646974792070726f7669646572206163636f756e74203d3e20506f6f6c20746f6b656e2062616c616e6365304163636f756e74506f6f6c730101080602ad090d0a040008c020536574206f6620706f6f6c7320696e207768696368206163636f756e7473206861766520736f6d652073686172652e4101204c69717569646974792070726f7669646572206163636f756e74203d3e20546172676574204173736574206f6620706169722028617373756d696e67206261736520617373657420697320584f522938546f74616c49737375616e6365730001040600180400088c20546f74616c2069737375616e6365206f6620706172746963756c617220706f6f6c2e7c20506f6f6c206163636f756e74203d3e20546f74616c2069737375616e63652850726f7065727469657300010802021d0a210a04000491012050726f70657274696573206f6620706172746963756c617220706f6f6c2e2042617365204173736574203d3e20546172676574204173736574203d3e20285265736572766573204163636f756e742049642c2046656573204163636f756e74204964290101050159010001250a19384c697175696469747950726f787900010505015d010001290a1a1c436f756e63696c011c436f756e63696c182450726f706f73616c7301002d0a040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f66000104062c4504040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e67000104062c310a040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d62657273010025020400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000000040004650120546865207072696d65206d656d62657220746861742068656c70732064657465726d696e65207468652064656661756c7420766f7465206265686176696f7220696e2063617365206f6620616273656e746174696f6e732e0125050175010001350a1b48546563686e6963616c436f6d6d69747465650148546563686e6963616c436f6d6d6974746565182450726f706f73616c730100390a040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f66000104062c4504040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e67000104062c310a040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d62657273010025020400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000000040004650120546865207072696d65206d656d62657220746861742068656c70732064657465726d696e65207468652064656661756c7420766f7465206265686176696f7220696e2063617365206f6620616273656e746174696f6e732e01310501790100013d0a1c2444656d6f6372616379012444656d6f63726163792c3c5075626c696350726f70436f756e74010010100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f70730100410a040004050120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c2e244465706f7369744f6600010405104d0a04000c842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e00d82054574f582d4e4f54453a20536166652c20617320696e6372656173696e6720696e7465676572206b6579732061726520736166652e3c5265666572656e64756d436f756e74010010100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b6564010010100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001040510550a04000cb420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e0009012054574f582d4e4f54453a205341464520617320696e646578657320617265206e6f7420756e64657220616e2061747461636b6572e280997320636f6e74726f6c2e20566f74696e674f660101040500610ad8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105d0120416c6c20766f74657320666f72206120706172746963756c617220766f7465722e2057652073746f7265207468652062616c616e636520666f7220746865206e756d626572206f6620766f74657320746861742077655d012068617665207265636f726465642e20546865207365636f6e64206974656d2069732074686520746f74616c20616d6f756e74206f662064656c65676174696f6e732c20746861742077696c6c2062652061646465642e00e82054574f582d4e4f54453a205341464520617320604163636f756e7449646073206172652063727970746f2068617368657320616e797761792e544c6173745461626c656457617345787465726e616c0100bc0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c0000790a040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c697374000104062c7d0a04000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e73010104062cbc0400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e013505017d01303c456e6163746d656e74506572696f6410108097060014e82054686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174510120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e207468652063617365b4207768657265207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6410100027060004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6410108013030004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e44566f74654c6f636b696e67506572696f64101080970600109020546865206d696e696d756d20706572696f64206f6620766f7465206c6f636b696e672e0065012049742073686f756c64206265206e6f2073686f72746572207468616e20656e6163746d656e7420706572696f6420746f20656e73757265207468617420696e207468652063617365206f6620616e20617070726f76616c2c49012074686f7365207375636365737366756c20766f7465727320617265206c6f636b656420696e746f2074686520636f6e73657175656e636573207468617420746865697220766f74657320656e7461696c2e384d696e696d756d4465706f7369741840000064a7b3b6e00d000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e38496e7374616e74416c6c6f776564bc04010c550120496e64696361746f7220666f72207768657468657220616e20656d657267656e6379206f726967696e206973206576656e20616c6c6f77656420746f2068617070656e2e20536f6d6520636861696e73206d617961012077616e7420746f207365742074686973207065726d616e656e746c7920746f206066616c7365602c206f7468657273206d61792077616e7420746f20636f6e646974696f6e206974206f6e207468696e67732073756368a020617320616e207570677261646520686176696e672068617070656e656420726563656e746c792e5446617374547261636b566f74696e67506572696f6410100807000004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f72206120666173742d747261636b207265666572656e64756d2e34436f6f6c6f6666506572696f6410100027060004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e204d6178566f74657310106400000010b020546865206d6178696d756d206e756d626572206f6620766f74657320666f7220616e206163636f756e742e00d420416c736f207573656420746f20636f6d70757465207765696768742c20616e206f7665726c79206269672076616c75652063616e1501206c65616420746f2065787472696e7369632077697468207665727920626967207765696768743a20736565206064656c65676174656020666f7220696e7374616e63652e304d617850726f706f73616c73101064000000040d0120546865206d6178696d756d206e756d626572206f66207075626c69632070726f706f73616c7320746861742063616e20657869737420617420616e792074696d652e2c4d61784465706f73697473101064000000041d0120546865206d6178696d756d206e756d626572206f66206465706f736974732061207075626c69632070726f706f73616c206d6179206861766520617420616e792074696d652e384d6178426c61636b6c697374656410106400000004d820546865206d6178696d756d206e756d626572206f66206974656d732077686963682063616e20626520626c61636b6c69737465642e01850a1d1844455841504901184445584150490448456e61626c6564536f75726365547970657301000d05040000014905018d010001890a1e24457468427269646765012445746842726964676568345265717565737473517565756501010405100d03040004e020526567697374657265642072657175657374732071756575652068616e646c6564206279206f66662d636861696e20776f726b6572732e20526571756573747300010805068d0a910a0400045420526567697374657265642072657175657374732e644c6f6164546f496e636f6d696e67526571756573744861736801010805068d0a2c800000000000000000000000000000000000000000000000000000000000000000042101205573656420746f206964656e7469667920616e20696e636f6d696e6720726571756573742062792074686520636f72726573706f6e64696e67206c6f616420726571756573742e3c52657175657374537461747573657300010805068d0a950a0400044c2052657175657374732073746174757365732e5c526571756573745375626d697373696f6e48656967687401010805068d0a10100000000004bc205265717565737473207375626d697373696f6e20686569676874206d617020286f6e20737562737472617465292e4052657175657374417070726f76616c7301010805068d0a990a04000474204f7574676f696e6720726571756573747320617070726f76616c732e3c4163636f756e7452657175657374730101040200a10a04000474205265717565737473206d61646520627920616e206163636f756e742e3c5265676973746572656441737365740001080506a50a6d050400045c2052656769737465726564206173736574206b696e642e5c53696465636861696e4173736574507265636973696f6e0101080506a50a08040008690120507265636973696f6e2028646563696d616c7329206f66206120726567697374657265642073696465636861696e2061737365742e2053686f756c64206265207468652073616d6520617320696e20746865204552432d32302820636f6e74726163742e605265676973746572656453696465636861696e41737365740001080502a90a0d01040004a4205265676973746572656420746f6b656e20604173736574496460206f6e2054686973636861696e2e605265676973746572656453696465636861696e546f6b656e0001080502a50a09040400049c20526567697374657265642061737365742061646472657373206f6e2053696465636861696e2e1450656572730101040510ad0a0400044c204e6574776f726b207065657273207365742e2c50656e64696e6750656572000104051000040004b0204e6574776f726b2070656e64696e6720286265696e672061646465642f72656d6f7665642920706565722e4c50656e64696e67457468506565727353796e630100b10a0c00000004cc205573656420666f7220636f6d7061746962696c697479207769746820584f5220616e642056414c20636f6e7472616374732e34506565724163636f756e7449640001080502a90a00040004782050656572206163636f756e74204944206f6e2054686973636861696e2e2c506565724164647265737301010805022d090904500000000000000000000000000000000000000000046c20506565722061646472657373206f6e2053696465636861696e2e344272696467654163636f756e740001040510000400049101204d756c74692d7369676e61747572652062726964676520706565727327206163636f756e742e20604e6f6e6560206966207468657265206973206e6f206163636f756e7420616e64206e6574776f726b20776974682074686520676976656e2049442e40417574686f726974794163636f756e74000000040004742054686973636861696e20617574686f72697479206163636f756e742e3842726964676553746174757365730001040510b50a0400043c20427269646765207374617475732e54427269646765436f6e74726163744164647265737301010405100904500000000000000000000000000000000000000000049420536d6172742d636f6e74726163742061646472657373206f6e2053696465636861696e2e60586f724d6173746572436f6e74726163744164647265737301000904500000000000000000000000000000000000000000048820536f726120584f52206d617374657220636f6e747261637420616464726573732e6056616c4d6173746572436f6e74726163744164647265737301000904500000000000000000000000000000000000000000048820536f72612056414c206d617374657220636f6e747261637420616464726573732e344e6578744e6574776f726b496401001010000000000464204e657874204e6574776f726b20494420636f756e7465722e444d6967726174696e67526571756573747301000d030400086901205265717565737473206d6967726174696e672066726f6d2076657273696f6e2027302e312e302720746f2027302e322e30272e2054686573652072657175657374732073686f756c642062652072656d6f7665642066726f6dd020605265717565737473517565756560206265666f7265206d6967726174696f6e2070726f63656475726520737461727465642e5c4272696467655369676e617475726556657273696f6e73010104051051050402007850656e64696e674272696467655369676e617475726556657273696f6e7300010405105105040000014d050191010001b90a1f445073776170446973747269627574696f6e01445073776170446973747269627574696f6e1848537562736372696265644163636f756e74730001040200bd0a040008b1012053746f726520666f7220696e666f726d6174696f6e2061626f7574206163636f756e747320636f6e7461696e696e6720666565732c207468617420706172746963697061746520696e20696e63656e7469766520646973747269627574696f6e206d656368616e69736d2ed1012046656573204163636f756e74204964202d3e20284445582049642c20506f6f6c204d61726b65722041737365742049642c20446973747269627574696f6e204672657175656e63792c20426c6f636b204f666673657429204672657175656e6379204d555354206265206e6f6e2d7a65726f2e204275726e5261746501003d01400000000000000000000000000000000004f820416d6f756e74206f6620696e63656e7469766520746f6b656e7320746f206265206275726e6564206f6e206561636820646973747269627574696f6e2e384275726e557064617465496e666f0100c10a80000000000000000000000000000000000000000000000000000000000000000004a820284275726e205261746520496e6372656173652044656c74612c204275726e2052617465204d6178294c5368617265686f6c6465724163636f756e747301010402003d01400000000000000000000000000000000004690120496e666f726d6174696f6e2061626f7574206f776e656420706f7274696f6e206f662073746f72656420696e63656e7469766520746f6b656e732e205368617265686f6c646572202d3e204f776e6564204672616374696f6e3c436c61696d61626c6553686172657301003d01400000000000000000000000000000000004b42053756d206f6620616c6c20736861726573206f6620696e63656e7469766520746f6b656e206f776e6572732e4c4275794261636b544243444672616374696f6e01003d014000008a5d78456301000000000000000004cc204672616374696f6e206f66205053574150207468617420636f756c6420626520627579206261636b656420746f205442434401d1050195010001c50a20204d756c746973696701204d756c746973696704244d756c74697369677300010805023104c90a040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e01d5050199010c2c4465706f7369744261736518400100000000000000000000000000000018590120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061206d756c746973696720657865637574696f6e206f7220746f842073746f726520612064697370617463682063616c6c20666f72206c617465722e00010120546869732069732068656c6420666f7220616e206164646974696f6e616c2073746f72616765206974656d2077686f73652076616c75652073697a652069733101206034202b2073697a656f662828426c6f636b4e756d6265722c2042616c616e63652c204163636f756e74496429296020627974657320616e642077686f7365206b65792073697a652069738020603332202b2073697a656f66284163636f756e74496429602062797465732e344465706f736974466163746f721840010000000000000000000000000000000c55012054686520616d6f756e74206f662063757272656e6379206e65656465642070657220756e6974207468726573686f6c64207768656e206372656174696e672061206d756c746973696720657865637574696f6e2e00250120546869732069732068656c6420666f7220616464696e67203332206279746573206d6f726520696e746f2061207072652d6578697374696e672073746f726167652076616c75652e384d61785369676e61746f7269657310106400000004ec20546865206d6178696d756d20616d6f756e74206f66207369676e61746f7269657320616c6c6f77656420696e20746865206d756c74697369672e01d10a21245363686564756c657201245363686564756c65720c3c496e636f6d706c65746553696e6365000010040000184167656e64610101040510d50a0400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e184c6f6f6b75700001040504a501040010f8204c6f6f6b75702066726f6d2061206e616d6520746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e00590120466f72207633202d3e207634207468652070726576696f75736c7920756e626f756e646564206964656e7469746965732061726520426c616b65322d3235362068617368656420746f20666f726d2074686520763430206964656e7469746965732e01dd0501a10108344d6178696d756d576569676874203c070010a5d4e813ffffffffffffff7f04290120546865206d6178696d756d207765696768742074686174206d6179206265207363686564756c65642070657220626c6f636b20666f7220616e7920646973706174636861626c65732e504d61785363686564756c6564506572426c6f636b101032000000041d0120546865206d6178696d756d206e756d626572206f66207363686564756c65642063616c6c7320696e2074686520717565756520666f7220612073696e676c6520626c6f636b2e01e50a223849726f68614d6967726174696f6e013849726f68614d6967726174696f6e202042616c616e63657300010402b101180400002452656665727265727300010402b101b101040000285075626c69634b65797301010402b101e90a0400001c51756f72756d7301010402b101080400001c4163636f756e74000000040000404d696772617465644163636f756e747300010402b101000400005c50656e64696e674d756c74695369674163636f756e747301010402b101f10a080000004050656e64696e67526566657272616c7301010402b101250204000001e50501ad010001f50a234c546563686e6963616c4d656d62657273686970014c546563686e6963616c4d656d62657273686970081c4d656d626572730100f90a040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000000040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e01e90501b5010001fd0a2644456c656374696f6e7350687261676d656e0144456c656374696f6e7350687261676d656e141c4d656d626572730100010b04000c74205468652063757272656e7420656c6563746564206d656d626572732e00b820496e76617269616e743a20416c7761797320736f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100010b04001084205468652063757272656e742072657365727665642072756e6e6572732d75702e00590120496e76617269616e743a20416c7761797320736f72746564206261736564206f6e2072616e6b2028776f72736520746f2062657374292e2055706f6e2072656d6f76616c206f662061206d656d6265722c20746865bc206c6173742028692e652e205f626573745f292072756e6e65722d75702077696c6c206265207265706c616365642e2843616e646964617465730100bd010400185901205468652070726573656e742063616e646964617465206c6973742e20412063757272656e74206d656d626572206f722072756e6e65722d75702063616e206e6576657220656e746572207468697320766563746f72d020616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e007c205365636f6e6420656c656d656e7420697320746865206465706f7369742e00b820496e76617269616e743a20416c7761797320736f72746564206261736564206f6e206163636f756e742069642e38456c656374696f6e526f756e647301001010000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e18566f74696e670101040500090b840000000000000000000000000000000000000000000000000000000000000000000cb820566f74657320616e64206c6f636b6564207374616b65206f66206120706172746963756c617220766f7465722e00c42054574f582d4e4f54453a205341464520617320604163636f756e7449646020697320612063727970746f20686173682e01ed0501b901242050616c6c65744964150120706872656c65637404d0204964656e74696669657220666f722074686520656c656374696f6e732d70687261676d656e2070616c6c65742773206c6f636b3443616e646964616379426f6e641840000064a7b3b6e00d000000000000000004050120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e38566f74696e67426f6e644261736518400010a5d4e8000000000000000000000010942042617365206465706f736974206173736f636961746564207769746820766f74696e672e00550120546869732073686f756c642062652073656e7369626c79206869676820746f2065636f6e6f6d6963616c6c7920656e73757265207468652070616c6c65742063616e6e6f742062652061747461636b656420627994206372656174696e67206120676967616e746963206e756d626572206f6620766f7465732e40566f74696e67426f6e64466163746f7218400010a5d4e800000000000000000000000411012054686520616d6f756e74206f6620626f6e642074686174206e65656420746f206265206c6f636b656420666f72206561636820766f746520283332206279746573292e38446573697265644d656d6265727310100d0000000470204e756d626572206f66206d656d6265727320746f20656c6563742e404465736972656452756e6e65727355701010140000000478204e756d626572206f662072756e6e6572735f757020746f206b6565702e305465726d4475726174696f6e1010c08901000c510120486f77206c6f6e6720656163682073656174206973206b6570742e205468697320646566696e657320746865206e65787420626c6f636b206e756d62657220617420776869636820616e20656c656374696f6e5d0120726f756e642077696c6c2068617070656e2e2049662073657420746f207a65726f2c206e6f20656c656374696f6e732061726520657665722074726967676572656420616e6420746865206d6f64756c652077696c6c5020626520696e2070617373697665206d6f64652e344d617843616e646964617465731010e803000014e420546865206d6178696d756d206e756d626572206f662063616e6469646174657320696e20612070687261676d656e20656c656374696f6e2e001501205761726e696e673a2054686520656c656374696f6e2068617070656e73206f6e636861696e2c20616e6420746869732076616c75652077696c6c2064657465726d696e65f4207468652073697a65206f662074686520656c656374696f6e2e205768656e2074686973206c696d69742069732072656163686564206e6f206d6f7265a42063616e646964617465732061726520616363657074656420696e2074686520656c656374696f6e2e244d6178566f7465727310101027000010f820546865206d6178696d756d206e756d626572206f6620766f7465727320746f20616c6c6f7720696e20612070687261676d656e20656c656374696f6e2e001501205761726e696e673a205468697320696d7061637473207468652073697a65206f662074686520656c656374696f6e2077686963682069732072756e206f6e636861696e2ed8205768656e20746865206c696d6974206973207265616368656420746865206e657720766f74657273206172652069676e6f7265642e010d0b273456657374656452657761726473013456657374656452657761726473101c526577617264730101040200110b84000000000000000000000000000000000000000000000000000000000000000000086020526573657276656420666f7220667574757265207573655101204d617070696e67206265747765656e20757365727320616e64207468656972206f776e65642072657761726473206f6620646966666572656e74206b696e64732c20776869636820617265207665737465642e30546f74616c526577617264730100184000000000000000000000000000000000086020526573657276656420666f7220667574757265207573659c20546f74616c20616d6f756e74206f662050535741502070656e64696e6720726577617264732e3843726f77646c6f616e496e666f7300010402f905150b0400047020496e666f726d6174696f6e2061626f75742063726f77646c6f616e4843726f77646c6f616e55736572496e666f730001080202190b1d0b040004d020496e666f726d6174696f6e2061626f75742063726f77646c6f616e207265776172647320636c61696d6564206279207573657201f50501c5010c784765744d61726b65744d616b6572526577617264734163636f756e744964008054734f90f971a02c609b2d684e61b5573ff6739bc94151fc45d6c34d3600e78504b8204163636f756e747320686f6c64696e672050535741502064656469636174656420666f7220726577617264732e684765744661726d696e67526577617264734163636f756e744964008054734f90f971a02c609b2d684e61b557c5ab779bfebd4b6d74b82c5f991c4a6d007c476574426f6e64696e674375727665526577617264734163636f756e744964008054734f90f971a02c609b2d684e61b5572ead45212d81543b2d6d8124445d63af0001210b28204964656e7469747901204964656e7469747910284964656e746974794f660001040500250b04000c210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e1c53757065724f660001040200ad060400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f660101040500350b44000000000000000000000000000000000014b820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e285265676973747261727301003d0b0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e011d0601cd01183042617369634465706f73697418400000c16ff2862300000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564206964656e74697479304669656c644465706f73697418400000c16ff28623000000000000000000042d012054686520616d6f756e742068656c64206f6e206465706f73697420706572206164646974696f6e616c206669656c6420666f7220612072656769737465726564206964656e746974792e445375624163636f756e744465706f73697418400000c16ff286230000000000000000000c65012054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564207375626163636f756e742e20546869732073686f756c64206163636f756e7420666f7220746865206661637465012074686174206f6e652073746f72616765206974656d27732076616c75652077696c6c20696e637265617365206279207468652073697a65206f6620616e206163636f756e742049442c20616e642074686572652077696c6c350120626520616e6f746865722074726965206974656d2077686f73652076616c7565206973207468652073697a65206f6620616e206163636f756e7420494420706c75732033322062797465732e384d61785375624163636f756e7473101064000000040d0120546865206d6178696d756d206e756d626572206f66207375622d6163636f756e747320616c6c6f77656420706572206964656e746966696564206163636f756e742e4c4d61784164646974696f6e616c4669656c6473101064000000086501204d6178696d756d206e756d626572206f66206164646974696f6e616c206669656c64732074686174206d61792062652073746f72656420696e20616e2049442e204e656564656420746f20626f756e642074686520492f4fe020726571756972656420746f2061636365737320616e206964656e746974792c206275742063616e2062652070726574747920686967682e344d617852656769737472617273101014000000085101204d61786d696d756d206e756d626572206f66207265676973747261727320616c6c6f77656420696e207468652073797374656d2e204e656564656420746f20626f756e642074686520636f6d706c65786974797c206f662c20652e672e2c207570646174696e67206a756467656d656e74732e014d0b291c4661726d696e67011c4661726d696e670814506f6f6c7301010406102502040004210120506f6f6c732077686f7365206661726d65727320617265207265667265736865642061742074686520737065636966696320626c6f636b2e20426c6f636b203d3e20506f6f6c732c506f6f6c4661726d6572730101040600510b04000494204661726d657273206f662074686520706f6f6c2e20506f6f6c203d3e204661726d65727300000001590b2a1c585354506f6f6c011c585354506f6f6c1444456e61626c656453796e74686574696373000104020d015d0b04000cb82053796e7468657469632061737365747320616e64207468656972207265666572656e63652073796d626f6c732e007501204974277320612070726f6772616d6d657220726573706f6e736962696c69747920746f206b656570207468697320636f6c6c656374696f6e20636f6e73697374656e742077697468205b60456e61626c656453796d626f6c73605d2e38456e61626c656453796d626f6c7300010402d5010d0104000cb8205265666572656e63652073796d626f6c7320616e642074686569722073796e746865746963206173736574732e008101204974277320612070726f6772616d6d657220726573706f6e736962696c69747920746f206b656570207468697320636f6c6c656374696f6e20636f6e73697374656e742077697468205b60456e61626c656453796e74686574696373605d2e405265666572656e63654173736574496401000d018002000000000000000000000000000000000000000000000000000000000000000415012041737365742074686174206973207573656420746f20636f6d7061726520636f6c6c61746572616c206173736574732062792076616c75652c20652e672e2c204441492e48436f6c6c61746572616c5265736572766573010104050d01184000000000000000000000000000000000042d012043757272656e742072657365727665732062616c616e636520666f7220636f6c6c61746572616c20746f6b656e732c207573656420666f7220636c69656e742075736162696c6974792e7053796e746865746963426173654173736574466c6f6f7250726963650100184000407a10f35a0000000000000000000004a820466c6f6f7220707269636520666f72207468652073796e74686574696320626173652061737365742e01bd0601d101047047657453796e7468657469634261736542757953656c6c4c696d69741840ffffffffffffffffffffffffffffffff047c204d6178696d756d207472616461626c6520616d6f756e74206f662058535401610b2b285072696365546f6f6c7301285072696365546f6f6c7304285072696365496e666f73000104060d01650b0400000001d90100016d0b2c3043657265735374616b696e67013043657265735374616b696e671040417574686f726974794163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b13204f4204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e672072656d61696e696e6720726577617264731c5374616b6572730101040600710b8000000000000000000000000000000000000000000000000000000000000000000464204163636f756e744964202d3e205374616b696e67496e666f38546f74616c4465706f7369746564010018400000000000000000000000000000000000405265776172647352656d61696e696e6701001840000060521035ac8620000000000000000001c10601dd010001750b2d5043657265734c69717569646974794c6f636b6572015043657265734c69717569646974794c6f636b65721850466565734f7074696f6e4f6e654163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b13204a8204163636f756e7420666f7220636f6c6c656374696e6720666565732066726f6d204f7074696f6e203150466565734f7074696f6e54776f4163636f756e74010000800a0455d92e1fda8dee17b2c58761c8efca490ef2a1a03322dbfea7379481d51704a8204163636f756e7420666f7220636f6c6c656374696e6720666565732066726f6d204f7074696f6e203260466565734f7074696f6e54776f4365726573416d6f756e74010018400000d01309468e15010000000000000004ac20416d6f756e74206f6620434552455320666f72206c6f636b65722066656573206f7074696f6e2074776f40417574686f726974794163636f756e740100008034a5b78f5fbcdc92a28767d63b579690a4b2f6a179931b3ecc87f09fc9366d4704f0204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e6720434552455320616d6f756e74206665655050616c6c657453746f7261676556657273696f6e0100790b0400045c2050616c6c65742073746f726167652076657273696f6e284c6f636b65724461746101010406007d0b040004b420436f6e7461696e7320646174612061626f7574206c6f636b75707320666f722065616368206163636f756e7401c50601e1010001850b2e404365726573546f6b656e4c6f636b657201404365726573546f6b656e4c6f636b6572142c466565734163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b1320470204163636f756e7420666f7220636f6c6c656374696e67206665657340417574686f726974794163636f756e74010000800a0455d92e1fda8dee17b2c58761c8efca490ef2a1a03322dbfea7379481d51704bc204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e67206665655050616c6c657453746f7261676556657273696f6e0100890b0400045c2050616c6c65742073746f726167652076657273696f6e24466565416d6f756e74010018400080e03779c31100000000000000000004ac20416d6f756e74206f6620434552455320666f72206c6f636b65722066656573206f7074696f6e2074776f3c546f6b656e4c6f636b65724461746101010406008d0b04000001c90601e5010001950b2f5c4365726573476f7665726e616e6365506c6174666f726d015c4365726573476f7665726e616e6365506c6174666f726d1018566f74696e670001080606990b9d0b040004c8204120766f7465206f66206120706172746963756c6172207573657220666f72206120706172746963756c617220706f6c6c20506f6c6c44617461000104062ca10b0400005050616c6c657453746f7261676556657273696f6e0100a50b0400045c2050616c6c65742073746f726167652076657273696f6e40417574686f726974794163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b13204c8204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206372656174696e67206120706f6c6c01cd0601e9010001a90b303843657265734c61756e6368706164013843657265734c61756e6368706164244050656e616c746965734163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b1320484204163636f756e7420666f7220636f6c6c656374696e672070656e616c746965734843657265734275726e466565416d6f756e74010018400000e8890423c78a0000000000000000047420416d6f756e74206f6620434552455320666f72206275726e20666565644365726573466f72436f6e747269627574696f6e496e494c4f01001840000064a7b3b6e00d000000000000000004a020416d6f756e74206f6620434552455320666f7220636f6e747269627574696f6e20696e20494c4f5c46656550657263656e744f6e52616973656446756e6473010018400000c16ff2862300000000000000000004b8204665652070657263656e74206f6e207261697365642066756e647320696e207375636365737366756c20494c4f40417574686f726974794163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b132040501204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e67204345524553206275726e20616d6f756e742066656510494c4f73000104060d01ad0b04000034436f6e747269627574696f6e730101080606b90bbd0bd40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c57686974656c6973746564436f6e7472696275746f7273010025020400006057686974656c6973746564496c6f4f7267616e697a6572730100250204000001e10601f5010001c10b315844656d657465724661726d696e67506c6174666f726d015844656d657465724661726d696e67506c6174666f726d1828546f6b656e496e666f73000104060d01c50b0400002455736572496e666f730101040600c90b04000014506f6f6c7301010806061d0ad10b0400005050616c6c657453746f7261676556657273696f6e0100d90b0400045c2050616c6c65742073746f726167652076657273696f6e40417574686f726974794163636f756e7401000080fc096e24663f4dd1e2d48092c73213354c067c0c715ec68e7fcad185da62680100284665654163636f756e7401000080fc096e24663f4dd1e2d48092c73213354c067c0c715ec68e7fcad185da6268010444204163636f756e7420666f72206665657301e50601f9010001dd0b3220426167734c6973740120426167734c6973740c244c6973744e6f6465730001040500e10b04000c8020412073696e676c65206e6f64652c2077697468696e20736f6d65206261672e000501204e6f6465732073746f7265206c696e6b7320666f727761726420616e64206261636b2077697468696e207468656972207265737065637469766520626167732e4c436f756e746572466f724c6973744e6f646573010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170204c697374426167730001040528e50b04000c642041206261672073746f72656420696e2073746f726167652e0019012053746f7265732061206042616760207374727563742c2077686963682073746f726573206865616420616e64207461696c20706f696e7465727320746f20697473656c662e01e90601fd0104344261675468726573686f6c6473e90b09192103290000000000000032000000000000003d000000000000004b000000000000005c0000000000000071000000000000008b00000000000000aa00000000000000d10000000000000000010000000000003a010000000000008101000000000000d8010000000000004302000000000000c60200000000000067030000000000002c040000000000001e050000000000004706000000000000b3070000000000007209000000000000960b000000000000360e0000000000006e110000000000006115000000000000391a0000000000002a20000000000000742700000000000065300000000000005d3b000000000000d14800000000000051590000000000008f6d0000000000006386000000000000d7a400000000000032ca00000000000004f800000000000038300100000000002975010000000000bac90100000000007531020000000000b1b0020000000000c34c030000000000330c04000000000005f70400000000000e170600000000005d78070000000000bd29090000000000533d0b000000000060c90d000000000032e910000000000044be140000000000aa71190000000000c7351f0000000000674826000000000059f52e0000000000999939000000000036a746000000000018aa560000000000db4d6a0000000000ff64820000000000b8f19f0000000000be30c400000000008fa6f00000000000b22f270100000000ac146a01000000007922bc01000000008fc8200200000000b23d9c02000000001ead330300000000ec6ded03000000000847d104000000008dc2e8050000000001943f0700000000c115e40800000000d8e2e70a00000000b093600d0000000089a568100000000065962014000000004641b018000000005e89481e0000000008662525000000008465902d0000000055c1e337000000004d258e4400000000bc511754000000006eca25670000000067cf857e000000000fea319b00000000786a5dbe00000000314581e90000000084db6b1e010000004f57545f01000000f069f2ae01000000c96c9b10020000008a1b6688020000003467561b03000000873793cf03000000045ba8ac040000004268d7bb0500000071f37a0807000000663f80a0080000007b82fc940a00000025ffe3fa0c000000b49aeaeb0f0000006559978713000000764896f41700000008fc56621d00000061fb080b24000000e7640b362c0000000ee6e93a36000000430e078542000000e2451b98510000006499b8156400000087740ec47a00000054ce35969600000024b55eb6b800000032514c92e2000000e32ca5ea15010000dae4bbe554010000df939926a201000093ee40e900020000a5f9582575020000b4eab2b803030000f5f7729bb203000095230b208904000099c0b54190050000bcd5b804d3060000e8207aec5e080000974e558c440a0000a8c54439980c00000934cde3720f0000848d4b23f31200002f7dd67d3e170000978c6dfa821c000099a84c0ef9220000d08a0bfae52a0000cbcddeaf9e340000c23c0e628b400000bbcebedf2b4f00004c2cd2ee1c610000da3436dc1e7700002846fe881d920000a35d914a3ab300004b66c607d8db0000cac1c414aa0d01003570eb6cc64a01009784180ebc95010073a8ef64aef101003bcb0bf07662020075c0a382ceec02007b69dde07f96030019c942d4a5660400b62cba51f76505008b012ce1249f0600c81af62f4b1f080066852b9a7ff60900ff2ce98c7c380c00c93c61f974fd0e0083f2f3b21763120040444494cd8d1600a10332bd3faa1b005248624036ef21000443dc4ae39f2900247ceb5ab30e33005a889eadc0a03e00040890df0ed24c00c8f36c1fbc3a5e006463b5985f95730030a5b659d9c68d001825e26fe7e7ad00f08c39efe650d50070d3eddf3ea80501f05efb990ff44001b027801be4af8901a03819db4de7e201e07d294888565002409f40cc8192d602a075a467f7397b038068f440b131450400f63bc765ee3c05405a02555bcf6c06001222ba938de10780b2fc3429c4aa09004667699297db0b8014931ace828b0e000d3db30d53d71100530fff675ce21500fea6be80f4d71a0028d48cff42ed2000fce043487b632800369e364f978a3100c2345ecbb0c43c00e40b03aa1c8a4a00005375c9746e5b004ca34cfac526700060914a832491890010ec8966f8bda800b0bcfc0f65fbceffffffffffffffffacd020546865206c697374206f66207468726573686f6c64732073657061726174696e672074686520766172696f757320626167732e00490120496473206172652073657061726174656420696e746f20756e736f727465642062616773206163636f7264696e6720746f2074686569722073636f72652e205468697320737065636966696573207468656101207468726573686f6c64732073657061726174696e672074686520626167732e20416e20696427732062616720697320746865206c6172676573742062616720666f722077686963682074686520696427732073636f7265b8206973206c657373207468616e206f7220657175616c20746f20697473207570706572207468726573686f6c642e006501205768656e20696473206172652069746572617465642c2068696768657220626167732061726520697465726174656420636f6d706c6574656c79206265666f7265206c6f77657220626167732e2054686973206d65616e735901207468617420697465726174696f6e206973205f73656d692d736f727465645f3a20696473206f66206869676865722073636f72652074656e6420746f20636f6d65206265666f726520696473206f66206c6f7765722d012073636f72652c206275742070656572206964732077697468696e206120706172746963756c6172206261672061726520736f7274656420696e20696e73657274696f6e206f726465722e006820232045787072657373696e672074686520636f6e7374616e74004d01205468697320636f6e7374616e74206d75737420626520736f7274656420696e207374726963746c7920696e6372656173696e67206f726465722e204475706c6963617465206974656d7320617265206e6f742c207065726d69747465642e00410120546865726520697320616e20696d706c696564207570706572206c696d6974206f66206053636f72653a3a4d4158603b20746861742076616c756520646f6573206e6f74206e65656420746f2062652101207370656369666965642077697468696e20746865206261672e20466f7220616e792074776f207468726573686f6c64206c697374732c206966206f6e6520656e647320776974683101206053636f72653a3a4d4158602c20746865206f74686572206f6e6520646f6573206e6f742c20616e64207468657920617265206f746865727769736520657175616c2c207468652074776f7c206c697374732077696c6c20626568617665206964656e746963616c6c792e003820232043616c63756c6174696f6e005501204974206973207265636f6d6d656e64656420746f2067656e65726174652074686520736574206f66207468726573686f6c647320696e20612067656f6d6574726963207365726965732c2073756368207468617441012074686572652065786973747320736f6d6520636f6e7374616e7420726174696f2073756368207468617420607468726573686f6c645b6b202b20315d203d3d20287468726573686f6c645b6b5d202ad020636f6e7374616e745f726174696f292e6d6178287468726573686f6c645b6b5d202b2031296020666f7220616c6c20606b602e005901205468652068656c7065727320696e2074686520602f7574696c732f6672616d652f67656e65726174652d6261677360206d6f64756c652063616e2073696d706c69667920746869732063616c63756c6174696f6e2e002c2023204578616d706c6573005101202d20496620604261675468726573686f6c64733a3a67657428292e69735f656d7074792829602c207468656e20616c6c20696473206172652070757420696e746f207468652073616d65206261672c20616e64b0202020697465726174696f6e206973207374726963746c7920696e20696e73657274696f6e206f726465722e6101202d20496620604261675468726573686f6c64733a3a67657428292e6c656e2829203d3d203634602c20616e6420746865207468726573686f6c6473206172652064657465726d696e6564206163636f7264696e6720746f11012020207468652070726f63656475726520676976656e2061626f76652c207468656e2074686520636f6e7374616e7420726174696f20697320657175616c20746f20322e6501202d20496620604261675468726573686f6c64733a3a67657428292e6c656e2829203d3d20323030602c20616e6420746865207468726573686f6c6473206172652064657465726d696e6564206163636f7264696e6720746f59012020207468652070726f63656475726520676976656e2061626f76652c207468656e2074686520636f6e7374616e7420726174696f20697320617070726f78696d6174656c7920657175616c20746f20312e3234382e6101202d20496620746865207468726573686f6c64206c69737420626567696e7320605b312c20322c20332c202e2e2e5d602c207468656e20616e20696420776974682073636f72652030206f7220312077696c6c2066616c6cf0202020696e746f2062616720302c20616e20696420776974682073636f726520322077696c6c2066616c6c20696e746f2062616720312c206574632e00302023204d6967726174696f6e00610120496e20746865206576656e7420746861742074686973206c6973742065766572206368616e6765732c206120636f7079206f6620746865206f6c642062616773206c697374206d7573742062652072657461696e65642e5d012057697468207468617420604c6973743a3a6d696772617465602063616e2062652063616c6c65642c2077686963682077696c6c20706572666f726d2074686520617070726f707269617465206d6967726174696f6e2e01ed0b3368456c656374696f6e50726f76696465724d756c746950686173650168456c656374696f6e50726f76696465724d756c746950686173652814526f756e64010010100100000018ac20496e7465726e616c20636f756e74657220666f7220746865206e756d626572206f6620726f756e64732e00550120546869732069732075736566756c20666f722064652d6475706c69636174696f6e206f66207472616e73616374696f6e73207375626d697474656420746f2074686520706f6f6c2c20616e642067656e6572616c6c20646961676e6f7374696373206f66207468652070616c6c65742e004d012054686973206973206d6572656c7920696e6372656d656e746564206f6e6365207065722065766572792074696d65207468617420616e20757073747265616d2060656c656374602069732063616c6c65642e3043757272656e745068617365010011020400043c2043757272656e742070686173652e38517565756564536f6c7574696f6e0000f50b0400043d012043757272656e74206265737420736f6c7574696f6e2c207369676e6564206f7220756e7369676e65642c2071756575656420746f2062652072657475726e65642075706f6e2060656c656374602e20536e617073686f740000fd0b04000c7020536e617073686f742064617461206f662074686520726f756e642e005d01205468697320697320637265617465642061742074686520626567696e6e696e67206f6620746865207369676e656420706861736520616e6420636c65617265642075706f6e2063616c6c696e672060656c656374602e38446573697265645461726765747300001004000ccc2044657369726564206e756d626572206f66207461726765747320746f20656c65637420666f72207468697320726f756e642e00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e40536e617073686f744d657461646174610000210804000c9820546865206d65746164617461206f6620746865205b60526f756e64536e617073686f74605d00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e645369676e65645375626d697373696f6e4e657874496e646578010010100000000024010120546865206e65787420696e64657820746f2062652061737369676e656420746f20616e20696e636f6d696e67207369676e6564207375626d697373696f6e2e007501204576657279206163636570746564207375626d697373696f6e2069732061737369676e6564206120756e6971756520696e6465783b207468617420696e64657820697320626f756e6420746f207468617420706172746963756c61726501207375626d697373696f6e20666f7220746865206475726174696f6e206f662074686520656c656374696f6e2e204f6e20656c656374696f6e2066696e616c697a6174696f6e2c20746865206e65787420696e6465782069733020726573657420746f20302e0069012057652063616e2774206a7573742075736520605369676e65645375626d697373696f6e496e64696365732e6c656e2829602c206265636175736520746861742773206120626f756e646564207365743b20706173742069747359012063617061636974792c2069742077696c6c2073696d706c792073617475726174652e2057652063616e2774206a7573742069746572617465206f76657220605369676e65645375626d697373696f6e734d6170602cf4206265636175736520697465726174696f6e20697320736c6f772e20496e73746561642c2077652073746f7265207468652076616c756520686572652e5c5369676e65645375626d697373696f6e496e64696365730100090c0400186d01204120736f727465642c20626f756e64656420766563746f72206f6620602873636f72652c20626c6f636b5f6e756d6265722c20696e64657829602c20776865726520656163682060696e6465786020706f696e747320746f2061782076616c756520696e20605369676e65645375626d697373696f6e73602e007101205765206e65766572206e65656420746f2070726f63657373206d6f7265207468616e20612073696e676c65207369676e6564207375626d697373696f6e20617420612074696d652e205369676e6564207375626d697373696f6e7375012063616e206265207175697465206c617267652c20736f2077652772652077696c6c696e6720746f207061792074686520636f7374206f66206d756c7469706c6520646174616261736520616363657373657320746f206163636573732101207468656d206f6e6520617420612074696d6520696e7374656164206f662072656164696e6720616e64206465636f64696e6720616c6c206f66207468656d206174206f6e63652e505369676e65645375626d697373696f6e734d61700001040510150c04001c7420556e636865636b65642c207369676e656420736f6c7574696f6e732e00690120546f676574686572207769746820605375626d697373696f6e496e6469636573602c20746869732073746f726573206120626f756e64656420736574206f6620605369676e65645375626d697373696f6e7360207768696c65ec20616c6c6f77696e6720757320746f206b656570206f6e6c7920612073696e676c65206f6e6520696e206d656d6f727920617420612074696d652e0069012054776f78206e6f74653a20746865206b6579206f6620746865206d617020697320616e206175746f2d696e6372656d656e74696e6720696e6465782077686963682075736572732063616e6e6f7420696e7370656374206f72f4206166666563743b2077652073686f756c646e2774206e65656420612063727970746f67726170686963616c6c7920736563757265206861736865722e544d696e696d756d556e7472757374656453636f726500000d020400105d0120546865206d696e696d756d2073636f7265207468617420656163682027756e747275737465642720736f6c7574696f6e206d7573742061747461696e20696e206f7264657220746f20626520636f6e7369646572656428206665617369626c652e00b82043616e206265207365742076696120607365745f6d696e696d756d5f756e747275737465645f73636f7265602e01ed060101024c34556e7369676e656450686173651010960000000480204475726174696f6e206f662074686520756e7369676e65642070686173652e2c5369676e656450686173651010960000000478204475726174696f6e206f6620746865207369676e65642070686173652e544265747465725369676e65645468726573686f6c64b01000000000084d0120546865206d696e696d756d20616d6f756e74206f6620696d70726f76656d656e7420746f2074686520736f6c7574696f6e2073636f7265207468617420646566696e6573206120736f6c7574696f6e2061737820226265747465722220696e20746865205369676e65642070686173652e5c426574746572556e7369676e65645468726573686f6c64b01020a10700084d0120546865206d696e696d756d20616d6f756e74206f6620696d70726f76656d656e7420746f2074686520736f6c7574696f6e2073636f7265207468617420646566696e6573206120736f6c7574696f6e2061738020226265747465722220696e2074686520556e7369676e65642070686173652e384f6666636861696e52657065617410101200000010b42054686520726570656174207468726573686f6c64206f6620746865206f6666636861696e20776f726b65722e00610120466f72206578616d706c652c20696620697420697320352c2074686174206d65616e732074686174206174206c65617374203520626c6f636b732077696c6c20656c61707365206265747765656e20617474656d7074738420746f207375626d69742074686520776f726b6572277320736f6c7574696f6e2e3c4d696e657254785072696f72697479282065666666666666e604250120546865207072696f72697479206f662074686520756e7369676e6564207472616e73616374696f6e207375626d697474656420696e2074686520756e7369676e65642d7068617365505369676e65644d61785375626d697373696f6e731010100000001ce4204d6178696d756d206e756d626572206f66207369676e6564207375626d697373696f6e7320746861742063616e206265207175657565642e005501204974206973206265737420746f2061766f69642061646a757374696e67207468697320647572696e6720616e20656c656374696f6e2c20617320697420696d706163747320646f776e73747265616d2064617461650120737472756374757265732e20496e20706172746963756c61722c20605369676e65645375626d697373696f6e496e64696365733c543e6020697320626f756e646564206f6e20746869732076616c75652e20496620796f75f42075706461746520746869732076616c756520647572696e6720616e20656c656374696f6e2c20796f75205f6d7573745f20656e7375726520746861744d0120605369676e65645375626d697373696f6e496e64696365732e6c656e282960206973206c657373207468616e206f7220657175616c20746f20746865206e65772076616c75652e204f74686572776973652cf020617474656d70747320746f207375626d6974206e657720736f6c7574696f6e73206d617920636175736520612072756e74696d652070616e69632e3c5369676e65644d617857656967687420400b28c41ed253011347e17a14ae47e1ba1494204d6178696d756d20776569676874206f662061207369676e656420736f6c7574696f6e2e005d01204966205b60436f6e6669673a3a4d696e6572436f6e666967605d206973206265696e6720696d706c656d656e74656420746f207375626d6974207369676e656420736f6c7574696f6e7320286f757473696465206f663d0120746869732070616c6c6574292c207468656e205b604d696e6572436f6e6669673a3a736f6c7574696f6e5f776569676874605d206973207573656420746f20636f6d7061726520616761696e73743020746869732076616c75652e405369676e65644d6178526566756e647310100400000004190120546865206d6178696d756d20616d6f756e74206f6620756e636865636b656420736f6c7574696f6e7320746f20726566756e64207468652063616c6c2066656520666f722e405369676e656452657761726442617365184000008a5d784563010000000000000000048820426173652072657761726420666f722061207369676e656420736f6c7574696f6e445369676e65644465706f73697442617365184020500dd2f5b1d901000000000000000004902042617365206465706f73697420666f722061207369676e656420736f6c7574696f6e2e445369676e65644465706f736974427974651840855f419407000000000000000000000004a0205065722d62797465206465706f73697420666f722061207369676e656420736f6c7574696f6e2e4c5369676e65644465706f73697457656967687418400000000000000000000000000000000004a8205065722d776569676874206465706f73697420666f722061207369676e656420736f6c7574696f6e2e444d6178456c656374696e67566f746572731010d43000000c5d0120546865206d6178696d756d206e756d626572206f6620656c656374696e6720766f7465727320746f2070757420696e2074686520736e617073686f742e20417420746865206d6f6d656e742c20736e617073686f7473590120617265206f6e6c79206f76657220612073696e676c6520626c6f636b2c20627574206f6e6365206d756c74692d626c6f636b20656c656374696f6e732061726520696e74726f647563656420746865792077696c6c842074616b6520706c616365206f766572206d756c7469706c6520626c6f636b732e4c4d6178456c65637461626c6554617267657473550308ffff04010120546865206d6178696d756d206e756d626572206f6620656c65637461626c65207461726765747320746f2070757420696e2074686520736e617073686f742e284d617857696e6e6572731010b004000010350120546865206d6178696d756d206e756d626572206f662077696e6e65727320746861742063616e20626520656c656374656420627920746869732060456c656374696f6e50726f7669646572604020696d706c656d656e746174696f6e2e005101204e6f74653a2054686973206d75737420616c776179732062652067726561746572206f7220657175616c20746f2060543a3a4461746150726f76696465723a3a646573697265645f746172676574732829602e384d696e65724d61784c656e67746810109a994b0000384d696e65724d617857656967687420400b28c41ed253011347e17a14ae47e1ba00544d696e65724d6178566f746573506572566f7465721010180000000001190c341042616e64011042616e64103c5472757374656452656c61796572730000ad0a0400002c53796d626f6c526174657301010402d5011d0c0400004053796d626f6c436865636b426c6f636b0101080202250cbc0400005044796e616d6963466565506172616d657465727301004508c000000000000000000000000000000000000064a7b3b6e00d000000000000000000000000000000000000000000000000000135080119020c5847657442616e64526174655374616c65506572696f642820e093040000000000048c20526174652065787069726174696f6e20706572696f6420696e207365636f6e64732e6c47657442616e64526174655374616c65426c6f636b506572696f64101058020000048420526174652065787069726174696f6e20706572696f6420696e20626c6f636b733c4d617852656c617953796d626f6c73101064000000041101204d6178696d756d206e756d626572206f662073796d626f6c7320746861742063616e2062652072656c617965642077697468696e20612073696e676c652063616c6c2e01290c352c4f7261636c6550726f7879012c4f7261636c6550726f78790838456e61626c65644f7261636c657301002d0c0400003c53796d626f6c50726f76696465727300010402d5012d020400000149080129020001350c36604865726d6573476f7665726e616e6365506c6174666f726d01604865726d6573476f7665726e616e6365506c6174666f726d18344865726d6573566f74696e67730001080606990b390c040004c8204120766f7465206f66206120706172746963756c6172207573657220666f72206120706172746963756c617220706f6c6c384865726d6573506f6c6c44617461000104062c3d0c040000644d696e696d756d4865726d6573566f74696e67416d6f756e74010018400000a0dec5adc935360000000000000000884d696e696d756d4865726d6573416d6f756e74466f724372656174696e67506f6c6c01001840000080f64ae1c7022d150000000000000040417574686f726974794163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b132048101204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e67204865726d6573206d696e696d756d20616d6f756e7420666f7220766f74696e6720616e64206372656174696e67206120706f6c6c5050616c6c657453746f7261676556657273696f6e0100410c0400045c2050616c6c65742073746f726167652076657273696f6e014d080131020001450c3720507265696d6167650120507265696d6167650824537461747573466f72000104062c490c0400049020546865207265717565737420737461747573206f66206120676976656e20686173682e2c507265696d616765466f7200010406510c550c040000015108013d020001590c38244f72646572426f6f6b01244f72646572426f6f6b28284f72646572426f6f6b730001040245025d0c0400002c4c696d69744f72646572730001080202650c690c040000104269647300010802026d0c710c0400001041736b7300010802026d0c710c040000384167677265676174656442696473010104024502750c040000384167677265676174656441736b73010104024502750c0400003c557365724c696d69744f72646572730001080202850c710c0400004445787069726174696f6e734167656e64610101040610890c0400003c416c69676e6d656e74437572736f720001040245021804000068496e636f6d706c65746545787069726174696f6e7353696e636500001004000cb0204561726c6965737420626c6f636b207769746820696e636f6d706c6574652065787069726174696f6e733b0d0120576569676874206c696d6974206d69676874206e6f7420616c6c6f7720746f2066696e69736820616c6c2065787069726174696f6e7320666f72206120626c6f636b8420736f2074686579206d69676874206265206f70657261746564206c617465722e0155080141020001910c39304c65616650726f766964657201304c65616650726f766964657204304c61746573744469676573740000a50804000438204c61746573742064696765737400015d020000632c42726964676550726f7879012c42726964676550726f787920305472616e73616374696f6e730001080202950c9d0c0400001c53656e646572730001080502a50c000400004053696465636861696e466565506169640001080202a90c8102040004690120466565207061696420666f722072656c61796564207478206f6e2073696465636861696e2e204d61702028284e6574776f726b2049442c204164647265737329203d3e2043756d756c6174697665204665652050616964292e304c6f636b65644173736574730101080202ad0c184000000000000000000000000000000000049d0120416d6f756e74206f6620617373657473206c6f636b65642062792062726964676520666f72207370656369666963206e6574776f726b2e204d61702028284e6574776f726b2049442c20417373657420494429203d3e204c6f636b656420616d6f756e74292e345472616e736665724c696d697401006908500000407ba5f06381960a00000000000058020000041901204d6178696d756d20616d6f756e74206f662061737365747320746861742063616e2062652077697468647261776e20647572696e6720706572696f64206f662074696d652e54436f6e73756d65645472616e736665724c696d69740100184000000000000000000000000000000000046420436f6e73756d6564207472616e73666572206c696d69742e6c5472616e736665724c696d6974556e6c6f636b5363686564756c65010104021018400000000000000000000000000000000004b4205363686564756c6520666f7220636f6e73756d6564207472616e73666572206c696d6974207265647563652e344c696d69746564417373657473010104020d01bc04000484204173736574732077697468207472616e73666572206c696d69746174696f6e2e0161080161020001b10c6774537562737472617465427269646765496e626f756e644368616e6e656c0174537562737472617465427269646765496e626f756e644368616e6e656c04344368616e6e656c4e6f6e6365730101040671022820000000000000000000016d080169020c40556e7369676e65645072696f726974792820999999999999991904f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e44556e7369676e65644c6f6e6765766974792820580200000000000004e0204120636f6e66696775726174696f6e20666f72206c6f6e676576697479206f6620756e7369676e6564207472616e73616374696f6e732e34546869734e6574776f726b49647d020801000001b50c6a785375627374726174654272696467654f7574626f756e644368616e6e656c01785375627374726174654272696467654f7574626f756e644368616e6e656c1020496e74657276616c010010100a000000049820496e74657276616c206265747765656e20636f6d6d697474696e67206d657373616765732e344d6573736167655175657565730101040671027908040008cd01204d657373616765732077616974696e6720746f20626520636f6d6d69747465642e20546f20757064617465207468652071756575652c207573652060617070656e645f6d6573736167655f71756575656020616e64206074616b655f6d6573736167655f717565756560206d6574686f6473b42028746f206b65657020636f72726563742076616c756520696e205b517565756573546f74616c4761735d292e344368616e6e656c4e6f6e6365730101040671022820000000000000000000404c6174657374436f6d6d69746d656e74000104067102b90c04000001ad08016d020434546869734e6574776f726b49647d020801000001bd0c6b44537562737472617465446973706174636801445375627374726174654469737061746368000001750200006c4850617261636861696e427269646765417070014850617261636861696e427269646765417070102841737365744b696e64730001080606c10cb5080400004853696465636861696e507265636973696f6e0001080606c10c0804000058416c6c6f77656450617261636861696e4173736574730101080606c50c19040400003c52656c6179636861696e41737365740001040671020d0104000001b108018d020001c90c6d40427269646765446174615369676e65720140427269646765446174615369676e65720c145065657273000104067d02cd0c040004182050656572734450656e64696e6750656572557064617465010104067d02bc040004382050656e64696e6720706565727324417070726f76616c730101080606a50cd50c0400042820417070726f76616c7301c10801d9020c40556e7369676e65645072696f726974792820999999999999991904f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e44556e7369676e65644c6f6e6765766974792820580200000000000004e0204120636f6e66696775726174696f6e20666f72206c6f6e676576697479206f6620756e7369676e6564207472616e73616374696f6e732e204d617850656572731010320000000001e50c6e404d756c7469736967566572696669657201404d756c746973696756657269666965720420506565724b657973000104057d02cd0c04000001c50801fd0208204d617850656572731010320000000034546869734e6574776f726b49647d020801000001e90c6f144265656679011442656566790c2c417574686f7269746965730100ed0c04000470205468652063757272656e7420617574686f726974696573207365743856616c696461746f7253657449640100282000000000000000000474205468652063757272656e742076616c696461746f72207365742069643c4e657874417574686f7269746965730100ed0c040004ec20417574686f72697469657320736574207363686564756c656420746f2062652075736564207769746820746865206e6578742073657373696f6e000000005b105375646f01105375646f040c4b6579000000040004842054686520604163636f756e74496460206f6620746865207375646f206b65792e01c9080101030001f50c03184661756365740001cd080105030001f90c501c5141546f6f6c730001d108000001fd0c70010d041c40436865636b5370656356657273696f6e0d0d1038436865636b547856657273696f6e110d1030436865636b47656e65736973150d2c38436865636b4d6f7274616c697479190d2c28436865636b4e6f6e6365210da82c436865636b576569676874250da8604368617267655472616e73616374696f6e5061796d656e74290da82d0d \ No newline at end of file +0x6d6574610e950e000c1c73705f636f72651863727970746f2c4163636f756e7449643332000004000401205b75383b2033325d0000040000032000000008000800000503000c08306672616d655f73797374656d2c4163636f756e74496e666f0814496e64657801102c4163636f756e74446174610114001401146e6f6e6365100114496e646578000124636f6e73756d657273100120526566436f756e7400012470726f766964657273100120526566436f756e7400012c73756666696369656e7473100120526566436f756e740001106461746114012c4163636f756e7444617461000010000005050014083c70616c6c65745f62616c616e6365732c4163636f756e7444617461041c42616c616e63650118001001106672656518011c42616c616e6365000120726573657276656418011c42616c616e636500012c6d6973635f66726f7a656e18011c42616c616e63650001286665655f66726f7a656e18011c42616c616e636500001800000507001c0c346672616d655f737570706f7274206469737061746368405065724469737061746368436c6173730404540120000c01186e6f726d616c2001045400012c6f7065726174696f6e616c200104540001246d616e6461746f7279200104540000200c2873705f77656967687473247765696768745f76321857656967687400000801207265665f74696d6524010c75363400012870726f6f665f73697a6524010c75363400002400000628002800000506002c083c7072696d69746976655f74797065731048323536000004000401205b75383b2033325d000030000002080034102873705f72756e74696d651c67656e65726963186469676573741844696765737400000401106c6f677338013c5665633c4469676573744974656d3e0000380000023c003c102873705f72756e74696d651c67656e6572696318646967657374284469676573744974656d0001142850726552756e74696d650800400144436f6e73656e737573456e67696e654964000030011c5665633c75383e00060024436f6e73656e7375730800400144436f6e73656e737573456e67696e654964000030011c5665633c75383e000400105365616c0800400144436f6e73656e737573456e67696e654964000030011c5665633c75383e000500144f74686572040030011c5665633c75383e0000006452756e74696d65456e7669726f6e6d656e745570646174656400080000400000030400000008004400000248004808306672616d655f73797374656d2c4576656e745265636f7264080445014c0454012c000c01147068617365a103011450686173650001146576656e744c010445000118746f70696373a50301185665633c543e00004c08446672616d656e6f64655f72756e74696d653052756e74696d654576656e74000101011853797374656d04005001706672616d655f73797374656d3a3a4576656e743c52756e74696d653e0000002042616c616e636573040074017c70616c6c65745f62616c616e6365733a3a4576656e743c52756e74696d653e000200485472616e73616374696f6e5061796d656e7404007c01a870616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4576656e743c52756e74696d653e0005002c5065726d697373696f6e73040080016c7065726d697373696f6e733a3a4576656e743c52756e74696d653e0006001c52657761726473040084015c726577617264733a3a4576656e743c52756e74696d653e00080018586f72466565040088015c786f725f6665653a3a4576656e743c52756e74696d653e000900384272696467654d756c7469736967040090017c6272696467655f6d756c74697369673a3a4576656e743c52756e74696d653e000a001c5574696c6974790400a0015470616c6c65745f7574696c6974793a3a4576656e74000b001c5374616b696e670400ac017870616c6c65745f7374616b696e673a3a4576656e743c52756e74696d653e001100204f6666656e6365730400c4015870616c6c65745f6f6666656e6365733a3a4576656e740025001c53657373696f6e0400cc015470616c6c65745f73657373696f6e3a3a4576656e74000c001c4772616e6470610400d0015470616c6c65745f6772616e6470613a3a4576656e74000f0020496d4f6e6c696e650400e4018070616c6c65745f696d5f6f6e6c696e653a3a4576656e743c52756e74696d653e00240018546f6b656e73040009010158746f6b656e733a3a4576656e743c52756e74696d653e0012002c54726164696e675061697204001901017074726164696e675f706169723a3a4576656e743c52756e74696d653e001400184173736574730400210101586173736574733a3a4576656e743c52756e74696d653e0015007c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c0400350101c86d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c3a3a4576656e743c52756e74696d653e00170024546563686e6963616c040045010164746563686e6963616c3a3a4576656e743c52756e74696d653e0018001c506f6f6c58594b040059010160706f6f6c5f78796b3a3a4576656e743c52756e74696d653e001900384c697175696469747950726f787904005d01017c6c69717569646974795f70726f78793a3a4576656e743c52756e74696d653e001a001c436f756e63696c04008d0101fc70616c6c65745f636f6c6c6563746976653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365313e001b0048546563686e6963616c436f6d6d69747465650400910101fc70616c6c65745f636f6c6c6563746976653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365323e001c002444656d6f637261637904009501018070616c6c65745f64656d6f63726163793a3a4576656e743c52756e74696d653e001d00184445584150490400a501015c6465785f6170693a3a4576656e743c52756e74696d653e001e00244574684272696467650400a90101686574685f6272696467653a3a4576656e743c52756e74696d653e001f00445073776170446973747269627574696f6e0400ad01018870737761705f646973747269627574696f6e3a3a4576656e743c52756e74696d653e002000204d756c74697369670400b101017c70616c6c65745f6d756c74697369673a3a4576656e743c52756e74696d653e002100245363686564756c65720400b901018070616c6c65745f7363686564756c65723a3a4576656e743c52756e74696d653e0022003849726f68614d6967726174696f6e0400c501017c69726f68615f6d6967726174696f6e3a3a4576656e743c52756e74696d653e0023004c546563686e6963616c4d656d626572736869700400cd0101fc70616c6c65745f6d656d626572736869703a3a4576656e743c52756e74696d652c2070616c6c65745f6d656d626572736869703a3a496e7374616e6365313e00260044456c656374696f6e7350687261676d656e0400d10101a470616c6c65745f656c656374696f6e735f70687261676d656e3a3a4576656e743c52756e74696d653e00270034566573746564526577617264730400dd0101787665737465645f726577617264733a3a4576656e743c52756e74696d653e002800204964656e746974790400f501017c70616c6c65745f6964656e746974793a3a4576656e743c52756e74696d653e0029001c4661726d696e670400f901015c6661726d696e673a3a4576656e743c52756e74696d653e002a001c585354506f6f6c0400fd01014c7873743a3a4576656e743c52756e74696d653e002b00285072696365546f6f6c7304000502016c70726963655f746f6f6c733a3a4576656e743c52756e74696d653e002c003043657265735374616b696e6704000902017463657265735f7374616b696e673a3a4576656e743c52756e74696d653e002d005043657265734c69717569646974794c6f636b657204000d02019863657265735f6c69717569646974795f6c6f636b65723a3a4576656e743c52756e74696d653e002e00404365726573546f6b656e4c6f636b657204001102018863657265735f746f6b656e5f6c6f636b65723a3a4576656e743c52756e74696d653e002f005c4365726573476f7665726e616e6365506c6174666f726d0400150201a463657265735f676f7665726e616e63655f706c6174666f726d3a3a4576656e743c52756e74696d653e0030003843657265734c61756e636870616404002102017c63657265735f6c61756e63687061643a3a4576656e743c52756e74696d653e0031005844656d657465724661726d696e67506c6174666f726d0400250201a064656d657465725f6661726d696e675f706c6174666f726d3a3a4576656e743c52756e74696d653e00320020426167734c69737404002902018070616c6c65745f626167735f6c6973743a3a4576656e743c52756e74696d653e00330068456c656374696f6e50726f76696465724d756c7469506861736504002d0201d070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653a3a4576656e743c52756e74696d653e0034001042616e6404004502015062616e643a3a4576656e743c52756e74696d653e0035002c4f7261636c6550726f78790400550201706f7261636c655f70726f78793a3a4576656e743c52756e74696d653e003600604865726d6573476f7665726e616e6365506c6174666f726d04005d0201a86865726d65735f676f7665726e616e63655f706c6174666f726d3a3a4576656e743c52756e74696d653e00370020507265696d61676504006902017c70616c6c65745f707265696d6167653a3a4576656e743c52756e74696d653e003800244f72646572426f6f6b04006d0201686f726465725f626f6f6b3a3a4576656e743c52756e74696d653e003900204b656e73657473750400890201606b656e73657473753a3a4576656e743c52756e74696d653e003a00304c65616650726f76696465720400a50201746c6561665f70726f76696465723a3a4576656e743c52756e74696d653e0063002c42726964676550726f78790400a902014c6272696467655f70726f78793a3a4576656e7400670074537562737472617465427269646765496e626f756e644368616e6e656c0400b10201c47375627374726174655f6272696467655f6368616e6e656c3a3a696e626f756e643a3a4576656e743c52756e74696d653e006a00785375627374726174654272696467654f7574626f756e644368616e6e656c0400b50201c87375627374726174655f6272696467655f6368616e6e656c3a3a6f7574626f756e643a3a4576656e743c52756e74696d653e006b004453756273747261746544697370617463680400bd0201b464697370617463683a3a4576656e743c52756e74696d652c2064697370617463683a3a496e7374616e6365323e006c004850617261636861696e4272696467654170700400d102019070617261636861696e5f6272696467655f6170703a3a4576656e743c52756e74696d653e006d0040427269646765446174615369676e657204001d0301886272696467655f646174615f7369676e65723a3a4576656e743c52756e74696d653e006e00404d756c746973696756657269666965720400410301846d756c74697369675f76657269666965723a3a4576656e743c52756e74696d653e006f00485375627374726174654272696467654170700400450301907375627374726174655f6272696467655f6170703a3a4576656e743c52756e74696d653e007100105375646f04005903016c70616c6c65745f7375646f3a3a4576656e743c52756e74696d653e0003001846617563657404005d0301586661756365743a3a4576656e743c52756e74696d653e0050001c5161546f6f6c7304006103016071615f746f6f6c733a3a4576656e743c52756e74696d653e0070003841706f6c6c6f506c6174666f726d04009103017c61706f6c6c6f5f706c6174666f726d3a3a4576656e743c52756e74696d653e00720038457874656e64656441737365747304009503017c657874656e6465645f6173736574733a3a4576656e743c52756e74696d653e00730000500c306672616d655f73797374656d1870616c6c6574144576656e740404540001184045787472696e7369635375636365737304013464697370617463685f696e666f5401304469737061746368496e666f00000490416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656408013864697370617463685f6572726f7260013444697370617463684572726f7200013464697370617463685f696e666f5401304469737061746368496e666f00010450416e2065787472696e736963206661696c65642e2c436f64655570646174656400020450603a636f6465602077617320757064617465642e284e65774163636f756e7404011c6163636f756e74000130543a3a4163636f756e7449640003046841206e6577206163636f756e742077617320637265617465642e344b696c6c65644163636f756e7404011c6163636f756e74000130543a3a4163636f756e74496400040458416e206163636f756e7420776173207265617065642e2052656d61726b656408011873656e646572000130543a3a4163636f756e744964000110686173682c011c543a3a48617368000504704f6e206f6e2d636861696e2072656d61726b2068617070656e65642e04704576656e7420666f72207468652053797374656d2070616c6c65742e540c346672616d655f737570706f7274206469737061746368304469737061746368496e666f00000c0118776569676874200118576569676874000114636c6173735801344469737061746368436c617373000120706179735f6665655c0110506179730000580c346672616d655f737570706f7274206469737061746368344469737061746368436c61737300010c184e6f726d616c0000002c4f7065726174696f6e616c000100244d616e6461746f7279000200005c0c346672616d655f737570706f727420646973706174636810506179730001080c596573000000084e6f0001000060082873705f72756e74696d653444697370617463684572726f72000134144f746865720000003043616e6e6f744c6f6f6b7570000100244261644f726967696e000200184d6f64756c65040064012c4d6f64756c654572726f7200030044436f6e73756d657252656d61696e696e670004002c4e6f50726f76696465727300050040546f6f4d616e79436f6e73756d65727300060014546f6b656e0400680128546f6b656e4572726f720007002841726974686d6574696304006c013c41726974686d657469634572726f72000800345472616e73616374696f6e616c04007001485472616e73616374696f6e616c4572726f7200090024457868617573746564000a0028436f7272757074696f6e000b002c556e617661696c61626c65000c000064082873705f72756e74696d652c4d6f64756c654572726f720000080114696e64657808010875380001146572726f7240018c5b75383b204d41585f4d4f44554c455f4552524f525f454e434f4445445f53495a455d000068082873705f72756e74696d6528546f6b656e4572726f7200011c1c4e6f46756e647300000020576f756c644469650001003042656c6f774d696e696d756d0002003043616e6e6f7443726561746500030030556e6b6e6f776e41737365740004001846726f7a656e0005002c556e737570706f72746564000600006c083473705f61726974686d657469633c41726974686d657469634572726f7200010c24556e646572666c6f77000000204f766572666c6f77000100384469766973696f6e42795a65726f0002000070082873705f72756e74696d65485472616e73616374696f6e616c4572726f72000108304c696d6974526561636865640000001c4e6f4c6179657200010000740c3c70616c6c65745f62616c616e6365731870616c6c6574144576656e740804540004490001281c456e646f77656408011c6163636f756e74000130543a3a4163636f756e744964000130667265655f62616c616e6365180128543a3a42616c616e6365000004b8416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e20447573744c6f737408011c6163636f756e74000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650001083d01416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c78726573756c74696e6720696e20616e206f75747269676874206c6f73732e205472616e736665720c011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650002044c5472616e73666572207375636365656465642e2842616c616e63655365740c010c77686f000130543a3a4163636f756e74496400011066726565180128543a3a42616c616e63650001207265736572766564180128543a3a42616c616e636500030468412062616c616e6365207761732073657420627920726f6f742e20526573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000404e0536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e28556e726573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000504e8536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e4852657365727665526570617472696174656410011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500014864657374696e6174696f6e5f7374617475737801185374617475730006084d01536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742ed846696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e1c4465706f73697408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000704d8536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e20576974686472617708010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650008041d01536f6d6520616d6f756e74207761732077697468647261776e2066726f6d20746865206163636f756e742028652e672e20666f72207472616e73616374696f6e2066656573292e1c536c617368656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650009040101536f6d6520616d6f756e74207761732072656d6f7665642066726f6d20746865206163636f756e742028652e672e20666f72206d69736265686176696f72292e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909097814346672616d655f737570706f72741874726169747318746f6b656e73106d6973633442616c616e63655374617475730001081046726565000000205265736572766564000100007c0c6870616c6c65745f7472616e73616374696f6e5f7061796d656e741870616c6c6574144576656e74040454000104485472616e73616374696f6e466565506169640c010c77686f000130543a3a4163636f756e74496400012861637475616c5f66656518013042616c616e63654f663c543e00010c74697018013042616c616e63654f663c543e000008590141207472616e73616374696f6e20666565206061637475616c5f666565602c206f662077686963682060746970602077617320616464656420746f20746865206d696e696d756d20696e636c7573696f6e206665652c5c686173206265656e2070616964206279206077686f602e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909800c2c7065726d697373696f6e731870616c6c6574144576656e74040454000110445065726d697373696f6e4772616e746564080010010c75333200000001384163636f756e7449644f663c543e000004d45065726d697373696f6e20776173206772616e74656420746f206120686f6c6465722e205b7065726d697373696f6e2c2077686f5d505065726d697373696f6e5472616e736665726564080010010c75333200000001384163636f756e7449644f663c543e000104ec5065726d697373696f6e20776173207472616e73666572656420746f2061206e6577206f776e65722e205b7065726d697373696f6e2c2077686f5d445065726d697373696f6e43726561746564080010010c75333200000001384163636f756e7449644f663c543e000204dc5065726d697373696f6e207761732063726561746564207769746820616e206f776e65722e205b7065726d697373696f6e2c2077686f5d485065726d697373696f6e41737369676e6564080010010c75333200000001384163636f756e7449644f663c543e00030419015065726d697373696f6e207761732061737369676e656420746f20746865206163636f756e7420696e207468652073636f70652e205b7065726d697373696f6e2c2077686f5d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909840c1c726577617264731870616c6c6574144576656e740404540001081c436c61696d656404000001384163636f756e7449644f663c543e000004c0546865206163636f756e742068617320636c61696d656420746865697220726577617264732e205b6163636f756e745d484d6967726174696f6e436f6d706c65746564000104b053746f72616765206d6967726174696f6e20746f2076657273696f6e20312e322e3020636f6d706c6574656404a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909880c1c786f725f6665651870616c6c6574144576656e7404045400010c3046656557697468647261776e08000001384163636f756e7449644f663c543e000018013042616c616e63654f663c543e0000042d0146656520686173206265656e2077697468647261776e2066726f6d20757365722e205b4163636f756e7420496420746f2077697468647261772066726f6d2c2046656520416d6f756e745d40526566657272657252657761726465640c000001384163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e000018011c42616c616e6365000104210154686520706f7274696f6e206f66206665652069732073656e7420746f207468652072656665727265722e205b526566657272616c2c2052656665727265722c20416d6f756e745d70576569676874546f4665654d756c7469706c6965725570646174656404008c0124466978656455313238000208c84e6577206d756c7469706c69657220666f722077656967687420746f2066656520636f6e76657273696f6e20697320736574a4282a315f3030305f3030305f3030305f3030305f3030305f303030292e205b4e65772076616c75655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909098c0c3473705f61726974686d657469632c66697865645f706f696e742446697865645531323800000400180110753132380000900c3c70616c6c65745f6d756c74697369671870616c6c6574144576656e74040454000114584d756c74697369674163636f756e74437265617465640400000130543a3a4163636f756e7449640000048841206e6577206d756c746973696720637265617465642e205b6d756c74697369675d2c4e65774d756c74697369670c00000130543a3a4163636f756e7449640000000130543a3a4163636f756e74496400000401205b75383b2033325d000104110141206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e205b617070726f76696e672c206d756c74697369672c2063616c6c5f686173685d404d756c7469736967417070726f76616c1000000130543a3a4163636f756e744964000094017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e0000000130543a3a4163636f756e74496400000401205b75383b2033325d000204790141206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d404d756c746973696745786563757465641400000130543a3a4163636f756e744964000094017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e0000000130543a3a4163636f756e74496400000401205b75383b2033325d00009c01544f7074696f6e3c44697370617463684572726f723e0003044d0141206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e205b617070726f76696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d444d756c746973696743616e63656c6c65641000000130543a3a4163636f756e744964000094017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e0000000130543a3a4163636f756e74496400000401205b75383b2033325d000404550141206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e205b63616e63656c6c696e672c2074696d65706f696e742c206d756c74697369672c2063616c6c5f686173685d04304576656e747320747970652e94083c70616c6c65745f6d756c74697369673c42726964676554696d65706f696e74042c426c6f636b4e756d6265720110000801186865696768749801744d756c7469436861696e4865696768743c426c6f636b4e756d6265723e000114696e64657810010c753332000098083c70616c6c65745f6d756c7469736967404d756c7469436861696e486569676874042c426c6f636b4e756d626572011001082454686973636861696e040010012c426c6f636b4e756d6265720000002453696465636861696e040028010c753634000100009c04184f7074696f6e04045401600108104e6f6e6500000010536f6d650400600000010000a00c3870616c6c65745f7574696c6974791870616c6c6574144576656e74000118404261746368496e746572727570746564080114696e64657810010c7533320001146572726f7260013444697370617463684572726f7200000855014261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734877656c6c20617320746865206572726f722e384261746368436f6d706c65746564000104c84261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e604261746368436f6d706c65746564576974684572726f7273000204b44261746368206f66206469737061746368657320636f6d706c657465642062757420686173206572726f72732e344974656d436f6d706c657465640003041d01412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206e6f206572726f722e284974656d4661696c65640401146572726f7260013444697370617463684572726f720004041101412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206572726f722e30446973706174636865644173040118726573756c74a401384469737061746368526573756c7400050458412063616c6c2077617320646973706174636865642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909a40418526573756c7408045401a8044501600108084f6b0400a8000000000c4572720400600000010000a80000040000ac103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144576656e7404045400013c1c457261506169640801246572615f696e646578100120457261496e64657800014076616c696461746f725f7061796f75741801644d756c746943757272656e637942616c616e63654f663c543e000008550154686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c07468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e2052657761726465640801147374617368000130543a3a4163636f756e744964000118616d6f756e741801644d756c746943757272656e637942616c616e63654f663c543e000104bc546865206e6f6d696e61746f7220686173206265656e207265776172646564206279207468697320616d6f756e742e1c536c61736865640801187374616b6572000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e00020445014f6e65207374616b65722028616e6420706f74656e7469616c6c7920697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e34536c6173685265706f727465640c012476616c696461746f72000130543a3a4163636f756e7449640001206672616374696f6eb0011c50657262696c6c000124736c6173685f657261100120457261496e64657800030859014120736c61736820666f722074686520676976656e2076616c696461746f722c20666f722074686520676976656e2070657263656e74616765206f66207468656972207374616b652c2061742074686520676976656e54657261206173206265656e207265706f727465642e684f6c64536c617368696e675265706f727444697363617264656404013473657373696f6e5f696e64657810013053657373696f6e496e6465780004081901416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c64446e6f742062652070726f6365737365642e385374616b657273456c65637465640005048441206e657720736574206f66207374616b6572732077617320656c65637465642e18426f6e6465640801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000610d0416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d004d014e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c210169742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e6465640801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e00070490416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e2457697468647261776e0801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0008085901416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e6365606466726f6d2074686520756e6c6f636b696e672071756575652e184b69636b65640801246e6f6d696e61746f72000130543a3a4163636f756e7449640001147374617368000130543a3a4163636f756e744964000904b441206e6f6d696e61746f7220686173206265656e206b69636b65642066726f6d20612076616c696461746f722e545374616b696e67456c656374696f6e4661696c6564000a04ac54686520656c656374696f6e206661696c65642e204e6f206e65772065726120697320706c616e6e65642e1c4368696c6c65640401147374617368000130543a3a4163636f756e744964000b042101416e206163636f756e74206861732073746f707065642070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e345061796f7574537461727465640801246572615f696e646578100120457261496e64657800013c76616c696461746f725f7374617368000130543a3a4163636f756e744964000c0498546865207374616b657273272072657761726473206172652067657474696e6720706169642e4456616c696461746f7250726566735365740801147374617368000130543a3a4163636f756e7449640001147072656673b4013856616c696461746f725072656673000d0498412076616c696461746f72206861732073657420746865697220707265666572656e6365732e20466f7263654572610401106d6f6465c0011c466f7263696e67000e047441206e657720666f72636520657261206d6f646520776173207365742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909b00c3473705f61726974686d65746963287065725f7468696e67731c50657262696c6c0000040010010c7533320000b4083870616c6c65745f7374616b696e673856616c696461746f7250726566730000080128636f6d6d697373696f6eb8011c50657262696c6c00011c626c6f636b6564bc0110626f6f6c0000b8000006b000bc0000050000c0083870616c6c65745f7374616b696e671c466f7263696e67000110284e6f74466f7263696e6700000020466f7263654e657700010024466f7263654e6f6e650002002c466f726365416c7761797300030000c40c3c70616c6c65745f6f6666656e6365731870616c6c6574144576656e740001041c4f6666656e63650801106b696e64c801104b696e6400012074696d65736c6f743001384f706171756554696d65536c6f7400000c5101546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e643501286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e4c5c5b6b696e642c2074696d65736c6f745c5d2e04304576656e747320747970652ec8000003100000000800cc0c3870616c6c65745f73657373696f6e1870616c6c6574144576656e74000104284e657753657373696f6e04013473657373696f6e5f696e64657810013053657373696f6e496e64657800000839014e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f74207468659c626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909d00c3870616c6c65745f6772616e6470611870616c6c6574144576656e7400010c384e6577417574686f726974696573040134617574686f726974795f736574d40134417574686f726974794c6973740000048c4e657720617574686f726974792073657420686173206265656e206170706c6965642e185061757365640001049843757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640002049c43757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909d4000002d800d800000408dc2800dc0c4c73705f66696e616c6974795f6772616e6470610c617070185075626c696300000400e0013c656432353531393a3a5075626c69630000e00c1c73705f636f72651c65643235353139185075626c6963000004000401205b75383b2033325d0000e40c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144576656e7404045400010c444865617274626561745265636569766564040130617574686f726974795f6964e80138543a3a417574686f726974794964000004c041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964602e1c416c6c476f6f64000104d041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504011c6f66666c696e65f0016c5665633c4964656e74696669636174696f6e5475706c653c543e3e000204290141742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909e8104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139185075626c696300000400ec013c737232353531393a3a5075626c69630000ec0c1c73705f636f72651c73723235353139185075626c6963000004000401205b75383b2033325d0000f0000002f400f40000040800f800f8083870616c6c65745f7374616b696e67204578706f7375726508244163636f756e74496401001c42616c616e63650118000c0114746f74616cfc011c42616c616e636500010c6f776efc011c42616c616e63650001186f7468657273010101ac5665633c496e646976696475616c4578706f737572653c4163636f756e7449642c2042616c616e63653e3e0000fc000006180001010000020501000501083870616c6c65745f7374616b696e6748496e646976696475616c4578706f7375726508244163636f756e74496401001c42616c616e636501180008010c77686f0001244163636f756e74496400011476616c7565fc011c42616c616e6365000009010c2c6f726d6c5f746f6b656e73186d6f64756c65144576656e7404045400013c1c456e646f7765640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000004b8416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e20447573744c6f73740c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000108ec416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77c84578697374656e7469616c4465706f7369742c20726573756c74696e6720696e20616e206f75747269676874206c6f73732e205472616e7366657210012c63757272656e63795f69640d010134543a3a43757272656e6379496400011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650002044c5472616e73666572207375636365656465642e2052657365727665640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000304e0536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e28556e72657365727665640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000404e8536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e4852657365727665526570617472696174656414012c63757272656e63795f69640d010134543a3a43757272656e6379496400011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500011873746174757378013442616c616e6365537461747573000508f4536f6d652072657365727665642062616c616e63652077617320726570617472696174656420286d6f7665642066726f6d20726573657276656420746f44616e6f74686572206163636f756e74292e2842616c616e636553657410012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e74496400011066726565180128543a3a42616c616e63650001207265736572766564180128543a3a42616c616e636500060468412062616c616e6365207761732073657420627920726f6f742e40546f74616c49737375616e636553657408012c63757272656e63795f69640d010134543a3a43757272656e63794964000118616d6f756e74180128543a3a42616c616e6365000704b854686520746f74616c2069737375616e6365206f6620616e2063757272656e637920686173206265656e207365742457697468647261776e0c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000804ec536f6d652062616c616e63657320776572652077697468647261776e2028652e672e2070617920666f72207472616e73616374696f6e20666565291c536c617368656410012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e74496400012c667265655f616d6f756e74180128543a3a42616c616e636500013c72657365727665645f616d6f756e74180128543a3a42616c616e6365000904d4536f6d652062616c616e636573207765726520736c61736865642028652e672e2064756520746f206d69732d6265686176696f7229244465706f73697465640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000a04984465706f736974656420736f6d652062616c616e636520696e746f20616e206163636f756e741c4c6f636b53657410011c6c6f636b5f6964150101384c6f636b4964656e74696669657200012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000b0454536f6d652066756e647320617265206c6f636b65642c4c6f636b52656d6f7665640c011c6c6f636b5f6964150101384c6f636b4964656e74696669657200012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000c047c536f6d65206c6f636b65642066756e6473207765726520756e6c6f636b6564184c6f636b65640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000d0474536f6d6520667265652062616c616e636520776173206c6f636b65642e20556e6c6f636b65640c012c63757272656e63795f69640d010134543a3a43757272656e6379496400010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000e0478536f6d65206c6f636b65642062616c616e6365207761732066726565642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909090d010c18636f6d6d6f6e287072696d69746976657324417373657449643332041c4173736574496401110100040110636f6465040134417373657449643332436f6465000011011018636f6d6d6f6e287072696d6974697665734c5f616c6c6f7765645f6465707265636174656444507265646566696e6564417373657449640001400c584f520000000c444f540001000c4b534d00020010555344540003000c56414c0004001450535741500005000c4441490006000c455448000700185853545553440008000c5853540009001054424344000a000c4b454e000b00104b555344000c00144b474f4c44000d00104b584f52000e00144b41524d41000f0000150100000308000000080019010c3074726164696e675f706169721870616c6c6574144576656e740404540001044454726164696e675061697253746f726564080010012844657849644f663c543e00001d01013854726164696e67506169723c543e000004050154726164696e67207061697220686173206265656e2072656469737465726564206f6e2061204445582e205b4445582049642c2054726164696e6720506169725d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909091d010c18636f6d6d6f6e287072696d6974697665732c54726164696e6750616972041c41737365744964010d0100080134626173655f61737365745f69640d01011c4173736574496400013c7461726765745f61737365745f69640d01011c41737365744964000021010c186173736574731870616c6c6574144576656e740404540001183c41737365745265676973746572656408000d010130417373657449644f663c543e00000001384163636f756e7449644f663c543e000004f84e657720617373657420686173206265656e20726567697374657265642e205b41737365742049642c204173736574204f776e6572204163636f756e745d205472616e7366657210000001384163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650001049501417373657420616d6f756e7420686173206265656e207472616e7366657265642e205b46726f6d204163636f756e742c20546f204163636f756e742c205472616e6665727265642041737365742049642c20416d6f756e74205472616e736665727265645d104d696e7410000001384163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650002047901417373657420616d6f756e7420686173206265656e206d696e7465642e205b497373756572204163636f756e742c20546172676574204163636f756e742c204d696e7465642041737365742049642c20416d6f756e74204d696e7465645d104275726e0c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650003043901417373657420616d6f756e7420686173206265656e206275726e65642e205b497373756572204163636f756e742c204275726e65642041737365742049642c20416d6f756e74204275726e65645d4c41737365745365744e6f6e4d696e7461626c6504000d010130417373657449644f663c543e000404bc417373657420697320736574206173206e6f6e2d6d696e7461626c652e205b5461726765742041737365742049645d304173736574557064617465640c000d010130417373657449644f663c543e00002501014c4f7074696f6e3c417373657453796d626f6c3e00002d0101444f7074696f6e3c41737365744e616d653e0005046c417373657420696e666f20686173206265656e207570646174656404a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909250104184f7074696f6e0404540129010108104e6f6e6500000010536f6d6504002901000001000029010c18636f6d6d6f6e287072696d6974697665732c417373657453796d626f6c0000040030011c5665633c75383e00002d0104184f7074696f6e0404540131010108104e6f6e6500000010536f6d6504003101000001000031010c18636f6d6d6f6e287072696d6974697665732441737365744e616d650000040030011c5665633c75383e000035010c886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c1870616c6c6574144576656e740404540001183c506f6f6c496e697469616c697a6564080010012844657849644f663c543e00000d010130417373657449644f663c543e000004ec506f6f6c20697320696e697469616c697a656420666f7220706169722e205b4445582049642c20436f6c6c61746572616c2041737365742049645d545265666572656e636541737365744368616e67656404000d010130417373657449644f663c543e0001040d015265666572656e636520417373657420686173206265656e206368616e67656420666f7220706f6f6c2e205b4e6577205265666572656e63652041737365742049645d7c4f7074696f6e616c5265776172644d756c7469706c6965725570646174656408000d010130417373657449644f663c543e0000390101344f7074696f6e3c46697865643e00020459014d756c7469706c69657220666f722072657761726420686173206265656e2075706461746564206f6e20706172746963756c61722061737365742e205b41737365742049642c204e6577204d756c7469706c6965725d405072696365426961734368616e676564040018011c42616c616e6365000304a05072696365206269617320776173206368616e6765642e205b4e657720507269636520426961735d6050726963654368616e6765436f6e6669674368616e676564080018011c42616c616e6365000018011c42616c616e63650004043d015072696365206368616e676520636f6e66696720776173206368616e6765642e205b4e6577205072696365204368616e676520526174652c204e6577205072696365204368616e676520537465705d784661696c6564546f44697374726962757465467265655265736572766573040060013444697370617463684572726f72000504c84672656520726573657276657320646973747269627574696f6e20726f7574696e65206661696c65642e205b4572726f725d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909390104184f7074696f6e040454013d010108104e6f6e6500000010536f6d6504003d0100000100003d0108186669786e756d284669786564506f696e7408044901410104500000040114696e6e65724101010449000041010000050d0045010c24746563686e6963616c1870616c6c6574144576656e74040454000114184d696e74656410004901014054656368417373657449644f663c543e00004d010148546563684163636f756e7449644f663c543e000018011c42616c616e6365000018011c42616c616e636500000c4d01536f6d65207075726520746563686e6963616c206173736574732077657265206d696e7465642e205b61737365742c206f776e65722c206d696e7465645f616d6f756e742c20746f74616c5f65786973745d2ea054686973206973206e6f74206f6e6c7920666f72207075726520546563684163636f756e7449642eb0546563684163636f756e7449642063616e206265206a7573742077726170706564204163636f756e7449642e184275726e656410004901014054656368417373657449644f663c543e00004d010148546563684163636f756e7449644f663c543e000018011c42616c616e6365000018011c42616c616e63650001084d01536f6d65207075726520746563686e6963616c206173736574732077657265206275726e65642e205b61737365742c206f776e65722c206275726e65645f616d6f756e742c20746f74616c5f65786973745d2ea4466f722066756c6c206b696e64206f66206163636f756e7473206c696b6520696e204d696e7465642e444f75747075745472616e7366657272656410004901014054656368417373657449644f663c543e00004d010148546563684163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e000018011c42616c616e6365000208f0536f6d65206173736574732077657265207472616e73666572726564206f75742e205b61737365742c2066726f6d2c20746f2c20616d6f756e745d2ea4546563684163636f756e744964206973206f6e6c79207075726520546563684163636f756e7449642e40496e7075745472616e7366657272656410004901014054656368417373657449644f663c543e00000001384163636f756e7449644f663c543e00004d010148546563684163636f756e7449644f663c543e000018011c42616c616e6365000308ec536f6d65206173736574732077657265207472616e7366657272656420696e2e205b61737365742c2066726f6d2c20746f2c20616d6f756e745d2ea4546563684163636f756e744964206973206f6e6c79207075726520546563684163636f756e7449642e2c537761705375636365737304000001384163636f756e7449644f663c543e000408d053776170206f706572616374696f6e2069732066696e616c69736564205b696e69746961746f722c2066696e616c697365725d2ea4546563684163636f756e744964206973206f6e6c79207075726520546563684163636f756e7449642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090949010c18636f6d6d6f6e287072696d6974697665732c5465636841737365744964041c4173736574496401110101081c5772617070656404001101011c417373657449640000001c457363617065640400040134417373657449643332436f6465000100004d010c18636f6d6d6f6e287072696d69746976657334546563684163636f756e7449640c244163636f756e74496401001c417373657449640149011444455849640110011410507572650800100114444558496400005101015054656368507572706f73653c417373657449643e0000001c47656e65726963080030011c5665633c75383e000030011c5665633c75383e0001001c5772617070656404000001244163636f756e7449640002002c577261707065645265707204000001244163636f756e744964000300104e6f6e650004000051010c18636f6d6d6f6e287072696d6974697665732c54656368507572706f7365041c41737365744964014901011430466565436f6c6c6563746f720000004c466565436f6c6c6563746f72466f725061697204005501015054726164696e67506169723c417373657449643e0001004858796b4c69717569646974794b656570657204005501015054726164696e67506169723c417373657449643e000200284964656e746966696572040030011c5665633c75383e000300604f72646572426f6f6b4c69717569646974794b656570657204005501015054726164696e67506169723c417373657449643e0004000055010c18636f6d6d6f6e287072696d6974697665732c54726164696e6750616972041c4173736574496401490100080134626173655f61737365745f69644901011c4173736574496400013c7461726765745f61737365745f69644901011c41737365744964000059010c20706f6f6c5f78796b1870616c6c6574144576656e7404045400010844506f6f6c4973496e697469616c697a656404000001384163636f756e7449644f663c543e00000030506f6f6c41646a7573746564100110706f6f6c0001384163636f756e7449644f663c543e0430506f6f6c206163636f756e7401306f6c645f69737375616e636518011c42616c616e6365046849737375616e6365206265666f72652061646a7573746d656e7401306e65775f69737375616e636518011c42616c616e6365046449737375616e63652061667465722061646a7573746d656e74012470726f76696465727310010c7533320488416d6f756e74206f662070726f63657373656420706f6f6c2070726f766964657273010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909095d010c3c6c69717569646974795f70726f78791870616c6c6574144576656e740404540001182045786368616e676520000001384163636f756e7449644f663c543e000010012844657849644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e6365000018011c42616c616e63650000610101844f7574636f6d654665653c417373657449644f663c543e2c2042616c616e63653e00007101016c5665633c4c6971756964697479536f7572636549644f663c543e3e0000089445786368616e6765206f6620746f6b656e7320686173206265656e20706572666f726d656489015b43616c6c6572204163636f756e742c204445582049642c20496e7075742041737365742049642c204f75747075742041737365742049642c20496e70757420416d6f756e742c204f757470757420416d6f756e742c2046656520416d6f756e745d584c6971756964697479536f75726365456e61626c656404007901014c4c6971756964697479536f7572636554797065000104704c697175696469747920736f757263652077617320656e61626c65645c4c6971756964697479536f7572636544697361626c656404007901014c4c6971756964697479536f7572636554797065000204744c697175696469747920736f75726365207761732064697361626c65644442617463685377617045786563757465640c0018011c42616c616e6365000018011c42616c616e636500007d01010d014f7074696f6e3c426f756e6465645665633c75382c20543a3a4d61784164646974696f6e616c446174614c656e677468537761705472616e7366657242617463683e3e000308a84261746368206f662073776170207472616e736665727320686173206265656e20706572666f726d6564d45b496e7075742061737365742041444152204665652c20496e70757420616d6f756e742c204164646974696f6e616c20446174615d3c586f726c6573735472616e7366657214000d010130417373657449644f663c543e00000001384163636f756e7449644f663c543e00000001384163636f756e7449644f663c543e000018011c42616c616e6365000085010105014f7074696f6e3c426f756e6465645665633c75382c20543a3a4d61784164646974696f6e616c446174614c656e677468586f726c6573735472616e736665723e3e0004088c584f526c657373207472616e7366657220686173206265656e20706572666f726d656415015b41737365742049642c2043616c6c6572204163636f756e742c205265636569766572204163636f756e742c20416d6f756e742c204164646974696f6e616c20446174615d404144415246656557697468647261776e08000d010130417373657449644f663c543e000018011c42616c616e6365000508f041444152206665652077686963682069732077697468647261776e2066726f6d20726575736564206f7574636f6d6520617373657420616d6f756e74505b41737365742049642c2041444152204665655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090961010c18636f6d6d6f6e2c6f7574636f6d655f666565284f7574636f6d65466565081c41737365744964010d0128416d6f756e745479706501180004006501017442547265654d61703c417373657449642c20416d6f756e74547970653e00006501042042547265654d617008044b010d0104560118000400690100000069010000026d01006d01000004080d011800710100000275010075010c18636f6d6d6f6e287072696d697469766573444c6971756964697479536f757263654964081444455849640110504c6971756964697479536f75726365496e646578017901000801186465785f696410011444455849640001586c69717569646974795f736f757263655f696e646578790101504c6971756964697479536f75726365496e646578000079010c18636f6d6d6f6e287072696d6974697665734c4c6971756964697479536f75726365547970650001241c58594b506f6f6c00000040426f6e64696e674375727665506f6f6c0001007c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c000200204d6f636b506f6f6c000300244d6f636b506f6f6c32000400244d6f636b506f6f6c33000500244d6f636b506f6f6c340006001c585354506f6f6c000700244f72646572426f6f6b000800007d0104184f7074696f6e0404540181010108104e6f6e6500000010536f6d650400810100000100008101101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e0000850104184f7074696f6e0404540189010108104e6f6e6500000010536f6d650400890100000100008901101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e00008d010c4470616c6c65745f636f6c6c6563746976651870616c6c6574144576656e7408045400044900011c2050726f706f73656410011c6163636f756e74000130543a3a4163636f756e74496400013870726f706f73616c5f696e64657810013450726f706f73616c496e64657800013470726f706f73616c5f686173682c011c543a3a486173680001247468726573686f6c6410012c4d656d626572436f756e74000008490141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e3c604d656d626572436f756e7460292e14566f74656414011c6163636f756e74000130543a3a4163636f756e74496400013470726f706f73616c5f686173682c011c543a3a48617368000114766f746564bc0110626f6f6c00010c79657310012c4d656d626572436f756e740001086e6f10012c4d656d626572436f756e74000108050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e671501612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404013470726f706f73616c5f686173682c011c543a3a48617368000204c041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404013470726f706f73616c5f686173682c011c543a3a48617368000304d041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408013470726f706f73616c5f686173682c011c543a3a48617368000118726573756c74a401384469737061746368526573756c74000404210141206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408013470726f706f73616c5f686173682c011c543a3a48617368000118726573756c74a401384469737061746368526573756c740005044901412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c013470726f706f73616c5f686173682c011c543a3a4861736800010c79657310012c4d656d626572436f756e740001086e6f10012c4d656d626572436f756e740006045501412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090991010c4470616c6c65745f636f6c6c6563746976651870616c6c6574144576656e7408045400044900011c2050726f706f73656410011c6163636f756e74000130543a3a4163636f756e74496400013870726f706f73616c5f696e64657810013450726f706f73616c496e64657800013470726f706f73616c5f686173682c011c543a3a486173680001247468726573686f6c6410012c4d656d626572436f756e74000008490141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e3c604d656d626572436f756e7460292e14566f74656414011c6163636f756e74000130543a3a4163636f756e74496400013470726f706f73616c5f686173682c011c543a3a48617368000114766f746564bc0110626f6f6c00010c79657310012c4d656d626572436f756e740001086e6f10012c4d656d626572436f756e74000108050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e671501612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e20417070726f76656404013470726f706f73616c5f686173682c011c543a3a48617368000204c041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2c446973617070726f76656404013470726f706f73616c5f686173682c011c543a3a48617368000304d041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e20457865637574656408013470726f706f73616c5f686173682c011c543a3a48617368000118726573756c74a401384469737061746368526573756c74000404210141206d6f74696f6e207761732065786563757465643b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e384d656d626572457865637574656408013470726f706f73616c5f686173682c011c543a3a48617368000118726573756c74a401384469737061746368526573756c740005044901412073696e676c65206d656d6265722064696420736f6d6520616374696f6e3b20726573756c742077696c6c20626520604f6b602069662069742072657475726e656420776974686f7574206572726f722e18436c6f7365640c013470726f706f73616c5f686173682c011c543a3a4861736800010c79657310012c4d656d626572436f756e740001086e6f10012c4d656d626572436f756e740006045501412070726f706f73616c2077617320636c6f736564206265636175736520697473207468726573686f6c64207761732072656163686564206f7220616674657220697473206475726174696f6e207761732075702e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090995010c4070616c6c65745f64656d6f63726163791870616c6c6574144576656e740404540001382050726f706f73656408013870726f706f73616c5f696e64657810012450726f70496e64657800011c6465706f73697418013042616c616e63654f663c543e000004bc41206d6f74696f6e20686173206265656e2070726f706f7365642062792061207075626c6963206163636f756e742e185461626c656408013870726f706f73616c5f696e64657810012450726f70496e64657800011c6465706f73697418013042616c616e63654f663c543e000104d841207075626c69632070726f706f73616c20686173206265656e207461626c656420666f72207265666572656e64756d20766f74652e3845787465726e616c5461626c656400020494416e2065787465726e616c2070726f706f73616c20686173206265656e207461626c65642e1c537461727465640801247265665f696e64657810013c5265666572656e64756d496e6465780001247468726573686f6c6499010134566f74655468726573686f6c640003045c41207265666572656e64756d2068617320626567756e2e185061737365640401247265665f696e64657810013c5265666572656e64756d496e646578000404ac412070726f706f73616c20686173206265656e20617070726f766564206279207265666572656e64756d2e244e6f745061737365640401247265665f696e64657810013c5265666572656e64756d496e646578000504ac412070726f706f73616c20686173206265656e2072656a6563746564206279207265666572656e64756d2e2443616e63656c6c65640401247265665f696e64657810013c5265666572656e64756d496e6465780006048041207265666572656e64756d20686173206265656e2063616e63656c6c65642e2444656c65676174656408010c77686f000130543a3a4163636f756e744964000118746172676574000130543a3a4163636f756e744964000704dc416e206163636f756e74206861732064656c65676174656420746865697220766f746520746f20616e6f74686572206163636f756e742e2c556e64656c65676174656404011c6163636f756e74000130543a3a4163636f756e744964000804e4416e206163636f756e74206861732063616e63656c6c656420612070726576696f75732064656c65676174696f6e206f7065726174696f6e2e185665746f65640c010c77686f000130543a3a4163636f756e74496400013470726f706f73616c5f686173682c011048323536000114756e74696c100138543a3a426c6f636b4e756d62657200090494416e2065787465726e616c2070726f706f73616c20686173206265656e207665746f65642e2c426c61636b6c697374656404013470726f706f73616c5f686173682c011048323536000a04c4412070726f706f73616c5f6861736820686173206265656e20626c61636b6c6973746564207065726d616e656e746c792e14566f7465640c0114766f746572000130543a3a4163636f756e7449640001247265665f696e64657810013c5265666572656e64756d496e646578000110766f74659d0101644163636f756e74566f74653c42616c616e63654f663c543e3e000b0490416e206163636f756e742068617320766f74656420696e2061207265666572656e64756d205365636f6e6465640801207365636f6e646572000130543a3a4163636f756e74496400012870726f705f696e64657810012450726f70496e646578000c048c416e206163636f756e742068617320736563636f6e64656420612070726f706f73616c4050726f706f73616c43616e63656c656404012870726f705f696e64657810012450726f70496e646578000d0460412070726f706f73616c20676f742063616e63656c65642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090999010c4070616c6c65745f64656d6f637261637938766f74655f7468726573686f6c6434566f74655468726573686f6c6400010c5053757065724d616a6f72697479417070726f76650000005053757065724d616a6f72697479416761696e73740001003853696d706c654d616a6f72697479000200009d010c4070616c6c65745f64656d6f637261637910766f74652c4163636f756e74566f7465041c42616c616e636501180108205374616e64617264080110766f7465a1010110566f746500011c62616c616e636518011c42616c616e63650000001453706c697408010c61796518011c42616c616e636500010c6e617918011c42616c616e636500010000a1010c4070616c6c65745f64656d6f637261637910766f746510566f74650000040008000000a5010c1c6465785f6170691870616c6c6574144576656e74040454000108584c6971756964697479536f75726365456e61626c656404007901014c4c6971756964697479536f75726365547970650000046c4c697175696469747920736f7572636520697320656e61626c65645c4c6971756964697479536f7572636544697361626c656404007901014c4c6971756964697479536f7572636554797065000104704c697175696469747920736f757263652069732064697361626c656404a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909a9010c286574685f6272696467651870616c6c6574144576656e7404045400012044526571756573745265676973746572656404002c011048323536000004bc4e6577207265717565737420686173206265656e20726567697374657265642e205b5265717565737420486173685d48417070726f76616c73436f6c6c656374656404002c0110483235360001044d015468652072657175657374277320617070726f76616c732068617665206265656e20636f6c6c65637465642e205b456e636f646564204f7574676f696e6720526571756573742c205369676e6174757265735d645265717565737446696e616c697a6174696f6e4661696c656404002c011048323536000204e054686520726571756573742066696e616c697a6174696f6e20686173206265656e206661696c65642e205b5265717565737420486173685d84496e636f6d696e675265717565737446696e616c697a6174696f6e4661696c656404002c011048323536000304050154686520696e636f6d696e6720726571756573742066696e616c697a6174696f6e20686173206265656e206661696c65642e205b5265717565737420486173685d60496e636f6d696e675265717565737446696e616c697a656404002c011048323536000404dc54686520696e636f6d696e67207265717565737420686173206265656e2066696e616c697a65642e205b5265717565737420486173685d385265717565737441626f7274656404002c011048323536000504d45468652072657175657374207761732061626f7274656420616e642063616e63656c6c65642e205b5265717565737420486173685d4843616e63656c6c6174696f6e4661696c656404002c011048323536000604e85468652072657175657374207761736e27742066696e616c697a6564206e6f722063616e63656c6c65642e205b5265717565737420486173685d545265676973746572526571756573744661696c656408002c011048323536000060013444697370617463684572726f72000704fc546865207265717565737420726567697374726174696f6e20686173206265656e206661696c65642e205b5265717565737420486173682c204572726f725d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909ad010c4870737761705f646973747269627574696f6e1870616c6c6574144576656e74040454000120344665657345786368616e676564180010012844657849644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e000018011c42616c616e6365000008090146656573207375636365737366756c6c792065786368616e67656420666f7220617070726f70726961746520616d6f756e74206f6620706f6f6c20746f6b656e732ea9015b4445582049642c2046656573204163636f756e742049642c20466565732041737365742049642c2046656573205370656e7420416d6f756e742c20496e63656e746976652041737365742049642c20496e63656e7469766520526563656976656420416d6f756e745d484665657345786368616e67654661696c6564180010012844657849644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e000060013444697370617463684572726f72000108e450726f626c656d206f63637572726564207468617420726573756c74656420696e20666565732065786368616e6765206e6f7420646f6e652e8d015b4445582049642c2046656573204163636f756e742049642c20466565732041737365742049642c20417661696c61626c65204665657320416d6f756e742c20496e63656e746976652041737365742049642c2045786368616e6765206572726f725d50496e63656e746976654469737472696275746564140010012844657849644f663c543e00000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e6365000018011075313238000208c4496e63656e7469766573207375636365737366756c6c792073656e74206f757420746f207368617265686f6c646572732ea5015b4445582049642c2046656573204163636f756e742049642c20496e63656e746976652041737365742049642c20496e63656e7469766520546f74616c20446973747269627574656420416d6f756e742c204e756d626572206f66207368617265686f6c646572735d6c496e63656e74697665446973747269627574696f6e4661696c6564080010012844657849644f663c543e00000001384163636f756e7449644f663c543e000308090150726f626c656d206f63637572726564207468617420726573756c74656420696e20696e63656e7469766520646973747269627574696f6e206e6f7420646f6e652e645b4445582049642c2046656573204163636f756e742049645d3c4275726e526174654368616e67656404003d0101144669786564000408484275726e207261746520757064617465642e4c5b43757272656e74204275726e20526174655d444e6f7468696e67546f45786368616e6765080010012844657849644f663c543e00000001384163636f756e7449644f663c543e0005080d0146656573204163636f756e7420636f6e7461696e73207a65726f206261736520746f6b656e732c20746875732065786368616e6765206973206469736d69737365642e645b4445582049642c2046656573204163636f756e742049645d4c4e6f7468696e67546f44697374726962757465080010012844657849644f663c543e00000001384163636f756e7449644f663c543e000608310146656573204163636f756e7420636f6e7461696e73207a65726f20696e63656e7469766520746f6b656e732c207468757320646973747269627574696f6e206973206469736d69737365642e645b4445582049642c2046656573204163636f756e742049645d74496e63656e74697665734275726e6564416674657245786368616e6765100010012844657849644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e6365000018011c42616c616e6365000710450154686973206973206e656564656420666f72206f746865722070616c6c657420746861742077696c6c207573652074686973207661726961626c65732c20666f72206578616d706c6520746869732069733c6661726d696e672070616c6c65742e6d015b4445582049642c20496e63656e746976652041737365742049642c20546f74616c2065786368616e67656420696e63656e74697665732028496e63656e7469766573206275726e65642061667465722065786368616e6765292cf8496e63656e7469766573206275726e65642028496e63656e74697665732074686174206973206e6f7420726576697665642028746f206275726e295d292e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909b1010c3c70616c6c65745f6d756c74697369671870616c6c6574144576656e740404540001102c4e65774d756c74697369670c0124617070726f76696e67000130543a3a4163636f756e7449640001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c486173680000048c41206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e404d756c7469736967417070726f76616c100124617070726f76696e67000130543a3a4163636f756e74496400012474696d65706f696e74b501016454696d65706f696e743c543a3a426c6f636b4e756d6265723e0001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c48617368000104c841206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e404d756c74697369674578656375746564140124617070726f76696e67000130543a3a4163636f756e74496400012474696d65706f696e74b501016454696d65706f696e743c543a3a426c6f636b4e756d6265723e0001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c48617368000118726573756c74a401384469737061746368526573756c740002049c41206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e444d756c746973696743616e63656c6c656410012863616e63656c6c696e67000130543a3a4163636f756e74496400012474696d65706f696e74b501016454696d65706f696e743c543a3a426c6f636b4e756d6265723e0001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c48617368000304a041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909b501083c70616c6c65745f6d756c74697369672454696d65706f696e74042c426c6f636b4e756d62657201100008011868656967687410012c426c6f636b4e756d626572000114696e64657810010c7533320000b9010c4070616c6c65745f7363686564756c65721870616c6c6574144576656e74040454000118245363686564756c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e64657810010c753332000004505363686564756c656420736f6d65207461736b2e2043616e63656c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e64657810010c7533320001044c43616e63656c656420736f6d65207461736b2e28446973706174636865640c01107461736bbd01016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964c10101404f7074696f6e3c5461736b4e616d653e000118726573756c74a401384469737061746368526573756c74000204544469737061746368656420736f6d65207461736b2e3c43616c6c556e617661696c61626c650801107461736bbd01016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964c10101404f7074696f6e3c5461736b4e616d653e00030429015468652063616c6c20666f72207468652070726f7669646564206861736820776173206e6f7420666f756e6420736f20746865207461736b20686173206265656e2061626f727465642e38506572696f6469634661696c65640801107461736bbd01016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964c10101404f7074696f6e3c5461736b4e616d653e0004043d0154686520676976656e207461736b2077617320756e61626c6520746f2062652072656e657765642073696e636520746865206167656e64612069732066756c6c206174207468617420626c6f636b2e545065726d616e656e746c794f7665727765696768740801107461736bbd01016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964c10101404f7074696f6e3c5461736b4e616d653e000504f054686520676976656e207461736b2063616e206e657665722062652065786563757465642073696e6365206974206973206f7665727765696768742e04304576656e747320747970652ebd0100000408101000c10104184f7074696f6e04045401040108104e6f6e6500000010536f6d650400040000010000c5010c3c69726f68615f6d6967726174696f6e1870616c6c6574144576656e74040454000104204d696772617465640800c9010118537472696e6700000001384163636f756e7449644f663c543e000004684d696772617465642e205b736f757263652c207461726765745d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909c9010000050200cd010c4470616c6c65745f6d656d626572736869701870616c6c6574144576656e740804540004490001182c4d656d6265724164646564000004e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e344d656d62657252656d6f766564000104e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2e384d656d6265727353776170706564000204d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e304d656d6265727352657365740003041501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e284b65794368616e676564000404844f6e65206f6620746865206d656d6265727327206b657973206368616e6765642e1444756d6d790005046c5068616e746f6d206d656d6265722c206e6576657220757365642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909d1010c6470616c6c65745f656c656374696f6e735f70687261676d656e1870616c6c6574144576656e7404045400011c1c4e65775465726d04012c6e65775f6d656d62657273d50101ec5665633c283c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e7449642c2042616c616e63654f663c543e293e000014450141206e6577207465726d2077697468206e65775f6d656d626572732e205468697320696e64696361746573207468617420656e6f7567682063616e64696461746573206578697374656420746f2072756e550174686520656c656374696f6e2c206e6f74207468617420656e6f756768206861766520686173206265656e20656c65637465642e2054686520696e6e65722076616c7565206d757374206265206578616d696e65644501666f72207468697320707572706f73652e204120604e65775465726d285c5b5c5d296020696e64696361746573207468617420736f6d652063616e6469646174657320676f7420746865697220626f6e645501736c617368656420616e64206e6f6e65207765726520656c65637465642c207768696c73742060456d7074795465726d60206d65616e732074686174206e6f2063616e64696461746573206578697374656420746f2c626567696e20776974682e24456d7074795465726d00010831014e6f20286f72206e6f7420656e6f756768292063616e64696461746573206578697374656420666f72207468697320726f756e642e205468697320697320646966666572656e742066726f6dc8604e65775465726d285c5b5c5d29602e2053656520746865206465736372697074696f6e206f6620604e65775465726d602e34456c656374696f6e4572726f72000204e4496e7465726e616c206572726f722068617070656e6564207768696c6520747279696e6720746f20706572666f726d20656c656374696f6e2e304d656d6265724b69636b65640401186d656d6265720001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e744964000308410141206d656d62657220686173206265656e2072656d6f7665642e20546869732073686f756c6420616c7761797320626520666f6c6c6f7765642062792065697468657220604e65775465726d60206f723060456d7074795465726d602e2452656e6f756e63656404012463616e6469646174650001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400040498536f6d656f6e65206861732072656e6f756e6365642074686569722063616e6469646163792e4043616e646964617465536c617368656408012463616e6469646174650001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0005103901412063616e6469646174652077617320736c617368656420627920616d6f756e742064756520746f206661696c696e6720746f206f627461696e20612073656174206173206d656d626572206f722872756e6e65722d75702e00e44e6f74652074686174206f6c64206d656d6265727320616e642072756e6e6572732d75702061726520616c736f2063616e646964617465732e4453656174486f6c646572536c617368656408012c736561745f686f6c6465720001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000604350141207365617420686f6c6465722077617320736c617368656420627920616d6f756e74206279206265696e6720666f72636566756c6c792072656d6f7665642066726f6d20746865207365742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909d501000002d90100d90100000408001800dd010c387665737465645f726577617264731870616c6c6574144576656e740404540001203452657761726473566573746564040018011c42616c616e6365000004cc52657761726473207665737465642c206c696d6974732077657265207261697365642e205b76657374656420616d6f756e745d6841637475616c446f65736e744d61746368417661696c61626c650400e1010130526577617264526561736f6e0001047d01417474656d7074656420746f20636c61696d207265776172642c206275742061637475616c20636c61696d656420616d6f756e74206973206c657373207468616e2065787065637465642e205b726561736f6e20666f72207265776172645d704661696c6564546f5361766543616c63756c6174656452657761726404000001384163636f756e7449644f663c543e0002042101536176696e672072657761726420666f72206163636f756e7420686173206661696c656420696e206120646973747269627574696f6e207365726965732e205b6163636f756e745d4043726f77646c6f616e436c61696d65640c00000130543a3a4163636f756e74496400000d010130417373657449644f663c543e000018011c42616c616e636500030464436c61696d65642063726f77646c6f616e20726577617264735056657374696e675363686564756c6541646465640c011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e74496400014076657374696e675f7363686564756c65e501015056657374696e675363686564756c654f663c543e0004046c4164646564206e65772076657374696e67207363686564756c652e38436c61696d656456657374696e670c010c77686f000130543a3a4163636f756e74496400012061737365745f69640d010130417373657449644f663c543e0001346c6f636b65645f616d6f756e7418013042616c616e63654f663c543e00050440436c61696d65642076657374696e672e5c56657374696e675363686564756c65735570646174656404010c77686f000130543a3a4163636f756e74496400060468557064617465642076657374696e67207363686564756c65732e5c50656e64696e675363686564756c65556e6c6f636b656408011064657374000130543a3a4163636f756e74496400014070656e64696e675f7363686564756c65e501015056657374696e675363686564756c654f663c543e000704a450656e64696e67207363686564756c6520756e6c6f636b656420616e64206d6179206265207573656404a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909e1010c18636f6d6d6f6e287072696d69746976657330526577617264526561736f6e0001142c556e737065636966696564000000444275794f6e426f6e64696e674375727665000100644c697175696469747950726f766973696f6e4661726d696e670002006c446570726563617465644d61726b65744d616b6572566f6c756d650003002443726f77646c6f616e00040000e5010c387665737465645f726577617264734876657374696e675f63757272656e636965735856657374696e675363686564756c6556617269616e740c2c426c6f636b4e756d62657201101c41737365744964010d01244163636f756e74496401000108544c696e65617256657374696e675363686564756c650400e90101ac4c696e65617256657374696e675363686564756c653c426c6f636b4e756d6265722c20417373657449643e000000704c696e65617250656e64696e6756657374696e675363686564756c650400ed0101f44c696e65617250656e64696e6756657374696e675363686564756c653c426c6f636b4e756d6265722c20417373657449642c204163636f756e7449643e00010000e9010c387665737465645f726577617264734876657374696e675f63757272656e63696573544c696e65617256657374696e675363686564756c65082c426c6f636b4e756d62657201101c41737365744964010d010018012061737365745f69640d01011c41737365744964000114737461727410012c426c6f636b4e756d626572000118706572696f6410012c426c6f636b4e756d626572000130706572696f645f636f756e7410010c7533320001287065725f706572696f64fc011c42616c616e636500014072656d61696e6465725f616d6f756e74fc011c42616c616e63650000ed010c387665737465645f726577617264734876657374696e675f63757272656e63696573704c696e65617250656e64696e6756657374696e675363686564756c650c2c426c6f636b4e756d62657201101c41737365744964010d01244163636f756e7449640100001c012061737365745f69640d01011c417373657449640001286d616e616765725f69640001244163636f756e7449640001147374617274f101014c4f7074696f6e3c426c6f636b4e756d6265723e000118706572696f6410012c426c6f636b4e756d626572000130706572696f645f636f756e7410010c7533320001287065725f706572696f64fc011c42616c616e636500014072656d61696e6465725f616d6f756e74fc011c42616c616e63650000f10104184f7074696f6e04045401100108104e6f6e6500000010536f6d650400100000010000f5010c3c70616c6c65745f6964656e746974791870616c6c6574144576656e740404540001282c4964656e7469747953657404010c77686f000130543a3a4163636f756e744964000004ec41206e616d652077617320736574206f72207265736574202877686963682077696c6c2072656d6f766520616c6c206a756467656d656e7473292e3c4964656e74697479436c656172656408010c77686f000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000104cc41206e616d652077617320636c65617265642c20616e642074686520676976656e2062616c616e63652072657475726e65642e384964656e746974794b696c6c656408010c77686f000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000204c441206e616d65207761732072656d6f76656420616e642074686520676976656e2062616c616e636520736c61736865642e484a756467656d656e7452657175657374656408010c77686f000130543a3a4163636f756e74496400013c7265676973747261725f696e646578100138526567697374726172496e6465780003049c41206a756467656d656e74207761732061736b65642066726f6d2061207265676973747261722e504a756467656d656e74556e72657175657374656408010c77686f000130543a3a4163636f756e74496400013c7265676973747261725f696e646578100138526567697374726172496e6465780004048841206a756467656d656e74207265717565737420776173207265747261637465642e384a756467656d656e74476976656e080118746172676574000130543a3a4163636f756e74496400013c7265676973747261725f696e646578100138526567697374726172496e6465780005049441206a756467656d656e742077617320676976656e2062792061207265676973747261722e38526567697374726172416464656404013c7265676973747261725f696e646578100138526567697374726172496e646578000604584120726567697374726172207761732061646465642e405375624964656e7469747941646465640c010c737562000130543a3a4163636f756e7449640001106d61696e000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000704f441207375622d6964656e746974792077617320616464656420746f20616e206964656e7469747920616e6420746865206465706f73697420706169642e485375624964656e7469747952656d6f7665640c010c737562000130543a3a4163636f756e7449640001106d61696e000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000804090141207375622d6964656e74697479207761732072656d6f7665642066726f6d20616e206964656e7469747920616e6420746865206465706f7369742066726565642e485375624964656e746974795265766f6b65640c010c737562000130543a3a4163636f756e7449640001106d61696e000130543a3a4163636f756e74496400011c6465706f73697418013042616c616e63654f663c543e000908190141207375622d6964656e746974792077617320636c65617265642c20616e642074686520676976656e206465706f7369742072657061747269617465642066726f6d20746865c86d61696e206964656e74697479206163636f756e7420746f20746865207375622d6964656e74697479206163636f756e742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909f9010c1c6661726d696e671870616c6c6574144576656e74040454000104744c704d696e586f72466f72426f6e75735265776172645570646174656408017c6e65775f6c705f6d696e5f786f725f666f725f626f6e75735f72657761726418011c42616c616e636500017c6f6c645f6c705f6d696e5f786f725f666f725f626f6e75735f72657761726418011c42616c616e636500000419015768656e204d696e696d756d20584f5220616d6f756e7420666f72204c69717569646974792050726f766964657220426f6e757320526577617264206973207570646174656404a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909fd010c0c7873741870616c6c6574144576656e74040454000118545265666572656e636541737365744368616e67656404000d010130417373657449644f663c543e0000040d015265666572656e636520417373657420686173206265656e206368616e67656420666f7220706f6f6c2e205b4e6577205265666572656e63652041737365742049645d5453796e7468657469634173736574456e61626c656408000d010130417373657449644f663c543e000001020124543a3a53796d626f6c000104210153796e74686574696320617373657420686173206265656e20656e61626c65642e205b53796e7468657469632041737365742049642c205265666572656e63652053796d626f6c5d5853796e746865746963417373657444697361626c656404000d010130417373657449644f663c543e000204dc53796e74686574696320617373657420686173206265656e2064697361626c65642e205b53796e7468657469632041737365742049645d6053796e74686574696341737365744665654368616e67656408000d010130417373657449644f663c543e00003d01011446697865640003040d0153796e7468657469632061737365742066656520686173206265656e206368616e6765642e205b53796e7468657469632041737365742049642c204e6577204665655d8c53796e746865746963426173654173736574466c6f6f7250726963654368616e676564040018011c42616c616e63650004042d01466c6f6f72207072696365206f66207468652073796e746865746963206261736520617373657420686173206265656e206368616e6765642e205b4e657720466c6f6f722050726963655d5453796e746865746963417373657452656d6f76656408000d010130417373657449644f663c543e000001020124543a3a53796d626f6c000504210153796e74686574696320617373657420686173206265656e2072656d6f7665642e205b53796e7468657469632041737365742049642c205265666572656e63652053796d626f6c5d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090901020c18636f6d6d6f6e287072696d6974697665732853796d626f6c4e616d650000040030011c5665633c75383e000005020c2c70726963655f746f6f6c731870616c6c6574144576656e7404045400010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090909020c3463657265735f7374616b696e671870616c6c6574144576656e7404045400010c244465706f736974656408000001384163636f756e7449644f663c543e000018011c42616c616e6365000004784365726573206465706f73697465642e205b77686f2c20616d6f756e745d2457697468647261776e0c000001384163636f756e7449644f663c543e000018011c42616c616e6365000018011c42616c616e6365000104e85374616b656420436572657320616e6420726577617264732077697468647261776e2e205b77686f2c207374616b65642c20726577617264735d38526577617264734368616e676564040018011c42616c616e63650002046452657761726473206368616e676564205b62616c616e63655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909090d020c5863657265735f6c69717569646974795f6c6f636b65721870616c6c6574144576656e74040454000104184c6f636b65640c000001384163636f756e7449644f663c543e000018011c42616c616e63650000280124543a3a4d6f6d656e740000049446756e6473204c6f636b6564205b77686f2c20616d6f756e742c2074696d657374616d705d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090911020c4863657265735f746f6b656e5f6c6f636b65721870616c6c6574144576656e7404045400010c184c6f636b65640c000001384163636f756e7449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e0000048446756e6473204c6f636b6564205b77686f2c20616d6f756e742c2061737365745d2457697468647261776e0c000001384163636f756e7449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e0001049046756e64732057697468647261776e205b77686f2c20616d6f756e742c2061737365745d284665654368616e67656408000001384163636f756e7449644f663c543e000018011c42616c616e636500020464466565204368616e676564205b77686f2c20616d6f756e745d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090915020c6463657265735f676f7665726e616e63655f706c6174666f726d1870616c6c6574144576656e7404045400010c14566f74656414000001384163636f756e7449644f663c543e00002c011048323536000010010c75333200000d010130417373657449644f663c543e000018011c42616c616e6365000004a8566f74696e67205b77686f2c20706f6c6c2c206f7074696f6e2c2061737365742c2062616c616e63655d1c4372656174656414000001384163636f756e7449644f663c543e000019020170426f756e646564537472696e673c543a3a5469746c654c696d69743e00000d010130417373657449644f663c543e0000280124543a3a4d6f6d656e740000280124543a3a4d6f6d656e74000104110143726561746520706f6c6c205b77686f2c207469746c652c20706f6c6c5f61737365742c2073746172745f74696d657374616d702c20656e645f74696d657374616d705d2457697468647261776e10000001384163636f756e7449644f663c543e00002c01104832353600000d010130417373657449644f663c543e000018011c42616c616e63650002049457697468647261776e205b77686f2c20706f6c6c2c2061737365742c2062616c616e63655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090919020c18636f6d6d6f6e287072696d69746976657334426f756e646564537472696e6704044e000004001d020144426f756e6465645665633c75382c204e3e00001d02101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e000021020c3c63657265735f6c61756e63687061641870616c6c6574144576656e7404045400013028494c4f4372656174656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e0000045c494c4f2063726561746564205b77686f2c20776861745d2c436f6e74726962757465640c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650001047c436f6e74726962757465205b77686f2c20776861742c2062616c616e63655d48456d657267656e637957697468647261776e0c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650002049c456d657267656e6379207769746864726177205b77686f2c20776861742c2062616c616e63655d2c494c4f46696e697368656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00030460494c4f2066696e6973686564205b77686f2c20776861745d24436c61696d65644c5008000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e0004046c436c61696d204c5020546f6b656e73205b77686f2c20776861745d1c436c61696d656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00050460436c61696d20746f6b656e73205b77686f2c20776861745d284665654368616e676564040018011c42616c616e636500060454466565206368616e676564205b62616c616e63655d30436c61696d6564505357415000070434505357415020636c61696d65645857686974656c6973746564436f6e7472696275746f7204000001384163636f756e7449644f663c543e00080474436f6e7472696275746f722077686974656c6973746564205b77686f5d5c57686974656c6973746564496c6f4f7267616e697a657204000001384163636f756e7449644f663c543e0009047c494c4f206f7267616e697a65722077686974656c6973746564205b77686f5d7452656d6f76656457686974656c6973746564436f6e7472696275746f7204000001384163636f756e7449644f663c543e000a0464436f6e7472696275746f722072656d6f766564205b77686f5d7852656d6f76656457686974656c6973746564496c6f4f7267616e697a657204000001384163636f756e7449644f663c543e000b046c494c4f206f7267616e697a65722072656d6f766564205b77686f5d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090925020c6064656d657465725f6661726d696e675f706c6174666f726d1870616c6c6574144576656e7404045400012c3c546f6b656e5265676973746572656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000470546f6b656e2072656769737465726564205b77686f2c20776861745d24506f6f6c416464656414000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000104fc506f6f6c206164646564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d5d3c52657761726457697468647261776e18000001384163636f756e7449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c00020435015265776172642057697468647261776e205b77686f2c20616d6f756e742c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d5d2457697468647261776e18000001384163636f756e7449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000304190157697468647261776e205b77686f2c20616d6f756e742c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d5d2c506f6f6c52656d6f76656414000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c0004040501506f6f6c2072656d6f766564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d5d244465706f736974656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000018011c42616c616e636500050419014465706f7369746564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d444d756c7469706c6965724368616e67656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000010010c7533320006043d014d756c7469706c696572204368616e676564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d444465706f7369744665654368616e67656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000018011c42616c616e636500070439014465706f7369744665654368616e676564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d40546f6b656e496e666f4368616e67656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00080478546f6b656e20696e666f206368616e676564205b77686f2c20776861745d48546f74616c546f6b656e734368616e67656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000018011c42616c616e63650009044501546f74616c20746f6b656e73206368616e676564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d2c496e666f4368616e67656418000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e00000d010130417373657449644f663c543e0000bc0110626f6f6c000018011c42616c616e6365000a042501496e666f206368616e676564205b77686f2c20626173655f61737365742c20706f6f6c5f61737365742c207265776172645f61737365742c2069735f6661726d2c20616d6f756e745d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090929020c4070616c6c65745f626167735f6c6973741870616c6c6574144576656e740804540004490001082052656261676765640c010c77686f000130543a3a4163636f756e74496400011066726f6d280120543a3a53636f7265000108746f280120543a3a53636f7265000004a44d6f76656420616e206163636f756e742066726f6d206f6e652062616720746f20616e6f746865722e3053636f72655570646174656408010c77686f000130543a3a4163636f756e7449640001246e65775f73636f7265280120543a3a53636f7265000104d855706461746564207468652073636f7265206f6620736f6d65206163636f756e7420746f2074686520676976656e20616d6f756e742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909092d020c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144576656e7404045400011838536f6c7574696f6e53746f7265640c011c636f6d707574653102013c456c656374696f6e436f6d707574650001186f726967696e350201504f7074696f6e3c543a3a4163636f756e7449643e000130707265765f656a6563746564bc0110626f6f6c00001cb44120736f6c7574696f6e207761732073746f72656420776974682074686520676976656e20636f6d707574652e00510154686520606f726967696e6020696e6469636174657320746865206f726967696e206f662074686520736f6c7574696f6e2e20496620606f726967696e602069732060536f6d65284163636f756e74496429602c55017468652073746f72656420736f6c7574696f6e20776173207375626d6974656420696e20746865207369676e65642070686173652062792061206d696e657220776974682074686520604163636f756e744964602e25014f74686572776973652c2074686520736f6c7574696f6e207761732073746f7265642065697468657220647572696e672074686520756e7369676e6564207068617365206f722062794d0160543a3a466f7263654f726967696e602e205468652060626f6f6c6020697320607472756560207768656e20612070726576696f757320736f6c7574696f6e2077617320656a656374656420746f206d616b6548726f6f6d20666f722074686973206f6e652e44456c656374696f6e46696e616c697a656408011c636f6d707574653102013c456c656374696f6e436f6d7075746500011473636f726539020134456c656374696f6e53636f7265000104190154686520656c656374696f6e20686173206265656e2066696e616c697a65642c20776974682074686520676976656e20636f6d7075746174696f6e20616e642073636f72652e38456c656374696f6e4661696c656400020c4c416e20656c656374696f6e206661696c65642e0001014e6f74206d7563682063616e20626520736169642061626f757420776869636820636f6d7075746573206661696c656420696e207468652070726f636573732e20526577617264656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0003042501416e206163636f756e7420686173206265656e20726577617264656420666f72207468656972207369676e6564207375626d697373696f6e206265696e672066696e616c697a65642e1c536c617368656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0004042101416e206163636f756e7420686173206265656e20736c617368656420666f72207375626d697474696e6720616e20696e76616c6964207369676e6564207375626d697373696f6e2e4450686173655472616e736974696f6e65640c011066726f6d3d02015450686173653c543a3a426c6f636b4e756d6265723e000108746f3d02015450686173653c543a3a426c6f636b4e756d6265723e000114726f756e6410010c753332000504b85468657265207761732061207068617365207472616e736974696f6e20696e206120676976656e20726f756e642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909093102089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653c456c656374696f6e436f6d707574650001141c4f6e436861696e000000185369676e656400010020556e7369676e65640002002046616c6c6261636b00030024456d657267656e637900040000350204184f7074696f6e04045401000108104e6f6e6500000010536f6d6504000000000100003902084473705f6e706f735f656c656374696f6e7334456c656374696f6e53636f726500000c01346d696e696d616c5f7374616b6518013c457874656e64656442616c616e636500012473756d5f7374616b6518013c457874656e64656442616c616e636500014473756d5f7374616b655f7371756172656418013c457874656e64656442616c616e636500003d02089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651450686173650408426e011001100c4f6666000000185369676e656400010020556e7369676e656404004102012828626f6f6c2c20426e2900020024456d657267656e637900030000410200000408bc100045020c1062616e641870616c6c6574144576656e7408045400044900010c3853796d626f6c7352656c617965640400490201645665633c28543a3a53796d626f6c2c2042616c616e6365293e000004d44e65772073796d626f6c2072617465732077657265207375636365737366756c6c792072656c617965642e205b73796d626f6c735d3452656c617965727341646465640400510201445665633c543a3a4163636f756e7449643e000104b84164646564206e657720747275737465642072656c61796572206163636f756e74732e205b72656c61796572735d3c52656c617965727352656d6f7665640400510201445665633c543a3a4163636f756e7449643e000204ec52656c61796572206163636f756e747320776572652072656d6f7665642066726f6d2074727573746564206c6973742e205b72656c61796572735d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090949020000024d02004d0200000408010218005102000002000055020c306f7261636c655f70726f78791870616c6c6574144576656e74040454000108344f7261636c65456e61626c65640400590201184f7261636c65000004a44f7261636c6520776173207375636365737366756c6c7920656e61626c65642e205b6f7261636c655d384f7261636c6544697361626c65640400590201184f7261636c65000104a84f7261636c6520776173207375636365737366756c6c792064697361626c65642e205b6f7261636c655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090959020c18636f6d6d6f6e287072696d697469766573184f7261636c650001043442616e64436861696e46656564000000005d020c686865726d65735f676f7665726e616e63655f706c6174666f726d1870616c6c6574144576656e7404045400011814566f7465640c000001384163636f756e7449644f663c543e00002c011048323536000061020174426f756e646564537472696e673c543a3a537472696e674c696d69743e00000468566f74696e67205b77686f2c20706f6c6c2c206f7074696f6e5d1c4372656174656410000001384163636f756e7449644f663c543e000019020170426f756e646564537472696e673c543a3a5469746c654c696d69743e0000280124543a3a4d6f6d656e740000280124543a3a4d6f6d656e74000104e043726561746520706f6c6c205b77686f2c207469746c652c2073746172745f74696d657374616d702c20656e645f74696d657374616d705d4c566f74657246756e647357697468647261776e08000001384163636f756e7449644f663c543e000018011c42616c616e636500020490566f7465722046756e64732057697468647261776e205b77686f2c2062616c616e63655d5443726561746f7246756e647357697468647261776e08000001384163636f756e7449644f663c543e000018011c42616c616e63650003049843726561746f722046756e64732057697468647261776e205b77686f2c2062616c616e63655d744d696e696d756d4865726d6573466f72566f74696e674368616e676564040018011c42616c616e6365000404a84368616e6765206d696e696d756d204865726d657320666f7220766f74696e67205b62616c616e63655d8c4d696e696d756d4865726d6573466f724372656174696e67506f6c6c4368616e676564040018011c42616c616e6365000504c44368616e6765206d696e696d756d204865726d657320666f72206372656174696e6720706f6c6c205b62616c616e63655d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090961020c18636f6d6d6f6e287072696d69746976657334426f756e646564537472696e6704044e0000040065020144426f756e6465645665633c75382c204e3e00006502101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e000069020c3c70616c6c65745f707265696d6167651870616c6c6574144576656e7404045400010c144e6f746564040110686173682c011c543a3a48617368000004684120707265696d61676520686173206265656e206e6f7465642e24526571756573746564040110686173682c011c543a3a48617368000104784120707265696d61676520686173206265656e207265717565737465642e1c436c6561726564040110686173682c011c543a3a486173680002046c4120707265696d616765206861732062656e20636c65617265642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909096d020c286f726465725f626f6f6b1870616c6c6574144576656e74040454000138404f72646572426f6f6b437265617465640801346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e00011c63726561746f72350201504f7074696f6e3c543a3a4163636f756e7449643e0471026063726561746f726020636f6e7461696e7320616e206164647265737320696620746865206f7264657220626f6f6b206973206372656174656420666f7220616e20696e646976697369626c652061737365742062792074686520617373657420686f6c6465722c206f7220604e6f6e6560206966206974206973206372656174656420627920726f6f74202f207465636820636f6d6d69747465650004844e6577206f7264657220626f6f6b20697320637265617465642062792075736572404f72646572426f6f6b44656c657465640401346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e000104544f7264657220626f6f6b2069732064656c65746564584f72646572426f6f6b5374617475734368616e6765640801346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001286e65775f7374617475737502013c4f72646572426f6f6b537461747573000204704f7264657220626f6f6b20737461747573206973206368616e676564404f72646572426f6f6b557064617465640401346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e000304844f7264657220626f6f6b2061747472696275746573206172652075706461746564404c696d69744f72646572506c616365641c01346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e7449640001107369646579020130507269636556617269616e7400011470726963657d0201284f726465725072696365000118616d6f756e747d02012c4f72646572566f6c756d650001206c69666574696d6528012c4d6f6d656e744f663c543e0004046c5573657220706c61636564206e6577206c696d6974206f72646572804c696d69744f72646572436f6e766572746564546f4d61726b65744f726465721401346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f776e65725f6964000130543a3a4163636f756e744964000124646972656374696f6e79020130507269636556617269616e74000118616d6f756e748102012c4f72646572416d6f756e74000134617665726167655f70726963657d0201284f726465725072696365000504a1015573657220747269656420746f20706c61636520746865206c696d6974206f72646572206f7574206f6620746865207370726561642e20546865206c696d6974206f7264657220697320636f6e76657274656420696e746f2061206d61726b6574206f726465722eb44c696d69744f72646572497353706c6974496e746f4d61726b65744f72646572416e644c696d69744f726465721801346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f776e65725f6964000130543a3a4163636f756e7449640001586d61726b65745f6f726465725f646972656374696f6e79020130507269636556617269616e7400014c6d61726b65745f6f726465725f616d6f756e748102012c4f72646572416d6f756e740001686d61726b65745f6f726465725f617665726167655f70726963657d0201284f7264657250726963650001386c696d69745f6f726465725f6964180128543a3a4f726465724964000608d85573657220747269656420746f20706c61636520746865206c696d6974206f72646572206f7574206f6620746865207370726561642ef5014f6e652070617274206f6620746865206c6971756964697479206f6620746865206c696d6974206f7264657220697320636f6e76657274656420696e746f2061206d61726b6574206f726465722c20616e6420746865206f74686572207061727420697320706c616365642061732061206c696d6974206f726465722e484c696d69744f7264657243616e63656c65641001346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e744964000118726561736f6e8502013043616e63656c526561736f6e0007045901557365722063616e63656c6564207468656972206c696d6974206f72646572206f7220746865206c696d6974206f726465722068617320726561636865642074686520656e64206f6620697473206c6966657370616e484c696d69744f7264657245786563757465641801346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e7449640001107369646579020130507269636556617269616e7400011470726963657d0201284f726465725072696365000118616d6f756e748102012c4f72646572416d6f756e74000804a8536f6d6520616d6f756e74206f6620746865206c696d6974206f72646572206973206578656375746564404c696d69744f7264657246696c6c65640c01346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e744964000904a4416c6c20616d6f756e74206f6620746865206c696d6974206f72646572206973206578656375746564444c696d69744f72646572557064617465641001346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001206f776e65725f6964000130543a3a4163636f756e7449640001286e65775f616d6f756e747d02012c4f72646572566f6c756d65000a0468546865206c696d6974206f7264657220697320757064617465644c4d61726b65744f7264657245786563757465641801346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f776e65725f6964000130543a3a4163636f756e744964000124646972656374696f6e79020130507269636556617269616e74000118616d6f756e748102012c4f72646572416d6f756e74000134617665726167655f70726963657d0201284f726465725072696365000108746f350201504f7074696f6e3c543a3a4163636f756e7449643e000b04a0557365722065786563757465732061206465616c20627920746865206d61726b6574206f726465724445787069726174696f6e4661696c7572650c01346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640001146572726f7260013444697370617463684572726f72000c04784661696c656420746f2063616e63656c2065787069726564206f7264657240416c69676e6d656e744661696c7572650801346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001146572726f7260013444697370617463684572726f72000d04784661696c656420746f2063616e63656c2065787069726564206f7264657204a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090971020c286f726465725f626f6f6b1474797065732c4f72646572426f6f6b4964081c41737365744964010d011444455849640110000c01186465785f69641001144445584964000110626173650d01011c4173736574496400011471756f74650d01011c41737365744964000075020c286f726465725f626f6f6b1474797065733c4f72646572426f6f6b53746174757300011014547261646500000038506c616365416e6443616e63656c000100284f6e6c7943616e63656c0002001053746f700003000079020c18636f6d6d6f6e287072696d69746976657330507269636556617269616e740001080c4275790000001053656c6c000100007d020c18636f6d6d6f6e3062616c616e63655f756e69742c42616c616e6365556e69740000080114696e6e657218011c42616c616e636500013069735f646976697369626c65bc0110626f6f6c000081020c286f726465725f626f6f6b1474797065732c4f72646572416d6f756e74000108104261736504007d02012c4f72646572566f6c756d650000001451756f746504007d02012c4f72646572566f6c756d650001000085020c286f726465725f626f6f6b1474797065733043616e63656c526561736f6e00010c184d616e75616c0000001c457870697265640001001c416c69676e65640002000089020c206b656e73657473751870616c6c6574144576656e7404045400014828434450437265617465641401186364705f696418011443647049640001146f776e65720001384163636f756e7449644f663c543e00014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e000134646562745f61737365745f69640d010130417373657449644f663c543e0001206364705f747970658d02011c4364705479706500000024434450436c6f7365641001186364705f696418011443647049640001146f776e65720001384163636f756e7449644f663c543e00014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e000144636f6c6c61746572616c5f616d6f756e7418011c42616c616e6365082901416d6f756e74206f6620636f6c6c61746572616c2072657475726e656420746f2074686520434450206f776e65722e2030206d65616e732074686520636f6c6c61746572616c207761732c6c6971756964617465642e010044436f6c6c61746572616c4465706f7369741001186364705f696418011443647049640001146f776e65720001384163636f756e7449644f663c543e00014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e000118616d6f756e7418011c42616c616e63650002003444656274496e637265617365641001186364705f696418011443647049640001146f776e65720001384163636f756e7449644f663c543e000134646562745f61737365745f69640d010130417373657449644f663c543e000118616d6f756e7418011c42616c616e63650484416d6f756e7420626f72726f77656420696e20646562742061737365742069642e03002c446562745061796d656e741001186364705f696418011443647049640001146f776e65720001384163636f756e7449644f663c543e000134646562745f61737365745f69640d010130417373657449644f663c543e000118616d6f756e7418011c42616c616e6365000400284c6971756964617465641801186364705f6964180114436470496400014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e000144636f6c6c61746572616c5f616d6f756e7418011c42616c616e6365000134646562745f61737365745f69640d010130417373657449644f663c543e00012070726f636565647318011c42616c616e636500011c70656e616c747918011c42616c616e63650005007c436f6c6c61746572616c5269736b506172616d65746572735570646174656408014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e00013c7269736b5f706172616d657465727391020160436f6c6c61746572616c5269736b506172616d657465727300060040426f72726f77546178557064617465640801406f6c645f626f72726f775f74617865739502012c426f72726f7754617865730001406e65775f626f72726f775f74617865739502012c426f72726f775461786573000700644c69717569646174696f6e50656e616c74795570646174656408015c6e65775f6c69717569646174696f6e5f70656e616c74799902011c50657263656e7400015c6f6c645f6c69717569646174696f6e5f70656e616c74799902011c50657263656e740008003c50726f66697457697468647261776e080134646562745f61737365745f69640d010130417373657449644f663c543e000118616d6f756e7418011c42616c616e636500090020446f6e6174696f6e080134646562745f61737365745f69640d010130417373657449644f663c543e000118616d6f756e7418011c42616c616e6365000a0050537461626c65636f696e5265676973746572656408014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e0001646e65775f737461626c65636f696e5f706172616d65746572739d020188537461626c65636f696e506172616d65746572733c417373657449644f663c543e3e000b003848617264436170557064617465640801306f6c645f686172645f63617018011c42616c616e63650001306e65775f686172645f63617018011c42616c616e6365000c005c4c69717569646174696f6e526174696f557064617465640801546f6c645f6c69717569646174696f6e5f726174696fb0011c50657262696c6c0001546e65775f6c69717569646174696f6e5f726174696fb0011c50657262696c6c000d00604d61784c69717569646174696f6e4c6f745570646174656408015c6f6c645f6d61785f6c69717569646174696f6e5f6c6f7418011c42616c616e636500015c6e65775f6d61785f6c69717569646174696f6e5f6c6f7418011c42616c616e6365000e005c53746162696c69747946656552617465557064617465640801586f6c645f73746162696c6974795f6665655f726174658c01244669786564553132380001586e65775f73746162696c6974795f6665655f726174658c0124466978656455313238000f007c4d696e696d616c436f6c6c61746572616c4465706f736974557064617465640801786f6c645f6d696e696d616c5f636f6c6c61746572616c5f6465706f73697418011c42616c616e63650001786e65775f6d696e696d616c5f636f6c6c61746572616c5f6465706f73697418011c42616c616e6365001000804d696e696d616c53746162696c697479466565416363727565557064617465640801806f6c645f6d696e696d616c5f73746162696c6974795f6665655f61636372756518011c42616c616e63650001806e65775f6d696e696d616c5f73746162696c6974795f6665655f61636372756518011c42616c616e636500110004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909098d0208206b656e73657473751c4364705479706500010814547970653100000014547970653200010000910208206b656e736574737560436f6c6c61746572616c5269736b506172616d65746572730000140120686172645f63617018011c42616c616e63650001446c69717569646174696f6e5f726174696fb0011c50657262696c6c00014c6d61785f6c69717569646174696f6e5f6c6f7418011c42616c616e636500014873746162696c6974795f6665655f726174658c01244669786564553132380001686d696e696d616c5f636f6c6c61746572616c5f6465706f73697418011c42616c616e63650000950208206b656e73657473752c426f72726f77546178657300000c01386b656e5f626f72726f775f7461789902011c50657263656e740001406b61726d615f626f72726f775f7461789902011c50657263656e7400013c746263645f626f72726f775f7461789902011c50657263656e74000099020c3473705f61726974686d65746963287065725f7468696e67731c50657263656e7400000400080108753800009d0208206b656e736574737550537461626c65636f696e506172616d6574657273041c41737365744964010d01000801247065675f6173736574a102014450656741737365743c417373657449643e0001706d696e696d616c5f73746162696c6974795f6665655f61636372756518011c42616c616e63650000a10208206b656e7365747375205065674173736574041c41737365744964010d010108304f7261636c6553796d626f6c04000102012853796d626f6c4e616d650000002c536f72614173736574496404000d01011c4173736574496400010000a5020c346c6561665f70726f76696465721870616c6c6574144576656e7404045400010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909a9020c306272696467655f70726f78791870616c6c6574144576656e740001084c5265717565737453746174757355706461746508002c0110483235360000ad0201344d65737361676553746174757300000030526566756e644661696c656404002c01104832353600010004684576656e747320666f722074686520455448206d6f64756c652ead020c306272696467655f7479706573147479706573344d6573736167655374617475730001181c496e517565756500000024436f6d6d697474656400010010446f6e65000200184661696c656400030020526566756e64656400040020417070726f76656400050000b10210607375627374726174655f6272696467655f6368616e6e656c1c696e626f756e641870616c6c6574144576656e7404045400010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909b50210607375627374726174655f6272696467655f6368616e6e656c206f7574626f756e641870616c6c6574144576656e740404540001083c4d65737361676541636365707465640c01286e6574776f726b5f6964b90201305375624e6574776f726b496400012c62617463685f6e6f6e636528010c7536340001346d6573736167655f6e6f6e63652801304d6573736167654e6f6e63650000003c496e74657276616c55706461746564040120696e74657276616c100138543a3a426c6f636b4e756d62657200010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909b90208306272696467655f7479706573305375624e6574776f726b49640001181c4d61696e6e6574000000184b7573616d6100010020506f6c6b61646f7400020018526f636f636f00030020416c7068616e6574000400244c696265726c616e6400050000bd020c2064697370617463681870616c6c6574144576656e7408045400044900010c444d657373616765446973706174636865640800c1020130543a3a4d65737361676549640000a401384469737061746368526573756c74000004b84d65737361676520686173206265656e2064697370617463686564207769746820676976656e20726573756c742e3c4d65737361676552656a65637465640400c1020130543a3a4d6573736167654964000104644d65737361676520686173206265656e2072656a65637465644c4d6573736167654465636f64654661696c65640400c1020130543a3a4d6573736167654964000204c457652068617665206661696c656420746f206465636f646520612043616c6c2066726f6d20746865206d6573736167652e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909c1020c306272696467655f7479706573147479706573244d6573736167654964000010011873656e646572c502014047656e657269634e6574776f726b49640001207265636569766572c502014047656e657269634e6574776f726b496400012c62617463685f6e6f6e6365cd0201484f7074696f6e3c42617463684e6f6e63653e0001346d6573736167655f6e6f6e63652801304d6573736167654e6f6e63650000c50208306272696467655f74797065734047656e657269634e6574776f726b49640001100c45564d04002c012845564d436861696e49640000000c5375620400b90201305375624e6574776f726b49640001002445564d4c6567616379040010010c7533320002000c544f4e0400c9020130546f6e4e6574776f726b496400030000c9020c306272696467655f74797065730c746f6e30546f6e4e6574776f726b49640001081c4d61696e6e65740000001c546573746e657400010000cd0204184f7074696f6e04045401280108104e6f6e6500000010536f6d650400280000010000d1020c5070617261636861696e5f6272696467655f6170701870616c6c6574144576656e74040454000108184275726e65641400b90201305375624e6574776f726b496400000d010130417373657449644f663c543e0000000130543a3a4163636f756e7449640000d502014850617261636861696e4163636f756e744964000018013042616c616e63654f663c543e000004c45b6e6574776f726b5f69642c2061737365745f69642c2073656e6465722c20726563657069656e742c20616d6f756e745d184d696e7465641400b90201305375624e6574776f726b496400000d010130417373657449644f663c543e0000190301684f7074696f6e3c50617261636861696e4163636f756e7449643e0000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000104c45b6e6574776f726b5f69642c2061737365745f69642c2073656e6465722c20726563657069656e742c20616d6f756e745d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909d502080c78636d5856657273696f6e65644d756c74694c6f636174696f6e0001080856320400d902014476323a3a4d756c74694c6f636174696f6e0001000856330400fd02014476333a3a4d756c74694c6f636174696f6e00030000d902100c78636d087632346d756c74696c6f636174696f6e344d756c74694c6f636174696f6e000008011c706172656e74730801087538000120696e746572696f72dd0201244a756e6374696f6e730000dd02100c78636d087632346d756c74696c6f636174696f6e244a756e6374696f6e7300012410486572650000000858310400e10201204a756e6374696f6e0001000858320800e10201204a756e6374696f6e0000e10201204a756e6374696f6e0002000858330c00e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0003000858341000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0004000858351400e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0005000858361800e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0006000858371c00e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0007000858382000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e0000e10201204a756e6374696f6e00080000e102100c78636d087632206a756e6374696f6e204a756e6374696f6e0001242450617261636861696e0400e502010c7533320000002c4163636f756e744964333208011c6e6574776f726be90201244e6574776f726b496400010869640401205b75383b2033325d000100384163636f756e74496e646578363408011c6e6574776f726be90201244e6574776f726b4964000114696e64657824010c753634000200304163636f756e744b6579323008011c6e6574776f726be90201244e6574776f726b496400010c6b6579f10201205b75383b2032305d0003003850616c6c6574496e7374616e6365040008010875380004003047656e6572616c496e6465780400fc0110753132380005002847656e6572616c4b65790400ed0201805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e000600244f6e6c794368696c6400070024506c7572616c6974790801086964f5020118426f6479496400011070617274f9020120426f64795061727400080000e5020000061000e9020c0c78636d087632244e6574776f726b49640001100c416e79000000144e616d65640400ed0201805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e00010020506f6c6b61646f74000200184b7573616d6100030000ed02101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401080453000004003001185665633c543e0000f102000003140000000800f5020c0c78636d08763218426f6479496400012810556e6974000000144e616d65640400ed0201805765616b426f756e6465645665633c75382c20436f6e73745533323c33323e3e00010014496e6465780400e502010c7533320002002445786563757469766500030024546563686e6963616c0004002c4c656769736c6174697665000500204a7564696369616c0006001c446566656e73650007003841646d696e697374726174696f6e00080020547265617375727900090000f9020c0c78636d08763220426f64795061727400011414566f6963650000001c4d656d62657273040114636f756e74e502010c753332000100204672616374696f6e08010c6e6f6de502010c75333200011464656e6f6de502010c7533320002004441744c6561737450726f706f7274696f6e08010c6e6f6de502010c75333200011464656e6f6de502010c753332000300484d6f72655468616e50726f706f7274696f6e08010c6e6f6de502010c75333200011464656e6f6de502010c75333200040000fd02100c78636d087633346d756c74696c6f636174696f6e344d756c74694c6f636174696f6e000008011c706172656e74730801087538000120696e746572696f72010301244a756e6374696f6e7300000103100c78636d087633246a756e6374696f6e73244a756e6374696f6e7300012410486572650000000858310400050301204a756e6374696f6e0001000858320800050301204a756e6374696f6e0000050301204a756e6374696f6e0002000858330c00050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0003000858341000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0004000858351400050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0005000858361800050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0006000858371c00050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0007000858382000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e0000050301204a756e6374696f6e000800000503100c78636d087633206a756e6374696f6e204a756e6374696f6e0001282450617261636861696e0400e502010c7533320000002c4163636f756e744964333208011c6e6574776f726b090301444f7074696f6e3c4e6574776f726b49643e00010869640401205b75383b2033325d000100384163636f756e74496e646578363408011c6e6574776f726b090301444f7074696f6e3c4e6574776f726b49643e000114696e64657824010c753634000200304163636f756e744b6579323008011c6e6574776f726b090301444f7074696f6e3c4e6574776f726b49643e00010c6b6579f10201205b75383b2032305d0003003850616c6c6574496e7374616e6365040008010875380004003047656e6572616c496e6465780400fc0110753132380005002847656e6572616c4b65790801186c656e6774680801087538000110646174610401205b75383b2033325d000600244f6e6c794368696c6400070024506c7572616c697479080108696411030118426f647949640001107061727415030120426f6479506172740008003c476c6f62616c436f6e73656e73757304000d0301244e6574776f726b496400090000090304184f7074696f6e040454010d030108104e6f6e6500000010536f6d6504000d0300000100000d03100c78636d087633206a756e6374696f6e244e6574776f726b496400012824427947656e6573697304000401205b75383b2033325d000000184279466f726b080130626c6f636b5f6e756d62657228010c753634000128626c6f636b5f686173680401205b75383b2033325d00010020506f6c6b61646f74000200184b7573616d610003001c57657374656e6400040018526f636f636f00050018576f636f636f00060020457468657265756d040120636861696e5f696424010c7536340007002c426974636f696e436f72650008002c426974636f696e43617368000900001103100c78636d087633206a756e6374696f6e18426f6479496400012810556e69740000001c4d6f6e696b6572040040011c5b75383b20345d00010014496e6465780400e502010c7533320002002445786563757469766500030024546563686e6963616c0004002c4c656769736c6174697665000500204a7564696369616c0006001c446566656e73650007003841646d696e697374726174696f6e000800205472656173757279000900001503100c78636d087633206a756e6374696f6e20426f64795061727400011414566f6963650000001c4d656d62657273040114636f756e74e502010c753332000100204672616374696f6e08010c6e6f6de502010c75333200011464656e6f6de502010c7533320002004441744c6561737450726f706f7274696f6e08010c6e6f6de502010c75333200011464656e6f6de502010c753332000300484d6f72655468616e50726f706f7274696f6e08010c6e6f6de502010c75333200011464656e6f6de502010c75333200040000190304184f7074696f6e04045401d5020108104e6f6e6500000010536f6d650400d50200000100001d030c486272696467655f646174615f7369676e65721870616c6c6574144576656e740404540001142c496e697469616c697a65640801286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000114706565727321030198426f756e6465645665633c65636473613a3a5075626c69632c20543a3a4d617850656572733e000000244164646564506565720801286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000110706565722503013465636473613a3a5075626c69630001002c52656d6f766564506565720801286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000110706565722503013465636473613a3a5075626c696300020040417070726f76616c41636365707465640c01286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000110646174612c0110483235360001247369676e61747572653103014065636473613a3a5369676e617475726500030020417070726f7665640c01286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000110646174612c0110483235360001287369676e617475726573390301a4426f756e6465645665633c65636473613a3a5369676e61747572652c20543a3a4d617850656572733e00040004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909092103101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540125030453000004002d0301185665633c543e000025030c1c73705f636f7265146563647361185075626c696300000400290301205b75383b2033335d000029030000032100000008002d0300000225030031030c1c73705f636f7265146563647361245369676e617475726500000400350301205b75383b2036355d000035030000034100000008003903101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540131030453000004003d0301185665633c543e00003d0300000231030041030c446d756c74697369675f76657269666965721870616c6c6574144576656e74040454000110484e6574776f726b496e697469616c697a65640400c502014047656e657269634e6574776f726b496400000058566572696669636174696f6e5375636365737366756c0400c502014047656e657269634e6574776f726b49640001002450656572416464656404002503013465636473613a3a5075626c69630002002c5065657252656d6f76656404002503013465636473613a3a5075626c696300030004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090945030c507375627374726174655f6272696467655f6170701870616c6c6574144576656e74040454000114184275726e65641401286e6574776f726b5f6964b90201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e00011873656e646572000130543a3a4163636f756e744964000124726563697069656e744903013847656e657269634163636f756e74000118616d6f756e7418013042616c616e63654f663c543e000000184d696e7465641401286e6574776f726b5f6964b90201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e00011873656e6465724903013847656e657269634163636f756e74000124726563697069656e74000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000100304661696c6564546f4d696e7408002c011048323536000060013444697370617463684572726f72000200604173736574526567697374726174696f6e50726f6365656404000d010130417373657449644f663c543e000300684173736574526567697374726174696f6e46696e616c697a656404000d010130417373657449644f663c543e00040004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909490308306272696467655f74797065733847656e657269634163636f756e7400011c0c45564d04004d0301104831363000000010536f726104000001404d61696e6e65744163636f756e744964000100244c696265726c616e6404000001404d61696e6e65744163636f756e7449640002002450617261636861696e0400d502016c78636d3a3a56657273696f6e65644d756c74694c6f636174696f6e0003001c556e6b6e6f776e00040010526f6f740005000c544f4e040051030128546f6e41646472657373000600004d03083c7072696d69746976655f7479706573104831363000000400f10201205b75383b2032305d000051030c306272696467655f74797065730c746f6e28546f6e416464726573730000080124776f726b636861696e55030108693800011c616464726573732c01104832353600005503000005090059030c2c70616c6c65745f7375646f1870616c6c6574144576656e7404045400010c14537564696404012c7375646f5f726573756c74a401384469737061746368526573756c740000048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d284b65794368616e6765640401286f6c645f7375646f6572350201504f7074696f6e3c543a3a4163636f756e7449643e0001043901546865205c5b7375646f65725c5d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c696564206966206f6e6520657869737465642e285375646f4173446f6e6504012c7375646f5f726573756c74a401384469737061746368526573756c740002048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909095d030c186661756365741870616c6c6574144576656e740404540001082c5472616e7366657272656408000001384163636f756e7449644f663c543e000018011c42616c616e6365000000304c696d697455706461746564040018011c42616c616e636500010004a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090961030c2071615f746f6f6c731870616c6c6574144576656e74040454000114444f72646572426f6f6b7343726561746564000004a0526571756573746564206f7264657220626f6f6b732068617665206265656e20637265617465642e404f72646572426f6f6b7346696c6c656400010498526571756573746564206f7264657220626f6f6b2068617665206265656e2066696c6c65642e3858796b496e697469616c697a656404013c7072696365735f6163686965766564650301b45665633c417373657450616972496e7075743c44657849644f663c543e2c20417373657449644f663c543e3e3e08050145786163742070726963657320666f7220746f6b656e2070616972732061636869657661626c652061667465722074686520696e697469616c697a6174696f6e2e710153686f756c6420636f72726573706f6e6420312d746f2d3120746f2074686520696e697469616c697a6174696f6e20696e70757420616e6420626520717569746520636c6f736520746f2074686520676976656e2076616c7565732e0204dc58796b206c697175696469747920736f7572636520686173206265656e20696e697469616c697a6564207375636365737366756c6c792e38587374496e697469616c697a656404013c71756f7465735f6163686965766564710301885665633c53796e7468657469634f75747075743c417373657449644f663c543e3e3e080d014578616374206071756f7465602f6065786368616e6765602063616c6c732061636869657661626c652061667465722074686520696e697469616c697a6174696f6e2e710153686f756c6420636f72726573706f6e6420312d746f2d3120746f2074686520696e697469616c697a6174696f6e20696e70757420616e6420626520717569746520636c6f736520746f2074686520676976656e2076616c7565732e0304dc585354206c697175696469747920736f7572636520686173206265656e20696e697469616c697a6564207375636365737366756c6c792e3c4d636263496e697469616c697a6564040154636f6c6c61746572616c5f7265665f707269636573850301ec5665633c28417373657449644f663c543e2c2070616c6c65745f746f6f6c733a3a70726963655f746f6f6c733a3a4173736574507269636573293e04e84578616374207265666572656e63652070726963657320616368696576656420666f722074686520636f6c6c61746572616c206173736574732e040445014d756c7469636f6c6c61746572616c20626f6e64696e67206375727665206c697175696469747920736f7572636520686173206265656e20696e697469616c697a6564207375636365737366756c6c792e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090965030000026903006903102071615f746f6f6c733070616c6c65745f746f6f6c7320706f6f6c5f78796b38417373657450616972496e7075740814444558496401101c41737365744964010d01001401186465785f6964100114444558496400011c61737365745f610d01011c4173736574496400011c61737365745f620d01011c41737365744964000114707269636518011c42616c616e63650001586d617962655f61737365745f615f72657365727665736d03013c4f7074696f6e3c42616c616e63653e00006d0304184f7074696f6e04045401180108104e6f6e6500000010536f6d65040018000001000071030000027503007503102071615f746f6f6c733070616c6c65745f746f6f6c730c7873743c53796e7468657469634f7574707574041c41737365744964010d010008012061737365745f69640d01011c4173736574496400013871756f74655f61636869657665647903013853796e74686574696351756f746500007903102071615f746f6f6c733070616c6c65745f746f6f6c730c7873743853796e74686574696351756f746500000c0124646972656374696f6e7d03015c53796e74686574696351756f7465446972656374696f6e000118616d6f756e748103015051756f7465416d6f756e743c42616c616e63653e000118726573756c7418011c42616c616e636500007d03102071615f746f6f6c733070616c6c65745f746f6f6c730c7873745c53796e74686574696351756f7465446972656374696f6e0001086053796e74686574696342617365546f53796e7468657469630000006053796e746865746963546f53796e746865746963426173650001000081030c18636f6d6d6f6e2c737761705f616d6f756e742c51756f7465416d6f756e740428416d6f756e745479706501180108405769746844657369726564496e707574040144646573697265645f616d6f756e745f696e180128416d6f756e74547970650000004457697468446573697265644f7574707574040148646573697265645f616d6f756e745f6f7574180128416d6f756e74547970650001000085030000028903008903000004080d018d03008d03102071615f746f6f6c733070616c6c65745f746f6f6c732c70726963655f746f6f6c732c4173736574507269636573000008010c62757918011c42616c616e636500011073656c6c18011c42616c616e6365000091030c3c61706f6c6c6f5f706c6174666f726d1870616c6c6574144576656e7404045400013424506f6f6c416464656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e00000468506f6f6c206164646564205b77686f2c2061737365745f69645d104c656e740c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e6365000104704c656e74205b77686f2c2061737365745f69642c20616d6f756e745d20426f72726f77656414000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e000018011c42616c616e63650002044101426f72726f776564205b77686f2c20636f6c6c61746572616c5f61737365742c20636f6c6c61746572616c5f616d6f756e742c20626f72726f775f61737365742c20626f72726f775f616d6f756e745d54436c61696d65644c656e64696e67526577617264730c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e6365000304b4436c61696d65644c656e64696e6752657761726473205b77686f2c2061737365745f69642c20616d6f756e745d5c436c61696d6564426f72726f77696e67526577617264730c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e6365000404bc436c61696d6564426f72726f77696e6752657761726473205b77686f2c2061737365745f69642c20616d6f756e745d2457697468647261776e0c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e63650005048457697468647261776e205b77686f2c2061737365745f69642c20616d6f756e745d185265706169640c000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e636500060478526570616964205b77686f2c2061737365745f69642c20616d6f756e745d504368616e67656452657761726473416d6f756e740c000001384163636f756e7449644f663c543e0000bc0110626f6f6c000018011c42616c616e6365000700704368616e67656452657761726473416d6f756e74506572426c6f636b0c000001384163636f756e7449644f663c543e0000bc0110626f6f6c000018011c42616c616e6365000800284c69717569646174656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000904684c697175696461746564205b77686f2c2061737365745f69645d2c506f6f6c52656d6f76656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000a0470506f6f6c2072656d6f766564205b77686f2c2061737365745f69645d38506f6f6c496e666f45646974656408000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000b0480506f6f6c20696e666f20656469746564205b77686f2c2061737365745f69645d3c436f6c6c61746572616c416464656410000001384163636f756e7449644f663c543e00000d010130417373657449644f663c543e000018011c42616c616e636500000d010130417373657449644f663c543e000c042501436f6c6c61746572616c206164646564205b77686f2c20636f6c6c61746572616c5f61737365742c20636f6c6c61746572616c5f616d6f756e742c20626f72726f775f61737365745d04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090995030c3c657874656e6465645f6173736574731870616c6c6574144576656e7404045400011460526567756c6174656441737365745265676973746572656404012061737365745f69640d010130417373657449644f663c543e000004b8456d697473205768656e2061206e657720726567756c61746564206173736574206973207265676973746572656450536f756c626f756e64546f6b656e49737375656414012061737365745f69640d010130417373657449644f663c543e0001146f776e65720001384163636f756e7449644f663c543e000114696d616765990301544f7074696f6e3c436f6e74656e74536f757263653e00013065787465726e616c5f75726c990301544f7074696f6e3c436f6e74656e74536f757263653e0001246973737565645f6174280124543a3a4d6f6d656e740001046c456d697473205768656e20616e20534254206973206973737565645053425445787069726174696f6e557064617465640c01307362745f61737365745f69640d010130417373657449644f663c543e0001386f6c645f657870697265735f6174cd0201444f7074696f6e3c543a3a4d6f6d656e743e0001386e65775f657870697265735f6174cd0201444f7074696f6e3c543a3a4d6f6d656e743e000204cc456d697473205768656e207468652065787069726174696f6e2064617465206f6620616e20534254206973207570646174656460526567756c617465644173736574426f756e64546f534254080148726567756c617465645f61737365745f69640d010130417373657449644f663c543e0001307362745f61737365745f69640d010130417373657449644f663c543e000304d85768656e206120726567756c61746564206173736574206973207375636365737366756c6c7920626f756e6420746f20616e20534254384173736574526567756c6174656404012061737365745f69640d010130417373657449644f663c543e00040480456d697473205768656e20616e20617373657420697320726567756c6174656404a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909990304184f7074696f6e040454019d030108104e6f6e6500000010536f6d6504009d0300000100009d030c18636f6d6d6f6e287072696d69746976657334436f6e74656e74536f757263650000040030011c5665633c75383e0000a10308306672616d655f73797374656d14506861736500010c384170706c7945787472696e736963040010010c7533320000003046696e616c697a6174696f6e00010038496e697469616c697a6174696f6e00020000a5030000022c00a903000002bd0100ad0308306672616d655f73797374656d584c61737452756e74696d6555706772616465496e666f0000080130737065635f76657273696f6ee502014c636f6465633a3a436f6d706163743c7533323e000124737065635f6e616d65c901016473705f72756e74696d653a3a52756e74696d65537472696e670000b1030c306672616d655f73797374656d1870616c6c65741043616c6c0404540001201872656d61726b04011872656d61726b30011c5665633c75383e000014684d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002823203c7765696768743e202d20604f283129602c23203c2f7765696768743e387365745f686561705f7061676573040114706167657328010c753634000104f853657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040110636f646530011c5665633c75383e0002306453657420746865206e65772072756e74696d6520636f64652e002823203c7765696768743e31012d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656045012d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e60207768696368206973342020657870656e73697665292e842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e4d0154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c7920746869732069732076657279b8657870656e736976652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e2c23203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b73040110636f646530011c5665633c75383e000324190153657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002823203c7765696768743e8c2d20604f2843296020776865726520604360206c656e677468206f662060636f646560842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e550154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c48626c6f636b2e2023203c2f7765696768743e2c7365745f73746f726167650401146974656d73b50301345665633c4b657956616c75653e0004046853657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f726167650401106b657973bd0301205665633c4b65793e000504744b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697808011870726566697830010c4b657900011c7375626b65797310010c75333200061011014b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e0039012a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465723d0174686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e4472656d61726b5f776974685f6576656e7404011872656d61726b30011c5665633c75383e000704a44d616b6520736f6d65206f6e2d636861696e2072656d61726b20616e6420656d6974206576656e742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eb503000002b90300b90300000408303000bd030000023000c1030c306672616d655f73797374656d186c696d69747330426c6f636b5765696768747300000c0128626173655f626c6f636b2001185765696768740001246d61785f626c6f636b2001185765696768740001247065725f636c617373c50301845065724469737061746368436c6173733c57656967687473506572436c6173733e0000c5030c346672616d655f737570706f7274206469737061746368405065724469737061746368436c61737304045401c903000c01186e6f726d616cc90301045400012c6f7065726174696f6e616cc9030104540001246d616e6461746f7279c9030104540000c9030c306672616d655f73797374656d186c696d6974733c57656967687473506572436c6173730000100138626173655f65787472696e7369632001185765696768740001346d61785f65787472696e736963cd0301384f7074696f6e3c5765696768743e0001246d61785f746f74616ccd0301384f7074696f6e3c5765696768743e0001207265736572766564cd0301384f7074696f6e3c5765696768743e0000cd0304184f7074696f6e04045401200108104e6f6e6500000010536f6d650400200000010000d1030c306672616d655f73797374656d186c696d6974732c426c6f636b4c656e677468000004010c6d6178d50301545065724469737061746368436c6173733c7533323e0000d5030c346672616d655f737570706f7274206469737061746368405065724469737061746368436c6173730404540110000c01186e6f726d616c1001045400012c6f7065726174696f6e616c100104540001246d616e6461746f7279100104540000d903082873705f776569676874733c52756e74696d65446257656967687400000801107265616428010c753634000114777269746528010c7536340000dd03082873705f76657273696f6e3852756e74696d6556657273696f6e0000200124737065635f6e616d65c901013452756e74696d65537472696e67000124696d706c5f6e616d65c901013452756e74696d65537472696e67000144617574686f72696e675f76657273696f6e10010c753332000130737065635f76657273696f6e10010c753332000130696d706c5f76657273696f6e10010c75333200011061706973e103011c4170697356656300014c7472616e73616374696f6e5f76657273696f6e10010c75333200013473746174655f76657273696f6e08010875380000e103040c436f7704045401e503000400e503000000e503000002e90300e9030000040815011000ed030000050400f1030c306672616d655f73797374656d1870616c6c6574144572726f720404540001183c496e76616c6964537065634e616d650000081101546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e63726561736500010841015468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e00020cec4661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e0009014569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f73697465000304fc537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e74000404350154686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e3043616c6c46696c7465726564000504d0546865206f726967696e2066696c7465722070726576656e74207468652063616c6c20746f20626520646973706174636865642e046c4572726f7220666f72207468652053797374656d2070616c6c6574f503101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401f903045300000400010401185665633c543e0000f90300000408fd032800fd030c4473705f636f6e73656e7375735f626162650c617070185075626c696300000400ec013c737232353531393a3a5075626c696300000104000002f903000504084873705f636f6e73656e7375735f736c6f747310536c6f740000040028010c753634000009040c4473705f636f6e73656e7375735f626162651c64696765737473504e657874436f6e66696744657363726970746f72000104085631080104630d040128287536342c2075363429000134616c6c6f7765645f736c6f747311040130416c6c6f776564536c6f7473000100000d04000004082828001104084473705f636f6e73656e7375735f6261626530416c6c6f776564536c6f747300010c305072696d617279536c6f7473000000745072696d617279416e645365636f6e64617279506c61696e536c6f74730001006c5072696d617279416e645365636f6e64617279565246536c6f7473000200001504101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540104045300000400190401185665633c543e0000190400000204001d0404184f7074696f6e0404540121040108104e6f6e6500000010536f6d6504002104000001000021040c4473705f636f6e73656e7375735f626162651c646967657374732450726544696765737400010c1c5072696d6172790400250401405072696d617279507265446967657374000100385365636f6e64617279506c61696e04002d04015c5365636f6e64617279506c61696e507265446967657374000200305365636f6e646172795652460400310401545365636f6e646172795652465072654469676573740003000025040c4473705f636f6e73656e7375735f626162651c64696765737473405072696d617279507265446967657374000010013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7405040110536c6f740001287672665f6f75747075740401245652464f75747075740001247672665f70726f6f662904012056524650726f6f66000029040000034000000008002d040c4473705f636f6e73656e7375735f626162651c646967657374735c5365636f6e64617279506c61696e507265446967657374000008013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7405040110536c6f74000031040c4473705f636f6e73656e7375735f626162651c64696765737473545365636f6e64617279565246507265446967657374000010013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7405040110536c6f740001287672665f6f75747075740401245652464f75747075740001247672665f70726f6f662904012056524650726f6f6600003504084473705f636f6e73656e7375735f62616265584261626545706f6368436f6e66696775726174696f6e0000080104630d040128287536342c2075363429000134616c6c6f7765645f736c6f747311040130416c6c6f776564536c6f7473000039040c2c70616c6c65745f626162651870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f663d040184426f783c45717569766f636174696f6e50726f6f663c543a3a4865616465723e3e00013c6b65795f6f776e65725f70726f6f6649040140543a3a4b65794f776e657250726f6f6600001009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f663d040184426f783c45717569766f636174696f6e50726f6f663c543a3a4865616465723e3e00013c6b65795f6f776e65725f70726f6f6649040140543a3a4b65794f776e657250726f6f6600012009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e0d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e48706c616e5f636f6e6669675f6368616e6765040118636f6e666967090401504e657874436f6e66696744657363726970746f720002105d01506c616e20616e2065706f636820636f6e666967206368616e67652e205468652065706f636820636f6e666967206368616e6765206973207265636f7264656420616e642077696c6c20626520656e6163746564206f6e5101746865206e6578742063616c6c20746f2060656e6163745f65706f63685f6368616e6765602e2054686520636f6e6669672077696c6c20626520616374697661746564206f6e652065706f63682061667465722e59014d756c7469706c652063616c6c7320746f2074686973206d6574686f642077696c6c207265706c61636520616e79206578697374696e6720706c616e6e656420636f6e666967206368616e6765207468617420686164546e6f74206265656e20656e6163746564207965742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e3d04084873705f636f6e73656e7375735f736c6f74734445717569766f636174696f6e50726f6f66081848656164657201410408496401fd03001001206f6666656e646572fd0301084964000110736c6f7405040110536c6f7400013066697273745f686561646572410401184865616465720001347365636f6e645f6865616465724104011848656164657200004104102873705f72756e74696d651c67656e65726963186865616465721848656164657208184e756d626572011010486173680145040014012c706172656e745f686173682c0130486173683a3a4f75747075740001186e756d626572e50201184e756d62657200012873746174655f726f6f742c0130486173683a3a4f757470757400013c65787472696e736963735f726f6f742c0130486173683a3a4f7574707574000118646967657374340118446967657374000045040c2873705f72756e74696d65187472616974732c426c616b6554776f323536000000004904082873705f73657373696f6e3c4d656d6265727368697050726f6f6600000c011c73657373696f6e10013053657373696f6e496e646578000128747269655f6e6f646573bd0301305665633c5665633c75383e3e00013c76616c696461746f725f636f756e7410013856616c696461746f72436f756e7400004d040c2c70616c6c65745f626162651870616c6c6574144572726f7204045400011060496e76616c696445717569766f636174696f6e50726f6f660000043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c69644b65794f776e65727368697050726f6f66000104310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400020415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e50496e76616c6964436f6e66696775726174696f6e0003048c5375626d697474656420636f6e66696775726174696f6e20697320696e76616c69642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a09090951040c4070616c6c65745f74696d657374616d701870616c6c65741043616c6c0404540001040c73657404010c6e6f77240124543a3a4d6f6d656e7400004054536574207468652063757272656e742074696d652e005501546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed470686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e0041015468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627940604d696e696d756d506572696f64602e00d4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002823203c7765696768743e31012d20604f2831296020284e6f7465207468617420696d706c656d656e746174696f6e73206f6620604f6e54696d657374616d7053657460206d75737420616c736f20626520604f283129602961012d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e402020606f6e5f66696e616c697a656029d42d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f736574602e204d75737420626520604f283129602e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e5504101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e646564566563080454015904045300000400610401185665633c543e00005904083c70616c6c65745f62616c616e6365732c42616c616e63654c6f636b041c42616c616e63650118000c01086964150101384c6f636b4964656e746966696572000118616d6f756e7418011c42616c616e636500011c726561736f6e735d04011c526561736f6e7300005d04083c70616c6c65745f62616c616e6365731c526561736f6e7300010c0c466565000000104d6973630001000c416c6c0002000061040000025904006504101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540169040453000004006d0401185665633c543e00006904083c70616c6c65745f62616c616e6365732c52657365727665446174610844526573657276654964656e74696669657201a81c42616c616e63650118000801086964a80144526573657276654964656e746966696572000118616d6f756e7418011c42616c616e636500006d0400000269040071040c3c70616c6c65745f62616c616e6365731870616c6c6574144572726f720804540004490001203856657374696e6742616c616e63650000049856657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e73000104c44163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c4c496e73756666696369656e7442616c616e63650002047842616c616e636520746f6f206c6f7720746f2073656e642076616c75652e484578697374656e7469616c4465706f736974000304e856616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650004048c5472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c65000504c8412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e740006048842656e6566696369617279206163636f756e74206d757374207072652d65786973743c546f6f4d616e795265736572766573000704ac4e756d626572206f66206e616d656420726573657276657320657863656564204d6178526573657276657304b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909097504101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012c045300000400a50301185665633c543e00007904086870616c6c65745f7472616e73616374696f6e5f7061796d656e742052656c6561736573000108245631416e6369656e74000000085632000100007d0400000408108104008104082c7065726d697373696f6e731453636f70650001081c4c696d697465640400850401104835313200000024556e6c696d69746564000100008504083c7072696d69746976655f7479706573104835313200000400290401205b75383b2036345d0000890400000408008104008d04000002100091040c2c7065726d697373696f6e731870616c6c65741043616c6c040454000100042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e95040c2c7065726d697373696f6e731870616c6c6574144572726f72040454000114485065726d697373696f6e4e6f74466f756e64000004884163636f756e7420646f65736e277420686f6c642061207065726d697373696f6e2e485065726d697373696f6e4e6f744f776e6564000104844163636f756e7420646f65736e2774206f776e2061207065726d697373696f6e2e5c5065726d697373696f6e416c7265616479457869737473000204a05065726d697373696f6e20616c72656164792065786973747320696e207468652073797374656d2e24466f7262696464656e000304bc546865206163636f756e742065697468657220646f65736e2774206861766520746865207065726d697373696f6e2e2c496e635265664572726f7200040488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a09090999040c24726566657272616c731870616c6c65741043616c6c04045400010c1c7265736572766504011c62616c616e636518011c42616c616e63650000048d015265736572766573207468652062616c616e63652066726f6d20746865206163636f756e7420666f722061207370656369616c2062616c616e636520746861742063616e206265207573656420746f2070617920726566657272616c7327206665657324756e7265736572766504011c62616c616e636518011c42616c616e6365000104ec556e7265736572766573207468652062616c616e636520616e64207472616e7366657273206974206261636b20746f20746865206163636f756e74307365745f72656665727265720401207265666572726572000130543a3a4163636f756e74496400020484536574732074686520726566657272657220666f7220746865206163636f756e74042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e9d040c24726566657272616c731870616c6c6574144572726f7204045400010c48416c726561647948617352656665727265720000047c4163636f756e7420616c72656164792068617320612072656665727265722e2c496e635265664572726f7200010488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e6c5265666572726572496e73756666696369656e7442616c616e6365000204c0526566657272657220646f65736e2774206861766520656e6f756768206f662072657365727665642062616c616e636504b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909a104081c7265776172647328526577617264496e666f0000080124636c61696d61626c6518011c42616c616e6365000114746f74616c18011c42616c616e63650000a5040000021800a9040000024d0300ad040000020d0100b1040c1c726577617264731870616c6c65741043616c6c04045400010814636c61696d0401247369676e617475726530011c5665633c75383e00000480436c61696d20746865207265776172642077697468207369676e61747572652e546164645f756d695f6e66745f726563656976657273040124726563656976657273a904013c5665633c457468416464726573733e000108d046696e616c697a652074686520757064617465206f6620756e636c61696d65642056414c206461746120696e2073746f72616765c0416464206164647265737365732c2077686f2077696c6c207265636569766520554d49204e465420726577617264732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eb5040c1c726577617264731870616c6c6574144572726f72040454000114384e6f7468696e67546f436c61696d0000041101546865206163636f756e7420686173206e6f20636c61696d61626c652072657761726473206174207468652074696d65206f6620636c61696d696e67207265717565737448416464726573734e6f74456c696769626c650001049c41646472657373206973206e6f7420656c696769626c6520666f7220616e792072657761726473405369676e6174757265496e76616c696400020460546865207369676e617475726520697320696e76616c69646c5369676e6174757265566572696669636174696f6e4661696c656400030484546865207369676e617475726520766572696669636174696f6e206661696c65642c496c6c6567616c43616c6c00040411014f636375727320696620616e20617474656d707420746f207265706561742074686520756e636c61696d65642056414c206461746120757064617465206973206d61646504b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909b9040c1c786f725f6665651870616c6c65741043616c6c04045400010c447570646174655f6d756c7469706c6965720401386e65775f6d756c7469706c6965728c0124466978656455313238000004cc55706461746520746865206d756c7469706c69657220666f7220776569676874202d3e2066656520636f6e76657273696f6e2e547365745f6665655f7570646174655f706572696f640401286e65775f706572696f641001a03c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a426c6f636b4e756d626572000108e0536574206e65772075706461746520706572696f6420666f722060786f725f6665653a3a4d756c7469706c69657260207570646174696e6758536574203020746f2073746f70207570646174696e67687365745f736d616c6c5f7265666572656e63655f616d6f756e740401506e65775f7265666572656e63655f616d6f756e7418011c42616c616e6365000208f8536574206e657720736d616c6c207265666572656e636520616d6f756e742060786f725f6665653a3a536d616c6c5265666572656e6365416d6f756e7460a4536d616c6c206665652073686f756c642074656e6420746f2074686520616d6f756e742076616c7565042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ebd040c1c786f725f6665651870616c6c6574144572726f720404540001086c4d756c7469706c69657243616c63756c6174696f6e4661696c65640000048c4661696c656420746f2063616c63756c617465206e6577206d756c7469706c6965722e6c496e76616c6964536d616c6c5265666572656e6365416d6f756e740001049460536d616c6c5265666572656e6365416d6f756e746020697320756e737570706f7274656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909c104083c70616c6c65745f6d756c74697369673c4d756c74697369674163636f756e7404244163636f756e74496401000008012c7369676e61746f72696573510201385665633c4163636f756e7449643e0001247468726573686f6c649902011c50657263656e740000c50400000408000400c904083c70616c6c65745f6d756c7469736967204d756c74697369670c2c426c6f636b4e756d62657201101c42616c616e63650118244163636f756e7449640100001001107768656e94017042726964676554696d65706f696e743c426c6f636b4e756d6265723e00011c6465706f73697418011c42616c616e63650001246465706f7369746f720001244163636f756e744964000124617070726f76616c73510201385665633c4163636f756e7449643e0000cd040000040c30001800d10400000408049400d5040c3c70616c6c65745f6d756c74697369671870616c6c65741043616c6c04045400011c4472656769737465725f6d756c746973696704012c7369676e61746f72696573510201445665633c543a3a4163636f756e7449643e00002c784372656174652061206e6577206d756c7469736967206163636f756e742eb0544f444f3a20757064617465207765696768747320666f72206072656769737465725f6d756c7469736967602823203c7765696768743e6c4b65793a204d202d206c656e677468206f66206d656d626572732c682d204f6e652073746f72616765207265616473202d204f283129942d204f6e652073656172636820696e20736f72746564206c697374202d204f286c6f674d29b42d20436f6e6669726d6174696f6e207468617420746865206c69737420697320736f72746564202d204f284d296c2d204f6e652073746f7261676520777269746573202d204f2831292c2d204f6e65206576656e7474546f74616c20436f6d706c65786974793a204f284d202b206c6f674d292823203c7765696768743e4072656d6f76655f7369676e61746f72790401247369676e61746f7279000130543a3a4163636f756e744964000128bc52656d6f766520746865207369676e61746f72792066726f6d20746865206d756c7469736967206163636f756e742ea443616e206f6e6c792062652063616c6c65642062792061206d756c7469736967206163636f756e742e00ac544f444f3a20757064617465207765696768747320666f72206072656d6f76655f7369676e61746f7279602823203c7765696768743eac4b65793a206c656e677468206f66206d656d6265727320696e206d756c7469736967436f6e6669673a204d682d204f6e652073746f72616765207265616473202d204f283129742d2072656d6f7665206974656d7320696e206c697374202d204f284d295c546f74616c20636f6d706c6578697479202d204f284d292823203c7765696768743e346164645f7369676e61746f72790401286e65775f6d656d626572000130543a3a4163636f756e74496400022cb04164642061206e6577207369676e61746f727920746f20746865206d756c7469736967206163636f756e742ea443616e206f6e6c792062652063616c6c65642062792061206d756c7469736967206163636f756e742e00a0544f444f3a20757064617465207765696768747320666f7220606164645f7369676e61746f7279602823203c7765696768743eac4b65793a206c656e677468206f66206d656d6265727320696e206d756c7469736967436f6e6669673a204d642d204f6e652073746f726167652072656164202d204f283129682d2073656172636820696e206d656d62657273202d204f284d29582d2053746f72616765207772697465202d204f284d295c546f74616c20636f6d706c6578697479202d204f284d292823203c7765696768743e5061735f6d756c74695f7468726573686f6c645f310c01086964000130543a3a4163636f756e74496400011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00012474696d65706f696e7494017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e0003445101496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003d012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f662074686501016d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e00b8526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e002823203c7765696768743e19014f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d902d2042617365205765696768743a2033332e3732202b20302e303032202a205a20c2b573442d204442205765696768743a204e6f6e65482d20506c75732043616c6c205765696768742c23203c2f7765696768743e2061735f6d756c74691401086964000130543a3a4163636f756e74496400013c6d617962655f74696d65706f696e74110a019c4f7074696f6e3c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00011063616c6c3001284f706171756543616c6c00012873746f72655f63616c6cbc0110626f6f6c0001286d61785f7765696768742001185765696768740004cc5501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e001d014e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f20757365190160617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005901526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f746865727769736555016f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642cdc6d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002823203c7765696768743e502d20604f2853202b205a202b2043616c6c29602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e21012d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e6c2d2054686520776569676874206f6620746865206063616c6c602e2d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c207769746820618c20206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b02020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d382d2042617365205765696768743adc202020202d204372656174653a2020202020202020202034312e3839202b20302e313138202a2053202b202e303032202a205a20c2b573dc202020202d2043726561746520772f2053746f72653a2035332e3537202b20302e313139202a2053202b202e303033202a205a20c2b573dc202020202d20417070726f76653a20202020202020202033312e3339202b20302e313336202a2053202b202e303032202a205a20c2b573dc202020202d20436f6d706c6574653a202020202020202033392e3934202b20302e323620202a2053202b202e303032202a205a20c2b573302d204442205765696768743a2101202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c60292501202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c6029482d20506c75732043616c6c205765696768742c23203c2f7765696768743e40617070726f76655f61735f6d756c74691001086964000130543a3a4163636f756e74496400013c6d617962655f74696d65706f696e74110a019c4f7074696f6e3c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00012463616c6c5f686173680401205b75383b2033325d0001286d61785f77656967687420011857656967687400059c5501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e0035014e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e2d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c207769746820618c20206465706f7369742074616b656e20666f7220697473206c69666574696d65206f66b02020604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d382d2042617365205765696768743a7c202020202d204372656174653a2034342e3731202b20302e303838202a205380202020202d20417070726f76653a2033312e3438202b20302e313136202a2053302d204442205765696768743ab8202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dbc202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c23203c2f7765696768743e3c63616e63656c5f61735f6d756c74690c01086964000130543a3a4163636f756e74496400012474696d65706f696e7494017c42726964676554696d65706f696e743c543a3a426c6f636b4e756d6265723e00012463616c6c5f686173680401205b75383b2033325d00066c550143616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c4666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e5d012d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c787472616e73616374696f6e20666f7220746869732064697370617463682ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e302d204f6e65206576656e742e842d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e702d2053746f726167653a2072656d6f766573206f6e65206974656d2e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d802d2042617365205765696768743a2033362e3037202b20302e313234202a2053302d204442205765696768743a1501202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c731901202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed90408446672616d656e6f64655f72756e74696d652c52756e74696d6543616c6c0001f01853797374656d0400b10301ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53797374656d2c2052756e74696d653e00000010426162650400390401a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426162652c2052756e74696d653e000e002454696d657374616d700400510401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54696d657374616d702c2052756e74696d653e0001002c5065726d697373696f6e730400910401c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5065726d697373696f6e732c2052756e74696d653e00060024526566657272616c730400990401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c526566657272616c732c2052756e74696d653e0007001c526577617264730400b10401b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c526577617264732c2052756e74696d653e00080018586f724665650400b90401ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c586f724665652c2052756e74696d653e000900384272696467654d756c74697369670400d50401cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4272696467654d756c74697369672c2052756e74696d653e000a001c5574696c6974790400dd0401b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5574696c6974792c2052756e74696d653e000b001c5374616b696e6704000d0501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5374616b696e672c2052756e74696d653e0011001c53657373696f6e0400250501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53657373696f6e2c2052756e74696d653e000c001c4772616e6470610400310501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4772616e6470612c2052756e74696d653e000f0020496d4f6e6c696e6504005d0501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c496d4f6e6c696e652c2052756e74696d653e0024002c54726164696e675061697204007d0501c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54726164696e67506169722c2052756e74696d653e001400184173736574730400810501ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4173736574732c2052756e74696d653e0015007c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c04008d0501110273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c2c2052756e74696d653e00170024546563686e6963616c0400910501b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c2c2052756e74696d653e0018001c506f6f6c58594b0400950501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f6f6c58594b2c2052756e74696d653e001900384c697175696469747950726f78790400990501cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4c697175696469747950726f78792c2052756e74696d653e001a001c436f756e63696c0400b90501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f756e63696c2c2052756e74696d653e001b0048546563686e6963616c436f6d6d69747465650400c50501dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c436f6d6d69747465652c2052756e74696d653e001c002444656d6f63726163790400c90501b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c44656d6f63726163792c2052756e74696d653e001d00184445584150490400d90501ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4445584150492c2052756e74696d653e001e00244574684272696467650400dd0501b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4574684272696467652c2052756e74696d653e001f00445073776170446973747269627574696f6e0400610601d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5073776170446973747269627574696f6e2c2052756e74696d653e002000204d756c74697369670400650601b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d756c74697369672c2052756e74696d653e002100245363686564756c657204006d0601b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5363686564756c65722c2052756e74696d653e0022003849726f68614d6967726174696f6e0400750601cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c49726f68614d6967726174696f6e2c2052756e74696d653e0023004c546563686e6963616c4d656d626572736869700400790601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c4d656d626572736869702c2052756e74696d653e00260044456c656374696f6e7350687261676d656e04007d0601d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c456c656374696f6e7350687261676d656e2c2052756e74696d653e00270034566573746564526577617264730400850601c90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c566573746564526577617264732c2052756e74696d653e002800204964656e746974790400ad0601b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4964656e746974792c2052756e74696d653e0029001c4661726d696e6704004d0701b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4661726d696e672c2052756e74696d653e002a001c585354506f6f6c0400510701b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c585354506f6f6c2c2052756e74696d653e002b003043657265735374616b696e670400550701c50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c43657265735374616b696e672c2052756e74696d653e002d005043657265734c69717569646974794c6f636b65720400590701e50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c43657265734c69717569646974794c6f636b65722c2052756e74696d653e002e00404365726573546f6b656e4c6f636b657204005d0701d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4365726573546f6b656e4c6f636b65722c2052756e74696d653e002f005c4365726573476f7665726e616e6365506c6174666f726d0400610701f10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4365726573476f7665726e616e6365506c6174666f726d2c2052756e74696d653e0030003843657265734c61756e63687061640400750701cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c43657265734c61756e63687061642c2052756e74696d653e0031005844656d657465724661726d696e67506c6174666f726d0400790701ed0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c44656d657465724661726d696e67506c6174666f726d2c2052756e74696d653e00320020426167734c69737404007d0701b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426167734c6973742c2052756e74696d653e00330068456c656374696f6e50726f76696465724d756c746950686173650400810701fd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c456c656374696f6e50726f76696465724d756c746950686173652c2052756e74696d653e0034001042616e640400c90801a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c42616e642c2052756e74696d653e0035002c4f7261636c6550726f78790400dd0801c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4f7261636c6550726f78792c2052756e74696d653e003600604865726d6573476f7665726e616e6365506c6174666f726d0400e10801f50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4865726d6573476f7665726e616e6365506c6174666f726d2c2052756e74696d653e00370020507265696d6167650400e50801b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c507265696d6167652c2052756e74696d653e003800244f72646572426f6f6b0400e90801b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4f72646572426f6f6b2c2052756e74696d653e003900204b656e73657473750400f50801b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4b656e73657473752c2052756e74696d653e003a002c42726964676550726f78790400f90801c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c42726964676550726f78792c2052756e74696d653e00670074537562737472617465427269646765496e626f756e644368616e6e656c0400010901090273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c537562737472617465427269646765496e626f756e644368616e6e656c2c2052756e74696d653e006a00785375627374726174654272696467654f7574626f756e644368616e6e656c04006909010d0273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5375627374726174654272696467654f7574626f756e644368616e6e656c2c2052756e74696d653e006b004850617261636861696e42726964676541707004006d0901dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50617261636861696e4272696467654170702c2052756e74696d653e006d0040427269646765446174615369676e657204007d0901d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c427269646765446174615369676e65722c2052756e74696d653e006e00404d756c746973696756657269666965720400810901d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d756c746973696756657269666965722c2052756e74696d653e006f00485375627374726174654272696467654170700400850901dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5375627374726174654272696467654170702c2052756e74696d653e007100105375646f04009d0901a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5375646f2c2052756e74696d653e000300184661756365740400a10901ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4661756365742c2052756e74696d653e0050001c5161546f6f6c730400a50901b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5161546f6f6c732c2052756e74696d653e0070003841706f6c6c6f506c6174666f726d0400090a01cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c41706f6c6c6f506c6174666f726d2c2052756e74696d653e00720038457874656e64656441737365747304000d0a01cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c457874656e6465644173736574732c2052756e74696d653e00730000dd040c3870616c6c65745f7574696c6974791870616c6c65741043616c6c04045400011814626174636804011463616c6c73e104017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00004c7c53656e642061206261746368206f662064697370617463682063616c6c732e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e0055014966206f726967696e20697320726f6f74207468656e207468652063616c6c7320617265206469737061746368656420776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e005501546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e31016576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e207468655501604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d6164654d01616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c65746564604c6576656e74206973206465706f73697465642e3461735f64657269766174697665080114696e646578ed03010c75313600011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000134dc53656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00550146696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368bc757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e0045014e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e61016265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e7451017468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f31607c696e20746865204d756c74697369672070616c6c657420696e73746561642e00f44e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2462617463685f616c6c04011463616c6c73e104017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000238ec53656e642061206261746368206f662064697370617463682063616c6c7320616e642061746f6d6963616c6c792065786563757465207468656d2e21015468652077686f6c65207472616e73616374696f6e2077696c6c20726f6c6c6261636b20616e64206661696c20696620616e79206f66207468652063616c6c73206661696c65642e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e0055014966206f726967696e20697320726f6f74207468656e207468652063616c6c7320617265206469737061746368656420776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e2c64697370617463685f617308012461735f6f726967696ee5040154426f783c543a3a50616c6c6574734f726967696e3e00011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000328c84469737061746368657320612066756e6374696f6e2063616c6c207769746820612070726f7669646564206f726967696e2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292e1d012d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b20543a3a576569676874496e666f3a3a64697370617463685f617328292e2c23203c2f7765696768743e2c666f7263655f626174636804011463616c6c73e104017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0004387c53656e642061206261746368206f662064697370617463682063616c6c732ed4556e6c696b6520606261746368602c20697420616c6c6f7773206572726f727320616e6420776f6e277420696e746572727570742e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e004d014966206f726967696e20697320726f6f74207468656e207468652063616c6c732061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e2c776974685f77656967687408011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000118776569676874200118576569676874000518c4446973706174636820612066756e6374696f6e2063616c6c2077697468206120737065636966696564207765696768742e002d01546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b8526f6f74206f726967696e20746f20737065636966792074686520776569676874206f66207468652063616c6c2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee104000002d90400e50408446672616d656e6f64655f72756e74696d65304f726967696e43616c6c65720001141873797374656d0400e90401746672616d655f73797374656d3a3a4f726967696e3c52756e74696d653e0000001c436f756e63696c0400ed0401010170616c6c65745f636f6c6c6563746976653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365313e001b0048546563686e6963616c436f6d6d69747465650400f10401010170616c6c65745f636f6c6c6563746976653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6c6c6563746976653a3a496e7374616e6365323e001c004453756273747261746544697370617463680400f50401b864697370617463683a3a4f726967696e3c52756e74696d652c2064697370617463683a3a496e7374616e6365323e006c0010566f69640400090501110173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a566f696400040000e9040c346672616d655f737570706f7274206469737061746368245261774f726967696e04244163636f756e7449640100010c10526f6f74000000185369676e656404000001244163636f756e744964000100104e6f6e6500020000ed04084470616c6c65745f636f6c6c656374697665245261774f726967696e08244163636f756e7449640100044900010c1c4d656d62657273080010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000000184d656d62657204000001244163636f756e744964000100205f5068616e746f6d00020000f104084470616c6c65745f636f6c6c656374697665245261774f726967696e08244163636f756e7449640100044900010c1c4d656d62657273080010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000000184d656d62657204000001244163636f756e744964000100205f5068616e746f6d00020000f50408206469737061746368245261774f726967696e04304f726967696e4f757470757401f904000401186f726967696ef90401304f726967696e4f75747075740000f9040c306272696467655f74797065731474797065734043616c6c4f726967696e4f75747075740c244e6574776f726b496401b902244d6573736167654964012c284164646974696f6e616c01a8001001286e6574776f726b5f6964b90201244e6574776f726b49640001286d6573736167655f69642c01244d657373616765496400012474696d65706f696e74fd04014047656e6572696354696d65706f696e740001286164646974696f6e616ca801284164646974696f6e616c0000fd0408306272696467655f74797065734047656e6572696354696d65706f696e740001180c45564d040028010c75363400000010536f7261040010010c7533320001002450617261636861696e040010010c7533320002001c50656e64696e670003001c556e6b6e6f776e0004000c544f4e040001050140546f6e5472616e73616374696f6e49640005000001050c306272696467655f74797065730c746f6e40546f6e5472616e73616374696f6e496400000801086c740505010c693634000110686173682c011048323536000005050000050c000905081c73705f636f726510566f6964000100000d05103870616c6c65745f7374616b696e671870616c6c65741870616c6c65741043616c6c04045400016810626f6e640c0128636f6e74726f6c6c65720001504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565fc013042616c616e63654f663c543e00011470617965651105017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000044610154616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c80626520746865206163636f756e74207468617420636f6e74726f6c732069742e002d016076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e002101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e003c456d6974732060426f6e646564602e2823203c7765696768743ed02d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e1c2d204f2831292e642d20546872656520657874726120444220656e74726965732e004d014e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e65643d01756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e482d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c23203c2f7765696768743e28626f6e645f65787472610401386d61785f6164646974696f6e616cfc013042616c616e63654f663c543e00013c610141646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757030666f72207374616b696e672e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e004d01557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e5501556e6c696b65205b60626f6e64605d2853656c663a3a626f6e6429206f72205b60756e626f6e64605d2853656c663a3a756e626f6e642920746869732066756e6374696f6e20646f6573206e6f7420696d706f7365bc616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e003c456d6974732060426f6e646564602e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e1c2d204f2831292e2c23203c2f7765696768743e18756e626f6e6404011476616c7565fc013042616c616e63654f663c543e00024c51015363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64fc706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e2101543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0045014f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665bc7468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e0031014e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d6178556e6c6f636b696e674368756e6b736029410163616e20636f2d657869737473206174207468652073616d652074696d652e20496620746865726520617265206e6f20756e6c6f636b696e67206368756e6b7320736c6f747320617661696c61626c6545015b6043616c6c3a3a77697468647261775f756e626f6e646564605d2069732063616c6c656420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00390149662061207573657220656e636f756e74657273207468652060496e73756666696369656e74426f6e6460206572726f72207768656e2063616c6c696e6720746869732065787472696e7369632c1901746865792073686f756c642063616c6c20606368696c6c6020666972737420696e206f7264657220746f206672656520757020746865697220626f6e6465642066756e64732e0044456d6974732060556e626f6e646564602e009453656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e4477697468647261775f756e626f6e6465640401486e756d5f736c617368696e675f7370616e7310010c75333200033c290152656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e0031015468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4877686174657665722069742077616e74732e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722e0048456d697473206057697468647261776e602e006853656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002823203c7765696768743e0501436f6d706c6578697479204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f766509014e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e2c23203c2f7765696768743e2076616c69646174650401147072656673b4013856616c696461746f725072656673000414e44465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e206e6f6d696e61746504011c74617267657473510201645665633c4163636f756e7449644c6f6f6b75704f663c543e3e00052c0d014465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002823203c7765696768743e2d012d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e29050177686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d49542028543a3a4d61784e6f6d696e6174696f6e73292ed42d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e2c23203c2f7765696768743e146368696c6c00062cc44465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e502d20436f6e7461696e73206f6e6520726561642ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e2c23203c2f7765696768743e247365745f706179656504011470617965651105017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000740b42852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e242d2d2d2d2d2d2d2d2d382d205765696768743a204f283129302d204442205765696768743a48202020202d20526561643a204c656467657248202020202d2057726974653a2050617965652c23203c2f7765696768743e387365745f636f6e74726f6c6c6572040128636f6e74726f6c6c65720001504163636f756e7449644c6f6f6b75704f663c543e0008408c2852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e282d2d2d2d2d2d2d2d2d2d305765696768743a204f283129284442205765696768743af02d20526561643a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572f42d2057726974653a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c65722c23203c2f7765696768743e4c7365745f76616c696461746f725f636f756e7404010c6e6577e502010c75333200092090536574732074686520696465616c206e756d626572206f662076616c696461746f72732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e305765696768743a204f2831295857726974653a2056616c696461746f7220436f756e742c23203c2f7765696768743e60696e6372656173655f76616c696461746f725f636f756e740401286164646974696f6e616ce502010c753332000a20e4496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f7273207570746f206d6178696d756d206f668c60456c656374696f6e50726f7669646572426173653a3a4d617857696e6e657273602e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e9853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e2c23203c2f7765696768743e547363616c655f76616c696461746f725f636f756e74040118666163746f729902011c50657263656e74000b200d015363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f72207570746f206d6178696d756d206f668c60456c656374696f6e50726f7669646572426173653a3a4d617857696e6e657273602e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e9853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e2c23203c2f7765696768743e34666f7263655f6e6f5f65726173000c3cac466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e3901546875732074686520656c656374696f6e2070726f63657373206d6179206265206f6e676f696e67207768656e20746869732069732063616c6c65642e20496e2074686973206361736520746865dc656c656374696f6e2077696c6c20636f6e74696e756520756e74696c20746865206e65787420657261206973207472696767657265642e002823203c7765696768743e3c2d204e6f20617267756d656e74732e382d205765696768743a204f283129442d2057726974653a20466f7263654572612c23203c2f7765696768743e34666f7263655f6e65775f657261000d404901466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c2062659c726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e002823203c7765696768743e3c2d204e6f20617267756d656e74732e382d205765696768743a204f283129402d20577269746520466f7263654572612c23203c2f7765696768743e447365745f696e76756c6e657261626c6573040134696e76756c6e657261626c6573510201445665633c543a3a4163636f756e7449643e000e0cc8536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e34666f7263655f756e7374616b650801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c753332000f0c0901466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e50666f7263655f6e65775f6572615f616c776179730010240101466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e5463616e63656c5f64656665727265645f736c61736808010c657261100120457261496e646578000134736c6173685f696e64696365738d0401205665633c7533323e0011149443616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e009843616e2062652063616c6c6564206279207468652060543a3a41646d696e4f726967696e602e000101506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e387061796f75745f7374616b65727308013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400010c657261100120457261496e6465780012540d01506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e0049012d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f2501202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e31012d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e005501546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e206966746974206973206e6f74206f6e65206f6620746865207374616b6572732e002823203c7765696768743efc2d2054696d6520636f6d706c65786974793a206174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292ec02d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e2c2d2d2d2d2d2d2d2d2d2d2d19014e20697320746865204e756d626572206f66207061796f75747320666f72207468652076616c696461746f722028696e636c7564696e67207468652076616c696461746f72291c5765696768743a842d205265776172642044657374696e6174696f6e205374616b65643a204f284e29c02d205265776172642044657374696e6174696f6e20436f6e74726f6c6c657220284372656174696e67293a204f284e29004d0120204e4f54453a20776569676874732061726520617373756d696e672074686174207061796f75747320617265206d61646520746f20616c697665207374617368206163636f756e7420285374616b6564292e55012020506179696e67206576656e2061206465616420636f6e74726f6c6c65722069732063686561706572207765696768742d776973652e20576520646f6e277420646f20616e7920726566756e647320686572652e2c23203c2f7765696768743e187265626f6e6404011476616c7565fc013042616c616e63654f663c543e001324dc5265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00d4546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722e002823203c7765696768743ed02d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b73882d20426f756e64656420627920604d6178556e6c6f636b696e674368756e6b73602ef02d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e2c23203c2f7765696768743e28726561705f73746173680801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c7533320014305d0152656d6f766520616c6c2064617461207374727563747572657320636f6e6365726e696e672061207374616b65722f7374617368206f6e636520697420697320617420612073746174652077686572652069742063616e0501626520636f6e736964657265642060647573746020696e20746865207374616b696e672073797374656d2e2054686520726571756972656d656e7473206172653a000501312e207468652060746f74616c5f62616c616e636560206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e1101322e206f722c2074686520606c65646765722e746f74616c60206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e00550154686520666f726d65722063616e2068617070656e20696e206361736573206c696b65206120736c6173683b20746865206c6174746572207768656e20612066756c6c7920756e626f6e646564206163636f756e7409016973207374696c6c20726563656976696e67207374616b696e67207265776172647320696e206052657761726444657374696e6174696f6e3a3a5374616b6564602e00310149742063616e2062652063616c6c656420627920616e796f6e652c206173206c6f6e672061732060737461736860206d65657473207468652061626f766520726571756972656d656e74732e00dc526566756e647320746865207472616e73616374696f6e20666565732075706f6e207375636365737366756c20657865637574696f6e2e106b69636b04010c77686f510201645665633c4163636f756e7449644c6f6f6b75704f663c543e3e00152ce052656d6f76652074686520676976656e206e6f6d696e6174696f6e732066726f6d207468652063616c6c696e672076616c696461746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e004d012d206077686f603a2041206c697374206f66206e6f6d696e61746f72207374617368206163636f756e74732077686f20617265206e6f6d696e6174696e6720746869732076616c696461746f72207768696368c0202073686f756c64206e6f206c6f6e676572206265206e6f6d696e6174696e6720746869732076616c696461746f722e0055014e6f74653a204d616b696e6720746869732063616c6c206f6e6c79206d616b65732073656e736520696620796f7520666972737420736574207468652076616c696461746f7220707265666572656e63657320746f78626c6f636b20616e792066757274686572206e6f6d696e6174696f6e732e4c7365745f7374616b696e675f636f6e666967731801486d696e5f6e6f6d696e61746f725f626f6e6415050158436f6e6669674f703c42616c616e63654f663c543e3e0001486d696e5f76616c696461746f725f626f6e6415050158436f6e6669674f703c42616c616e63654f663c543e3e00014c6d61785f6e6f6d696e61746f725f636f756e7419050134436f6e6669674f703c7533323e00014c6d61785f76616c696461746f725f636f756e7419050134436f6e6669674f703c7533323e00013c6368696c6c5f7468726573686f6c641d050144436f6e6669674f703c50657263656e743e0001386d696e5f636f6d6d697373696f6e21050144436f6e6669674f703c50657262696c6c3e001644ac5570646174652074686520766172696f7573207374616b696e6720636f6e66696775726174696f6e73202e0025012a20606d696e5f6e6f6d696e61746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f2062652061206e6f6d696e61746f722e25012a20606d696e5f76616c696461746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f20626520612076616c696461746f722e55012a20606d61785f6e6f6d696e61746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e2062652061206e6f6d696e61746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e55012a20606d61785f76616c696461746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e20626520612076616c696461746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e59012a20606368696c6c5f7468726573686f6c64603a2054686520726174696f206f6620606d61785f6e6f6d696e61746f725f636f756e7460206f7220606d61785f76616c696461746f725f636f756e74602077686963681901202073686f756c642062652066696c6c656420696e206f7264657220666f722074686520606368696c6c5f6f7468657260207472616e73616374696f6e20746f20776f726b2e61012a20606d696e5f636f6d6d697373696f6e603a20546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e207468617420656163682076616c696461746f7273206d757374206d61696e7461696e2e550120205468697320697320636865636b6564206f6e6c792075706f6e2063616c6c696e67206076616c6964617465602e204578697374696e672076616c696461746f727320617265206e6f742061666665637465642e00c452756e74696d654f726967696e206d75737420626520526f6f7420746f2063616c6c20746869732066756e6374696f6e2e0035014e4f54453a204578697374696e67206e6f6d696e61746f727320616e642076616c696461746f72732077696c6c206e6f742062652061666665637465642062792074686973207570646174652e1101746f206b69636b2070656f706c6520756e64657220746865206e6577206c696d6974732c20606368696c6c5f6f74686572602073686f756c642062652063616c6c65642e2c6368696c6c5f6f74686572040128636f6e74726f6c6c6572000130543a3a4163636f756e74496400176841014465636c61726520612060636f6e74726f6c6c65726020746f2073746f702070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e004101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2c206275742063616e2062652063616c6c656420627920616e796f6e652e0059014966207468652063616c6c6572206973207468652073616d652061732074686520636f6e74726f6c6c6572206265696e672074617267657465642c207468656e206e6f206675727468657220636865636b7320617265d8656e666f726365642c20616e6420746869732066756e6374696f6e2062656861766573206a757374206c696b6520606368696c6c602e005d014966207468652063616c6c657220697320646966666572656e74207468616e2074686520636f6e74726f6c6c6572206265696e672074617267657465642c2074686520666f6c6c6f77696e6720636f6e646974696f6e73306d757374206265206d65743a001d012a2060636f6e74726f6c6c657260206d7573742062656c6f6e6720746f2061206e6f6d696e61746f722077686f20686173206265636f6d65206e6f6e2d6465636f6461626c652c000c4f723a003d012a204120604368696c6c5468726573686f6c6460206d7573742062652073657420616e6420636865636b656420776869636820646566696e657320686f7720636c6f736520746f20746865206d6178550120206e6f6d696e61746f7273206f722076616c696461746f7273207765206d757374207265616368206265666f72652075736572732063616e207374617274206368696c6c696e67206f6e652d616e6f746865722e59012a204120604d61784e6f6d696e61746f72436f756e746020616e6420604d617856616c696461746f72436f756e7460206d75737420626520736574207768696368206973207573656420746f2064657465726d696e65902020686f7720636c6f73652077652061726520746f20746865207468726573686f6c642e5d012a204120604d696e4e6f6d696e61746f72426f6e646020616e6420604d696e56616c696461746f72426f6e6460206d7573742062652073657420616e6420636865636b65642c2077686963682064657465726d696e65735101202069662074686973206973206120706572736f6e20746861742073686f756c64206265206368696c6c6564206265636175736520746865792068617665206e6f74206d657420746865207468726573686f6c64402020626f6e642072657175697265642e005501546869732063616e2062652068656c7066756c20696620626f6e6420726571756972656d656e74732061726520757064617465642c20616e64207765206e65656420746f2072656d6f7665206f6c642075736572739877686f20646f206e6f74207361746973667920746865736520726571756972656d656e74732e68666f7263655f6170706c795f6d696e5f636f6d6d697373696f6e04013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400180c4501466f72636520612076616c696461746f7220746f2068617665206174206c6561737420746865206d696e696d756d20636f6d6d697373696f6e2e20546869732077696c6c206e6f74206166666563742061610176616c696461746f722077686f20616c726561647920686173206120636f6d6d697373696f6e2067726561746572207468616e206f7220657175616c20746f20746865206d696e696d756d2e20416e79206163636f756e743863616e2063616c6c20746869732e487365745f6d696e5f636f6d6d697373696f6e04010c6e6577b0011c50657262696c6c00191025015365747320746865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e207468617420656163682076616c696461746f7273206d757374206d61696e7461696e2e005901546869732063616c6c20686173206c6f7765722070726976696c65676520726571756972656d656e7473207468616e20607365745f7374616b696e675f636f6e6669676020616e642063616e2062652063616c6c6564cc6279207468652060543a3a41646d696e4f726967696e602e20526f6f742063616e20616c776179732063616c6c20746869732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e1105083870616c6c65745f7374616b696e674452657761726444657374696e6174696f6e04244163636f756e74496401000114185374616b656400000014537461736800010028436f6e74726f6c6c65720002001c4163636f756e7404000001244163636f756e744964000300104e6f6e65000400001505103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540118010c104e6f6f700000000c5365740400180104540001001852656d6f7665000200001905103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540110010c104e6f6f700000000c5365740400100104540001001852656d6f7665000200001d05103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f70040454019902010c104e6f6f700000000c536574040099020104540001001852656d6f7665000200002105103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f7004045401b0010c104e6f6f700000000c5365740400b00104540001001852656d6f76650002000025050c3870616c6c65745f73657373696f6e1870616c6c65741043616c6c040454000108207365745f6b6579730801106b6579732905011c543a3a4b65797300011470726f6f6630011c5665633c75383e000038e453657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e1d01416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d0546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002823203c7765696768743e11012d20436f6d706c65786974793a20604f283129602e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f6698202060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a02d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b65797360802d204462526561647320706572206b65792069643a20604b65794f776e657260842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e2870757267655f6b657973000140c852656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e00c05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e005501546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265205369676e656420616e6420746865206163636f756e74206d757374206265206569746865722062655d01636f6e7665727469626c6520746f20612076616c696461746f72204944207573696e672074686520636861696e2773207479706963616c2061646472657373696e672073797374656d20287468697320757375616c6c7951016d65616e73206265696e67206120636f6e74726f6c6c6572206163636f756e7429206f72206469726563746c7920636f6e7665727469626c6520696e746f20612076616c696461746f722049442028776869636894757375616c6c79206d65616e73206265696e672061207374617368206163636f756e74292e002823203c7765696768743e61012d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468a420206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a02d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e7460842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e29050c446672616d656e6f64655f72756e74696d65186f70617175652c53657373696f6e4b657973000010011062616265fd0301c43c42616265206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300011c6772616e647061dc01d03c4772616e647061206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c6963000124696d5f6f6e6c696e65e801d43c496d4f6e6c696e65206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300011462656566792d0501c83c4265656679206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300002d050c2073705f62656566791863727970746f185075626c6963000004002503013465636473613a3a5075626c6963000031050c3870616c6c65745f6772616e6470611870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f66350501bc426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3e00013c6b65795f6f776e65725f70726f6f6649040140543a3a4b65794f776e657250726f6f6600001009015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f66350501bc426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3e00013c6b65795f6f776e65725f70726f6f6649040140543a3a4b65794f776e657250726f6f6600012409015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e000d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e306e6f74655f7374616c6c656408011464656c6179100138543a3a426c6f636b4e756d62657200016c626573745f66696e616c697a65645f626c6f636b5f6e756d626572100138543a3a426c6f636b4e756d6265720002303d014e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c6974792067616467657420686173207374616c6c65642e006101546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e67206f6620746865206e6578742073657373696f6e2c20746f6101626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e20546865206064656c6179602073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d654901746861742074686520626c6f636b207369676e616c6c696e672074686520666f72636564206368616e67652077696c6c206e6f742062652072652d6f7267656420652e672e203130303020626c6f636b732e5d0154686520626c6f636b2070726f64756374696f6e207261746520287768696368206d617920626520736c6f77656420646f776e2062656361757365206f662066696e616c697479206c616767696e67292073686f756c64510162652074616b656e20696e746f206163636f756e74207768656e2063686f6f73696e6720746865206064656c6179602e20546865204752414e44504120766f74657273206261736564206f6e20746865206e65775501617574686f726974792077696c6c20737461727420766f74696e67206f6e20746f70206f662060626573745f66696e616c697a65645f626c6f636b5f6e756d6265726020666f72206e65772066696e616c697a65644d01626c6f636b732e2060626573745f66696e616c697a65645f626c6f636b5f6e756d626572602073686f756c64206265207468652068696768657374206f6620746865206c61746573742066696e616c697a6564c4626c6f636b206f6620616c6c2076616c696461746f7273206f6620746865206e657720617574686f72697479207365742e00584f6e6c792063616c6c61626c6520627920726f6f742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e3505084c73705f66696e616c6974795f6772616e6470614445717569766f636174696f6e50726f6f66080448012c044e0110000801187365745f6964280114536574496400013065717569766f636174696f6e3905014845717569766f636174696f6e3c482c204e3e00003905084c73705f66696e616c6974795f6772616e6470613045717569766f636174696f6e080448012c044e011001081c507265766f746504003d050139016772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c206772616e6470613a3a507265766f74653c482c204e3e2c0a417574686f726974795369676e61747572653e00000024507265636f6d6d6974040051050141016772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c206772616e6470613a3a507265636f6d6d69743c482c204e3e2c0a417574686f726974795369676e61747572653e000100003d05084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401dc0456014105045301450500100130726f756e645f6e756d62657228010c7536340001206964656e74697479dc0108496400011466697273744d05011828562c2053290001187365636f6e644d05011828562c20532900004105084066696e616c6974795f6772616e6470611c507265766f7465080448012c044e01100008012c7461726765745f686173682c0104480001347461726765745f6e756d6265721001044e000045050c4c73705f66696e616c6974795f6772616e6470610c617070245369676e61747572650000040049050148656432353531393a3a5369676e6174757265000049050c1c73705f636f72651c65643235353139245369676e617475726500000400290401205b75383b2036345d00004d050000040841054505005105084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401dc0456015505045301450500100130726f756e645f6e756d62657228010c7536340001206964656e74697479dc0108496400011466697273745905011828562c2053290001187365636f6e645905011828562c20532900005505084066696e616c6974795f6772616e64706124507265636f6d6d6974080448012c044e01100008012c7461726765745f686173682c0104480001347461726765745f6e756d6265721001044e000059050000040855054505005d050c4070616c6c65745f696d5f6f6e6c696e651870616c6c65741043616c6c04045400010424686561727462656174080124686561727462656174610501644865617274626561743c543a3a426c6f636b4e756d6265723e0001247369676e6174757265750501bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e61747572650000242823203c7765696768743e61012d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020286865617274626561742e76616c696461746f72735f6c656e2920616e642045206973d820206c656e677468206f6620606865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f61646472657373608820202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60ac20202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e6774682060456039012d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c5820206052656365697665644865617274626561747360802d2044625772697465733a2060526563656976656448656172746265617473602c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e6105084070616c6c65745f696d5f6f6e6c696e6524486561727462656174042c426c6f636b4e756d626572011000140130626c6f636b5f6e756d62657210012c426c6f636b4e756d6265720001346e6574776f726b5f7374617465650501484f70617175654e6574776f726b537461746500013473657373696f6e5f696e64657810013053657373696f6e496e64657800013c617574686f726974795f696e64657810012441757468496e64657800013876616c696461746f72735f6c656e10010c753332000065050c1c73705f636f7265206f6666636861696e484f70617175654e6574776f726b5374617465000008011c706565725f6964690501304f706171756550656572496400014865787465726e616c5f6164647265737365736d0501505665633c4f70617175654d756c7469616464723e00006905081c73705f636f7265304f70617175655065657249640000040030011c5665633c75383e00006d0500000271050071050c1c73705f636f7265206f6666636861696e3c4f70617175654d756c7469616464720000040030011c5665633c75383e00007505104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139245369676e61747572650000040079050148737232353531393a3a5369676e6174757265000079050c1c73705f636f72651c73723235353139245369676e617475726500000400290401205b75383b2036345d00007d050c3074726164696e675f706169721870616c6c65741043616c6c0404540001042072656769737465720c01186465785f6964100120543a3a4445584964000134626173655f61737365745f69640d010130417373657449644f663c543e00013c7461726765745f61737365745f69640d010130417373657449644f663c543e0000189c52656769737465722074726164696e672070616972206f6e2074686520676976656e204445582e9043616e206265206f6e6c792063616c6c65642062792074686520444558206f776e65722e007c2d20606465785f6964603a204944206f66207468652065786368616e67652e842d2060626173655f61737365745f6964603a20626173652061737365742049442e942d20607461726765745f61737365745f6964603a207461726765742061737365742049442e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e81050c186173736574731870616c6c65741043616c6c0404540001202072656769737465721c011873796d626f6c2901012c417373657453796d626f6c0001106e616d653101012441737365744e616d65000138696e697469616c5f737570706c7918011c42616c616e636500012c69735f6d696e7461626c65bc0110626f6f6c00013869735f696e646976697369626c65bc0110626f6f6c00013c6f70745f636f6e74656e745f737263990301544f7074696f6e3c436f6e74656e74536f757263653e0001206f70745f646573638505014c4f7074696f6e3c4465736372697074696f6e3e0000147c506572666f726d7320616e20617373657420726567697374726174696f6e2e00bc526567697374657273206e65772060417373657449646020666f722074686520676976656e20606f726967696e602e6501417373657453796d626f6c2073686f756c6420726570726573656e7420737472696e672077697468206f6e6c7920757070657263617365206c6174696e2063686172732077697468206d6178206c656e677468206f6620372eed0141737365744e616d652073686f756c6420726570726573656e7420737472696e672077697468206f6e6c7920757070657263617365206f72206c6f77657263617365206c6174696e206368617273206f72206e756d62657273206f72207370616365732c2077697468206d6178206c656e677468206f662033332e207472616e736665720c012061737365745f69640d010128543a3a41737365744964000108746f000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500011888506572666f726d73206120636865636b6564204173736574207472616e736665722e0005012d20606f726967696e603a2063616c6c6572204163636f756e742c2066726f6d20776869636820417373657420616d6f756e742069732077697468647261776e2c982d206061737365745f6964603a204964206f66207472616e736665727265642041737365742ce82d2060746f603a204964206f66204163636f756e742c20746f20776869636820417373657420616d6f756e74206973206465706f73697465642c942d2060616d6f756e74603a207472616e7366657272656420417373657420616d6f756e742e106d696e740c012061737365745f69640d010128543a3a41737365744964000108746f000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500021cbc506572666f726d73206120636865636b6564204173736574206d696e742c2063616e206f6e6c7920626520646f6e6594627920636f72726573706f6e64696e67206173736574206f776e6572206163636f756e742e00dc2d20606f726967696e603a2063616c6c6572204163636f756e742c20776869636820697373756573204173736574206d696e74696e672c842d206061737365745f6964603a204964206f66206d696e7465642041737365742cdc2d2060746f603a204964206f66204163636f756e742c20746f20776869636820417373657420616d6f756e74206973206d696e7465642c802d2060616d6f756e74603a206d696e74656420417373657420616d6f756e742e28666f7263655f6d696e740c012061737365745f69640d010128543a3a41737365744964000108746f000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500032cc8506572666f726d7320616e20756e636865636b6564204173736574206d696e742c2063616e206f6e6c7920626520646f6e6540627920726f6f74206163636f756e742e009853686f756c6420626520757365642061732065787472696e7369632063616c6c206f6e6c792e55016043757272656e636965733a3a757064617465645f62616c616e63652829602073686f756c6420626520646570726563617465642e205573696e672060666f7263655f6d696e746020616c6c6f777320757320746f2d01706572666f726d20657874726120616374696f6e7320666f72206d696e74696e672c2073756368206173206275792d6261636b2c2065787472612d6d696e74696e6720616e64206574632e00dc2d20606f726967696e603a2063616c6c6572204163636f756e742c20776869636820697373756573204173736574206d696e74696e672c842d206061737365745f6964603a204964206f66206d696e7465642041737365742cdc2d2060746f603a204964206f66204163636f756e742c20746f20776869636820417373657420616d6f756e74206973206d696e7465642c802d2060616d6f756e74603a206d696e74656420417373657420616d6f756e742e106275726e08012061737365745f69640d010128543a3a41737365744964000118616d6f756e7418011c42616c616e6365000418bc506572666f726d73206120636865636b6564204173736574206275726e2c2063616e206f6e6c7920626520646f6e65b8627920636f72726573706f6e64696e67206173736574206f776e65722077697468206f776e206163636f756e742e00f82d20606f726967696e603a2063616c6c6572204163636f756e742c2066726f6d20776869636820417373657420616d6f756e74206973206275726e65642c842d206061737365745f6964603a204964206f66206275726e65642041737365742c802d2060616d6f756e74603a206275726e656420417373657420616d6f756e742e387570646174655f62616c616e63650c010c77686f000130543a3a4163636f756e74496400012c63757272656e63795f69640d01013c43757272656e637949644f663c543e000118616d6f756e744101012c416d6f756e744f663c543e00051cf8416464206f722072656d6f766520616273286062795f616d6f756e7460292066726f6d207468652062616c616e6365206f66206077686f6020756e646572fc6063757272656e63795f6964602e20496620706f736974697665206062795f616d6f756e74602c20646f206164642c20656c736520646f2072656d6f76652e00f84261736963616c6c7920612077726170706572206f6620604d756c746943757272656e6379457874656e6465643a3a7570646174655f62616c616e63656054666f722074657374696e6720707572706f7365732e00c4544f444f3a206d6f766520696e746f2074657374732065787472696e73696320636f6c6c656374696f6e2070616c6c6574407365745f6e6f6e5f6d696e7461626c6504012061737365745f69640d010128543a3a41737365744964000614450153657420676976656e20617373657420746f206265206e6f6e2d6d696e7461626c652c20692e652e2069742063616e206e6f206c6f6e676572206265206d696e7465642c206f6e6c79206275726e65642e704f7065726174696f6e2063616e206e6f7420626520756e646f6e652e00f02d20606f726967696e603a2063616c6c6572204163636f756e742c2073686f756c6420636f72726573706f6e6420746f204173736574206f776e6572842d206061737365745f6964603a204964206f66206275726e65642041737365742c2c7570646174655f696e666f0c012061737365745f69640d010128543a3a417373657449640001286e65775f73796d626f6c2501014c4f7074696f6e3c417373657453796d626f6c3e0001206e65775f6e616d652d0101444f7074696f6e3c41737365744e616d653e000718e04368616e676520696e666f726d6174696f6e2061626f75742061737365742e2043616e206f6e6c7920626520646f6e6520627920726f6f7400a82d20606f726967696e603a2063616c6c6572204163636f756e742c2073686f756c6420626520726f6f74902d206061737365745f6964603a204964206f6620617373657420746f206368616e67652c19012d20606e65775f73796d626f6c603a204e65772061737365742073796d626f6c2e204966204e6f6e652061737365742073796d626f6c2077696c6c206e6f74206368616e676501012d20606e65775f6e616d65603a204e6577206173736574206e616d652e204966204e6f6e65206173736574206e616d652077696c6c206e6f74206368616e6765042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e850504184f7074696f6e0404540189050108104e6f6e6500000010536f6d6504008905000001000089050c18636f6d6d6f6e287072696d6974697665732c4465736372697074696f6e0000040030011c5665633c75383e00008d050c886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c1870616c6c65741043616c6c0404540001143c696e697469616c697a655f706f6f6c04014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e0000041101456e61626c652065786368616e67652070617468206f6e2074686520706f6f6c20666f722070616972204261736541737365742d436f6c6c61746572616c41737365742e4c7365745f7265666572656e63655f61737365740401487265666572656e63655f61737365745f69640d010130417373657449644f663c543e000104b5014368616e6765207265666572656e6365206173736574207768696368206973207573656420746f2064657465726d696e6520636f6c6c61746572616c206173736574732076616c75652e20496e746564656420746f20626520652e672e20737461626c65636f696e204441492e787365745f6f7074696f6e616c5f7265776172645f6d756c7469706c69657208014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e0001286d756c7469706c696572390101344f7074696f6e3c46697865643e0002088101536574206d756c7469706c696572207768696368206973206170706c69656420746f20726577617264656420616d6f756e74207768656e206465706f736974696e6720706172746963756c617220636f6c6c61746572616c206173736574732e0101604e6f6e65602076616c756520696e646963617465732072657761726420776974686f7574206368616e67652c2073616d6520617320536f6d6528312e30292e387365745f70726963655f6269617304012870726963655f6269617318011c42616c616e636500030449014368616e6765732060696e697469616c5f7072696365602075736564206173206269617320696e20584f522d444149287265666572656e6365206173736574292070726963652063616c63756c6174696f6e5c7365745f70726963655f6368616e67655f636f6e66696708014470726963655f6368616e67655f7261746518011c42616c616e636500014470726963655f6368616e67655f7374657018011c42616c616e6365000404884368616e676573207072696365206368616e6765207261746520616e642073746570042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e91050c24746563686e6963616c1870616c6c65741043616c6c040454000100042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e95050c20706f6f6c5f78796b1870616c6c65741043616c6c04045400010c446465706f7369745f6c69717569646974791c01186465785f696410012844455849644f663c543e000134696e7075745f61737365745f610d010130417373657449644f663c543e000134696e7075745f61737365745f620d010130417373657449644f663c543e00013c696e7075745f615f6465736972656418011c42616c616e636500013c696e7075745f625f6465736972656418011c42616c616e636500012c696e7075745f615f6d696e18011c42616c616e636500012c696e7075745f625f6d696e18011c42616c616e63650000004877697468647261775f6c69717569646974791801186465785f696410012844455849644f663c543e0001386f75747075745f61737365745f610d010130417373657449644f663c543e0001386f75747075745f61737365745f620d010130417373657449644f663c543e0001506d61726b65725f61737365745f6465736972656418011c42616c616e63650001306f75747075745f615f6d696e18011c42616c616e63650001306f75747075745f625f6d696e18011c42616c616e63650001003c696e697469616c697a655f706f6f6c0c01186465785f696410012844455849644f663c543e00011c61737365745f610d010130417373657449644f663c543e00011c61737365745f620d010130417373657449644f663c543e000200042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e99050c3c6c69717569646974795f70726f78791870616c6c65741043616c6c04045400011c10737761701801186465785f6964100120543a3a4445584964000138696e7075745f61737365745f69640d010130417373657449644f663c543e00013c6f75747075745f61737365745f69640d010130417373657449644f663c543e00012c737761705f616d6f756e749d05014c53776170416d6f756e743c42616c616e63653e00015473656c65637465645f736f757263655f7479706573a10501605665633c4c6971756964697479536f75726365547970653e00012c66696c7465725f6d6f6465a505012846696c7465724d6f64650000241d01506572666f726d2073776170206f6620746f6b656e732028696e7075742f6f757470757420646566696e6564207669612053776170416d6f756e7420646972656374696f6e292e0029012d20606f726967696e603a20746865206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642c25012d20606465785f6964603a2044455820494420666f72207768696368206c697175696469747920736f7572636573206167677265676174696f6e206973206265696e6720646f6e652cbc2d2060696e7075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720736f6c642cc82d20606f75747075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720626f756768742c59022d2060737761705f616d6f756e74603a2074686520657861637420616d6f756e7420746f20626520736f6c64202865697468657220696e20696e7075745f61737365745f6964206f72206f75747075745f61737365745f696420756e697473207769746820636f72726573706f6e64696e6720736c69707061676520746f6c6572616e6365206162736f6c75746520626f756e64292cc5012d206073656c65637465645f736f757263655f7479706573603a206c697374206f662073656c6563746564204c6971756964697479536f757263652074797065732c2073656c656374696f6e206566666563742069732064657465726d696e65642062792066696c7465725f6d6f64652c79012d206066696c7465725f6d6f6465603a20696e6469636174652065697468657220746f20616c6c6f77206f7220666f726269642073656c6563746564207479706573206f6e6c792c206f722064697361626c652066696c746572696e672e34737761705f7472616e736665721c01207265636569766572000130543a3a4163636f756e7449640001186465785f6964100120543a3a4445584964000138696e7075745f61737365745f69640d010130417373657449644f663c543e00013c6f75747075745f61737365745f69640d010130417373657449644f663c543e00012c737761705f616d6f756e749d05014c53776170416d6f756e743c42616c616e63653e00015473656c65637465645f736f757263655f7479706573a10501605665633c4c6971756964697479536f75726365547970653e00012c66696c7465725f6d6f6465a505012846696c7465724d6f64650001281d01506572666f726d2073776170206f6620746f6b656e732028696e7075742f6f757470757420646566696e6564207669612053776170416d6f756e7420646972656374696f6e292e0029012d20606f726967696e603a20746865206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642ccc2d20607265636569766572603a20746865206163636f756e74207468617420726563656976657320746865206f75747075742c25012d20606465785f6964603a2044455820494420666f72207768696368206c697175696469747920736f7572636573206167677265676174696f6e206973206265696e6720646f6e652cbc2d2060696e7075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720736f6c642cc82d20606f75747075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720626f756768742c59022d2060737761705f616d6f756e74603a2074686520657861637420616d6f756e7420746f20626520736f6c64202865697468657220696e20696e7075745f61737365745f6964206f72206f75747075745f61737365745f696420756e697473207769746820636f72726573706f6e64696e6720736c69707061676520746f6c6572616e6365206162736f6c75746520626f756e64292cc5012d206073656c65637465645f736f757263655f7479706573603a206c697374206f662073656c6563746564204c6971756964697479536f757263652074797065732c2073656c656374696f6e206566666563742069732064657465726d696e65642062792066696c7465725f6d6f64652c79012d206066696c7465725f6d6f6465603a20696e6469636174652065697468657220746f20616c6c6f77206f7220666f726269642073656c6563746564207479706573206f6e6c792c206f722064697361626c652066696c746572696e672e4c737761705f7472616e736665725f6261746368180130737761705f62617463686573a90501e05665633c537761704261746368496e666f3c417373657449644f663c543e2c20543a3a44455849642c20543a3a4163636f756e7449643e3e000138696e7075745f61737365745f69640d010130417373657449644f663c543e0001406d61785f696e7075745f616d6f756e7418011c42616c616e636500015473656c65637465645f736f757263655f7479706573a10501605665633c4c6971756964697479536f75726365547970653e00012c66696c7465725f6d6f6465a505012846696c7465724d6f646500013c6164646974696f6e616c5f646174617d01010d014f7074696f6e3c426f756e6465645665633c75382c20543a3a4d61784164646974696f6e616c446174614c656e677468537761705472616e7366657242617463683e3e000234450144697370617463686573206d756c7469706c6520737761702026207472616e73666572206f7065726174696f6e732e2060737761705f626174636865736020636f6e7461696e7320766563746f72206f664901537761704261746368496e666f20737472756374732c20776865726520656163682062617463682073706563696669657320776869636820617373657420494420616e64204445582049442073686f756c6449016265207573656420666f72207377617070696e672c207265636569766572206163636f756e747320616e642074686569722064657369726564206f7574636f6d6520616d6f756e7420696e2061737365742c8073706563696669656420666f72207468652063757272656e742062617463682e0029012d20606f726967696e603a20746865206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642c09012d2060737761705f62617463686573603a2074686520766563746f7220636f6e7461696e696e672074686520537761704261746368496e666f20737472756374732cbc2d2060696e7075745f61737365745f6964603a204944206f6620746865206173736574206265696e6720736f6c642c19012d20606d61785f696e7075745f616d6f756e74603a20746865206d6178696d756d20616d6f756e7420746f20626520736f6c6420696e20696e7075745f61737365745f69642c59012d206073656c65637465645f736f757263655f7479706573603a206c697374206f662073656c6563746564204c6971756964697479536f757263652074797065732c2073656c656374696f6e20656666656374206973d420202020202020202020202020202020202020202020202020202064657465726d696e65642062792066696c7465725f6d6f64652c79012d206066696c7465725f6d6f6465603a20696e6469636174652065697468657220746f20616c6c6f77206f7220666f726269642073656c6563746564207479706573206f6e6c792c206f722064697361626c652066696c746572696e672eec2d20606164646974696f6e616c5f64617461603a206461746120746f20696e636c75646520696e20737761702073756363657373206576656e742e5c656e61626c655f6c69717569646974795f736f757263650401406c69717569646974795f736f757263657901014c4c6971756964697479536f757263655479706500030c90456e61626c657320585354206f7220544243206c697175696469747920736f757263652e00e42d20606c69717569646974795f736f75726365603a20746865206c697175696469747920736f7572636520746f20626520656e61626c65642e6064697361626c655f6c69717569646974795f736f757263650401406c69717569646974795f736f757263657901014c4c6971756964697479536f757263655479706500040c610144697361626c657320585354206f7220544243206c697175696469747920736f757263652e20546865206c697175696469747920736f75726365206265636f6d657320756e617661696c61626c6520666f7220737761702e00e82d20606c69717569646974795f736f75726365603a20746865206c697175696469747920736f7572636520746f2062652064697361626c65642e647365745f616461725f636f6d6d697373696f6e5f726174696f040140636f6d6d697373696f6e5f726174696f18011c42616c616e636500050040786f726c6573735f7472616e736665722401186465785f6964100120543a3a444558496400012061737365745f69640d010130417373657449644f663c543e0001207265636569766572000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e6365000148646573697265645f786f725f616d6f756e7418011c42616c616e63650001346d61785f616d6f756e745f696e18011c42616c616e636500015473656c65637465645f736f757263655f7479706573a10501605665633c4c6971756964697479536f75726365547970653e00012c66696c7465725f6d6f6465a505012846696c7465724d6f646500013c6164646974696f6e616c5f6461746185010105014f7074696f6e3c426f756e6465645665633c75382c20543a3a4d61784164646974696f6e616c446174614c656e677468586f726c6573735472616e736665723e3e000618b045787472696e73696320776869636820697320656e61626c6520584f526c657373207472616e73666572732ef501496e7465726e616c6c792069742773207377617073206061737365745f69646020746f2060646573697265645f786f725f616d6f756e7460206f662060584f526020616e64207472616e73666572732072656d61696e696e6720616d6f756e74206f66206061737365745f69646020746f20607265636569766572602ea901436c69656e7420617070732073686f756c6420737065636966792074686520584f5220616d6f756e742077686963682073686f756c64206265207061696420617320612066656520696e2060646573697265645f786f725f616d6f756e746020706172616d657465722e750149662073656e6465722077696c6c206e6f74206861766520656e6f75676820584f5220746f20706179206665657320616674657220657865637574696f6e2c207472616e73616374696f6e2077696c6c2062652072656a65637465642e8501546869732065787472696e73696320697320646f6e652061732074656d706f7261727920736f6c7574696f6e20666f7220584f526c657373207472616e73666572732c20696e2066757475726520697420776f756c642062652072656d6f7665640d01616e64206c6f67696320666f7220584f526c6573732065787472696e736963732073686f756c64206265206d6f76656420746f20786f722d6665652070616c6c65742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e9d050c18636f6d6d6f6e2c737761705f616d6f756e742853776170416d6f756e740428416d6f756e745479706501180108405769746844657369726564496e707574080144646573697265645f616d6f756e745f696e180128416d6f756e74547970650001386d696e5f616d6f756e745f6f7574180128416d6f756e74547970650000004457697468446573697265644f7574707574080148646573697265645f616d6f756e745f6f7574180128416d6f756e74547970650001346d61785f616d6f756e745f696e180128416d6f756e745479706500010000a105000002790100a5050c18636f6d6d6f6e287072696d6974697665732846696c7465724d6f646500010c2044697361626c656400000038466f7262696453656c656374656400010034416c6c6f7753656c656374656400020000a905000002ad0500ad05083c6c69717569646974795f70726f787934537761704261746368496e666f0c1c41737365744964010d011444455849640110244163636f756e7449640100001001406f7574636f6d655f61737365745f69640d01011c4173736574496400014c6f7574636f6d655f61737365745f726575736518011c42616c616e63650001186465785f69641001144445584964000124726563656976657273b10501845665633c42617463685265636569766572496e666f3c4163636f756e7449643e3e0000b105000002b50500b505083c6c69717569646974795f70726f78794442617463685265636569766572496e666f04244163636f756e7449640100000801286163636f756e745f69640001244163636f756e7449640001347461726765745f616d6f756e7418011c42616c616e63650000b9050c4470616c6c65745f636f6c6c6563746976651870616c6c65741043616c6c08045400044900011c2c7365745f6d656d626572730c012c6e65775f6d656d62657273510201445665633c543a3a4163636f756e7449643e0001147072696d65350201504f7074696f6e3c543a3a4163636f756e7449643e0001246f6c645f636f756e7410012c4d656d626572436f756e74000080805365742074686520636f6c6c6563746976652773206d656d626572736869702e0045012d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee02d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e59012d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652e205573656420666f7250202077656967687420657374696d6174696f6e2e0054526571756972657320726f6f74206f726967696e2e0051014e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c2062757421012020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002823205741524e494e473a005901546865206070616c6c65742d636f6c6c656374697665602063616e20616c736f206265206d616e61676564206279206c6f676963206f757473696465206f66207468652070616c6c6574207468726f75676820746865b8696d706c656d656e746174696f6e206f6620746865207472616974205b604368616e67654d656d62657273605d2e5501416e792063616c6c20746f20607365745f6d656d6265727360206d757374206265206361726566756c207468617420746865206d656d6265722073657420646f65736e277420676574206f7574206f662073796e63a477697468206f74686572206c6f676963206d616e6167696e6720746865206d656d626572207365742e002823203c7765696768743e24232320576569676874502d20604f284d50202b204e29602077686572653ae020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299820202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e64656429142d2044423a510120202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e67207468652c202020206d656d62657273ec20202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c73450120202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c5d0120202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e652c23203c2f7765696768743e1c6578656375746508012070726f706f73616cd904017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e64e502010c75333200012cf0446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00a84f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002823203c7765696768743e2423232057656967687455012d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e673020206070726f706f73616c60d42d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c60242d2031206576656e742c23203c2f7765696768743e1c70726f706f73650c01247468726573686f6c64e502012c4d656d626572436f756e7400012070726f706f73616cd904017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e64e502010c75333200026cf84164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e00845265717569726573207468652073656e64657220746f206265206d656d6265722e004101607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c20326029546f722070757420757020666f7220766f74696e672e002823203c7765696768743e24232320576569676874ac2d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c420202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af4202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029fc202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d20326029142d2044423ab420202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029a820202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0901202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029b8202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029d82020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e42020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029cc2020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029bc2020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d2960292c20202d2031206576656e742c23203c2f7765696768743e10766f74650c012070726f706f73616c2c011c543a3a48617368000114696e646578e502013450726f706f73616c496e64657800011c617070726f7665bc0110626f6f6c00033cf041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e008c5265717569726573207468652073656e64657220746f2062652061206d656d6265722e0049015472616e73616374696f6e20666565732077696c6c2062652077616976656420696620746865206d656d62657220697320766f74696e67206f6e20616e7920706172746963756c61722070726f706f73616c5101666f72207468652066697273742074696d6520616e64207468652063616c6c206973207375636365737366756c2e2053756273657175656e7420766f7465206368616e6765732077696c6c206368617267652061106665652e2823203c7765696768743e2423232057656967687409012d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429142d2044423aac20202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029b820202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d296029242d2031206576656e742c23203c2f7765696768743e40636c6f73655f6f6c645f77656967687410013470726f706f73616c5f686173682c011c543a3a48617368000114696e646578e502013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e64bd0501244f6c645765696768740001306c656e6774685f626f756e64e502010c7533320004804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e4c646973617070726f76655f70726f706f73616c04013470726f706f73616c5f686173682c011c543a3a486173680005385901446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e741873746174652e00884d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e002c506172616d65746572733a1d012a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002823203c7765696768743edc436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73284442205765696768743a482a2052656164733a2050726f706f73616c739c2a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f662c23203c2f7765696768743e14636c6f736510013470726f706f73616c5f686173682c011c543a3a48617368000114696e646578e502013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e642001185765696768740001306c656e6774685f626f756e64e502010c7533320006804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ebd05000006c10500c105082873705f77656967687473244f6c645765696768740000040028010c7536340000c5050c4470616c6c65745f636f6c6c6563746976651870616c6c65741043616c6c08045400044900011c2c7365745f6d656d626572730c012c6e65775f6d656d62657273510201445665633c543a3a4163636f756e7449643e0001147072696d65350201504f7074696f6e3c543a3a4163636f756e7449643e0001246f6c645f636f756e7410012c4d656d626572436f756e74000080805365742074686520636f6c6c6563746976652773206d656d626572736869702e0045012d20606e65775f6d656d62657273603a20546865206e6577206d656d626572206c6973742e204265206e69636520746f2074686520636861696e20616e642070726f7669646520697420736f727465642ee02d20607072696d65603a20546865207072696d65206d656d6265722077686f736520766f74652073657473207468652064656661756c742e59012d20606f6c645f636f756e74603a2054686520757070657220626f756e6420666f72207468652070726576696f7573206e756d626572206f66206d656d6265727320696e2073746f726167652e205573656420666f7250202077656967687420657374696d6174696f6e2e0054526571756972657320726f6f74206f726967696e2e0051014e4f54453a20446f6573206e6f7420656e666f7263652074686520657870656374656420604d61784d656d6265727360206c696d6974206f6e2074686520616d6f756e74206f66206d656d626572732c2062757421012020202020207468652077656967687420657374696d6174696f6e732072656c79206f6e20697420746f20657374696d61746520646973706174636861626c65207765696768742e002823205741524e494e473a005901546865206070616c6c65742d636f6c6c656374697665602063616e20616c736f206265206d616e61676564206279206c6f676963206f757473696465206f66207468652070616c6c6574207468726f75676820746865b8696d706c656d656e746174696f6e206f6620746865207472616974205b604368616e67654d656d62657273605d2e5501416e792063616c6c20746f20607365745f6d656d6265727360206d757374206265206361726566756c207468617420746865206d656d6265722073657420646f65736e277420676574206f7574206f662073796e63a477697468206f74686572206c6f676963206d616e6167696e6720746865206d656d626572207365742e002823203c7765696768743e24232320576569676874502d20604f284d50202b204e29602077686572653ae020202d20604d60206f6c642d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429e020202d20604e60206e65772d6d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e646564299820202d206050602070726f706f73616c732d636f756e742028636f64652d626f756e64656429142d2044423a510120202d20312073746f72616765206d75746174696f6e2028636f64656320604f284d296020726561642c20604f284e29602077726974652920666f722072656164696e6720616e642077726974696e67207468652c202020206d656d62657273ec20202d20312073746f7261676520726561642028636f64656320604f285029602920666f722072656164696e67207468652070726f706f73616c73450120202d206050602073746f72616765206d75746174696f6e732028636f64656320604f284d29602920666f72207570646174696e672074686520766f74657320666f7220656163682070726f706f73616c5d0120202d20312073746f726167652077726974652028636f64656320604f283129602920666f722064656c6574696e6720746865206f6c6420607072696d656020616e642073657474696e6720746865206e6577206f6e652c23203c2f7765696768743e1c6578656375746508012070726f706f73616cd904017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e64e502010c75333200012cf0446973706174636820612070726f706f73616c2066726f6d2061206d656d626572207573696e672074686520604d656d62657260206f726967696e2e00a84f726967696e206d7573742062652061206d656d626572206f662074686520636f6c6c6563746976652e002823203c7765696768743e2423232057656967687455012d20604f284d202b2050296020776865726520604d60206d656d626572732d636f756e742028636f64652d626f756e6465642920616e642060506020636f6d706c6578697479206f66206469737061746368696e673020206070726f706f73616c60d42d2044423a203120726561642028636f64656320604f284d296029202b20444220616363657373206f66206070726f706f73616c60242d2031206576656e742c23203c2f7765696768743e1c70726f706f73650c01247468726573686f6c64e502012c4d656d626572436f756e7400012070726f706f73616cd904017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e0001306c656e6774685f626f756e64e502010c75333200026cf84164642061206e65772070726f706f73616c20746f2065697468657220626520766f746564206f6e206f72206578656375746564206469726563746c792e00845265717569726573207468652073656e64657220746f206265206d656d6265722e004101607468726573686f6c64602064657465726d696e65732077686574686572206070726f706f73616c60206973206578656375746564206469726563746c792028607468726573686f6c64203c20326029546f722070757420757020666f7220766f74696e672e002823203c7765696768743e24232320576569676874ac2d20604f2842202b204d202b2050312960206f7220604f2842202b204d202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c420202d206272616e6368696e6720697320696e666c75656e63656420627920607468726573686f6c64602077686572653af4202020202d20605031602069732070726f706f73616c20657865637574696f6e20636f6d706c65786974792028607468726573686f6c64203c20326029fc202020202d20605032602069732070726f706f73616c732d636f756e742028636f64652d626f756e646564292028607468726573686f6c64203e3d20326029142d2044423ab420202d20312073746f726167652072656164206069735f6d656d626572602028636f64656320604f284d296029f020202d20312073746f726167652072656164206050726f706f73616c4f663a3a636f6e7461696e735f6b6579602028636f64656320604f2831296029a820202d20444220616363657373657320696e666c75656e63656420627920607468726573686f6c64603a0901202020202d204549544845522073746f7261676520616363657373657320646f6e65206279206070726f706f73616c602028607468726573686f6c64203c20326029b8202020202d204f522070726f706f73616c20696e73657274696f6e2028607468726573686f6c64203c3d20326029d82020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c73602028636f64656320604f285032296029e42020202020202d20312073746f72616765206d75746174696f6e206050726f706f73616c436f756e74602028636f64656320604f2831296029cc2020202020202d20312073746f72616765207772697465206050726f706f73616c4f66602028636f64656320604f2842296029bc2020202020202d20312073746f726167652077726974652060566f74696e67602028636f64656320604f284d2960292c20202d2031206576656e742c23203c2f7765696768743e10766f74650c012070726f706f73616c2c011c543a3a48617368000114696e646578e502013450726f706f73616c496e64657800011c617070726f7665bc0110626f6f6c00033cf041646420616e20617965206f72206e617920766f746520666f72207468652073656e64657220746f2074686520676976656e2070726f706f73616c2e008c5265717569726573207468652073656e64657220746f2062652061206d656d6265722e0049015472616e73616374696f6e20666565732077696c6c2062652077616976656420696620746865206d656d62657220697320766f74696e67206f6e20616e7920706172746963756c61722070726f706f73616c5101666f72207468652066697273742074696d6520616e64207468652063616c6c206973207375636365737366756c2e2053756273657175656e7420766f7465206368616e6765732077696c6c206368617267652061106665652e2823203c7765696768743e2423232057656967687409012d20604f284d296020776865726520604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429142d2044423aac20202d20312073746f72616765207265616420604d656d62657273602028636f64656320604f284d296029b820202d20312073746f72616765206d75746174696f6e2060566f74696e67602028636f64656320604f284d296029242d2031206576656e742c23203c2f7765696768743e40636c6f73655f6f6c645f77656967687410013470726f706f73616c5f686173682c011c543a3a48617368000114696e646578e502013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e64bd0501244f6c645765696768740001306c656e6774685f626f756e64e502010c7533320004804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e4c646973617070726f76655f70726f706f73616c04013470726f706f73616c5f686173682c011c543a3a486173680005385901446973617070726f766520612070726f706f73616c2c20636c6f73652c20616e642072656d6f76652069742066726f6d207468652073797374656d2c207265676172646c657373206f66206974732063757272656e741873746174652e00884d7573742062652063616c6c65642062792074686520526f6f74206f726967696e2e002c506172616d65746572733a1d012a206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20746861742073686f756c6420626520646973617070726f7665642e002823203c7765696768743edc436f6d706c65786974793a204f285029207768657265205020697320746865206e756d626572206f66206d61782070726f706f73616c73284442205765696768743a482a2052656164733a2050726f706f73616c739c2a205772697465733a20566f74696e672c2050726f706f73616c732c2050726f706f73616c4f662c23203c2f7765696768743e14636c6f736510013470726f706f73616c5f686173682c011c543a3a48617368000114696e646578e502013450726f706f73616c496e64657800015470726f706f73616c5f7765696768745f626f756e642001185765696768740001306c656e6774685f626f756e64e502010c7533320006804d01436c6f7365206120766f746520746861742069732065697468657220617070726f7665642c20646973617070726f766564206f722077686f736520766f74696e6720706572696f642068617320656e6465642e0055014d61792062652063616c6c656420627920616e79207369676e6564206163636f756e7420696e206f7264657220746f2066696e69736820766f74696e6720616e6420636c6f7365207468652070726f706f73616c2e00490149662063616c6c6564206265666f72652074686520656e64206f662074686520766f74696e6720706572696f642069742077696c6c206f6e6c7920636c6f73652074686520766f7465206966206974206973bc68617320656e6f75676820766f74657320746f20626520617070726f766564206f7220646973617070726f7665642e00490149662063616c6c65642061667465722074686520656e64206f662074686520766f74696e6720706572696f642061627374656e74696f6e732061726520636f756e7465642061732072656a656374696f6e732501756e6c6573732074686572652069732061207072696d65206d656d6265722073657420616e6420746865207072696d65206d656d626572206361737420616e20617070726f76616c2e00610149662074686520636c6f7365206f7065726174696f6e20636f6d706c65746573207375636365737366756c6c79207769746820646973617070726f76616c2c20746865207472616e73616374696f6e206665652077696c6c5d016265207761697665642e204f746865727769736520657865637574696f6e206f662074686520617070726f766564206f7065726174696f6e2077696c6c206265206368617267656420746f207468652063616c6c65722e0061012b206070726f706f73616c5f7765696768745f626f756e64603a20546865206d6178696d756d20616d6f756e74206f662077656967687420636f6e73756d656420627920657865637574696e672074686520636c6f7365642470726f706f73616c2e61012b20606c656e6774685f626f756e64603a2054686520757070657220626f756e6420666f7220746865206c656e677468206f66207468652070726f706f73616c20696e2073746f726167652e20436865636b65642076696135016073746f726167653a3a726561646020736f206974206973206073697a655f6f663a3a3c7533323e2829203d3d203460206c6172676572207468616e207468652070757265206c656e6774682e002823203c7765696768743e24232320576569676874742d20604f2842202b204d202b205031202b20503229602077686572653ae020202d20604260206973206070726f706f73616c602073697a6520696e20627974657320286c656e6774682d6665652d626f756e64656429dc20202d20604d60206973206d656d626572732d636f756e742028636f64652d20616e6420676f7665726e616e63652d626f756e64656429c820202d20605031602069732074686520636f6d706c6578697479206f66206070726f706f73616c6020707265696d6167652ea420202d20605032602069732070726f706f73616c2d636f756e742028636f64652d626f756e64656429142d2044423a0d01202d20322073746f726167652072656164732028604d656d62657273603a20636f64656320604f284d29602c20605072696d65603a20636f64656320604f28312960295901202d2033206d75746174696f6e73202860566f74696e67603a20636f64656320604f284d29602c206050726f706f73616c4f66603a20636f64656320604f284229602c206050726f706f73616c73603a20636f6465632c202020604f285032296029dc202d20616e79206d75746174696f6e7320646f6e65207768696c6520657865637574696e67206070726f706f73616c6020286050316029402d20757020746f2033206576656e74732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec9050c4070616c6c65745f64656d6f63726163791870616c6c65741043616c6c0404540001481c70726f706f736508012070726f706f73616ccd050140426f756e64656443616c6c4f663c543e00011476616c7565fc013042616c616e63654f663c543e0000249c50726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e001501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737480686176652066756e647320746f20636f76657220746865206465706f7369742e00d42d206070726f706f73616c5f68617368603a205468652068617368206f66207468652070726f706f73616c20707265696d6167652e15012d206076616c7565603a2054686520616d6f756e74206f66206465706f73697420286d757374206265206174206c6561737420604d696e696d756d4465706f73697460292e0044456d697473206050726f706f736564602e187365636f6e6404012070726f706f73616ce502012450726f70496e646578000118b45369676e616c732061677265656d656e742077697468206120706172746963756c61722070726f706f73616c2e000101546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e64657211016d75737420686176652066756e647320746f20636f76657220746865206465706f7369742c20657175616c20746f20746865206f726967696e616c206465706f7369742e00c82d206070726f706f73616c603a2054686520696e646578206f66207468652070726f706f73616c20746f207365636f6e642e10766f74650801247265665f696e646578e502013c5265666572656e64756d496e646578000110766f74659d0101644163636f756e74566f74653c42616c616e63654f663c543e3e00021c3101566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3bb86f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00dc2d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f20766f746520666f722e842d2060766f7465603a2054686520766f746520636f6e66696775726174696f6e2e40656d657267656e63795f63616e63656c0401247265665f696e64657810013c5265666572656e64756d496e6465780003204d015363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d652c7265666572656e64756d2e00f8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c6c6174696f6e4f726967696e602e00d02d607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e003c5765696768743a20604f283129602e4065787465726e616c5f70726f706f736504012070726f706f73616ccd050140426f756e64656443616c6c4f663c543e0004182d015363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c2c7265666572656e64756d2e00e8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206045787465726e616c4f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e6465787465726e616c5f70726f706f73655f6d616a6f7269747904012070726f706f73616ccd050140426f756e64656443616c6c4f663c543e00052c55015363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c655c616e2065787465726e616c207265666572656e64756d2e00ec546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c4d616a6f726974794f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004901556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061987072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e00385765696768743a20604f283129606065787465726e616c5f70726f706f73655f64656661756c7404012070726f706f73616ccd050140426f756e64656443616c6c4f663c543e00062c45015363686564756c652061206e656761746976652d7475726e6f75742d62696173207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f807363686564756c6520616e2065787465726e616c207265666572656e64756d2e00e8546865206469737061746368206f6620746869732063616c6c206d757374206265206045787465726e616c44656661756c744f726967696e602e00d42d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c2e004901556e6c696b65206065787465726e616c5f70726f706f7365602c20626c61636b6c697374696e6720686173206e6f20656666656374206f6e207468697320616e64206974206d6179207265706c6163652061987072652d7363686564756c6564206065787465726e616c5f70726f706f7365602063616c6c2e00385765696768743a20604f2831296028666173745f747261636b0c013470726f706f73616c5f686173682c011048323536000134766f74696e675f706572696f64100138543a3a426c6f636b4e756d62657200011464656c6179100138543a3a426c6f636b4e756d6265720007404d015363686564756c65207468652063757272656e746c792065787465726e616c6c792d70726f706f736564206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c65646101696d6d6564696174656c792e204966207468657265206973206e6f2065787465726e616c6c792d70726f706f736564207265666572656e64756d2063757272656e746c792c206f72206966207468657265206973206f6e65e8627574206974206973206e6f742061206d616a6f726974792d63617272696573207265666572656e64756d207468656e206974206661696c732e00d0546865206469737061746368206f6620746869732063616c6c206d757374206265206046617374547261636b4f726967696e602e00f42d206070726f706f73616c5f68617368603a205468652068617368206f66207468652063757272656e742065787465726e616c2070726f706f73616c2e5d012d2060766f74696e675f706572696f64603a2054686520706572696f64207468617420697320616c6c6f77656420666f7220766f74696e67206f6e20746869732070726f706f73616c2e20496e6372656173656420746f88094d75737420626520616c776179732067726561746572207468616e207a65726f2e350109466f72206046617374547261636b4f726967696e60206d75737420626520657175616c206f722067726561746572207468616e206046617374547261636b566f74696e67506572696f64602e51012d206064656c6179603a20546865206e756d626572206f6620626c6f636b20616674657220766f74696e672068617320656e64656420696e20617070726f76616c20616e6420746869732073686f756c64206265b82020656e61637465642e205468697320646f65736e277420686176652061206d696e696d756d20616d6f756e742e0040456d697473206053746172746564602e00385765696768743a20604f28312960347665746f5f65787465726e616c04013470726f706f73616c5f686173682c011048323536000824b85665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e00d8546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520605665746f4f726967696e602e002d012d206070726f706f73616c5f68617368603a2054686520707265696d6167652068617368206f66207468652070726f706f73616c20746f207665746f20616e6420626c61636b6c6973742e003c456d69747320605665746f6564602e00fc5765696768743a20604f2856202b206c6f6728562929602077686572652056206973206e756d626572206f6620606578697374696e67207665746f657273604463616e63656c5f7265666572656e64756d0401247265665f696e646578e502013c5265666572656e64756d496e64657800091c5052656d6f76652061207265666572656e64756d2e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e00d42d20607265665f696e646578603a2054686520696e646578206f6620746865207265666572656e64756d20746f2063616e63656c2e004423205765696768743a20604f283129602e2064656c65676174650c0108746f0001504163636f756e7449644c6f6f6b75704f663c543e000128636f6e76696374696f6ed5050128436f6e76696374696f6e00011c62616c616e636518013042616c616e63654f663c543e000a50390144656c65676174652074686520766f74696e6720706f77657220287769746820736f6d6520676976656e20636f6e76696374696f6e29206f66207468652073656e64696e67206163636f756e742e0055015468652062616c616e63652064656c656761746564206973206c6f636b656420666f72206173206c6f6e6720617320697427732064656c6567617465642c20616e64207468657265616674657220666f7220746865c874696d6520617070726f70726961746520666f722074686520636f6e76696374696f6e2773206c6f636b20706572696f642e005d01546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e696e67206163636f756e74206d757374206569746865723a7420202d2062652064656c65676174696e6720616c72656164793b206f72590120202d2068617665206e6f20766f74696e67206163746976697479202869662074686572652069732c207468656e2069742077696c6c206e65656420746f2062652072656d6f7665642f636f6e736f6c69646174656494202020207468726f7567682060726561705f766f746560206f722060756e766f746560292e0045012d2060746f603a20546865206163636f756e742077686f736520766f74696e6720746865206074617267657460206163636f756e74277320766f74696e6720706f7765722077696c6c20666f6c6c6f772e55012d2060636f6e76696374696f6e603a2054686520636f6e76696374696f6e20746861742077696c6c20626520617474616368656420746f207468652064656c65676174656420766f7465732e205768656e20746865410120206163636f756e7420697320756e64656c6567617465642c207468652066756e64732077696c6c206265206c6f636b656420666f722074686520636f72726573706f6e64696e6720706572696f642e61012d206062616c616e6365603a2054686520616d6f756e74206f6620746865206163636f756e7427732062616c616e636520746f206265207573656420696e2064656c65676174696e672e2054686973206d757374206e6f74b420206265206d6f7265207468616e20746865206163636f756e7427732063757272656e742062616c616e63652e0048456d697473206044656c656761746564602e003d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173c82020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e28756e64656c6567617465000b30cc556e64656c65676174652074686520766f74696e6720706f776572206f66207468652073656e64696e67206163636f756e742e005d01546f6b656e73206d617920626520756e6c6f636b656420666f6c6c6f77696e67206f6e636520616e20616d6f756e74206f662074696d6520636f6e73697374656e74207769746820746865206c6f636b20706572696f64dc6f662074686520636f6e76696374696f6e2077697468207768696368207468652064656c65676174696f6e20776173206973737565642e004501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d7573742062655463757272656e746c792064656c65676174696e672e0050456d6974732060556e64656c656761746564602e003d015765696768743a20604f28522960207768657265205220697320746865206e756d626572206f66207265666572656e64756d732074686520766f7465722064656c65676174696e6720746f20686173c82020766f746564206f6e2e205765696768742069732063686172676564206173206966206d6178696d756d20766f7465732e58636c6561725f7075626c69635f70726f706f73616c73000c1470436c6561727320616c6c207075626c69632070726f706f73616c732e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f526f6f745f2e003c5765696768743a20604f283129602e18756e6c6f636b0401187461726765740001504163636f756e7449644c6f6f6b75704f663c543e000d1ca0556e6c6f636b20746f6b656e732074686174206861766520616e2065787069726564206c6f636b2e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e00b82d2060746172676574603a20546865206163636f756e7420746f2072656d6f766520746865206c6f636b206f6e2e00bc5765696768743a20604f2852296020776974682052206e756d626572206f6620766f7465206f66207461726765742e2c72656d6f76655f766f7465040114696e64657810013c5265666572656e64756d496e646578000e6c7c52656d6f7665206120766f746520666f722061207265666572656e64756d2e000c49663a882d20746865207265666572656e64756d207761732063616e63656c6c65642c206f727c2d20746865207265666572656e64756d206973206f6e676f696e672c206f72902d20746865207265666572656e64756d2068617320656e64656420737563682074686174fc20202d2074686520766f7465206f6620746865206163636f756e742077617320696e206f70706f736974696f6e20746f2074686520726573756c743b206f72d420202d20746865726520776173206e6f20636f6e76696374696f6e20746f20746865206163636f756e74277320766f74653b206f728420202d20746865206163636f756e74206d61646520612073706c697420766f74655d012e2e2e7468656e2074686520766f74652069732072656d6f76656420636c65616e6c7920616e64206120666f6c6c6f77696e672063616c6c20746f2060756e6c6f636b60206d617920726573756c7420696e206d6f72655866756e6473206265696e6720617661696c61626c652e00a849662c20686f77657665722c20746865207265666572656e64756d2068617320656e64656420616e643aec2d2069742066696e697368656420636f72726573706f6e64696e6720746f2074686520766f7465206f6620746865206163636f756e742c20616e64dc2d20746865206163636f756e74206d6164652061207374616e6461726420766f7465207769746820636f6e76696374696f6e2c20616e64bc2d20746865206c6f636b20706572696f64206f662074686520636f6e76696374696f6e206973206e6f74206f76657259012e2e2e7468656e20746865206c6f636b2077696c6c206265206167677265676174656420696e746f20746865206f766572616c6c206163636f756e742773206c6f636b2c207768696368206d617920696e766f6c766559012a6f7665726c6f636b696e672a20287768657265207468652074776f206c6f636b732061726520636f6d62696e656420696e746f20612073696e676c65206c6f636b207468617420697320746865206d6178696d756de46f6620626f74682074686520616d6f756e74206c6f636b656420616e64207468652074696d65206973206974206c6f636b656420666f72292e004901546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2c20616e6420746865207369676e6572206d7573742068617665206120766f7465887265676973746572656420666f72207265666572656e64756d2060696e646578602e00f42d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e0055015765696768743a20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2ed820205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652e4472656d6f76655f6f746865725f766f74650801187461726765740001504163636f756e7449644c6f6f6b75704f663c543e000114696e64657810013c5265666572656e64756d496e646578000f3c7c52656d6f7665206120766f746520666f722061207265666572656e64756d2e004d0149662074686520607461726765746020697320657175616c20746f20746865207369676e65722c207468656e20746869732066756e6374696f6e2069732065786163746c79206571756976616c656e7420746f2d016072656d6f76655f766f7465602e204966206e6f7420657175616c20746f20746865207369676e65722c207468656e2074686520766f7465206d757374206861766520657870697265642c5501656974686572206265636175736520746865207265666572656e64756d207761732063616e63656c6c65642c20626563617573652074686520766f746572206c6f737420746865207265666572656e64756d206f7298626563617573652074686520636f6e76696374696f6e20706572696f64206973206f7665722e00c8546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e004d012d2060746172676574603a20546865206163636f756e74206f662074686520766f746520746f2062652072656d6f7665643b2074686973206163636f756e74206d757374206861766520766f74656420666f725420207265666572656e64756d2060696e646578602ef42d2060696e646578603a2054686520696e646578206f66207265666572656e64756d206f662074686520766f746520746f2062652072656d6f7665642e0055015765696768743a20604f2852202b206c6f6720522960207768657265205220697320746865206e756d626572206f66207265666572656e646120746861742060746172676574602068617320766f746564206f6e2ed820205765696768742069732063616c63756c6174656420666f7220746865206d6178696d756d206e756d626572206f6620766f74652e24626c61636b6c69737408013470726f706f73616c5f686173682c01104832353600013c6d617962655f7265665f696e646578f101015c4f7074696f6e3c5265666572656e64756d496e6465783e00103c45015065726d616e656e746c7920706c61636520612070726f706f73616c20696e746f2074686520626c61636b6c6973742e20546869732070726576656e74732069742066726f6d2065766572206265696e673c70726f706f73656420616761696e2e00510149662063616c6c6564206f6e206120717565756564207075626c6963206f722065787465726e616c2070726f706f73616c2c207468656e20746869732077696c6c20726573756c7420696e206974206265696e67510172656d6f7665642e2049662074686520607265665f696e6465786020737570706c69656420697320616e20616374697665207265666572656e64756d2077697468207468652070726f706f73616c20686173682c687468656e2069742077696c6c2062652063616e63656c6c65642e00ec546865206469737061746368206f726967696e206f6620746869732063616c6c206d7573742062652060426c61636b6c6973744f726967696e602e00f82d206070726f706f73616c5f68617368603a205468652070726f706f73616c206861736820746f20626c61636b6c697374207065726d616e656e746c792e45012d20607265665f696e646578603a20416e206f6e676f696e67207265666572656e64756d2077686f73652068617368206973206070726f706f73616c5f68617368602c2077686963682077696c6c2062652863616e63656c6c65642e0041015765696768743a20604f28702960202874686f756768206173207468697320697320616e20686967682d70726976696c6567652064697370617463682c20776520617373756d65206974206861732061502020726561736f6e61626c652076616c7565292e3c63616e63656c5f70726f706f73616c04012870726f705f696e646578e502012450726f70496e64657800111c4852656d6f766520612070726f706f73616c2e000101546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265206043616e63656c50726f706f73616c4f726967696e602e00d02d206070726f705f696e646578603a2054686520696e646578206f66207468652070726f706f73616c20746f2063616e63656c2e00e45765696768743a20604f28702960207768657265206070203d205075626c696350726f70733a3a3c543e3a3a6465636f64655f6c656e282960042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ecd0510346672616d655f737570706f72741874726169747324707265696d616765731c426f756e64656404045401d904010c184c6567616379040110686173682c01104861736800000018496e6c696e650400d1050134426f756e646564496e6c696e65000100184c6f6f6b7570080110686173682c01104861736800010c6c656e10010c75333200020000d105101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e0000d5050c4070616c6c65745f64656d6f637261637928636f6e76696374696f6e28436f6e76696374696f6e00011c104e6f6e65000000204c6f636b65643178000100204c6f636b65643278000200204c6f636b65643378000300204c6f636b65643478000400204c6f636b65643578000500204c6f636b6564367800060000d9050c1c6465785f6170691870616c6c65741043616c6c0404540001085c656e61626c655f6c69717569646974795f736f75726365040118736f757263657901014c4c6971756964697479536f75726365547970650000006064697361626c655f6c69717569646974795f736f75726365040118736f757263657901014c4c6971756964697479536f7572636554797065000100042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632edd050c286574685f6272696467651870616c6c65741043616c6c0404540001443c72656769737465725f6272696467650c015c6272696467655f636f6e74726163745f616464726573734d03012845746841646472657373000134696e697469616c5f7065657273510201445665633c543a3a4163636f756e7449643e0001447369676e61747572655f76657273696f6ee10501584272696467655369676e617475726556657273696f6e0000185852656769737465722061206e6577206272696467652e002c506172616d65746572733a4d012d20606272696467655f636f6e74726163745f6164647265737360202d2061646472657373206f6620736d6172742d636f6e7472616374206465706c6f796564206f6e206120636f72726573706f6e64696e67206e6574776f726b2ecc2d2060696e697469616c5f706565727360202d206120736574206f6620696e697469616c206e6574776f726b2070656572732e246164645f617373657408012061737365745f69640d010130417373657449644f663c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00011cb841646420612054686973636861696e20617373657420746f20746865206272696467652077686974656c6973742e006c43616e206f6e6c792062652063616c6c656420627920726f6f742e002c506172616d65746572733aa82d206061737365745f696460202d2054686973636861696e206173736574206964656e7469666965722e1d012d20606e6574776f726b5f696460202d206e6574776f726b206964656e74696669657220746f207768696368207468652061737365742073686f756c642062652061646465642e4c6164645f73696465636861696e5f746f6b656e140134746f6b656e5f616464726573734d0301284574684164647265737300011873796d626f6cc9010118537472696e670001106e616d65c9010118537472696e67000120646563696d616c7308010875380001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000220b841646420612053696465636861696e20746f6b656e20746f20746865206272696467652077686974656c6973742e002c506172616d65746572733aac2d2060746f6b656e5f6164647265737360202d20746f6b656e20636f6e747261637420616464726573732e8c2d206073796d626f6c60202d20746f6b656e2073796d626f6c20287469636b6572292e582d20606e616d6560202d20746f6b656e206e616d652e802d2060646563696d616c7360202d2020746f6b656e20707265636973696f6e2e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e547472616e736665725f746f5f73696465636861696e10012061737365745f69640d010130417373657449644f663c543e000108746f4d03012845746841646472657373000118616d6f756e7418011c42616c616e63650001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000338f45472616e7366657220736f6d6520616d6f756e74206f662074686520676976656e20617373657420746f2053696465636861696e20616464726573732e0059014e6f74653a20696620746865206173736574206b696e64206973206053696465636861696e602c2074686520616d6f756e742073686f756c642066697420696e20746865206173736574277320707265636973696f6e49016f6e2073696465636861696e20286053696465636861696e4173736574507265636973696f6e602920776974686f7574206578747261206469676974732e20466f72206578616d706c652c20617373756d655901736f6d65204552432d323020286054602920746f6b656e206861732060646563696d616c733d36602c20616e642074686520636f72726573706f6e64696e67206173736574206f6e207375627374726174652068617355016037602e20416c69636527732062616c616e6365206f6e2074686973636861696e2069732060302e31303030303039602e20496620416c69636520776f756c642077616e7420746f207472616e7366657220616c6c5d0174686520616d6f756e742c207368652077696c6c2067657420616e206572726f7220604e6f6e5a65726f44757374602c2062656361757365206f6620746865206039602061742074686520656e642c20736f2c207468652d01636f727265637420616d6f756e7420776f756c642062652060302e3130303030306020286f6e6c792036206469676974732061667465722074686520646563696d616c20706f696e74292e002c506172616d65746572733a882d206061737365745f696460202d2074686973636861696e2061737365742069642e782d2060746f60202d2073696465636861696e206163636f756e742069642e842d2060616d6f756e7460202d20616d6f756e74206f66207468652061737365742e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e58726571756573745f66726f6d5f73696465636861696e0c012c6574685f74785f686173682c0110483235360001106b696e64e505014c496e636f6d696e67526571756573744b696e640001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0004180d014c6f616420696e636f6d696e6720726571756573742066726f6d2053696465636861696e2062792074686520676976656e207472616e73616374696f6e20686173682e002c506172616d65746572733ac02d20606574685f74785f6861736860202d207472616e73616374696f6e2068617368206f6e2053696465636861696e2e842d20606b696e6460202d20696e636f6d696e67207265717565737420747970652e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e6466696e616c697a655f696e636f6d696e675f72657175657374080110686173682c0110483235360001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00051c290146696e616c697a6520696e636f6d696e6720726571756573742028736565206050616c6c65743a3a66696e616c697a655f696e636f6d696e675f726571756573745f696e6e657260292e00a443616e206265206f6e6c792063616c6c65642066726f6d206120627269646765206163636f756e742e002c506172616d65746572733a882d20607265717565737460202d20616e20696e636f6d696e6720726571756573742e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e206164645f706565720c01286163636f756e745f6964000130543a3a4163636f756e74496400011c616464726573734d030128457468416464726573730001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0006189c4164642061206e6577207065657220746f2074686520627269646765207065657273207365742e002c506172616d65746572733aa42d20606163636f756e745f696460202d206163636f756e74206964206f6e2074686973636861696e2e982d20606164647265737360202d206163636f756e74206964206f6e2073696465636861696e2e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e2c72656d6f76655f706565720c01286163636f756e745f6964000130543a3a4163636f756e744964000130706565725f61646472657373f10501484f7074696f6e3c457468416464726573733e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000714a852656d6f766520706565722066726f6d207468652074686520627269646765207065657273207365742e002c506172616d65746572733aa42d20606163636f756e745f696460202d206163636f756e74206964206f6e2074686973636861696e2e902d20606e6574776f726b5f696460202d206e6574776f726b206964656e7469666965722e54707265706172655f666f725f6d6967726174696f6e0401286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0008189c507265706172652074686520676976656e2062726964676520666f72206d6967726174696f6e2e008c43616e206f6e6c792062652063616c6c656420627920616e20617574686f726974792e002c506172616d65746572733aac2d20606e6574776f726b5f696460202d20627269646765206e6574776f726b206964656e7469666965722e1c6d6967726174651001506e65775f636f6e74726163745f616464726573734d0301284574684164647265737300014c65726332305f6e61746976655f746f6b656e73a904013c5665633c457468416464726573733e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0001546e65775f7369676e61747572655f76657273696f6ee10501584272696467655369676e617475726556657273696f6e000920c44d6967726174652074686520676976656e2062726964676520746f2061206e657720736d6172742d636f6e74726163742e008c43616e206f6e6c792062652063616c6c656420627920616e20617574686f726974792e002c506172616d65746572733ae82d20606e65775f636f6e74726163745f6164647265737360202d206e65772073696465636861696e206f636e747261637420616464726573732eb82d206065726332305f6e61746976655f746f6b656e7360202d206d6967726174656420617373657473206964732eac2d20606e6574776f726b5f696460202d20627269646765206e6574776f726b206964656e7469666965722e6472656769737465725f696e636f6d696e675f72657175657374040140696e636f6d696e675f72657175657374f5050148496e636f6d696e67526571756573743c543e000a18f052656769737465722074686520676976656e20696e636f6d696e67207265717565737420616e642061646420697420746f207468652071756575652e00610143616c6c73206076616c69646174656020616e6420607072657061726560206f6e2074686520726571756573742c206164647320697420746f2074686520717565756520616e64206d6170732069742077697468207468654101636f72726573706f6e64696e67206c6f61642d696e636f6d696e672d7265717565737420616e642072656d6f76657320746865206c6f61642d726571756573742066726f6d207468652071756575652e009c43616e206f6e6c792062652063616c6c6564206279206120627269646765206163636f756e742e5c696d706f72745f696e636f6d696e675f726571756573740801546c6f61645f696e636f6d696e675f726571756573744d0601584c6f6164496e636f6d696e67526571756573743c543e00015c696e636f6d696e675f726571756573745f726573756c74590601a4526573756c743c496e636f6d696e67526571756573743c543e2c2044697370617463684572726f723e000b1888496d706f72742074686520676976656e20696e636f6d696e6720726571756573742e0051015265676973746572277320746865206c6f616420726571756573742c207468656e2072656769737465727320616e642066696e616c697a65732074686520696e636f6d696e672072657175657374206966206974b47375636365656465642c206f74686572776973652061626f72747320746865206c6f616420726571756573742e009c43616e206f6e6c792062652063616c6c6564206279206120627269646765206163636f756e742e3c617070726f76655f726571756573741001286f63775f7075626c69632503013465636473613a3a5075626c6963000110686173682c0110483235360001407369676e61747572655f706172616d735d06013c5369676e6174757265506172616d730001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000c102501417070726f76652074686520676976656e206f7574676f696e6720726571756573742e205468652066756e6374696f6e2069732075736564206279206272696467652070656572732e004d015665726966696573207468652070656572207369676e6174757265206f662074686520676976656e207265717565737420616e64206164647320697420746f206052657175657374417070726f76616c73602e51014f6e63652071756f72756d20697320636f6c6c65637465642c20746865207265717565737420676574732066696e616c697a656420616e642072656d6f7665642066726f6d20726571756573742071756575652e3461626f72745f726571756573740c0110686173682c0110483235360001146572726f7260013444697370617463684572726f720001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000d187443616e63656c732061207265676973746572656420726571756573742e0045014c6f61647320726571756573742062792074686520676976656e206068617368602c2063616e63656c732069742c206368616e676573206974732073746174757320746f20604661696c65646020616e648c72656d6f7665732069742066726f6d207468652072657175657374207175657565732e00a443616e206f6e6c792062652063616c6c65642066726f6d206120627269646765206163636f756e742e38666f7263655f6164645f706565720c010c77686f000130543a3a4163636f756e74496400011c616464726573734d030128457468416464726573730001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000e0cf84164642074686520676976656e207065657220746f207468652070656572732073657420776974686f7574206164646974696f6e616c20636865636b732e009443616e206f6e6c792062652063616c6c6564206279206120726f6f74206163636f756e742e5872656d6f76655f73696465636861696e5f617373657408012061737365745f69640d010130417373657449644f663c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000f0c3052656d6f7665206173736574006c43616e206f6e6c792062652063616c6c656420627920726f6f742e8472656769737465725f6578697374696e675f73696465636861696e5f61737365740c012061737365745f69640d010130417373657449644f663c543e000134746f6b656e5f616464726573734d030128457468416464726573730001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00100c5c5265676973746572206578697374696e67206173736574006c43616e206f6e6c792062652063616c6c656420627920726f6f742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee10508286574685f627269646765584272696467655369676e617475726556657273696f6e00010c08563100000008563200010008563300020000e5050c286574685f6272696467652072657175657374734c496e636f6d696e67526571756573744b696e640001082c5472616e73616374696f6e0400e9050178496e636f6d696e675472616e73616374696f6e526571756573744b696e64000000104d6574610400ed05015c496e636f6d696e674d657461526571756573744b696e6400010000e9050c286574685f62726964676520726571756573747378496e636f6d696e675472616e73616374696f6e526571756573744b696e64000124205472616e736665720000002041646441737365740001001c416464506565720002002852656d6f7665506565720003004c50726570617265466f724d6967726174696f6e0004001c4d6967726174650005003441646450656572436f6d7061740006004052656d6f766550656572436f6d7061740007002c5472616e73666572584f5200080000ed050c286574685f6272696467652072657175657374735c496e636f6d696e674d657461526571756573744b696e640001085443616e63656c4f7574676f696e6752657175657374000000284d61726b4173446f6e6500010000f10504184f7074696f6e040454014d030108104e6f6e6500000010536f6d6504004d030000010000f5050c286574685f6272696467652072657175657374733c496e636f6d696e6752657175657374040454000120205472616e736665720400f905014c496e636f6d696e675472616e736665723c543e00000020416464546f6b656e04000106014c496e636f6d696e67416464546f6b656e3c543e0001002c4368616e67655065657273040005060158496e636f6d696e674368616e676550656572733c543e0002005443616e63656c4f7574676f696e6752657175657374040009060180496e636f6d696e6743616e63656c4f7574676f696e67526571756573743c543e000300284d61726b4173446f6e65040039060170496e636f6d696e674d61726b4173446f6e65526571756573743c543e0004004c50726570617265466f724d6967726174696f6e04003d060178496e636f6d696e6750726570617265466f724d6967726174696f6e3c543e0005001c4d696772617465040041060148496e636f6d696e674d6967726174653c543e000600444368616e67655065657273436f6d706174040045060170496e636f6d696e674368616e67655065657273436f6d7061743c543e00070000f90510286574685f62726964676520726571756573747320696e636f6d696e6740496e636f6d696e675472616e7366657204045400002c011066726f6d4d03012845746841646472657373000108746f000130543a3a4163636f756e74496400012061737365745f69640d010130417373657449644f663c543e00012861737365745f6b696e64fd05012441737365744b696e64000118616d6f756e7418011c42616c616e6365000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00013c73686f756c645f74616b655f666565bc0110626f6f6c0000fd050c286574685f6272696467652072657175657374732441737365744b696e6400010c2454686973636861696e0000002453696465636861696e0001003853696465636861696e4f776e656400020000010610286574685f62726964676520726571756573747320696e636f6d696e6740496e636f6d696e67416464546f6b656e0404540000280134746f6b656e5f616464726573734d0301284574684164647265737300012061737365745f69640d010128543a3a41737365744964000124707265636973696f6e08014042616c616e6365507265636973696f6e00011873796d626f6c2901012c417373657453796d626f6c0001106e616d653101012441737365744e616d65000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000050610286574685f62726964676520726571756573747320696e636f6d696e674c496e636f6d696e674368616e67655065657273040454000020013c706565725f6163636f756e745f6964350201504f7074696f6e3c543a3a4163636f756e7449643e000130706565725f616464726573734d0301284574684164647265737300011c72656d6f766564bc0110626f6f6c000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000090610286574685f62726964676520726571756573747320696e636f6d696e6774496e636f6d696e6743616e63656c4f7574676f696e675265717565737404045400002401406f7574676f696e675f726571756573740d0601484f7574676f696e67526571756573743c543e0001546f7574676f696e675f726571756573745f686173682c011048323536000150696e697469616c5f726571756573745f686173682c01104832353600012074785f696e70757430011c5665633c75383e000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00000d060c286574685f6272696467652072657175657374733c4f7574676f696e6752657175657374040454000124205472616e7366657204001106014c4f7574676f696e675472616e736665723c543e00000020416464417373657404001506014c4f7574676f696e6741646441737365743c543e00010020416464546f6b656e04001906014c4f7574676f696e67416464546f6b656e3c543e0002001c4164645065657204001d0601484f7574676f696e67416464506565723c543e0003002852656d6f7665506565720400210601544f7574676f696e6752656d6f7665506565723c543e0004004c50726570617265466f724d6967726174696f6e0400290601784f7574676f696e6750726570617265466f724d6967726174696f6e3c543e0005001c4d69677261746504002d0601484f7574676f696e674d6967726174653c543e0006003441646450656572436f6d7061740400310601604f7574676f696e6741646450656572436f6d7061743c543e0007004052656d6f766550656572436f6d70617404003506016c4f7574676f696e6752656d6f766550656572436f6d7061743c543e00080000110610286574685f627269646765207265717565737473206f7574676f696e67404f7574676f696e675472616e7366657204045400001c011066726f6d000130543a3a4163636f756e744964000108746f4d0301284574684164647265737300012061737365745f69640d010130417373657449644f663c543e000118616d6f756e7418011c42616c616e63650001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000150610286574685f627269646765207265717565737473206f7574676f696e67404f7574676f696e6741646441737365740404540000140118617574686f72000130543a3a4163636f756e74496400012061737365745f69640d010130417373657449644f663c543e0001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000190610286574685f627269646765207265717565737473206f7574676f696e67404f7574676f696e67416464546f6b656e0404540000200118617574686f72000130543a3a4163636f756e744964000134746f6b656e5f616464726573734d0301284574684164647265737300011873796d626f6cc9010118537472696e670001106e616d65c9010118537472696e67000120646563696d616c7308010875380001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e00001d0610286574685f627269646765207265717565737473206f7574676f696e673c4f7574676f696e67416464506565720404540000180118617574686f72000130543a3a4163636f756e744964000130706565725f616464726573734d0301284574684164647265737300013c706565725f6163636f756e745f6964000130543a3a4163636f756e7449640001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000210610286574685f627269646765207265717565737473206f7574676f696e67484f7574676f696e6752656d6f76655065657204045400001c0118617574686f72000130543a3a4163636f756e74496400013c706565725f6163636f756e745f6964000130543a3a4163636f756e744964000130706565725f616464726573734d030128457468416464726573730001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e00012c636f6d7061745f68617368250601304f7074696f6e3c483235363e0000250604184f7074696f6e040454012c0108104e6f6e6500000010536f6d6504002c0000010000290610286574685f627269646765207265717565737473206f7574676f696e676c4f7574676f696e6750726570617265466f724d6967726174696f6e0404540000100118617574686f72000130543a3a4163636f756e7449640001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e00002d0610286574685f627269646765207265717565737473206f7574676f696e673c4f7574676f696e674d69677261746504045400001c0118617574686f72000130543a3a4163636f756e7449640001506e65775f636f6e74726163745f616464726573734d0301284574684164647265737300014c65726332305f6e61746976655f746f6b656e73a904013c5665633c457468416464726573733e0001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001546e65775f7369676e61747572655f76657273696f6ee10501584272696467655369676e617475726556657273696f6e0000310610286574685f627269646765207265717565737473206f7574676f696e67544f7574676f696e6741646450656572436f6d7061740404540000180118617574686f72000130543a3a4163636f756e744964000130706565725f616464726573734d0301284574684164647265737300013c706565725f6163636f756e745f6964000130543a3a4163636f756e7449640001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000350610286574685f627269646765207265717565737473206f7574676f696e67604f7574676f696e6752656d6f766550656572436f6d7061740404540000180118617574686f72000130543a3a4163636f756e74496400013c706565725f6163636f756e745f6964000130543a3a4163636f756e744964000130706565725f616464726573734d030128457468416464726573730001146e6f6e6365100120543a3a496e6465780001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00012474696d65706f696e7494014842726964676554696d65706f696e743c543e0000390610286574685f62726964676520726571756573747320696e636f6d696e6764496e636f6d696e674d61726b4173446f6e655265717565737404045400001801546f7574676f696e675f726571756573745f686173682c011048323536000150696e697469616c5f726571756573745f686173682c011048323536000118617574686f72000130543a3a4163636f756e74496400012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e00003d0610286574685f62726964676520726571756573747320696e636f6d696e676c496e636f6d696e6750726570617265466f724d6967726174696f6e0404540000140118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000410610286574685f62726964676520726571756573747320696e636f6d696e673c496e636f6d696e674d69677261746504045400001801506e65775f636f6e74726163745f616464726573734d03012845746841646472657373000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000450610286574685f62726964676520726571756573747320696e636f6d696e6764496e636f6d696e674368616e67655065657273436f6d706174040454000024013c706565725f6163636f756e745f6964000130543a3a4163636f756e744964000130706565725f616464726573734d030128457468416464726573730001146164646564bc0110626f6f6c000120636f6e74726163744906014c4368616e67655065657273436f6e7472616374000118617574686f72000130543a3a4163636f756e74496400011c74785f686173682c01104832353600012461745f68656967687428010c75363400012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e0000490610286574685f62726964676520726571756573747320696e636f6d696e674c4368616e67655065657273436f6e74726163740001080c584f520000000c56414c000100004d060c286574685f6272696467652072657175657374734c4c6f6164496e636f6d696e67526571756573740404540001082c5472616e73616374696f6e0400510601844c6f6164496e636f6d696e675472616e73616374696f6e526571756573743c543e000000104d6574610800550601684c6f6164496e636f6d696e674d657461526571756573743c543e00002c0110483235360001000051060c286574685f627269646765207265717565737473784c6f6164496e636f6d696e675472616e73616374696f6e526571756573740404540000140118617574686f72000130543a3a4163636f756e744964000110686173682c01104832353600012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001106b696e64e9050178496e636f6d696e675472616e73616374696f6e526571756573744b696e640001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000055060c286574685f6272696467652072657175657374735c4c6f6164496e636f6d696e674d657461526571756573740404540000140118617574686f72000130543a3a4163636f756e744964000110686173682c01104832353600012474696d65706f696e7494014842726964676554696d65706f696e743c543e0001106b696e64ed05015c496e636f6d696e674d657461526571756573744b696e640001286e6574776f726b5f69641001484272696467654e6574776f726b49643c543e000059060418526573756c7408045401f505044501600108084f6b0400f505000000000c45727204006000000100005d060c286574685f627269646765206f6666636861696e3c5369676e6174757265506172616d7300000c0104720401205b75383b2033325d000104730401205b75383b2033325d000104760801087538000061060c4870737761705f646973747269627574696f6e1870616c6c65741043616c6c0404540001043c636c61696d5f696e63656e74697665000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e65060c3c70616c6c65745f6d756c74697369671870616c6c65741043616c6c0404540001105061735f6d756c74695f7468726573686f6c645f310801446f746865725f7369676e61746f72696573510201445665633c543a3a4163636f756e7449643e00011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0000405101496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003d012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f662074686501016d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e00b8526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e002823203c7765696768743e19014f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d442d204442205765696768743a204e6f6e65482d20506c75732043616c6c205765696768742c23203c2f7765696768743e2061735f6d756c74691401247468726573686f6c64ed03010c7531360001446f746865725f7369676e61746f72696573510201445665633c543a3a4163636f756e7449643e00013c6d617962655f74696d65706f696e74690601844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0001286d61785f7765696768742001185765696768740001b45501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e001d014e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f20757365190160617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005901526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f746865727769736555016f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642cdc6d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002823203c7765696768743e502d20604f2853202b205a202b2043616c6c29602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e21012d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e6c2d2054686520776569676874206f6620746865206063616c6c602e4d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061206465706f7369741901202074616b656e20666f7220697473206c69666574696d65206f6620604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743abc202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dc0202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d482d20506c75732043616c6c205765696768742c23203c2f7765696768743e40617070726f76655f61735f6d756c74691401247468726573686f6c64ed03010c7531360001446f746865725f7369676e61746f72696573510201445665633c543a3a4163636f756e7449643e00013c6d617962655f74696d65706f696e74690601844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00012463616c6c5f686173680401205b75383b2033325d0001286d61785f77656967687420011857656967687400028c5501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e0035014e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e4d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061206465706f7369741901202074616b656e20666f7220697473206c69666574696d65206f6620604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743ab8202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dbc202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c23203c2f7765696768743e3c63616e63656c5f61735f6d756c74691001247468726573686f6c64ed03010c7531360001446f746865725f7369676e61746f72696573510201445665633c543a3a4163636f756e7449643e00012474696d65706f696e74b501016454696d65706f696e743c543a3a426c6f636b4e756d6265723e00012463616c6c5f686173680401205b75383b2033325d000368550143616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c4666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e5d012d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c787472616e73616374696f6e20666f7220746869732064697370617463682ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e302d204f6e65206576656e742e842d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e702d2053746f726167653a2072656d6f766573206f6e65206974656d2e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743af8202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e74fc202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e690604184f7074696f6e04045401b5010108104e6f6e6500000010536f6d650400b50100000100006d060c4070616c6c65745f7363686564756c65721870616c6c65741043616c6c040454000118207363686564756c651001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963710601a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00000470416e6f6e796d6f75736c79207363686564756c652061207461736b2e1863616e63656c0801107768656e100138543a3a426c6f636b4e756d626572000114696e64657810010c7533320001049443616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e387363686564756c655f6e616d656414010869640401205461736b4e616d650001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963710601a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000204585363686564756c652061206e616d6564207461736b2e3063616e63656c5f6e616d656404010869640401205461736b4e616d650003047843616e63656c2061206e616d6564207363686564756c6564207461736b2e387363686564756c655f61667465721001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963710601a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000414a8416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e002823203c7765696768743e5453616d65206173205b607363686564756c65605d2e2c23203c2f7765696768743e507363686564756c655f6e616d65645f616674657214010869640401205461736b4e616d650001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963710601a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000514905363686564756c652061206e616d6564207461736b20616674657220612064656c61792e002823203c7765696768743ec453616d65206173205b607363686564756c655f6e616d6564605d2853656c663a3a7363686564756c655f6e616d6564292e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e710604184f7074696f6e04045401bd010108104e6f6e6500000010536f6d650400bd01000001000075060c3c69726f68615f6d6967726174696f6e1870616c6c65741043616c6c0404540001041c6d6967726174650c013469726f68615f61646472657373c9010118537472696e6700014069726f68615f7075626c69635f6b6579c9010118537472696e6700013c69726f68615f7369676e6174757265c9010118537472696e67000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e79060c4470616c6c65745f6d656d626572736869701870616c6c65741043616c6c08045400044900011c286164645f6d656d62657204010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e00000c784164642061206d656d626572206077686f6020746f20746865207365742e009c4d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a4164644f726967696e602e3472656d6f76655f6d656d62657204010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e00010c8c52656d6f76652061206d656d626572206077686f602066726f6d20746865207365742e00a84d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52656d6f76654f726967696e602e2c737761705f6d656d62657208011872656d6f76650001504163636f756e7449644c6f6f6b75704f663c543e00010c6164640001504163636f756e7449644c6f6f6b75704f663c543e000214bc53776170206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f746865722060616464602e00a04d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a537761704f726967696e602e000d015072696d65206d656d62657273686970206973202a6e6f742a207061737365642066726f6d206072656d6f76656020746f2060616464602c20696620657874616e742e3472657365745f6d656d6265727304011c6d656d62657273510201445665633c543a3a4163636f756e7449643e00031055014368616e676520746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702e204265206e69636520616e64687061737320606d656d6265727360207072652d736f727465642e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a52657365744f726967696e602e286368616e67655f6b657904010c6e65770001504163636f756e7449644c6f6f6b75704f663c543e000414d453776170206f7574207468652073656e64696e67206d656d62657220666f7220736f6d65206f74686572206b657920606e6577602e00f04d6179206f6e6c792062652063616c6c65642066726f6d20605369676e656460206f726967696e206f6620612063757272656e74206d656d6265722e001d015072696d65206d656d62657273686970206973207061737365642066726f6d20746865206f726967696e206163636f756e7420746f20606e6577602c20696620657874616e742e247365745f7072696d6504010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e00050cbc53657420746865207072696d65206d656d6265722e204d75737420626520612063757272656e74206d656d6265722e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e2c636c6561725f7072696d6500060c9452656d6f766520746865207072696d65206d656d626572206966206974206578697374732e00a44d6179206f6e6c792062652063616c6c65642066726f6d2060543a3a5072696d654f726967696e602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e7d060c6470616c6c65745f656c656374696f6e735f70687261676d656e1870616c6c65741043616c6c04045400011810766f7465080114766f746573510201445665633c543a3a4163636f756e7449643e00011476616c7565fc013042616c616e63654f663c543e00005c5901566f746520666f72206120736574206f662063616e6469646174657320666f7220746865207570636f6d696e6720726f756e64206f6620656c656374696f6e2e20546869732063616e2062652063616c6c656420746fe07365742074686520696e697469616c20766f7465732c206f722075706461746520616c7265616479206578697374696e6720766f7465732e005d0155706f6e20696e697469616c20766f74696e672c206076616c75656020756e697473206f66206077686f6027732062616c616e6365206973206c6f636b656420616e642061206465706f73697420616d6f756e742069734d0172657365727665642e20546865206465706f736974206973206261736564206f6e20746865206e756d626572206f6620766f74657320616e642063616e2062652075706461746564206f7665722074696d652e004c5468652060766f746573602073686f756c643a4420202d206e6f7420626520656d7074792e550120202d206265206c657373207468616e20746865206e756d626572206f6620706f737369626c652063616e646964617465732e204e6f7465207468617420616c6c2063757272656e74206d656d6265727320616e6411012020202072756e6e6572732d75702061726520616c736f206175746f6d61746963616c6c792063616e6469646174657320666f7220746865206e65787420726f756e642e0049014966206076616c756560206973206d6f7265207468616e206077686f60277320667265652062616c616e63652c207468656e20746865206d6178696d756d206f66207468652074776f20697320757365642e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265207369676e65642e002c232323205761726e696e6700550149742069732074686520726573706f6e736962696c697479206f66207468652063616c6c657220746f202a2a4e4f542a2a20706c61636520616c6c206f662074686569722062616c616e636520696e746f20746865a86c6f636b20616e64206b65657020736f6d6520666f722066757274686572206f7065726174696f6e732e002823203c7765696768743e5101576520617373756d6520746865206d6178696d756d2077656967687420616d6f6e6720616c6c20332063617365733a20766f74655f657175616c2c20766f74655f6d6f726520616e6420766f74655f6c6573732e2c23203c2f7765696768743e3072656d6f76655f766f7465720001146c52656d6f766520606f726967696e60206173206120766f7465722e00b8546869732072656d6f76657320746865206c6f636b20616e642072657475726e7320746865206465706f7369742e00fc546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265207369676e656420616e64206265206120766f7465722e407375626d69745f63616e64696461637904013c63616e6469646174655f636f756e74e502010c75333200023c11015375626d6974206f6e6573656c6620666f722063616e6469646163792e204120666978656420616d6f756e74206f66206465706f736974206973207265636f726465642e005d01416c6c2063616e64696461746573206172652077697065642061742074686520656e64206f6620746865207465726d2e205468657920656974686572206265636f6d652061206d656d6265722f72756e6e65722d75702ccc6f72206c65617665207468652073797374656d207768696c65207468656972206465706f73697420697320736c61736865642e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265207369676e65642e002c232323205761726e696e67005d014576656e20696620612063616e64696461746520656e6473207570206265696e672061206d656d6265722c2074686579206d7573742063616c6c205b6043616c6c3a3a72656e6f756e63655f63616e646964616379605d5901746f20676574207468656972206465706f736974206261636b2e204c6f73696e67207468652073706f7420696e20616e20656c656374696f6e2077696c6c20616c77617973206c65616420746f206120736c6173682e002823203c7765696768743e0901546865206e756d626572206f662063757272656e742063616e64696461746573206d7573742062652070726f7669646564206173207769746e65737320646174612e2c23203c2f7765696768743e4872656e6f756e63655f63616e64696461637904012872656e6f756e63696e678106012852656e6f756e63696e670003484d0152656e6f756e6365206f6e65277320696e74656e74696f6e20746f20626520612063616e64696461746520666f7220746865206e65787420656c656374696f6e20726f756e642e203320706f74656e7469616c3c6f7574636f6d65732065786973743a0049012d20606f726967696e6020697320612063616e64696461746520616e64206e6f7420656c656374656420696e20616e79207365742e20496e207468697320636173652c20746865206465706f736974206973f02020756e72657365727665642c2072657475726e656420616e64206f726967696e2069732072656d6f76656420617320612063616e6469646174652e61012d20606f726967696e6020697320612063757272656e742072756e6e65722d75702e20496e207468697320636173652c20746865206465706f73697420697320756e72657365727665642c2072657475726e656420616e648c20206f726967696e2069732072656d6f76656420617320612072756e6e65722d75702e55012d20606f726967696e6020697320612063757272656e74206d656d6265722e20496e207468697320636173652c20746865206465706f73697420697320756e726573657276656420616e64206f726967696e2069735501202072656d6f7665642061732061206d656d6265722c20636f6e73657175656e746c79206e6f74206265696e6720612063616e64696461746520666f7220746865206e65787420726f756e6420616e796d6f72652e6101202053696d696c617220746f205b6072656d6f76655f6d656d626572605d2853656c663a3a72656d6f76655f6d656d626572292c206966207265706c6163656d656e742072756e6e657273206578697374732c20746865795901202061726520696d6d6564696174656c7920757365642e20496620746865207072696d652069732072656e6f756e63696e672c207468656e206e6f207072696d652077696c6c20657869737420756e74696c207468653420206e65787420726f756e642e004501546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265207369676e65642c20616e642068617665206f6e65206f66207468652061626f766520726f6c65732e002823203c7765696768743ee05468652074797065206f662072656e6f756e63696e67206d7573742062652070726f7669646564206173207769746e65737320646174612e2c23203c2f7765696768743e3472656d6f76655f6d656d6265720c010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e000128736c6173685f626f6e64bc0110626f6f6c000138726572756e5f656c656374696f6ebc0110626f6f6c000448590152656d6f7665206120706172746963756c6172206d656d6265722066726f6d20746865207365742e20546869732069732065666665637469766520696d6d6564696174656c7920616e642074686520626f6e64206f667c746865206f7574676f696e67206d656d62657220697320736c61736865642e005501496620612072756e6e65722d757020697320617661696c61626c652c207468656e2074686520626573742072756e6e65722d75702077696c6c2062652072656d6f76656420616e64207265706c616365732074686555016f7574676f696e67206d656d6265722e204f74686572776973652c2069662060726572756e5f656c656374696f6e60206973206074727565602c2061206e65772070687261676d656e20656c656374696f6e2069737c737461727465642c20656c73652c206e6f7468696e672068617070656e732e00590149662060736c6173685f626f6e64602069732073657420746f20747275652c2074686520626f6e64206f6620746865206d656d626572206265696e672072656d6f76656420697320736c61736865642e20456c73652c3c69742069732072657475726e65642e00b8546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520726f6f742e0041014e6f74652074686174207468697320646f6573206e6f7420616666656374207468652064657369676e6174656420626c6f636b206e756d626572206f6620746865206e65787420656c656374696f6e2e002823203c7765696768743e5101496620776520686176652061207265706c6163656d656e742c20776520757365206120736d616c6c207765696768742e20456c73652c2073696e63652074686973206973206120726f6f742063616c6c20616e64d077696c6c20676f20696e746f2070687261676d656e2c20776520617373756d652066756c6c20626c6f636b20666f72206e6f772e2c23203c2f7765696768743e50636c65616e5f646566756e63745f766f746572730801286e756d5f766f7465727310010c75333200012c6e756d5f646566756e637410010c7533320005284501436c65616e20616c6c20766f746572732077686f2061726520646566756e63742028692e652e207468657920646f206e6f7420736572766520616e7920707572706f736520617420616c6c292e20546865ac6465706f736974206f66207468652072656d6f76656420766f74657273206172652072657475726e65642e0001015468697320697320616e20726f6f742066756e6374696f6e20746f2062652075736564206f6e6c7920666f7220636c65616e696e67207468652073746174652e00b8546865206469737061746368206f726967696e206f6620746869732063616c6c206d75737420626520726f6f742e002823203c7765696768743e5d0154686520746f74616c206e756d626572206f6620766f7465727320616e642074686f736520746861742061726520646566756e6374206d7573742062652070726f7669646564206173207769746e65737320646174612e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e8106086470616c6c65745f656c656374696f6e735f70687261676d656e2852656e6f756e63696e6700010c184d656d6265720000002052756e6e657255700001002443616e6469646174650400e502010c7533320002000085060c387665737465645f726577617264731870616c6c65741043616c6c04045400012434636c61696d5f726577617264730000041901436c61696d20616c6c20617661696c61626c652050535741502072657761726473206279206163636f756e74207369676e696e672074686973207472616e73616374696f6e2e5c636c61696d5f63726f77646c6f616e5f7265776172647304012463726f77646c6f616e8906013043726f77646c6f616e546167000100387570646174655f7265776172647304011c726577617264738d0601dc42547265654d61703c543a3a4163636f756e7449642c2042547265654d61703c526577617264526561736f6e2c2042616c616e63653e3e0002004872656769737465725f63726f77646c6f616e14010c7461678906013043726f77646c6f616e54616700012c73746172745f626c6f636b100138543a3a426c6f636b4e756d6265720001186c656e677468100138543a3a426c6f636b4e756d62657200011c72657761726473690101705665633c28417373657449644f663c543e2c2042616c616e6365293e000134636f6e747269627574696f6e73d50101705665633c28543a3a4163636f756e7449642c2042616c616e6365293e00030038636c61696d5f756e6c6f636b656404012061737365745f69640d010130417373657449644f663c543e0004003c7665737465645f7472616e736665720801106465737400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001207363686564756c65e501015056657374696e675363686564756c654f663c543e000500607570646174655f76657374696e675f7363686564756c657308010c77686f00018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500014476657374696e675f7363686564756c6573a50601e0426f756e6465645665633c56657374696e675363686564756c654f663c543e2c20543a3a4d617856657374696e675363686564756c65733e00060024636c61696d5f666f7208012061737365745f69640d010130417373657449644f663c543e0001106465737400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500070088756e6c6f636b5f70656e64696e675f7363686564756c655f62795f6d616e616765720801106465737400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500013c66696c7465725f7363686564756c65e501015056657374696e675363686564756c654f663c543e000800042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e89060c18636f6d6d6f6e287072696d6974697665733043726f77646c6f616e54616700000400d10501c8426f756e6465645665633c75382c20436f6e73745533323c43524f57444c4f414e5f5441475f4d41585f4c454e4754483e3e00008d06042042547265654d617008044b010004560191060004009d060000009106042042547265654d617008044b01e1010456011800040095060000009506000002990600990600000408e10118009d06000002a10600a1060000040800910600a506101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401e501045300000400a90601185665633c543e0000a906000002e50100ad060c3c70616c6c65745f6964656e746974791870616c6c65741043616c6c04045400013c346164645f72656769737472617204011c6163636f756e740001504163636f756e7449644c6f6f6b75704f663c543e0000347841646420612072656769737472617220746f207468652073797374656d2e00fc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060543a3a5265676973747261724f726967696e602e00a82d20606163636f756e74603a20746865206163636f756e74206f6620746865207265676973747261722e0094456d6974732060526567697374726172416464656460206966207375636365737366756c2e002823203c7765696768743e25012d20604f2852296020776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e64656420616e6420636f64652d626f756e646564292e982d204f6e652073746f72616765206d75746174696f6e2028636f64656320604f28522960292e302d204f6e65206576656e742e2c23203c2f7765696768743e307365745f6964656e74697479040110696e666fb10601a4426f783c4964656e74697479496e666f3c543a3a4d61784164646974696f6e616c4669656c64733e3e00014c290153657420616e206163636f756e742773206964656e7469747920696e666f726d6174696f6e20616e6420726573657276652074686520617070726f707269617465206465706f7369742e005501496620746865206163636f756e7420616c726561647920686173206964656e7469747920696e666f726d6174696f6e2c20746865206465706f7369742069732074616b656e2061732070617274207061796d656e7450666f7220746865206e6577206465706f7369742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e008c2d2060696e666f603a20546865206964656e7469747920696e666f726d6174696f6e2e0088456d69747320604964656e7469747953657460206966207375636365737366756c2e002823203c7765696768743e442d20604f2858202b205827202b205229601d0120202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e64656429e020202d20776865726520605260206a756467656d656e74732d636f756e7420287265676973747261722d636f756e742d626f756e64656429802d204f6e652062616c616e63652072657365727665206f7065726174696f6e2e21012d204f6e652073746f72616765206d75746174696f6e2028636f6465632d7265616420604f285827202b205229602c20636f6465632d777269746520604f2858202b20522960292e302d204f6e65206576656e742e2c23203c2f7765696768743e207365745f7375627304011073756273390701645665633c28543a3a4163636f756e7449642c2044617461293e0002548c53657420746865207375622d6163636f756e7473206f66207468652073656e6465722e0055015061796d656e743a20416e79206167677265676174652062616c616e63652072657365727665642062792070726576696f757320607365745f73756273602063616c6c732077696c6c2062652072657475726e65642d01616e6420616e20616d6f756e7420605375624163636f756e744465706f736974602077696c6c20626520726573657276656420666f722065616368206974656d20696e206073756273602e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520612072656769737465726564246964656e746974792e00b02d206073756273603a20546865206964656e74697479277320286e657729207375622d6163636f756e74732e002823203c7765696768743e302d20604f2850202b20532960e420202d20776865726520605060206f6c642d737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292ed420202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e842d204174206d6f7374206f6e652062616c616e6365206f7065726174696f6e732e142d2044423adc20202d206050202b2053602073746f72616765206d75746174696f6e732028636f64656320636f6d706c657869747920604f2831296029bc20202d204f6e652073746f7261676520726561642028636f64656320636f6d706c657869747920604f28502960292ec020202d204f6e652073746f726167652077726974652028636f64656320636f6d706c657869747920604f28532960292ed020202d204f6e652073746f726167652d6578697374732028604964656e746974794f663a3a636f6e7461696e735f6b657960292e2c23203c2f7765696768743e38636c6561725f6964656e746974790003483901436c65617220616e206163636f756e742773206964656e7469747920696e666f20616e6420616c6c207375622d6163636f756e747320616e642072657475726e20616c6c206465706f736974732e00ec5061796d656e743a20416c6c2072657365727665642062616c616e636573206f6e20746865206163636f756e74206172652072657475726e65642e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520612072656769737465726564246964656e746974792e0098456d69747320604964656e74697479436c656172656460206966207375636365737366756c2e002823203c7765696768743e402d20604f2852202b2053202b20582960cc20202d20776865726520605260207265676973747261722d636f756e742028676f7665726e616e63652d626f756e646564292ed420202d2077686572652060536020737562732d636f756e742028686172642d20616e64206465706f7369742d626f756e646564292e210120202d20776865726520605860206164646974696f6e616c2d6669656c642d636f756e7420286465706f7369742d626f756e64656420616e6420636f64652d626f756e646564292e882d204f6e652062616c616e63652d756e72657365727665206f7065726174696f6e2ec82d206032602073746f7261676520726561647320616e64206053202b2032602073746f726167652064656c6574696f6e732e302d204f6e65206576656e742e2c23203c2f7765696768743e44726571756573745f6a756467656d656e740801247265675f696e646578e5020138526567697374726172496e64657800011c6d61785f666565fc013042616c616e63654f663c543e00045c94526571756573742061206a756467656d656e742066726f6d2061207265676973747261722e0055015061796d656e743a204174206d6f737420606d61785f666565602077696c6c20626520726573657276656420666f72207061796d656e7420746f2074686520726567697374726172206966206a756467656d656e7418676976656e2e003501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520615072656769737465726564206964656e746974792e001d012d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973207265717565737465642e55012d20606d61785f666565603a20546865206d6178696d756d206665652074686174206d617920626520706169642e20546869732073686f756c64206a757374206265206175746f2d706f70756c617465642061733a00306060606e6f636f6d70696c65b853656c663a3a7265676973747261727328292e676574287265675f696e646578292e756e7772617028292e6665650c60606000a4456d69747320604a756467656d656e7452657175657374656460206966207375636365737366756c2e002823203c7765696768743e342d20604f2852202b205829602e802d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2eb82d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2858202b205229602e302d204f6e65206576656e742e2c23203c2f7765696768743e3863616e63656c5f726571756573740401247265675f696e646578100138526567697374726172496e6465780005446843616e63656c20612070726576696f757320726571756573742e00f85061796d656e743a20412070726576696f75736c79207265736572766564206465706f7369742069732072657475726e6564206f6e20737563636573732e003501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206861766520615072656769737465726564206964656e746974792e0045012d20607265675f696e646578603a2054686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206e6f206c6f6e676572207265717565737465642e00ac456d69747320604a756467656d656e74556e72657175657374656460206966207375636365737366756c2e002823203c7765696768743e342d20604f2852202b205829602e802d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e882d204f6e652073746f72616765206d75746174696f6e20604f2852202b205829602e2c2d204f6e65206576656e742c23203c2f7765696768743e1c7365745f666565080114696e646578e5020138526567697374726172496e64657800010c666565fc013042616c616e63654f663c543e0006341901536574207468652066656520726571756972656420666f722061206a756467656d656e7420746f206265207265717565737465642066726f6d2061207265676973747261722e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a06f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f42d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e542d2060666565603a20746865206e6577206665652e002823203c7765696768743e242d20604f285229602e782d204f6e652073746f72616765206d75746174696f6e20604f285229602ee42d2042656e63686d61726b3a20372e333135202b2052202a20302e33323920c2b57320286d696e207371756172657320616e616c79736973292c23203c2f7765696768743e387365745f6163636f756e745f6964080114696e646578e5020138526567697374726172496e64657800010c6e65770001504163636f756e7449644c6f6f6b75704f663c543e000734bc4368616e676520746865206163636f756e74206173736f63696174656420776974682061207265676973747261722e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a06f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f42d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e702d20606e6577603a20746865206e6577206163636f756e742049442e002823203c7765696768743e242d20604f285229602e782d204f6e652073746f72616765206d75746174696f6e20604f285229602ee02d2042656e63686d61726b3a20382e383233202b2052202a20302e333220c2b57320286d696e207371756172657320616e616c79736973292c23203c2f7765696768743e287365745f6669656c6473080114696e646578e5020138526567697374726172496e6465780001186669656c6473410701384964656e746974794669656c6473000834a853657420746865206669656c6420696e666f726d6174696f6e20666f722061207265676973747261722e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74a06f6620746865207265676973747261722077686f736520696e6465782069732060696e646578602e00f42d2060696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f73652066656520697320746f206265207365742e0d012d20606669656c6473603a20746865206669656c64732074686174207468652072656769737472617220636f6e6365726e73207468656d73656c76657320776974682e002823203c7765696768743e242d20604f285229602e782d204f6e652073746f72616765206d75746174696f6e20604f285229602ee42d2042656e63686d61726b3a20372e343634202b2052202a20302e33323520c2b57320286d696e207371756172657320616e616c79736973292c23203c2f7765696768743e4470726f766964655f6a756467656d656e741001247265675f696e646578e5020138526567697374726172496e6465780001187461726765740001504163636f756e7449644c6f6f6b75704f663c543e0001246a756467656d656e744907015c4a756467656d656e743c42616c616e63654f663c543e3e0001206964656e746974792c011c543a3a48617368000950b850726f766964652061206a756467656d656e7420666f7220616e206163636f756e742773206964656e746974792e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420626520746865206163636f756e74b06f6620746865207265676973747261722077686f736520696e64657820697320607265675f696e646578602e0021012d20607265675f696e646578603a2074686520696e646578206f6620746865207265676973747261722077686f7365206a756467656d656e74206973206265696e67206d6164652e55012d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e747420207769746820612072656769737465726564206964656e746974792e49012d20606a756467656d656e74603a20746865206a756467656d656e74206f662074686520726567697374726172206f6620696e64657820607265675f696e646578602061626f75742060746172676574602e49012d20606964656e74697479603a205468652068617368206f6620746865205b604964656e74697479496e666f605d20666f72207468617420746865206a756467656d656e742069732070726f76696465642e0094456d69747320604a756467656d656e74476976656e60206966207375636365737366756c2e002823203c7765696768743e342d20604f2852202b205829602e842d204f6e652062616c616e63652d7472616e73666572206f7065726174696f6e2e942d20557020746f206f6e65206163636f756e742d6c6f6f6b7570206f7065726174696f6e2eb82d2053746f726167653a2031207265616420604f285229602c2031206d757461746520604f2852202b205829602e302d204f6e65206576656e742e2c23203c2f7765696768743e346b696c6c5f6964656e746974790401187461726765740001504163636f756e7449644c6f6f6b75704f663c543e000a4c410152656d6f766520616e206163636f756e742773206964656e7469747920616e64207375622d6163636f756e7420696e666f726d6174696f6e20616e6420736c61736820746865206465706f736974732e0061015061796d656e743a2052657365727665642062616c616e6365732066726f6d20607365745f737562736020616e6420607365745f6964656e74697479602061726520736c617368656420616e642068616e646c6564206279450160536c617368602e20566572696669636174696f6e2072657175657374206465706f7369747320617265206e6f742072657475726e65643b20746865792073686f756c642062652063616e63656c6c6564806d616e75616c6c79207573696e67206063616e63656c5f72657175657374602e00f8546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206d617463682060543a3a466f7263654f726967696e602e0055012d2060746172676574603a20746865206163636f756e742077686f7365206964656e7469747920746865206a756467656d656e742069732075706f6e2e2054686973206d75737420626520616e206163636f756e747420207769746820612072656769737465726564206964656e746974792e0094456d69747320604964656e746974794b696c6c656460206966207375636365737366756c2e002823203c7765696768743e442d20604f2852202b2053202b205829602e802d204f6e652062616c616e63652d72657365727665206f7065726174696f6e2e702d206053202b2032602073746f72616765206d75746174696f6e732e302d204f6e65206576656e742e2c23203c2f7765696768743e1c6164645f73756208010c7375620001504163636f756e7449644c6f6f6b75704f663c543e00011064617461bd06011044617461000b1cac4164642074686520676976656e206163636f756e7420746f207468652073656e646572277320737562732e005d015061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c20626520726570617472696174656438746f207468652073656e6465722e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656458737562206964656e74697479206f662060737562602e2872656e616d655f73756208010c7375620001504163636f756e7449644c6f6f6b75704f663c543e00011064617461bd06011044617461000c10cc416c74657220746865206173736f636961746564206e616d65206f662074686520676976656e207375622d6163636f756e742e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656458737562206964656e74697479206f662060737562602e2872656d6f76655f73756204010c7375620001504163636f756e7449644c6f6f6b75704f663c543e000d1cc052656d6f76652074686520676976656e206163636f756e742066726f6d207468652073656e646572277320737562732e005d015061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c20626520726570617472696174656438746f207468652073656e6465722e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652061207265676973746572656458737562206964656e74697479206f662060737562602e20717569745f737562000e288c52656d6f7665207468652073656e6465722061732061207375622d6163636f756e742e005d015061796d656e743a2042616c616e636520726573657276656420627920612070726576696f757320607365745f73756273602063616c6c20666f72206f6e65207375622077696c6c206265207265706174726961746564b4746f207468652073656e64657220282a6e6f742a20746865206f726967696e616c206465706f7369746f72292e006101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d7573742068617665206120726567697374657265643c73757065722d6964656e746974792e0045014e4f54453a20546869732073686f756c64206e6f74206e6f726d616c6c7920626520757365642c206275742069732070726f766964656420696e207468652063617365207468617420746865206e6f6e2d1101636f6e74726f6c6c6572206f6620616e206163636f756e74206973206d616c6963696f75736c7920726567697374657265642061732061207375622d6163636f756e742e04704964656e746974792070616c6c6574206465636c61726174696f6e2eb1060c3c70616c6c65745f6964656e74697479147479706573304964656e74697479496e666f04284669656c644c696d697400002401286164646974696f6e616cb5060190426f756e6465645665633c28446174612c2044617461292c204669656c644c696d69743e00011c646973706c6179bd060110446174610001146c6567616cbd0601104461746100010c776562bd0601104461746100011072696f74bd06011044617461000114656d61696cbd0601104461746100013c7067705f66696e6765727072696e74350701404f7074696f6e3c5b75383b2032305d3e000114696d616765bd0601104461746100011c74776974746572bd060110446174610000b506101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401b906045300000400310701185665633c543e0000b90600000408bd06bd0600bd060c3c70616c6c65745f6964656e746974791474797065731044617461000198104e6f6e6500000010526177300400c1060000010010526177310400c5060000020010526177320400c9060000030010526177330400cd060000040010526177340400400000050010526177350400d1060000060010526177360400d5060000070010526177370400d906000008001052617738040015010000090010526177390400dd0600000a001452617731300400e10600000b001452617731310400e50600000c001452617731320400e90600000d001452617731330400ed0600000e001452617731340400f10600000f001452617731350400f506000010001452617731360400c8000011001452617731370400f906000012001452617731380400fd060000130014526177313904000107000014001452617732300400f102000015001452617732310400050700001600145261773232040009070000170014526177323304000d070000180014526177323404001107000019001452617732350400150700001a001452617732360400190700001b0014526177323704001d0700001c001452617732380400210700001d001452617732390400250700001e001452617733300400290700001f0014526177333104002d0700002000145261773332040004000021002c426c616b6554776f323536040004000022001853686132353604000400002300244b656363616b323536040004000024002c53686154687265653235360400040000250000c106000003000000000800c506000003010000000800c906000003020000000800cd06000003030000000800d106000003050000000800d506000003060000000800d906000003070000000800dd06000003090000000800e1060000030a0000000800e5060000030b0000000800e9060000030c0000000800ed060000030d0000000800f1060000030e0000000800f5060000030f0000000800f906000003110000000800fd060000031200000008000107000003130000000800050700000315000000080009070000031600000008000d070000031700000008001107000003180000000800150700000319000000080019070000031a00000008001d070000031b000000080021070000031c000000080025070000031d000000080029070000031e00000008002d070000031f00000008003107000002b90600350704184f7074696f6e04045401f1020108104e6f6e6500000010536f6d650400f102000001000039070000023d07003d070000040800bd060041070c3c70616c6c65745f6964656e7469747914747970657320426974466c6167730404540145070004002801344964656e746974794669656c64000045070c3c70616c6c65745f6964656e74697479147479706573344964656e746974794669656c640001201c446973706c6179000100144c6567616c0002000c5765620004001052696f7400080014456d61696c0010003850677046696e6765727072696e7400200014496d6167650040001c547769747465720080000049070c3c70616c6c65745f6964656e74697479147479706573244a756467656d656e74041c42616c616e63650118011c1c556e6b6e6f776e0000001c46656550616964040018011c42616c616e636500010028526561736f6e61626c65000200244b6e6f776e476f6f64000300244f75744f6644617465000400284c6f775175616c697479000500244572726f6e656f7573000600004d070c1c6661726d696e671870616c6c65741043616c6c0404540001047c7365745f6c705f6d696e5f786f725f666f725f626f6e75735f72657761726404017c6e65775f6c705f6d696e5f786f725f666f725f626f6e75735f72657761726418011c42616c616e6365000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e51070c0c7873741870616c6c65741043616c6c04045400011c4c7365745f7265666572656e63655f61737365740401487265666572656e63655f61737365745f69640d010130417373657449644f663c543e00001429014368616e6765207265666572656e6365206173736574207768696368206973207573656420746f2064657465726d696e6520636f6c6c61746572616c206173736574732076616c75652e90496e74656e64656420746f20626520652e672e2c20737461626c65636f696e204441492e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642cf02d20607265666572656e63655f61737365745f6964603a206173736574206964206f6620746865206e6577207265666572656e63652061737365742e58656e61626c655f73796e7468657469635f61737365740c012061737365745f69640d010130417373657449644f663c543e0001407265666572656e63655f73796d626f6c01020124543a3a53796d626f6c0001246665655f726174696f3d01011446697865640001006072656769737465725f73796e7468657469635f617373657410013061737365745f73796d626f6c2901012c417373657453796d626f6c00012861737365745f6e616d653101012441737365744e616d650001407265666572656e63655f73796d626f6c01020124543a3a53796d626f6c0001246665655f726174696f3d01011446697865640002043501526567697374657220616e6420656e61626c65206e65772073796e746865746963206173736574207769746820607265666572656e63655f73796d626f6c602070726963652062696e64696e675c64697361626c655f73796e7468657469635f617373657404013c73796e7468657469635f61737365740d010130417373657449644f663c543e00031c6044697361626c652073796e7468657469632061737365742e008452656d6f7665732073796e7468657469632066726f6d2065786368616e67696e671101616e642072656d6f76657320585354506f6f6c206c697175696469747920736f7572636520666f7220636f72726573706f6e64696e672074726164696e6720706169722e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642ccc2d206073796e7468657469635f6173736574603a2073796e74686574696320617373657420696420746f2064697361626c652e5872656d6f76655f73796e7468657469635f617373657404013c73796e7468657469635f61737365740d010130417373657449644f663c543e000404f8456e746972656c792072656d6f76652073796e7468657469632061737365742028696e636c7564696e67206c696e6b65642073796d626f6c20696e666f295c7365745f73796e7468657469635f61737365745f66656508013c73796e7468657469635f61737365740d010130417373657449644f663c543e0001246665655f726174696f3d0101144669786564000520605365742073796e746865746963206173736574206665652e00590154686973206665652077696c6c206265207573656420746f2064657465726d696e652074686520616d6f756e74206f662073796e74686574696320626173652061737365742028652e672e205853542920746f206265986275726e6564207768656e207573657220627579732073796e7468657469632061737365742e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642cdc2d206073796e7468657469635f6173736574603a2073796e74686574696320617373657420696420746f207365742066656520666f722c51012d20606665655f726174696f603a2066656520726174696f207769746820707265636973696f6e203d2031382c20736f2031303030303030303030303030303030303030203d2031203d2031303025206665652e907365745f73796e7468657469635f626173655f61737365745f666c6f6f725f707269636504012c666c6f6f725f707269636518011c42616c616e6365000610b053657420666c6f6f7220707269636520666f72207468652073796e746865746963206261736520617373657400602d20606f726967696e603a20726f6f74206163636f756e74e42d2060666c6f6f725f7072696365603a20666c6f6f7220707269636520666f72207468652073796e7468657469632062617365206173736574042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e55070c3463657265735f7374616b696e671870616c6c65741043616c6c04045400010c1c6465706f736974040118616d6f756e7418011c42616c616e6365000000207769746864726177000100606368616e67655f726577617264735f72656d61696e696e67040144726577617264735f72656d61696e696e6718011c42616c616e63650002045c4368616e6765205265776172647352656d61696e696e67042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e59070c5863657265735f6c69717569646974795f6c6f636b65721870616c6c65741043616c6c040454000108386c6f636b5f6c697175696469747914011c61737365745f610d010130417373657449644f663c543e00011c61737365745f620d010130417373657449644f663c543e00014c756e6c6f636b696e675f74696d657374616d70280124543a3a4d6f6d656e7400016470657263656e746167655f6f665f706f6f6c5f746f6b656e7318011c42616c616e63650001186f7074696f6ebc0110626f6f6c000004384c6f636b206c6971756964697479406368616e67655f63657265735f66656504012463657265735f66656518011c42616c616e6365000104404368616e676520434552455320666565042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e5d070c4863657265735f746f6b656e5f6c6f636b65721870616c6c65741043616c6c04045400010c2c6c6f636b5f746f6b656e730c012061737365745f69640d010130417373657449644f663c543e00014c756e6c6f636b696e675f74696d657374616d70280124543a3a4d6f6d656e740001406e756d6265725f6f665f746f6b656e7318011c42616c616e63650000042c4c6f636b20746f6b656e733c77697468647261775f746f6b656e730c012061737365745f69640d010130417373657449644f663c543e00014c756e6c6f636b696e675f74696d657374616d70280124543a3a4d6f6d656e740001406e756d6265725f6f665f746f6b656e7318011c42616c616e63650001043c576974686472617720746f6b656e73286368616e67655f66656504011c6e65775f66656518011c42616c616e6365000204284368616e676520666565042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e61070c6463657265735f676f7665726e616e63655f706c6174666f726d1870616c6c65741043616c6c04045400010c10766f74650c011c706f6c6c5f69642c011048323536000134766f74696e675f6f7074696f6e10010c75333200013c6e756d6265725f6f665f766f74657318011c42616c616e636500000444566f74696e6720666f72206f7074696f6e2c6372656174655f706f6c6c180128706f6c6c5f61737365740d010130417373657449644f663c543e000150706f6c6c5f73746172745f74696d657374616d70280124543a3a4d6f6d656e74000148706f6c6c5f656e645f74696d657374616d70280124543a3a4d6f6d656e740001147469746c6519020170426f756e646564537472696e673c543a3a5469746c654c696d69743e00012c6465736372697074696f6e65070188426f756e646564537472696e673c543a3a4465736372697074696f6e4c696d69743e00011c6f7074696f6e736d0701e8426f756e6465645665633c426f756e646564537472696e673c543a3a537472696e674c696d69743e2c20543a3a4f7074696f6e734c696d69743e0001042c43726561746520706f6c6c20776974686472617704011c706f6c6c5f69642c01104832353600020454576974686472617720766f74696e672066756e6473042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e65070c18636f6d6d6f6e287072696d69746976657334426f756e646564537472696e6704044e0000040069070144426f756e6465645665633c75382c204e3e00006907101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e00006d07101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454016102045300000400710701185665633c543e0000710700000261020075070c3c63657265735f6c61756e63687061641870616c6c65741043616c6c040454000138286372656174655f696c6f580128626173655f61737365740d010130417373657449644f663c543e00012061737365745f69640d010130417373657449644f663c543e000138746f6b656e735f666f725f696c6f18011c42616c616e6365000150746f6b656e735f666f725f6c697175696469747918011c42616c616e6365000124696c6f5f707269636518011c42616c616e6365000120736f66745f63617018011c42616c616e6365000120686172645f63617018011c42616c616e63650001406d696e5f636f6e747269627574696f6e18011c42616c616e63650001406d61785f636f6e747269627574696f6e18011c42616c616e636500012c726566756e645f74797065bc0110626f6f6c0001446c69717569646974795f70657263656e7418011c42616c616e63650001346c697374696e675f707269636518011c42616c616e636500012c6c6f636b75705f6461797310010c75333200013c73746172745f74696d657374616d70280124543a3a4d6f6d656e74000134656e645f74696d657374616d70280124543a3a4d6f6d656e740001647465616d5f76657374696e675f746f74616c5f746f6b656e7318011c42616c616e63650001887465616d5f76657374696e675f66697273745f72656c656173655f70657263656e7418011c42616c616e636500014c7465616d5f76657374696e675f706572696f64280124543a3a4d6f6d656e740001507465616d5f76657374696e675f70657263656e7418011c42616c616e636500015466697273745f72656c656173655f70657263656e7418011c42616c616e636500013876657374696e675f706572696f64280124543a3a4d6f6d656e7400013c76657374696e675f70657263656e7418011c42616c616e63650000042843726561746520494c4f28636f6e7472696275746508012061737365745f69640d010130417373657449644f663c543e00014c66756e64735f746f5f636f6e7472696275746518011c42616c616e636500010428436f6e7472696275746548656d657267656e63795f776974686472617704012061737365745f69640d010130417373657449644f663c543e00020448456d657267656e63792077697468647261772866696e6973685f696c6f04012061737365745f69640d010130417373657449644f663c543e0003042846696e69736820494c4f3c636c61696d5f6c705f746f6b656e7304012061737365745f69640d010130417373657449644f663c543e0004043c436c61696d204c5020746f6b656e7314636c61696d04012061737365745f69640d010130417373657449644f663c543e00050430436c61696d20746f6b656e738c6368616e67655f6665655f70657263656e745f666f725f7261697365645f66756e647304012c6665655f70657263656e7418011c42616c616e6365000604d04368616e6765206665652070657263656e74206f6e207261697365642066756e647320696e207375636365737366756c20494c4f546368616e67655f63657265735f6275726e5f66656504012463657265735f66656518011c42616c616e6365000704544368616e6765204345524553206275726e20666565746368616e67655f63657265735f636f6e747269627574696f6e5f66656504012463657265735f66656518011c42616c616e6365000804744368616e676520434552455320636f6e747269627574696f6e206665654c636c61696d5f70737761705f726577617264730009044c436c61696d20505357415020726577617264736c6164645f77686974656c69737465645f636f6e7472696275746f7204012c636f6e7472696275746f720001384163636f756e7449644f663c543e000a046c4164642077686974656c697374656420636f6e7472696275746f727872656d6f76655f77686974656c69737465645f636f6e7472696275746f7204012c636f6e7472696275746f720001384163636f756e7449644f663c543e000b047852656d6f76652077686974656c697374656420636f6e7472696275746f72746164645f77686974656c69737465645f696c6f5f6f7267616e697a6572040134696c6f5f6f7267616e697a65720001384163636f756e7449644f663c543e000c04744164642077686974656c697374656420494c4f206f7267616e697a65728072656d6f76655f77686974656c69737465645f696c6f5f6f7267616e697a6572040134696c6f5f6f7267616e697a65720001384163636f756e7449644f663c543e000d048052656d6f76652077686974656c697374656420494c4f206f7267616e697a6572042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e79070c6064656d657465725f6661726d696e675f706c6174666f726d1870616c6c65741043616c6c04045400012c3872656769737465725f746f6b656e180128706f6f6c5f61737365740d010130417373657449644f663c543e00013c746f6b656e5f7065725f626c6f636b18011c42616c616e63650001406661726d735f616c6c6f636174696f6e18011c42616c616e63650001487374616b696e675f616c6c6f636174696f6e18011c42616c616e636500013c7465616d5f616c6c6f636174696f6e18011c42616c616e63650001307465616d5f6163636f756e740001384163636f756e7449644f663c543e00000468526567697374657220746f6b656e20666f72206661726d696e67206164645f706f6f6c1c0128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c0001286d756c7469706c69657210010c75333200012c6465706f7369745f66656518011c42616c616e636500011c69735f636f7265bc0110626f6f6c0001042041646420706f6f6c1c6465706f736974140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c000134706f6f6c65645f746f6b656e7318011c42616c616e63650002043c4465706f73697420746f20706f6f6c2c6765745f72657761726473100128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c0003042c4765742072657761726473207769746864726177140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e000134706f6f6c65645f746f6b656e7318011c42616c616e636500011c69735f6661726dbc0110626f6f6c0004042057697468647261772c72656d6f76655f706f6f6c100128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c0005042c52656d6f766520706f6f6c586368616e67655f706f6f6c5f6d756c7469706c696572140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c0001386e65775f6d756c7469706c69657210010c753332000604584368616e676520706f6f6c206d756c7469706c6965724c6368616e67655f746f74616c5f746f6b656e73140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c000130746f74616c5f746f6b656e7318011c42616c616e63650007044c4368616e676520746f74616c20746f6b656e732c6368616e67655f696e666f1801306368616e6765645f757365720001384163636f756e7449644f663c543e000128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c00012c706f6f6c5f746f6b656e7318011c42616c616e63650008042c4368616e676520696e666f5c6368616e67655f706f6f6c5f6465706f7369745f666565140128626173655f61737365740d010130417373657449644f663c543e000128706f6f6c5f61737365740d010130417373657449644f663c543e0001307265776172645f61737365740d010130417373657449644f663c543e00011c69735f6661726dbc0110626f6f6c00012c6465706f7369745f66656518011c42616c616e63650009045c4368616e676520706f6f6c206465706f73697420666565446368616e67655f746f6b656e5f696e666f180128706f6f6c5f61737365740d010130417373657449644f663c543e00013c746f6b656e5f7065725f626c6f636b18011c42616c616e63650001406661726d735f616c6c6f636174696f6e18011c42616c616e63650001487374616b696e675f616c6c6f636174696f6e18011c42616c616e636500013c7465616d5f616c6c6f636174696f6e18011c42616c616e63650001307465616d5f6163636f756e740001384163636f756e7449644f663c543e000a04444368616e676520746f6b656e20696e666f042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e7d070c4070616c6c65745f626167735f6c6973741870616c6c65741043616c6c0804540004490001081472656261670401286469736c6f63617465640001504163636f756e7449644c6f6f6b75704f663c543e00002859014465636c617265207468617420736f6d6520606469736c6f636174656460206163636f756e74206861732c207468726f7567682072657761726473206f722070656e616c746965732c2073756666696369656e746c7951016368616e676564206974732073636f726520746861742069742073686f756c642070726f7065726c792066616c6c20696e746f206120646966666572656e7420626167207468616e206974732063757272656e74106f6e652e001d01416e796f6e652063616e2063616c6c20746869732066756e6374696f6e2061626f757420616e7920706f74656e7469616c6c79206469736c6f6361746564206163636f756e742e00490157696c6c20616c7761797320757064617465207468652073746f7265642073636f7265206f6620606469736c6f63617465646020746f2074686520636f72726563742073636f72652c206261736564206f6e406053636f726550726f7669646572602e00d4496620606469736c6f63617465646020646f6573206e6f74206578697374732c2069742072657475726e7320616e206572726f722e3c7075745f696e5f66726f6e745f6f6604011c6c6967687465720001504163636f756e7449644c6f6f6b75704f663c543e000120d04d6f7665207468652063616c6c65722773204964206469726563746c7920696e2066726f6e74206f6620606c696768746572602e005901546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642063616e206f6e6c792062652063616c6c656420627920746865204964206f66a0746865206163636f756e7420676f696e6720696e2066726f6e74206f6620606c696768746572602e00344f6e6c7920776f726b73206966942d20626f7468206e6f646573206172652077697468696e207468652073616d65206261672cd02d20616e6420606f726967696e602068617320612067726561746572206053636f726560207468616e20606c696768746572602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e81070c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c65741043616c6c0404540001143c7375626d69745f756e7369676e65640801307261775f736f6c7574696f6e850701b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e00011c7769746e657373b5080158536f6c7574696f6e4f72536e617073686f7453697a65000038a45375626d6974206120736f6c7574696f6e20666f722074686520756e7369676e65642070686173652e00c8546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f6e6f6e655f5f2e003d0154686973207375626d697373696f6e20697320636865636b6564206f6e2074686520666c792e204d6f72656f7665722c207468697320756e7369676e656420736f6c7574696f6e206973206f6e6c79550176616c696461746564207768656e207375626d697474656420746f2074686520706f6f6c2066726f6d20746865202a2a6c6f63616c2a2a206e6f64652e204566666563746976656c792c2074686973206d65616e735d0174686174206f6e6c79206163746976652076616c696461746f72732063616e207375626d69742074686973207472616e73616374696f6e207768656e20617574686f72696e67206120626c6f636b202873696d696c617240746f20616e20696e686572656e74292e005901546f2070726576656e7420616e7920696e636f727265637420736f6c7574696f6e2028616e642074687573207761737465642074696d652f776569676874292c2074686973207472616e73616374696f6e2077696c6c4d0170616e69632069662074686520736f6c7574696f6e207375626d6974746564206279207468652076616c696461746f7220697320696e76616c696420696e20616e79207761792c206566666563746976656c799c70757474696e6720746865697220617574686f72696e6720726577617264206174207269736b2e00e04e6f206465706f736974206f7220726577617264206973206173736f63696174656420776974682074686973207375626d697373696f6e2e6c7365745f6d696e696d756d5f756e747275737465645f73636f72650401406d617962655f6e6578745f73636f7265b90801544f7074696f6e3c456c656374696f6e53636f72653e000114b05365742061206e65772076616c756520666f7220604d696e696d756d556e7472757374656453636f7265602e00d84469737061746368206f726967696e206d75737420626520616c69676e656420776974682060543a3a466f7263654f726967696e602e00f05468697320636865636b2063616e206265207475726e6564206f66662062792073657474696e67207468652076616c756520746f20604e6f6e65602e747365745f656d657267656e63795f656c656374696f6e5f726573756c74040120737570706f727473bd080158537570706f7274733c543a3a4163636f756e7449643e0002205901536574206120736f6c7574696f6e20696e207468652071756575652c20746f2062652068616e646564206f757420746f2074686520636c69656e74206f6620746869732070616c6c657420696e20746865206e6578748863616c6c20746f2060456c656374696f6e50726f76696465723a3a656c656374602e004501546869732063616e206f6e6c79206265207365742062792060543a3a466f7263654f726967696e602c20616e64206f6e6c79207768656e207468652070686173652069732060456d657267656e6379602e00610154686520736f6c7574696f6e206973206e6f7420636865636b656420666f7220616e7920666561736962696c69747920616e6420697320617373756d656420746f206265207472757374776f727468792c20617320616e795101666561736962696c69747920636865636b20697473656c662063616e20696e207072696e6369706c652063617573652074686520656c656374696f6e2070726f6365737320746f206661696c202864756520746f686d656d6f72792f77656967687420636f6e73747261696e73292e187375626d69740401307261775f736f6c7574696f6e850701b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e0003249c5375626d6974206120736f6c7574696f6e20666f7220746865207369676e65642070686173652e00d0546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f7369676e65645f5f2e005d0154686520736f6c7574696f6e20697320706f74656e7469616c6c79207175657565642c206261736564206f6e2074686520636c61696d65642073636f726520616e642070726f6365737365642061742074686520656e64506f6620746865207369676e65642070686173652e005d0141206465706f73697420697320726573657276656420616e64207265636f7264656420666f722074686520736f6c7574696f6e2e204261736564206f6e20746865206f7574636f6d652c2074686520736f6c7574696f6e15016d696768742062652072657761726465642c20736c61736865642c206f722067657420616c6c206f7220612070617274206f6620746865206465706f736974206261636b2e4c676f7665726e616e63655f66616c6c6261636b0801406d617962655f6d61785f766f74657273f101012c4f7074696f6e3c7533323e0001446d617962655f6d61785f74617267657473f101012c4f7074696f6e3c7533323e00041080547269676765722074686520676f7665726e616e63652066616c6c6261636b2e004901546869732063616e206f6e6c792062652063616c6c6564207768656e205b6050686173653a3a456d657267656e6379605d20697320656e61626c65642c20617320616e20616c7465726e617469766520746fc063616c6c696e67205b6043616c6c3a3a7365745f656d657267656e63795f656c656374696f6e5f726573756c74605d2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e8507089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173652c526177536f6c7574696f6e040453018907000c0120736f6c7574696f6e890701045300011473636f726539020134456c656374696f6e53636f7265000114726f756e6410010c7533320000890708446672616d656e6f64655f72756e74696d65544e706f73436f6d70616374536f6c7574696f6e32340000600118766f746573318d0700000118766f74657332990700000118766f74657333ad0700000118766f74657334b90700000118766f74657335c50700000118766f74657336d10700000118766f74657337dd0700000118766f74657338e90700000118766f74657339f5070000011c766f746573313001080000011c766f74657331310d080000011c766f746573313219080000011c766f746573313325080000011c766f746573313431080000011c766f74657331353d080000011c766f746573313649080000011c766f746573313755080000011c766f746573313861080000011c766f74657331396d080000011c766f746573323079080000011c766f746573323185080000011c766f746573323291080000011c766f74657332339d080000011c766f7465733234a9080000008d07000002910700910700000408e5029507009507000006ed030099070000029d07009d070000040ce502a107950700a107000004089507a50700a507000006a90700a9070c3473705f61726974686d65746963287065725f7468696e67731850657255313600000400ed03010c7531360000ad07000002b10700b1070000040ce502b507950700b50700000302000000a10700b907000002bd0700bd070000040ce502c107950700c10700000303000000a10700c507000002c90700c9070000040ce502cd07950700cd0700000304000000a10700d107000002d50700d5070000040ce502d907950700d90700000305000000a10700dd07000002e10700e1070000040ce502e507950700e50700000306000000a10700e907000002ed0700ed070000040ce502f107950700f10700000307000000a10700f507000002f90700f9070000040ce502fd07950700fd0700000308000000a10700010800000205080005080000040ce5020908950700090800000309000000a107000d0800000211080011080000040ce502150895070015080000030a000000a1070019080000021d08001d080000040ce502210895070021080000030b000000a10700250800000229080029080000040ce5022d089507002d080000030c000000a10700310800000235080035080000040ce502390895070039080000030d000000a107003d0800000241080041080000040ce502450895070045080000030e000000a1070049080000024d08004d080000040ce502510895070051080000030f000000a10700550800000259080059080000040ce5025d089507005d0800000310000000a10700610800000265080065080000040ce5026908950700690800000311000000a107006d0800000271080071080000040ce5027508950700750800000312000000a1070079080000027d08007d080000040ce5028108950700810800000313000000a10700850800000289080089080000040ce5028d089507008d0800000314000000a10700910800000295080095080000040ce5029908950700990800000315000000a107009d08000002a10800a1080000040ce502a508950700a50800000316000000a10700a908000002ad0800ad080000040ce502b108950700b10800000317000000a10700b508089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736558536f6c7574696f6e4f72536e617073686f7453697a650000080118766f74657273e502010c75333200011c74617267657473e502010c7533320000b90804184f7074696f6e0404540139020108104e6f6e6500000010536f6d65040039020000010000bd08000002c10800c1080000040800c50800c508084473705f6e706f735f656c656374696f6e731c537570706f727404244163636f756e744964010000080114746f74616c18013c457874656e64656442616c616e6365000118766f74657273d50101845665633c284163636f756e7449642c20457874656e64656442616c616e6365293e0000c9080c1062616e641870616c6c65741043616c6c0804540004490001141472656c61790c01147261746573cd0801c0426f756e6465645665633c28543a3a53796d626f6c2c20753634292c20543a3a4d617852656c617953796d626f6c733e0001307265736f6c76655f74696d6528010c753634000128726571756573745f696428010c753634000030b50152656c61792061206c697374206f662073796d626f6c7320616e64207468656972206173736f63696174656420726174657320616c6f6e67207769746820746865207265736f6c76652074696d6520616e642072657175657374206964206f6e206042616e64436861696e602e0028436865636b732069663a682d205468652063616c6c657220697320612072656c617965723bb5012d2054686520607265736f6c76655f74696d656020666f72206120706172746963756c61722073796d626f6c206973206e6f74206c6f776572207468616e2070726576696f75732073617665642076616c75652c2069676e6f7265732074686973207261746520696620736f3b0029014966206072617465736020636f6e7461696e73206475706c6963617465642073796d626f6c732c207468656e20746865206c61737420726174652077696c6c2062652073746f7265642e0049012d20606f726967696e603a207468652072656c61796572206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642c4d012d20607261746573603a2073796d626f6c73207769746820726174657320696e2055534420726570726573656e74656420617320666978656420706f696e74207769746820707265636973696f6e203d20392ccc2d20607265736f6c76655f74696d65603a2073796d626f6c73207768696368207261746573206172652070726f76696465642c41012d2060726571756573745f6964603a206964206f662074686520726571756573742073656e7420746f20746865202a42616e64436861696e2a20746f207265747269657665207468697320646174612e2c666f7263655f72656c61790c01147261746573cd0801c0426f756e6465645665633c28543a3a53796d626f6c2c20753634292c20543a3a4d617852656c617953796d626f6c733e0001307265736f6c76655f74696d6528010c753634000128726571756573745f696428010c753634000124e853696d696c617220746f205b6072656c61792829605d2062757420776974686f757420746865207265736f6c76652074696d652067756172642e000d0153686f756c64206265207573656420696e20656d657267656e637920736974756174696f6e7320692e652e207468656e2070726576696f75732076616c7565207761739072656c617965642062792061206661756c74792f6d616c6963696f7573206163746f722e0049012d20606f726967696e603a207468652072656c61796572206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642c4d012d20607261746573603a2073796d626f6c73207769746820726174657320696e2055534420726570726573656e74656420617320666978656420706f696e74207769746820707265636973696f6e203d20392ccc2d20607265736f6c76655f74696d65603a2073796d626f6c73207768696368207261746573206172652070726f76696465642c41012d2060726571756573745f6964603a206964206f662074686520726571756573742073656e7420746f20746865202a42616e64436861696e2a20746f207265747269657665207468697320646174612e306164645f72656c617965727304012c6163636f756e745f696473510201445665633c543a3a4163636f756e7449643e000220c841646420606163636f756e745f6964736020746f20746865206c697374206f6620747275737465642072656c61796572732e00ac49676e6f726573207265706561746564206163636f756e747320696e20606163636f756e745f696473602e61014966206f6e65206f66206163636f756e7420697320616c7265616479206120747275737465642072656c6179657220616e205b604572726f723a3a416c7265616479415472757374656452656c61796572605d2077696c6c3062652072657475726e65642e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642cd42d20606163636f756e745f696473603a206c697374206f66206e657720747275737465642072656c617965727320746f206164642e3c72656d6f76655f72656c617965727304012c6163636f756e745f696473510201445665633c543a3a4163636f756e7449643e000320dc52656d6f766520606163636f756e745f696473602066726f6d20746865206c697374206f6620747275737465642072656c61796572732e00ac49676e6f726573207265706561746564206163636f756e747320696e20606163636f756e745f696473602e51014966206f6e65206f66206163636f756e74206973206e6f74206120747275737465642072656c6179657220616e205b604572726f723a3a416c7265616479415472757374656452656c61796572605d2077696c6c3062652072657475726e65642e003d012d20606f726967696e603a20746865207375646f206163636f756e74206f6e2077686f736520626568616c6620746865207472616e73616374696f6e206973206265696e672065786563757465642cb02d20606163636f756e745f696473603a206c697374206f662072656c617965727320746f2072656d6f76652e687365745f64796e616d69635f6665655f706172616d65746572730401386665655f706172616d6574657273d908016046656543616c63756c6174696f6e506172616d6574657273000400042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ecd08101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401d108045300000400d50801185665633c543e0000d1080000040801022800d508000002d10800d908081062616e646046656543616c63756c6174696f6e506172616d657465727300000c011464656361793d010114466978656400011c6d696e5f6665653d0101144669786564000124646576696174696f6e3d01011446697865640000dd080c306f7261636c655f70726f78791870616c6c65741043616c6c04045400010834656e61626c655f6f7261636c650401186f7261636c65590201184f7261636c6500001868456e61626c6573206120737065636966696564206f7261636c650070436865636b73206966207468652063616c6c657220697320726f6f7400702d20606f726967696e603a20746865207375646f206163636f756e74c82d20606f7261636c65603a206f7261636c652076617269616e742077686963682073686f756c6420626520656e61626c65643864697361626c655f6f7261636c650401186f7261636c65590201184f7261636c650001186c44697361626c6573206120737065636966696564206f7261636c650070436865636b73206966207468652063616c6c657220697320726f6f7400702d20606f726967696e603a20746865207375646f206163636f756e74cc2d20606f7261636c65603a206f7261636c652076617269616e742077686963682073686f756c642062652064697361626c6564042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee1080c686865726d65735f676f7665726e616e63655f706c6174666f726d1870616c6c65741043616c6c04045400011810766f746508011c706f6c6c5f69642c011048323536000134766f74696e675f6f7074696f6e61020174426f756e646564537472696e673c543a3a537472696e674c696d69743e00000450566f746520666f7220736f6d65206f7074696f6e2c6372656174655f706f6c6c140150706f6c6c5f73746172745f74696d657374616d70280124543a3a4d6f6d656e74000148706f6c6c5f656e645f74696d657374616d70280124543a3a4d6f6d656e740001147469746c6519020170426f756e646564537472696e673c543a3a5469746c654c696d69743e00012c6465736372697074696f6e65070188426f756e646564537472696e673c543a3a4465736372697074696f6e4c696d69743e00011c6f7074696f6e736d0701e8426f756e6465645665633c426f756e646564537472696e673c543a3a537472696e674c696d69743e2c20543a3a4f7074696f6e734c696d69743e0001042c43726561746520706f6c6c5077697468647261775f66756e64735f766f74657204011c706f6c6c5f69642c0110483235360002045057697468647261772066756e647320766f7465725877697468647261775f66756e64735f63726561746f7204011c706f6c6c5f69642c0110483235360003045857697468647261772066756e64732063726561746f72706368616e67655f6d696e5f6865726d65735f666f725f766f74696e670401346865726d65735f616d6f756e7418011c42616c616e6365000404804368616e6765206d696e696d756d204865726d657320666f7220766f74696e678c6368616e67655f6d696e5f6865726d65735f666f725f6372656174696e675f706f6c6c0401346865726d65735f616d6f756e7418011c42616c616e6365000504a44368616e6765206d696e696d756d204865726d657320666f72206372656174696e67206120706f6c6c042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee5080c3c70616c6c65745f707265696d6167651870616c6c65741043616c6c040454000110346e6f74655f707265696d616765040114627974657330011c5665633c75383e000010745265676973746572206120707265696d616765206f6e2d636861696e2e00550149662074686520707265696d616765207761732070726576696f75736c79207265717565737465642c206e6f2066656573206f72206465706f73697473206172652074616b656e20666f722070726f766964696e67550174686520707265696d6167652e204f74686572776973652c2061206465706f7369742069732074616b656e2070726f706f7274696f6e616c20746f207468652073697a65206f662074686520707265696d6167652e3c756e6e6f74655f707265696d616765040110686173682c011c543a3a48617368000118dc436c65617220616e20756e72657175657374656420707265696d6167652066726f6d207468652072756e74696d652073746f726167652e00fc496620606c656e602069732070726f76696465642c207468656e2069742077696c6c2062652061206d7563682063686561706572206f7065726174696f6e2e0001012d206068617368603a205468652068617368206f662074686520707265696d61676520746f2062652072656d6f7665642066726f6d207468652073746f72652eb82d20606c656e603a20546865206c656e677468206f662074686520707265696d616765206f66206068617368602e40726571756573745f707265696d616765040110686173682c011c543a3a48617368000210410152657175657374206120707265696d6167652062652075706c6f6164656420746f2074686520636861696e20776974686f757420706179696e6720616e792066656573206f72206465706f736974732e00550149662074686520707265696d6167652072657175657374732068617320616c7265616479206265656e2070726f7669646564206f6e2d636861696e2c20776520756e7265736572766520616e79206465706f7369743901612075736572206d6179206861766520706169642c20616e642074616b652074686520636f6e74726f6c206f662074686520707265696d616765206f7574206f662074686569722068616e64732e48756e726571756573745f707265696d616765040110686173682c011c543a3a4861736800030cbc436c65617220612070726576696f75736c79206d616465207265717565737420666f72206120707265696d6167652e002d014e4f54453a2054484953204d555354204e4f542042452043414c4c4544204f4e20606861736860204d4f52452054494d4553205448414e2060726571756573745f707265696d616765602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee9080c286f726465725f626f6f6b1870616c6c65741043616c6c040454000120406372656174655f6f72646572626f6f6b1401346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001247469636b5f73697a6518011c42616c616e6365000134737465705f6c6f745f73697a6518011c42616c616e63650001306d696e5f6c6f745f73697a6518011c42616c616e63650001306d61785f6c6f745f73697a6518011c42616c616e636500005cc0437265617465732061206e6577206f7264657220626f6f6b20666f72207468652070616972206f66206173736574732e00342320506172616d65746572733a35012d20606f726967696e603a2063616c6c6572206163636f756e742077686f206d7573742068617665207065726d697373696f6e7320746f2063726561746520746865206f7264657220626f6f6bb1012d20606f726465725f626f6f6b5f6964603a205b6f7264657220626f6f6b206964656e7469666965725d284f72646572426f6f6b496429207468617420636f6e7461696e733a20604465784964602c206062617365206173736574602026206071756f746520617373657460642d20607469636b5f73697a65603a2070726963652073746570782d2060737465705f6c6f745f73697a65603a20616d6f756e742073746570982d20606d696e5f6c6f745f73697a65603a206d696e696d616c206f7264657220616d6f756e74982d20606d61785f6c6f745f73697a65603a206d6178696d616c206f7264657220616d6f756e740020232052756c65733ac42d20726f6f742026207465636820636f6d6d69747465652063616e2063726561746520616e79206f7264657220626f6f6b39022d206120726567756c617220757365722063616e2063726561746520616e206f7264657220626f6f6b206f6e6c7920666f7220696e646976697369626c6520626173652061737365747320286d6f7374206c696b656c79204e46542920616e64206f6e6c79206966207468657920686176652074686973206173736574206f6e2074686569722062616c616e636549012d2074726164696e67207061697220666f722074686520617373657473206d7573742062652072656769737465726564206265666f726520746865206372656174696e6720616e206f7264657220626f6f6b00590123204174747269627574652072756c65732028666f7220607469636b5f73697a65602c2060737465705f6c6f745f73697a65602c20606d696e5f6c6f745f73697a6560202620606d61785f6c6f745f73697a6560293a842d20616c6c2061747472696275746573206d757374206265206e6f6e2d7a65726f882d20606d696e5f6c6f745f73697a6560203c3d20606d61785f6c6f745f73697a65608c2d2060737465705f6c6f745f73697a6560203c3d20606d696e5f6c6f745f73697a65601d012d20606d696e5f6c6f745f73697a6560202620606d61785f6c6f745f73697a6560206d7573742062652061206d756c7469706c65206f662060737465705f6c6f745f73697a65606d012d20606d61785f6c6f745f73697a6560203c3d20606d696e5f6c6f745f73697a6560202a2060534f46545f4d494e5f4d41585f524154494f602c206e6f772060534f46545f4d494e5f4d41585f524154494f60203d203120303030c02d20606d61785f6c6f745f73697a6560203c3d20746f74616c20737570706c79206f662060626173656020617373657431012d20707265636973696f6e206f6620607469636b5f73697a6560202a2060737465705f6c6f745f73697a6560206d757374206e6f74206f766572666c6f77202a2a3138206469676974732a2a4064656c6574655f6f72646572626f6f6b0401346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001405844656c6574657320746865206f7264657220626f6f6b00342320506172616d65746572733a35012d20606f726967696e603a2063616c6c6572206163636f756e742077686f206d7573742068617665207065726d697373696f6e7320746f2064656c65746520746865206f7264657220626f6f6bb1012d20606f726465725f626f6f6b5f6964603a205b6f7264657220626f6f6b206964656e7469666965725d284f72646572426f6f6b496429207468617420636f6e7461696e733a20604465784964602c206062617365206173736574602026206071756f7465206173736574600020232052756c65733ad82d206f6e6c7920726f6f742026207465636820636f6d6d69747465652063616e2064656c65746520746865206f7264657220626f6f6bc5012d20737461747573206f6620746865206f7264657220626f6f6b206d757374206265205b604f6e6c7943616e63656c605d284f72646572426f6f6b5374617475733a3a4f6e6c7943616e63656c29206f72205b6053746f70605d284f72646572426f6f6b5374617475733a3a53746f7029ec2d20746865206f7264657220626f6f6b206d75737420626520656d707479202d20646f65736e277420636f6e7461696e20616e79206f7264657273006c23205265616c206c6966652064656c6574652070726f636573733ac0312e20416e6e6f756e6365207468617420746865206f7264657220626f6f6b2077696c6c2062652064656c657465642efd01322e2053746f7020746865206f7264657220626f6f6b206279206368616e67696e67207468652073746174757320746f205b604f6e6c7943616e63656c605d284f72646572426f6f6b5374617475733a3a4f6e6c7943616e63656c29206f72205b6053746f70605d284f72646572426f6f6b5374617475733a3a53746f70296501332e205761697420756e74696c2075736572732063616e63656c207468656972206f7264657273206f72207468656972206c69666574696d65206a757374206578706972657320286d6178696d756d2031206d6f6e7468292e7c342e2044656c6574652074686520656d707479206f7264657220626f6f6b2e407570646174655f6f72646572626f6f6b1401346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001247469636b5f73697a6518011c42616c616e6365000134737465705f6c6f745f73697a6518011c42616c616e63650001306d696e5f6c6f745f73697a6518011c42616c616e63650001306d61785f6c6f745f73697a6518011c42616c616e63650002a4a055706461746573207468652061747472696275746573206f6620746865206f7264657220626f6f6b00342320506172616d65746572733a35012d20606f726967696e603a2063616c6c6572206163636f756e742077686f206d7573742068617665207065726d697373696f6e7320746f2075706461746520746865206f7264657220626f6f6bb1012d20606f726465725f626f6f6b5f6964603a205b6f7264657220626f6f6b206964656e7469666965725d284f72646572426f6f6b496429207468617420636f6e7461696e733a20604465784964602c206062617365206173736574602026206071756f746520617373657460642d20607469636b5f73697a65603a2070726963652073746570782d2060737465705f6c6f745f73697a65603a20616d6f756e742073746570982d20606d696e5f6c6f745f73697a65603a206d696e696d616c206f7264657220616d6f756e74982d20606d61785f6c6f745f73697a65603a206d6178696d616c206f7264657220616d6f756e740020232052756c65733ad82d206f6e6c7920726f6f742026207465636820636f6d6d69747465652063616e2075706461746520746865206f7264657220626f6f6bc5012d20737461747573206f6620746865206f7264657220626f6f6b206d757374206265205b604f6e6c7943616e63656c605d284f72646572426f6f6b5374617475733a3a4f6e6c7943616e63656c29206f72205b6053746f70605d284f72646572426f6f6b5374617475733a3a53746f702905022d20696e65726e616c207465636820737461747573206f6620746865206f7264657220626f6f6b206d757374206265205b605265616479605d284f72646572426f6f6b546563685374617475733a3a5265616479292c2074686174206d65616e73207468652070726576696f732075706461746520697320636f6d706c6574656400590123204174747269627574652072756c65732028666f7220607469636b5f73697a65602c2060737465705f6c6f745f73697a65602c20606d696e5f6c6f745f73697a6560202620606d61785f6c6f745f73697a6560293a842d20616c6c2061747472696275746573206d757374206265206e6f6e2d7a65726f882d20606d696e5f6c6f745f73697a6560203c3d20606d61785f6c6f745f73697a65608c2d2060737465705f6c6f745f73697a6560203c3d20606d696e5f6c6f745f73697a65601d012d20606d696e5f6c6f745f73697a6560202620606d61785f6c6f745f73697a6560206d7573742062652061206d756c7469706c65206f662060737465705f6c6f745f73697a6560c02d20606d61785f6c6f745f73697a6560203c3d20746f74616c20737570706c79206f662060626173656020617373657421012d20707265636973696f6e206f6620607469636b5f73697a6560202a2060737465705f6c6f745f73697a6560206d757374206e6f74206f766572666c6f77203138206469676974736d012d20606d61785f6c6f745f73697a6560203c3d20606d696e5f6c6f745f73697a6560202a2060534f46545f4d494e5f4d41585f524154494f602c206e6f772060534f46545f4d494e5f4d41585f524154494f60203d2031203030308d012d20606d61785f6c6f745f73697a6560203c3d202a2a6f6c642a2a20606d696e5f6c6f745f73697a6560202a2060484152445f4d494e5f4d41585f524154494f602c206e6f772060484152445f4d494e5f4d41585f524154494f60203d203420303030006c23205265616c206c696665207570646174652070726f636573733ac0312e20416e6e6f756e6365207468617420746865206f7264657220626f6f6b2077696c6c20626520757064617465642efd01322e2053746f7020746865206f7264657220626f6f6b206279206368616e67696e67207468652073746174757320746f205b604f6e6c7943616e63656c605d284f72646572426f6f6b5374617475733a3a4f6e6c7943616e63656c29206f72205b6053746f70605d284f72646572426f6f6b5374617475733a3a53746f70290901332e2055706461746520746865206f7264657220626f6f6b2061747472696275746573206163636f7264696e6720746f207468652072756c65735b5e6e6f74655d2efd01342e205761697420746865206f726465727320616c69676e6d656e74206966206974206973206e6563657373617279202d20746865206f7264657220626f6f6b207465636820737461747573206d757374206265636f6d65205b605265616479605d284f72646572426f6f6b546563685374617475733a3a5265616479292e9101352e204368616e676520746865206f7264657220626f6f6b20737461747573206261636b20746f205b605472616465605d284f72646572426f6f6b5374617475733a3a547261646529206f72206f74686572206e6563657373617279207374617475732ed0362e20416e6e6f756e6365207468617420746865206f7264657220626f6f6b2075706461746520697320636f6d706c657465642e00d9015b5e6e6f74655d3a206163636f7264696e6720746f207465636820726561736f6e7320697420697320666f7262696464656e20746f2075706461746520606d61785f6c6f745f73697a6560207769746820746f6f206c6172676520612076616c75652028736565206c61737420322072756c6573292e3d01466f72206578616d706c652c206966207468652063757272656e742076616c75657320606d696e5f6c6f745f73697a6560203d2031202620606d61785f6c6f745f73697a6560203d2031203030302c2d0177652063616e6e6f74206368616e676520697420746f20606d696e5f6c6f745f73697a6560203d203120303030202620606d61785f6c6f745f73697a6560203d203120303030203030302ee4496e20746869732063617365206974206973206e656365737361727920746f20646f207365766572616c2075706461746520726f756e64733afc312e20606d696e5f6c6f745f73697a65603a2031202d2d3e2031203030302c20606d61785f6c6f745f73697a65603a203120303030202d2d3e20342030303098322e20606d61785f6c6f745f73697a65603a203420303030202d2d3e2031203030302030303000c902497420697320616c736f206e6f74207265636f6d6d656e64656420746f20626174636820746865736520757064617465732c206265636175736520746865207465636820737461747573206f6620746865206f7264657220626f6f6b2063616e206265206368616e67656420616674657220746865203173742075706461746520616e642074686520326e64207570646174652077696c6c206265206465636c696e656420696e207468697320636173652e5c6368616e67655f6f72646572626f6f6b5f7374617475730801346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001187374617475737502013c4f72646572426f6f6b537461747573000330685365747320746865206f7264657220626f6f6b2073746174757300342320506172616d65746572733a51012d20606f726967696e603a2063616c6c6572206163636f756e742077686f206d7573742068617665207065726d697373696f6e7320746f206368616e676520746865206f7264657220626f6f6b20737461747573b1012d20606f726465725f626f6f6b5f6964603a205b6f7264657220626f6f6b206964656e7469666965725d284f72646572426f6f6b496429207468617420636f6e7461696e733a20604465784964602c206062617365206173736574602026206071756f746520617373657460d82d2060737461747573603a206f6e65206f66207468652073746174757365732066726f6d205b4f72646572426f6f6b5374617475735d0020232052756c65733ae82d206f6e6c7920726f6f742026207465636820636f6d6d69747465652063616e2073657420746865206f7264657220626f6f6b207374617475730d022d20696620746865206f7264657220626f6f6b206973206c6f636b6564206279207570646174696e6720287465636820737461747573206973205b605570646174696e67605d284f72646572426f6f6b546563685374617475733a3a5570646174696e6729292c2074686520616c6c6f776564207374617475657320746f207365743ac4202020202d205b604f6e6c7943616e63656c605d284f72646572426f6f6b5374617475733a3a4f6e6c7943616e63656c2994202020202d205b6053746f70605d284f72646572426f6f6b5374617475733a3a53746f702944706c6163655f6c696d69745f6f726465721401346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e000114707269636518011c42616c616e6365000118616d6f756e7418011c42616c616e63650001107369646579020130507269636556617269616e740001206c6966657370616ecd02014c4f7074696f6e3c4d6f6d656e744f663c543e3e000448a8506c6163657320746865206c696d6974206f7264657220696e746f20746865206f7264657220626f6f6b00342320506172616d65746572733ac42d20606f726967696e603a2063616c6c6572206163636f756e742c20746865206c696d6974206f72646572206f776e6572b1012d20606f726465725f626f6f6b5f6964603a205b6f7264657220626f6f6b206964656e7469666965725d284f72646572426f6f6b496429207468617420636f6e7461696e733a20604465784964602c206062617365206173736574602026206071756f746520617373657460942d20607072696365603a20707269636520696e20746865206071756f746520617373657460e42d2060616d6f756e74603a20766f6c756d65206f6620746865206c696d6974206f7264657220696e2074686520606261736520617373657460f42d206073696465603a205b736964655d28507269636556617269616e742920776865726520746f20706c61636520746865206c696d6974206f72646572b1012d20606c6966657370616e603a206c696665206475726174696f6e206f6620746865206c696d6974206f7264657220696e206d696c6c69736563732c206966206e6f7420646566696e6564207468652064656661756c742076616c75652033302064617973206973207365740020232052756c65733ae02d2060707269636560206d7573742062652061206d756c7469706c65206f66205b604f72646572426f6f6b3a3a7469636b5f73697a65605da42d2060616d6f756e7460203e3d205b604f72646572426f6f6b3a3a6d696e5f6c6f745f73697a65605da42d2060616d6f756e7460203c3d205b604f72646572426f6f6b3a3a6d61785f6c6f745f73697a65605df42d2060616d6f756e7460206d7573742062652061206d756c7469706c65206f66205b604f72646572426f6f6b3a3a737465705f6c6f745f73697a65605de82d2069662074686520607072696365602063726f7373657320746865207370726561642028746865206f70706f7369746520607369646560293add01202020202d206966205b604f72646572426f6f6b3a3a737461747573605d20616c6c6f777320746f207472616465202d20746865206c696d6974206f7264657220697320636f6e76657274656420696e746f206d61726b6574206f7264657220616e64207468652065786368616e6765206f63637572732501202020202d206966205b604f72646572426f6f6b3a3a737461747573605d20646f65736e277420616c6c6f7720746f207472616465202d207472616e73616374696f6e206661696c734863616e63656c5f6c696d69745f6f726465720801346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001206f726465725f6964180128543a3a4f7264657249640005305c43616e63656c7320746865206c696d6974206f7264657200342320506172616d65746572733acc2d20606f726967696e603a2063616c6c6572206163636f756e742077686f206f776e7320746865206c696d6974206f72646572b1012d20606f726465725f626f6f6b5f6964603a205b6f7264657220626f6f6b206964656e7469666965725d284f72646572426f6f6b496429207468617420636f6e7461696e733a20604465784964602c206062617365206173736574602026206071756f746520617373657460942d20606f726465725f6964603a2060696460206f6620746865206c696d6974206f726465720020232052756c65733ac42d206f6e6c7920746865206f72646572206f776e65722063616e2063616e63656c20746865206c696d6974206f72646572001c23204e6f74653a35014e6574776f726b206665652069736e2774206368617267656420696620746865206f72646572206973207375636365737366756c6c792063616e63656c6c656420627920746865206f776e65726463616e63656c5f6c696d69745f6f72646572735f62617463680401586c696d69745f6f72646572735f746f5f63616e63656ced0801ec5665633c284f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e2c205665633c543a3a4f7264657249643e293e00062c8043616e63656c7320746865206c697374206f66206c696d6974206f726465727300342320506172616d65746572733ad02d20606f726967696e603a2063616c6c6572206163636f756e742077686f206f776e7320746865206c696d6974206f726465727395012d20606c696d69745f6f72646572735f746f5f63616e63656c603a20746865206c6973742077697468205b606f726465725f626f6f6b5f6964605d284f72646572426f6f6b496429202620606f726465725f69646020706169727320746f2063616e63656c0020232052756c65733a31012d206f6e6c7920746865206f776e6572206f66202a2a616c6c2a2a206f72646572732063616e2063616e63656c20616c6c206c696d6974206f72646572732066726f6d20746865206c697374001c23204e6f74653a2d014e6574776f726b206665652069736e27742063686172676564206966206f726465727320617265207375636365737366756c6c792063616e63656c6c656420627920746865206f776e657250657865637574655f6d61726b65745f6f726465720c01346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e000124646972656374696f6e79020130507269636556617269616e74000118616d6f756e7418011c42616c616e636500073464457865637574657320746865206d61726b6574206f7264657200342320506172616d65746572733a682d20606f726967696e603a2063616c6c6572206163636f756e74b1012d20606f726465725f626f6f6b5f6964603a205b6f7264657220626f6f6b206964656e7469666965725d284f72646572426f6f6b496429207468617420636f6e7461696e733a20604465784964602c206062617365206173736574602026206071756f746520617373657460f02d2060646972656374696f6e603a205b646972656374696f6e5d28507269636556617269616e7429206f6620746865206d61726b6574206f72646572bc2d2060616d6f756e74603a20766f6c756d65206f66207468652060626173652061737365746020746f2074726164650020232052756c65733ae1022d20776f726b73206f6e6c7920666f72206f7264657220626f6f6b73207769746820696e646976697369626c65206062617365206173736574602c2062656361757365207468657265206973206e6f206f74686572206162696c69747920746f2074726164652073756368206173736574732e20416c6c206f7468657220646976697369626c6520617373657473206d7573742062652074726164656420627920606c69717569646974795f70726f78793a3a7377617060a42d2060616d6f756e7460203e3d205b604f72646572426f6f6b3a3a6d696e5f6c6f745f73697a65605da42d2060616d6f756e7460203c3d205b604f72646572426f6f6b3a3a6d61785f6c6f745f73697a65605df42d2060616d6f756e7460206d7573742062652061206d756c7469706c65206f66205b604f72646572426f6f6b3a3a737465705f6c6f745f73697a65605d042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632eed08000002f10800f108000004087102a50400f5080c206b656e73657473751870616c6c65741043616c6c04045400014c286372656174655f63647018014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e000144636f6c6c61746572616c5f616d6f756e7418011c42616c616e636500014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e000144626f72726f775f616d6f756e745f6d696e18011c42616c616e6365000144626f72726f775f616d6f756e745f6d617818011c42616c616e63650001206364705f747970658d02011c43647054797065000030b443726561746573206120436f6c6c61746572616c697a6564204465627420506f736974696f6e2028434450292eec5468652065787472696e73696320636f6d62696e6573206465706f736974696e6720636f6c6c61746572616c20616e6420626f72726f77696e672ed4426f72726f7720616d6f756e742077696c6c206265206173206d617820617320706f737369626c6520696e207468652072616e67655101605b626f72726f775f616d6f756e745f6d696e2c20626f72726f775f616d6f756e745f6d61785d6020696e206f7264657220746f20636f6e66726f6d2074686520736c69707061676520746f6c6572616e63652e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2e21012d2060636f6c6c61746572616c5f61737365745f6964603a20546865206964656e746966696572206f6620746865206173736574207573656420617320636f6c6c61746572616c2e01012d2060636f6c6c61746572616c5f616d6f756e74603a2054686520616d6f756e74206f6620636f6c6c61746572616c20746f206265206465706f73697465642e0d012d2060626f72726f775f616d6f756e745f6d696e603a20546865206d696e696d756d20616d6f756e742074686520757365722077616e747320746f20626f72726f772e0d012d2060626f72726f775f616d6f756e745f6d6178603a20546865206d6178696d756d20616d6f756e742074686520757365722077616e747320746f20626f72726f772e24636c6f73655f6364700401186364705f69641801144364704964000128b0436c6f736573206120436f6c6c61746572616c697a6564204465627420506f736974696f6e2028434450292e005101496620612043445020686173206f75747374616e64696e6720646562742c207468697320616d6f756e7420697320636f76657265642077697468206f776e65722062616c616e63652e20436f6c6c61746572616cc47468656e2069732072657475726e656420746f20746865206f776e657220616e64204344502069732064656c657465642e0034232320506172616d65746572730015012d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2c206f6e6c7920434450206f776e657220697320616c6c6f7765642eac2d20606364705f6964603a20546865204944206f66207468652043445020746f20626520636c6f7365642e542077696c6c206265207472616e736665727265642e486465706f7369745f636f6c6c61746572616c0801186364705f69641801144364704964000144636f6c6c61746572616c5f616d6f756e7418011c42616c616e636500021cf84465706f7369747320636f6c6c61746572616c20696e746f206120436f6c6c61746572616c697a6564204465627420506f736974696f6e2028434450292e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2ee42d20606364705f6964603a20546865204944206f66207468652043445020746f206465706f73697420636f6c6c61746572616c20696e746f2eec2d2060636f6c6c61746572616c5f616d6f756e74603a2054686520616d6f756e74206f6620636f6c6c61746572616c20746f206465706f7369742e18626f72726f770c01186364705f69641801144364704964000144626f72726f775f616d6f756e745f6d696e18011c42616c616e6365000144626f72726f775f616d6f756e745f6d617818011c42616c616e6365000324ec426f72726f77732066756e647320616761696e7374206120436f6c6c61746572616c697a6564204465627420506f736974696f6e2028434450292ed4426f72726f7720616d6f756e742077696c6c206265206173206d617820617320706f737369626c6520696e207468652072616e67655101605b626f72726f775f616d6f756e745f6d696e2c20626f72726f775f616d6f756e745f6d61785d6020696e206f7264657220746f20636f6e66726f6d2074686520736c69707061676520746f6c6572616e63652e34232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2ec02d20606364705f6964603a20546865204944206f66207468652043445020746f20626f72726f7720616761696e73742e0d012d2060626f72726f775f616d6f756e745f6d696e603a20546865206d696e696d756d20616d6f756e742074686520757365722077616e747320746f20626f72726f772e0d012d2060626f72726f775f616d6f756e745f6d6178603a20546865206d6178696d756d20616d6f756e742074686520757365722077616e747320746f20626f72726f772e2872657061795f646562740801186364705f69641801144364704964000118616d6f756e7418011c42616c616e636500041ce4526570617973206465627420616761696e7374206120436f6c6c61746572616c697a6564204465627420506f736974696f6e2028434450292e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2ec02d20606364705f6964603a20546865204944206f66207468652043445020746f207265706179206465627420666f722edc2d2060616d6f756e74603a2054686520616d6f756e7420746f20726570617920616761696e73742074686520434450277320646562742e246c69717569646174650401186364705f6964180114436470496400051815014c697175696461746573206120436f6c6c61746572616c697a6564204465627420506f736974696f6e202843445029206966206974206265636f6d657320756e736166652e0034232320506172616d657465727300d02d20605f6f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2028756e75736564292ebc2d20606364705f6964603a20546865204944206f66207468652043445020746f206265206c6971756964617465642e186163637275650401186364705f69641801144364704964000618e44163637275657320696e746572657374206f6e206120436f6c6c61746572616c697a6564204465627420506f736974696f6e2028434450292e0034232320506172616d657465727300d02d20605f6f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2028756e75736564292ed02d20606364705f6964603a20546865204944206f66207468652043445020746f2061636372756520696e746572657374206f6e2e847570646174655f636f6c6c61746572616c5f7269736b5f706172616d65746572730c014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e00014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e00014c6e65775f7269736b5f706172616d657465727391020160436f6c6c61746572616c5269736b506172616d6574657273000720f05570646174657320746865207269736b20706172616d657465727320666f72206120737065636966696320636f6c6c61746572616c2061737365742e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2e5d012d2060636f6c6c61746572616c5f61737365745f6964603a20546865206964656e746966696572206f662074686520636f6c6c61746572616c2061737365742e20496620636f6c6c61746572616c2061737365742069640d016973206e6f7420747261636b6564206279205072696365546f6f6c732c207265676973746572732074686520617373657420696420696e205072696365546f6f6c732e51012d20606e65775f7269736b5f706172616d6574657273603a20546865206e6577207269736b20706172616d657465727320746f2062652073657420666f722074686520636f6c6c61746572616c2061737365742e447570646174655f626f72726f775f7461780401406e65775f626f72726f775f74617865739502012c426f72726f775461786573000818b4557064617465732074686520626f72726f7720746178206170706c69656420647572696e6720626f72726f772e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2ef02d20606e65775f626f72726f775f746178603a20546865206e657720626f72726f77207461782070657263656e7461676520746f206265207365742e687570646174655f6c69717569646174696f6e5f70656e616c747904015c6e65775f6c69717569646174696f6e5f70656e616c74799902011c50657263656e74000918fc5570646174657320746865206c69717569646174696f6e2070656e616c7479206170706c69656420647572696e6720434450206c69717569646174696f6e2e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2e39012d20606e65775f6c69717569646174696f6e5f70656e616c7479603a20546865206e6577206c69717569646174696f6e2070656e616c74792070657263656e7461676520746f206265207365742e3c77697468647261775f70726f6669740c012c62656e6566696369617279000130543a3a4163636f756e74496400014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e000118616d6f756e7418011c42616c616e6365000a20d05769746864726177732070726f746f636f6c2070726f66697420696e2074686520666f726d206f6620737461626c65636f696e2e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2e25012d206062656e656669636961727960203a205468652064657374696e6174696f6e206163636f756e74207768657265206173736574732077696c6c2062652077697468647261776e2ed42d2060737461626c65636f696e5f61737365745f696460202d20546865206173736574206964206f6620737461626c65636f696e2e11012d2060616d6f756e74603a2054686520616d6f756e74206f6620737461626c65636f696e20746f2077697468647261772061732070726f746f636f6c2070726f6669742e18646f6e61746508014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e000118616d6f756e7418011c42616c616e6365000b1cb8446f6e6174657320737461626c65636f696e20746f20636f7665722070726f746f636f6c2062616420646562742e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2ed42d2060737461626c65636f696e5f61737365745f696460202d20546865206173736574206964206f6620737461626c65636f696e2e05012d2060616d6f756e74603a2054686520616d6f756e74206f6620737461626c65636f696e20746f20646f6e61746520746f20636f7665722062616420646562742e4c72656769737465725f737461626c65636f696e0401646e65775f737461626c65636f696e5f706172616d65746572739d020188537461626c65636f696e506172616d65746572733c417373657449644f663c543e3e000c18b041646473206e657720737461626c65636f696e206d75746174696e6720537461626c65636f696e496e666f2e00302323506172616d657465727355012d20737461626c65636f696e5f61737365745f6964202d206173736574206964206f66206e657720737461626c65636f696e2c206d757374206265206d696e7461626c6520616e6420746f74616c20737570706c79286d75737420626520302ec42d206e65775f737461626c65636f696e5f706172616d6574657273202d20706172616d657465727320666f72207065672e3c7570646174655f686172645f6361700c014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e00014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e000120686172645f63617018011c42616c616e6365000d148855706461746573207269736b20706172616d657465722060686172645f636170602e00302323506172616d657465727359012d2060636f6c6c61746572616c5f61737365745f69646020616e642060737461626c65636f696e5f61737365745f696460202d20636f6d706f73697465206b657920666f7220636f6c6c61746572616c5f696e666f3b642d2060686172645f63617060202d206e65772076616c75652e607570646174655f6c69717569646174696f6e5f726174696f0c014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e00014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e0001446c69717569646174696f6e5f726174696fb0011c50657262696c6c000e14ac55706461746573207269736b20706172616d6574657220606c69717569646174696f6e5f726174696f602e00302323506172616d657465727359012d2060636f6c6c61746572616c5f61737365745f69646020616e642060737461626c65636f696e5f61737365745f696460202d20636f6d706f73697465206b657920666f7220636f6c6c61746572616c5f696e666f3b882d20606c69717569646174696f6e5f726174696f60202d206e65772076616c75652e687570646174655f6d61785f6c69717569646174696f6e5f6c6f740c014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e00014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e00014c6d61785f6c69717569646174696f6e5f6c6f7418011c42616c616e6365000f14b455706461746573207269736b20706172616d6574657220606d61785f6c69717569646174696f6e5f6c6f74602e00302323506172616d657465727359012d2060636f6c6c61746572616c5f61737365745f69646020616e642060737461626c65636f696e5f61737365745f696460202d20636f6d706f73697465206b657920666f7220636f6c6c61746572616c5f696e666f3b902d20606d61785f6c69717569646174696f6e5f6c6f7460202d206e65772076616c75652e647570646174655f73746162696c6974795f6665655f726174650c014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e00014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e00014873746162696c6974795f6665655f726174658c0124466978656455313238001014b055706461746573207269736b20706172616d65746572206073746162696c6974795f6665655f72617465602e00302323506172616d657465727359012d2060636f6c6c61746572616c5f61737365745f69646020616e642060737461626c65636f696e5f61737365745f696460202d20636f6d706f73697465206b657920666f7220636f6c6c61746572616c5f696e666f3b8c2d206073746162696c6974795f6665655f7261746560202d206e65772076616c75652e847570646174655f6d696e696d616c5f636f6c6c61746572616c5f6465706f7369740c014c636f6c6c61746572616c5f61737365745f69640d010130417373657449644f663c543e00014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e0001686d696e696d616c5f636f6c6c61746572616c5f6465706f73697418011c42616c616e6365001114d055706461746573207269736b20706172616d6574657220606d696e696d616c5f636f6c6c61746572616c5f6465706f736974602e00302323506172616d657465727359012d2060636f6c6c61746572616c5f61737365745f69646020616e642060737461626c65636f696e5f61737365745f696460202d20636f6d706f73697465206b657920666f7220636f6c6c61746572616c5f696e666f3bac2d20606d696e696d616c5f636f6c6c61746572616c5f6465706f73697460202d206e65772076616c75652e8c7570646174655f6d696e696d616c5f73746162696c6974795f6665655f61636372756508014c737461626c65636f696e5f61737365745f69640d010130417373657449644f663c543e0001806e65775f6d696e696d616c5f73746162696c6974795f6665655f61636372756518011c42616c616e6365001200042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ef9080c306272696467655f70726f78791870616c6c65741043616c6c040454000110106275726e1001286e6574776f726b5f6964c502014047656e657269634e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e000124726563697069656e744903013847656e657269634163636f756e74000118616d6f756e7418013042616c616e63654f663c543e000000446164645f6c696d697465645f617373657404012061737365745f69640d010130417373657449644f663c543e0001005072656d6f76655f6c696d697465645f617373657404012061737365745f69640d010130417373657449644f663c543e000200547570646174655f7472616e736665725f6c696d697404012073657474696e6773fd0801a05472616e736665724c696d697453657474696e67733c426c6f636b4e756d626572466f723c543e3e000300042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632efd0808306272696467655f70726f7879545472616e736665724c696d697453657474696e6773042c426c6f636b4e756d6265720110000801286d61785f616d6f756e7418011c42616c616e6365000134706572696f645f626c6f636b7310012c426c6f636b4e756d6265720000010910607375627374726174655f6272696467655f6368616e6e656c1c696e626f756e641870616c6c65741043616c6c040454000104187375626d69740c01286e6574776f726b5f6964b90201305375624e6574776f726b4964000128636f6d6d69746d656e7405090151016272696467655f74797065733a3a47656e65726963436f6d6d69746d656e743c543a3a4d61784d65737361676573506572436f6d6d69742c20543a3a0a4d61784d6573736167655061796c6f616453697a652c3e00011470726f6f66550901803c543a3a56657269666965722061732056657269666965723e3a3a50726f6f66000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e050908306272696467655f74797065734447656e65726963436f6d6d69746d656e74082c4d61784d6573736167657300284d61785061796c6f616400010c0c5375620400090901b87375627374726174653a3a436f6d6d69746d656e743c4d61784d657373616765732c204d61785061796c6f61643e0000000c45564d04001d0901a065766d3a3a436f6d6d69746d656e743c4d61784d657373616765732c204d61785061796c6f61643e0001000c544f4e04004d09016c746f6e3a3a436f6d6d69746d656e743c4d61785061796c6f61643e0002000009090c306272696467655f74797065732473756273747261746528436f6d6d69746d656e74082c4d61784d6573736167657300284d61785061796c6f616400000801206d657373616765730d0901c8426f756e6465645665633c4272696467654d6573736167653c4d61785061796c6f61643e2c204d61784d657373616765733e0001146e6f6e636528010c75363400000d09101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454011109045300000400190901185665633c543e000011090c306272696467655f747970657324737562737472617465344272696467654d65737361676504284d61785061796c6f6164000008011c7061796c6f616415090168426f756e6465645665633c75382c204d61785061796c6f61643e00012474696d65706f696e74fd04014047656e6572696354696d65706f696e7400001509101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e000019090000021109001d090c306272696467655f74797065730c65766d28436f6d6d69746d656e74082c4d61784d6573736167657300284d61785061796c6f6164000110204f7574626f756e640400210901ac4f7574626f756e64436f6d6d69746d656e743c4d61784d657373616765732c204d61785061796c6f61643e0000001c496e626f756e64040039090174496e626f756e64436f6d6d69746d656e743c4d61785061796c6f61643e000100305374617475735265706f727404003d0901605374617475735265706f72743c4d61785061796c6f61643e0002003442617365466565557064617465040049090134426173654665655570646174650003000021090c306272696467655f74797065730c65766d484f7574626f756e64436f6d6d69746d656e74082c4d61784d6573736167657300284d61785061796c6f616400000c01146e6f6e636528010c753634000134746f74616c5f6d61785f67617325090110553235360001206d657373616765732d0901b0426f756e6465645665633c4d6573736167653c4d61785061796c6f61643e2c204d61784d657373616765733e00002509083c7072696d69746976655f7479706573105532353600000400290901205b7536343b20345d000029090000030400000028002d09101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454013109045300000400350901185665633c543e000031090c306272696467655f74797065730c65766d1c4d65737361676504284d61785061796c6f616400000c01187461726765744d0301104831363000011c6d61785f676173250901105532353600011c7061796c6f616415090168426f756e6465645665633c75382c204d61785061796c6f61643e0000350900000231090039090c306272696467655f74797065730c65766d44496e626f756e64436f6d6d69746d656e7404284d61785061796c6f6164000014011c6368616e6e656c4d03011048313630000118736f757263654d030110483136300001146e6f6e636528010c753634000130626c6f636b5f6e756d62657228010c75363400011c7061796c6f616415090168426f756e6465645665633c75382c204d61785061796c6f61643e00003d090c306272696467655f74797065730c65766d305374617475735265706f7274042c4d61784d6573736167657300001c011c6368616e6e656c4d03011048313630000130626c6f636b5f6e756d62657228010c75363400011c72656c617965724d030110483136300001146e6f6e636528010c75363400011c726573756c747341090174426f756e6465645665633c626f6f6c2c204d61784d657373616765733e0001246761735f7370656e742509011055323536000120626173655f666565250901105532353600004109101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401bc045300000400450901185665633c543e00004509000002bc0049090c306272696467655f74797065730c65766d344261736546656555706461746500000801306e65775f626173655f666565250901105532353600014065766d5f626c6f636b5f6e756d62657228010c75363400004d090c306272696467655f74797065730c746f6e28436f6d6d69746d656e7404284d61785061796c6f61640001041c496e626f756e64040051090174496e626f756e64436f6d6d69746d656e743c4d61785061796c6f61643e0000000051090c306272696467655f74797065730c746f6e44496e626f756e64436f6d6d69746d656e7404284d61785061796c6f6164000014011c6368616e6e656c51030128546f6e41646472657373000118736f7572636551030128546f6e416464726573730001146e6f6e636528010c7536340001387472616e73616374696f6e5f696401050140546f6e5472616e73616374696f6e496400011c7061796c6f616415090168426f756e6465645665633c75382c204d61785061796c6f61643e0000550908446672616d656e6f64655f72756e74696d65284d756c746950726f6f66000104204d756c74697369670400590901943c4d756c746973696756657269666965722061732056657269666965723e3a3a50726f6f6600010000590908446d756c74697369675f76657269666965721450726f6f6600000801186469676573745d09013c417578696c6961727944696765737400011470726f6f663d0301545665633c65636473613a3a5369676e61747572653e00005d090c306272696467655f74797065731474797065733c417578696c6961727944696765737400000401106c6f6773610901605665633c417578696c696172794469676573744974656d3e0000610900000265090065090c306272696467655f74797065731474797065734c417578696c696172794469676573744974656d00010428436f6d6d69746d656e740800c502014047656e657269634e6574776f726b496400002c01104832353600000000690910607375627374726174655f6272696467655f6368616e6e656c206f7574626f756e641870616c6c65741043616c6c0404540001043c7570646174655f696e74657276616c0401306e65775f696e74657276616c100138543a3a426c6f636b4e756d626572000000042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e6d090c5070617261636861696e5f6272696467655f6170701870616c6c65741043616c6c040454000128106d696e7410012061737365745f69640d010130417373657449644f663c543e00011873656e646572190301684f7074696f6e3c50617261636861696e4163636f756e7449643e000124726563697069656e74000130543a3a4163636f756e744964000118616d6f756e741801384d61696e6e657442616c616e63650000006c66696e616c697a655f61737365745f726567697374726174696f6e08012061737365745f69640d010130417373657449644f663c543e00012861737365745f6b696e647109012441737365744b696e64000100106275726e1001286e6574776f726b5f6964b90201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e000124726563697069656e74d502014850617261636861696e4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0002006072656769737465725f74686973636861696e5f61737365741401286e6574776f726b5f6964b90201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e00013c73696465636861696e5f61737365747509014050617261636861696e41737365744964000148616c6c6f7765645f70617261636861696e738d0401205665633c7533323e0001486d696e696d616c5f78636d5f616d6f756e7418013042616c616e63654f663c543e0003006072656769737465725f73696465636861696e5f61737365741c01286e6574776f726b5f6964b90201305375624e6574776f726b496400013c73696465636861696e5f61737365747509014050617261636861696e4173736574496400011873796d626f6c29010140417373657453796d626f6c4f663c543e0001106e616d653101013841737365744e616d654f663c543e000120646563696d616c730801087538000148616c6c6f7765645f70617261636861696e738d0401205665633c7533323e0001486d696e696d616c5f78636d5f616d6f756e7418013042616c616e63654f663c543e000400486164645f617373657469645f7061726169640c01286e6574776f726b5f6964b90201305375624e6574776f726b496400011c706172615f696410010c75333200012061737365745f69640d010130417373657449644f663c543e0005005472656d6f76655f617373657469645f7061726169640c01286e6574776f726b5f6964b90201305375624e6574776f726b496400011c706172615f696410010c75333200012061737365745f69640d010130417373657449644f663c543e000600647570646174655f7472616e73616374696f6e5f7374617475730801286d6573736167655f69642c01104832353600013c7472616e736665725f7374617475737909015058434d4170705472616e73666572537461747573000700907365745f6d696e696d756d5f78636d5f696e636f6d696e675f61737365745f636f756e740c01286e6574776f726b5f6964b90201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e0001486d696e696d616c5f78636d5f616d6f756e7418013042616c616e63654f663c543e0008005062696e645f73696465636861696e5f61737365741801286e6574776f726b5f6964b90201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e00013c73696465636861696e5f61737365747509014050617261636861696e4173736574496400014c73696465636861696e5f707265636973696f6e0801087538000148616c6c6f7765645f70617261636861696e738d0401205665633c7533323e0001486d696e696d616c5f78636d5f616d6f756e7418013042616c616e63654f663c543e000900042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e71090c306272696467655f74797065731474797065732441737365744b696e640001082454686973636861696e0000002453696465636861696e000100007509100c78636d087633286d756c746961737365741c4173736574496400010820436f6e63726574650400fd0201344d756c74694c6f636174696f6e00000020416273747261637404000401205b75383b2033325d0001000079090c306272696467655f7479706573247375627374726174655058434d4170705472616e736665725374617475730001081c537563636573730000004058434d5472616e736665724572726f72000100007d090c486272696467655f646174615f7369676e65721870616c6c65741043616c6c0404540001184072656769737465725f6e6574776f726b0801286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000114706565727321030198426f756e6465645665633c65636473613a3a5075626c69632c20543a3a4d617850656572733e0000001c617070726f76650c01286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000110646174612c0110483235360001247369676e61747572653103014065636473613a3a5369676e6174757265000100206164645f706565720801286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000110706565722503013465636473613a3a5075626c69630002002c72656d6f76655f706565720801286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000110706565722503013465636473613a3a5075626c69630003004866696e6973685f72656d6f76655f70656572040110706565722503013465636473613a3a5075626c69630004003c66696e6973685f6164645f70656572040110706565722503013465636473613a3a5075626c6963000500042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e81090c446d756c74697369675f76657269666965721870616c6c65741043616c6c04045400010c28696e697469616c697a650801286e6574776f726b5f6964c502014047656e657269634e6574776f726b4964000114706565727321030198426f756e6465645665633c65636473613a3a5075626c69632c20543a3a4d617850656572733e000000206164645f70656572040110706565722503013465636473613a3a5075626c69630001002c72656d6f76655f70656572040110706565722503013465636473613a3a5075626c6963000200042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e85090c507375627374726174655f6272696467655f6170701870616c6c65741043616c6c040454000118106d696e7410012061737365745f69640d010130417373657449644f663c543e00011873656e6465724903013847656e657269634163636f756e74000124726563697069656e740001384163636f756e7449644f663c543e000118616d6f756e748909013847656e6572696342616c616e636500000c9846756e6374696f6e207573656420746f206d696e74206f7220756e6c6f636b20746f6b656e73b4546865204f726967696e20666f7220746869732063616c6c2069732074686520427269646765204f726967696e9c4f6e6c79207468652072656c617965722063616e2063616c6c20746869732066756e6374696f6e6c66696e616c697a655f61737365745f726567697374726174696f6e10012061737365745f69640d010130417373657449644f663c543e00014873696465636861696e5f61737365745f69649509013847656e657269634173736574496400012861737365745f6b696e647109012441737365744b696e6400014c73696465636861696e5f707265636973696f6e080108753800010c550146756e6374696f6e207573656420746f2066696e616c697a6520617373657420726567697374726174696f6e2069662065766572797468696e672077656e742077656c6c206f6e207468652073696465636861696eb4546865204f726967696e20666f7220746869732063616c6c2069732074686520427269646765204f726967696e9c4f6e6c79207468652072656c617965722063616e2063616c6c20746869732066756e6374696f6e94696e636f6d696e675f74686973636861696e5f61737365745f726567697374726174696f6e08012061737365745f69640d010130417373657449644f663c543e00014873696465636861696e5f61737365745f69649509013847656e6572696341737365744964000210a846756e6374696f6e207573656420746f207265676973746572207468697320636861696e206173736574b4546865204f726967696e20666f7220746869732063616c6c2069732074686520427269646765204f726967696e9c4f6e6c79207468652072656c617965722063616e2063616c6c20746869732066756e6374696f6ef453656e647320746865206d65737361676520746f2073696465636861696e20746f2066696e616c697a6520617373657420726567697374726174696f6e106275726e1001286e6574776f726b5f6964b90201305375624e6574776f726b496400012061737365745f69640d010130417373657449644f663c543e000124726563697069656e744903013847656e657269634163636f756e74000118616d6f756e7418013042616c616e63654f663c543e000304d846756e6374696f6e207573656420627920757365727320746f2073656e6420746f6b656e7320746f207468652073696465636861696e6072656769737465725f73696465636861696e5f61737365741001286e6574776f726b5f6964b90201305375624e6574776f726b496400013c73696465636861696e5f61737365749509013847656e657269634173736574496400011873796d626f6c29010140417373657453796d626f6c4f663c543e0001106e616d653101013841737365744e616d654f663c543e000410a446756e6374696f6e207573656420746f2072656769737465722073696465636861696e206173736574ac546865204f726967696e20666f7220746869732063616c6c2069732074686520526f6f74204f726967696e904f6e6c792074686520726f6f742063616e2063616c6c20746869732066756e6374696f6ec053656e647320746865206d65737361676520746f2073696465636861696e20746f207265676973746572206173736574647570646174655f7472616e73616374696f6e5f7374617475730801286d6573736167655f69642c0110483235360001386d6573736167655f737461747573ad0201344d65737361676553746174757300050ca846756e6374696f6e207573656420746f20757064617465207472616e73616374696f6e20737461747573b4546865204f726967696e20666f7220746869732063616c6c2069732074686520427269646765204f726967696e9c4f6e6c79207468652072656c617965722063616e2063616c6c20746869732066756e6374696f6e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e890908306272696467655f74797065733847656e6572696342616c616e636500010c2453756273747261746504001801384d61696e6e657442616c616e63650000000c45564d04002c0110483235360001000c544f4e04008d090128546f6e42616c616e6365000200008d090c306272696467655f74797065730c746f6e28546f6e42616c616e636500000400910901104831323800009109083c7072696d69746976655f7479706573104831323800000400c801205b75383b2031365d0000950908306272696467655f74797065733847656e657269634173736574496400011010536f726104002c01384d61696e6e6574417373657449640000000c58434d04007509016c7375627374726174653a3a50617261636861696e417373657449640001000c45564d04004d03011048313630000200244c696265726c616e640400990901404c696265726c616e644173736574496400030000990908306272696467655f7479706573404c696265726c616e64417373657449640001080c4c4c44000000144173736574040010010c753332000100009d090c2c70616c6c65745f7375646f1870616c6c65741043616c6c040454000110107375646f04011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000028350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292ec42d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e2c23203c2f7765696768743e547375646f5f756e636865636b65645f77656967687408011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000118776569676874200118576569676874000128350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e2d01546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b05375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292ecc2d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e2c23203c2f7765696768743e1c7365745f6b657904010c6e65770001504163636f756e7449644c6f6f6b75704f663c543e0002285d0141757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f106b65792e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e402d204f6e65204442206368616e67652e2c23203c2f7765696768743e1c7375646f5f617308010c77686f0001504163636f756e7449644c6f6f6b75704f663c543e00011063616c6cd904017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00032c4d0141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d406120676976656e206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292ec42d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ea1090c186661756365741870616c6c65741043616c6c04045400010c207472616e736665720c012061737365745f69640d010130417373657449644f663c543e0001187461726765740001384163636f756e7449644f663c543e000118616d6f756e7418011c42616c616e636500002005015472616e7366657273207468652073706563696669656420616d6f756e74206f6620617373657420746f2074686520737065636966696564206163636f756e742ea854686520737570706f7274656420617373657473206172653a20584f522c2056414c2c2050535741502e002023204572726f727300590141737365744e6f74537570706f727465642069732072657475726e6564206966206061737365745f69646020697320736f6d657468696e67207468652066756e6374696f6e20646f65736e277420737570706f72742e7901416d6f756e7441626f76654c696d69742069732072657475726e65642069662060746172676574602068617320616c7265616479207265636569766564207468656972206461696c79206c696d6974206f66206061737365745f6964602e19014e6f74456e6f75676852657365727665732069732072657475726e65642069662060616d6f756e74602069732067726561746572207468616e207468652072657365727665733472657365745f72657761726473000100307570646174655f6c696d69740401246e65775f6c696d697418011c42616c616e6365000200042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ea5090c2071615f746f6f6c731870616c6c65741043616c6c040454000118806f726465725f626f6f6b5f6372656174655f616e645f66696c6c5f62617463680c0128626964735f6f776e6572000130543a3a4163636f756e74496400012861736b735f6f776e6572000130543a3a4163636f756e74496400012073657474696e6773a9090185025665633c0a284f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e2c2070616c6c65745f746f6f6c733a3a6f726465725f626f6f6b3a3a0a4f72646572426f6f6b417474726962757465732c2070616c6c65745f746f6f6c733a3a6f726465725f626f6f6b3a3a46696c6c496e7075743c4d6f6d656e744f663c543e2c0a426c6f636b4e756d626572466f723c543e3e2c293e0000307501437265617465206d756c7469706c65206d616e79206f7264657220626f6f6b73207769746820706172616d657465727320616e642066696c6c207468656d206163636f7264696e6720746f20676976656e20706172616d65746572732e00250142616c616e636520666f7220706c6163696e6720746865206f7264657273206973206d696e746564206175746f6d61746963616c6c792c2074726164696e67207061697273206172654863726561746564206966206e65656465642e000d01496e206f7264657220746f2063726561746520656d707479206f7264657220626f6f6b732c206f6e652063616e206c656176652073657474696e677320656d7074792e002c506172616d65746572733a402d20606f726967696e603a20726f6f7411012d2060626964735f6f776e6572603a2043726561746f72206f662074686520627579206f726465727320706c61636564206f6e20746865206f7264657220626f6f6b732c15012d206061736b735f6f776e6572603a2043726561746f72206f66207468652073656c6c206f726465727320706c61636564206f6e20746865206f7264657220626f6f6b732c89012d206073657474696e6773603a20506172616d657465727320666f72206372656174696f6e206f6620746865206f7264657220626f6f6b20616e6420706c6163696e6720746865206f726465727320696e2065616368206f7264657220626f6f6b2e546f726465725f626f6f6b5f66696c6c5f62617463680c0128626964735f6f776e6572000130543a3a4163636f756e74496400012861736b735f6f776e6572000130543a3a4163636f756e74496400012073657474696e6773c90901c9015665633c0a284f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e2c2070616c6c65745f746f6f6c733a3a6f726465725f626f6f6b3a3a0a46696c6c496e7075743c4d6f6d656e744f663c543e2c20426c6f636b4e756d626572466f723c543e3e2c293e000124cc46696c6c20746865206f7264657220626f6f6b73206163636f7264696e6720746f20676976656e20706172616d65746572732e00dc42616c616e636520666f7220706c6163696e6720746865206f7264657273206973206d696e746564206175746f6d61746963616c6c792e002c506172616d65746572733a402d20606f726967696e603a20726f6f7411012d2060626964735f6f776e6572603a2043726561746f72206f662074686520627579206f726465727320706c61636564206f6e20746865206f7264657220626f6f6b732c15012d206061736b735f6f776e6572603a2043726561746f72206f66207468652073656c6c206f726465727320706c61636564206f6e20746865206f7264657220626f6f6b732c0d012d206073657474696e6773603a20506172616d657465727320666f7220706c6163696e6720746865206f726465727320696e2065616368206f7264657220626f6f6b2e3878796b5f696e697469616c697a6508011c6163636f756e740001384163636f756e7449644f663c543e0001147061697273650301b45665633c417373657450616972496e7075743c44657849644f663c543e2c20417373657449644f663c543e3e3e00021894496e697469616c697a652078796b20706f6f6c206c697175696469747920736f757263652e002c506172616d65746572733a402d20606f726967696e603a20526f6f74e82d20606163636f756e74603a20536f6d65206163636f756e7420746f2075736520647572696e672074686520696e697469616c697a6174696f6e942d20607061697273603a20417373657420706169727320746f20696e697469616c697a652e387873745f696e697469616c697a650c012c626173655f707269636573d10901444f7074696f6e3c42617365496e7075743e00014473796e746865746963735f707269636573d90901dc5665633c53796e746865746963496e7075743c417373657449644f663c543e2c3c5420617320436f6e6669673e3a3a53796d626f6c3e3e00011c72656c61796572000130543a3a4163636f756e7449640003306901496e697469616c697a6520787374206c697175696469747920736f757263652e20496e207873742773206071756f7465602c206f6e65206f662074686520617373657473206973207468652073796e7468657469632062617365b4285853542920616e6420746865206f74686572206f6e6520697320612073796e7468657469632061737365742e002c506172616d65746572733a402d20606f726967696e603a20526f6f7435012d2060626173655f707269636573603a2053796e7468657469632062617365206173736574207072696365207570646174652e20557375616c6c7920627579207072696365203e2073656c6c2ec02d206073796e746865746963735f707269636573603a2053796e74686574696320696e697469616c697a6174696f6e3bfc726567697374726174696f6e206f6620616e206173736574202b2073657474696e672075702070726963657320666f72207461726765742071756f7465732e35012d206072656c61796572603a204163636f756e742077686963682077696c6c2062652074686520617574686f72206f66207072696365732066656420746f206062616e64602070616c6c65743b00f8456d697473206576656e747320776974682061637475616c2071756f74657320616368696576656420616674657220696e697469616c697a6174696f6e3bd46d6f72652064657461696c7320696e205b606c69717569646974795f736f75726365733a3a696e697469616c697a655f787374605d3c6d6362635f696e697469616c697a650c012c626173655f737570706c79e50901d04f7074696f6e3c70616c6c65745f746f6f6c733a3a6d6362633a3a42617365537570706c793c543a3a4163636f756e7449643e3e0001446f746865725f636f6c6c61746572616c73ed0901ec5665633c70616c6c65745f746f6f6c733a3a6d6362633a3a4f74686572436f6c6c61746572616c496e7075743c417373657449644f663c543e3e3e00013c746263645f636f6c6c61746572616cfd0901bc4f7074696f6e3c70616c6c65745f746f6f6c733a3a6d6362633a3a54626364436f6c6c61746572616c496e7075743e00041c84496e697469616c697a65206d636263206c697175696469747920736f757263652e002c506172616d65746572733a402d20606f726967696e603a20526f6f749c2d2060626173655f737570706c79603a20436f6e74726f6c20737570706c79206f6620584f522c49012d20606f746865725f636f6c6c61746572616c73603a205661726961626c65732072656c6174656420746f2061726269747261727920636f6c6c61746572616c2d73706563696669632070726963696e672cd42d2060746263645f636f6c6c61746572616c603a20544243442d73706563696669632070726963696e67207661726961626c65732e6c70726963655f746f6f6c735f7365745f61737365745f707269636508013461737365745f7065725f786f728d03019870616c6c65745f746f6f6c733a3a70726963655f746f6f6c733a3a417373657450726963657300012061737365745f6964050a0168496e707574417373657449643c417373657449644f663c543e3e00051cbc53657420707269636573206f6620616e20617373657420696e206070726963655f746f6f6c73602070616c6c65742ec849676e6f7265732070616c6c6574207265737472696374696f6e73206f6e207072696365207370656564206368616e67652e002c506172616d65746572733a402d20606f726967696e603a20526f6f7419012d206061737365745f7065725f786f72603a2050726963657320283120584f5220696e207465726d73206f662074686520636f72726573706f6e64696e67206173736574292e35012d206061737365745f6964603a204173736574206964656e7469666965723b2063616e20626520736f6d6520636f6d6d6f6e20636f6e7374616e7420666f722065617369657220696e7075742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ea909000002ad0900ad090000040c7102b109b50900b109102071615f746f6f6c733070616c6c65745f746f6f6c73286f726465725f626f6f6b4c4f72646572426f6f6b4174747269627574657300001001247469636b5f73697a6518011c42616c616e6365000134737465705f6c6f745f73697a6518011c42616c616e63650001306d696e5f6c6f745f73697a6518011c42616c616e63650001306d61785f6c6f745f73697a6518011c42616c616e63650000b509102071615f746f6f6c733070616c6c65745f746f6f6c73286f726465725f626f6f6b2446696c6c496e70757408184d6f6d656e7401282c426c6f636b4e756d6265720110000c011061736b73b90901744f7074696f6e3c5369646546696c6c496e7075743c4d6f6d656e743e3e00011062696473b90901744f7074696f6e3c5369646546696c6c496e7075743c4d6f6d656e743e3e00012c72616e646f6d5f73656564f101014c4f7074696f6e3c426c6f636b4e756d6265723e0000b90904184f7074696f6e04045401bd090108104e6f6e6500000010536f6d650400bd090000010000bd09102071615f746f6f6c733070616c6c65745f746f6f6c73286f726465725f626f6f6b345369646546696c6c496e70757404184d6f6d656e74012800180134686967686573745f707269636518011c42616c616e63650001306c6f776573745f707269636518011c42616c616e636500012870726963655f7374657018011c42616c616e63650001406f72646572735f7065725f707269636510010c7533320001206c6966657370616ecd0201384f7074696f6e3c4d6f6d656e743e000158616d6f756e745f72616e67655f696e636c7573697665c10901504f7074696f6e3c52616e646f6d416d6f756e743e0000c10904184f7074696f6e04045401c5090108104e6f6e6500000010536f6d650400c5090000010000c509102071615f746f6f6c733070616c6c65745f746f6f6c73286f726465725f626f6f6b3052616e646f6d416d6f756e74000008010c6d696e18011c42616c616e636500010c6d617818011c42616c616e63650000c909000002cd0900cd09000004087102b50900d10904184f7074696f6e04045401d5090108104e6f6e6500000010536f6d650400d5090000010000d509102071615f746f6f6c733070616c6c65745f746f6f6c730c7873742442617365496e70757400000801807265666572656e63655f7065725f73796e7468657469635f626173655f62757918011c42616c616e63650001847265666572656e63655f7065725f73796e7468657469635f626173655f73656c6c18011c42616c616e63650000d909000002dd0900dd09102071615f746f6f6c733070616c6c65745f746f6f6c730c7873743853796e746865746963496e707574081c41737365744964010d011853796d626f6c010102000c012061737365745f69640d01011c4173736574496400013865787065637465645f71756f74657903013853796e74686574696351756f74650001246578697374656e6365e109016853796e7468657469634578697374656e63653c53796d626f6c3e0000e109102071615f746f6f6c733070616c6c65745f746f6f6c730c7873744853796e7468657469634578697374656e6365041853796d626f6c010102010834416c72656164794578697374730000004052656769737465724e6577417373657410011873796d626f6c2901012c417373657453796d626f6c0001106e616d653101012441737365744e616d650001407265666572656e63655f73796d626f6c0102011853796d626f6c0001246665655f726174696f3d010134636f6d6d6f6e3a3a466978656400010000e50904184f7074696f6e04045401e9090108104e6f6e6500000010536f6d650400e9090000010000e909102071615f746f6f6c733070616c6c65745f746f6f6c73106d6362632842617365537570706c7904244163636f756e74496401000008013c61737365745f636f6c6c6563746f720001244163636f756e74496400011874617267657418011c42616c616e63650000ed09000002f10900f109102071615f746f6f6c733070616c6c65745f746f6f6c73106d636263504f74686572436f6c6c61746572616c496e707574041c41737365744964010d010008011461737365740d01011c41737365744964000128706172616d6574657273f5090168436f6c6c61746572616c436f6d6d6f6e506172616d65746572730000f509102071615f746f6f6c733070616c6c65745f746f6f6c73106d63626368436f6c6c61746572616c436f6d6d6f6e506172616d657465727300000801287265665f707269636573f909014c4f7074696f6e3c41737365745072696365733e00012072657365727665736d03013c4f7074696f6e3c42616c616e63653e0000f90904184f7074696f6e040454018d030108104e6f6e6500000010536f6d6504008d030000010000fd0904184f7074696f6e04045401010a0108104e6f6e6500000010536f6d650400010a0000010000010a102071615f746f6f6c733070616c6c65745f746f6f6c73106d6362634c54626364436f6c6c61746572616c496e7075740000080128706172616d6574657273f5090168436f6c6c61746572616c436f6d6d6f6e506172616d65746572730001387265665f786f725f707269636573f909014c4f7074696f6e3c41737365745072696365733e0000050a0c2071615f746f6f6c731870616c6c657430496e70757441737365744964041c41737365744964010d01010c344d6362635265666572656e6365000000305873745265666572656e6365000100144f7468657204000d01011c4173736574496400020000090a0c3c61706f6c6c6f5f706c6174666f726d1870616c6c65741043616c6c040454000130206164645f706f6f6c20012061737365745f69640d010130417373657449644f663c543e0001346c6f616e5f746f5f76616c756518011c42616c616e63650001546c69717569646174696f6e5f7468726573686f6c6418011c42616c616e63650001606f7074696d616c5f7574696c697a6174696f6e5f7261746518011c42616c616e6365000124626173655f7261746518011c42616c616e6365000130736c6f70655f726174655f3118011c42616c616e6365000130736c6f70655f726174655f3218011c42616c616e6365000138726573657276655f666163746f7218011c42616c616e63650000042041646420706f6f6c106c656e640801346c656e64696e675f61737365740d010130417373657449644f663c543e0001386c656e64696e675f616d6f756e7418011c42616c616e6365000104284c656e6420746f6b656e18626f72726f77100140636f6c6c61746572616c5f61737365740d010130417373657449644f663c543e00013c626f72726f77696e675f61737365740d010130417373657449644f663c543e000140626f72726f77696e675f616d6f756e7418011c42616c616e63650001346c6f616e5f746f5f76616c756518011c42616c616e636500020430426f72726f7720746f6b656e2c6765745f7265776172647308012061737365745f69640d010130417373657449644f663c543e00012869735f6c656e64696e67bc0110626f6f6c0003042c476574207265776172647320776974686472617708013c77697468647261776e5f61737365740d010130417373657449644f663c543e00014077697468647261776e5f616d6f756e7418011c42616c616e63650004042057697468647261771472657061790c0140636f6c6c61746572616c5f61737365740d010130417373657449644f663c543e00013c626f72726f77696e675f61737365740d010130417373657449644f663c543e00013c616d6f756e745f746f5f726570617918011c42616c616e6365000504145265706179546368616e67655f726577617264735f616d6f756e7408012869735f6c656e64696e67bc0110626f6f6c000118616d6f756e7418011c42616c616e6365000604544368616e6765207265776172647320616d6f756e74606368616e67655f726577617264735f7065725f626c6f636b08012869735f6c656e64696e67bc0110626f6f6c000118616d6f756e7418011c42616c616e6365000704604368616e676520726577617264732070657220626c6f636b246c6971756964617465080110757365720001384163636f756e7449644f663c543e00012061737365745f69640d010130417373657449644f663c543e000804244c69717569646174652c72656d6f76655f706f6f6c04014861737365745f69645f746f5f72656d6f76650d010130417373657449644f663c543e0009042c52656d6f766520706f6f6c38656469745f706f6f6c5f696e666f2c012061737365745f69640d010130417373657449644f663c543e0001446e65775f6c6f616e5f746f5f76616c756518011c42616c616e63650001646e65775f6c69717569646174696f6e5f7468726573686f6c6418011c42616c616e63650001706e65775f6f7074696d616c5f7574696c697a6174696f6e5f7261746518011c42616c616e63650001346e65775f626173655f7261746518011c42616c616e63650001406e65775f736c6f70655f726174655f3118011c42616c616e63650001406e65775f736c6f70655f726174655f3218011c42616c616e63650001486e65775f726573657276655f666163746f7218011c42616c616e63650001186e65775f746c18011c42616c616e63650001186e65775f746218011c42616c616e63650001186e65775f746318011c42616c616e6365000a04384564697420706f6f6c20696e666f386164645f636f6c6c61746572616c0c0140636f6c6c61746572616c5f61737365740d010130417373657449644f663c543e000144636f6c6c61746572616c5f616d6f756e7418011c42616c616e636500013c626f72726f77696e675f61737365740d010130417373657449644f663c543e000b04a4416464206d6f726520636f6c6c61746572616c20746f20626f72726f77696e6720706f736974696f6e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e0d0a0c3c657874656e6465645f6173736574731870616c6c65741043616c6c0404540001146072656769737465725f726567756c617465645f61737365741c011873796d626f6c2901012c417373657453796d626f6c0001106e616d653101012441737365744e616d65000138696e697469616c5f737570706c7918011c42616c616e636500012c69735f6d696e7461626c65bc0110626f6f6c00013869735f696e646976697369626c65bc0110626f6f6c00013c6f70745f636f6e74656e745f737263990301544f7074696f6e3c436f6e74656e74536f757263653e0001206f70745f646573638505014c4f7074696f6e3c4465736372697074696f6e3e000040b1015265676973746572732061206e657720726567756c617465642061737365742c20726570726573656e74696e672074686174207468652061737365742077696c6c206f6e6c79206f706572617465206265747765656e204b59432d76657269666965642077616c6c6574732e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2e95012d206073796d626f6c603a20417373657453796d626f6c2073686f756c6420726570726573656e7420737472696e672077697468206f6e6c7920757070657263617365206c6174696e2063686172732077697468206d6178206c656e677468206f6620372e15022d20606e616d65603a2041737365744e616d652073686f756c6420726570726573656e7420737472696e672077697468206f6e6c7920757070657263617365206f72206c6f77657263617365206c6174696e206368617273206f72206e756d62657273206f72207370616365732c2077697468206d6178206c656e677468206f662033332e8d012d2060696e697469616c5f737570706c79603a2042616c616e6365207479706520726570726573656e74696e672074686520746f74616c20616d6f756e74206f662074686520617373657420746f2062652069737375656420696e697469616c6c792ea5012d206069735f696e646976697369626c65603a204120626f6f6c65616e20666c616720696e6469636174696e672077686574686572207468652061737365742063616e206265206469766964656420696e746f20736d616c6c657220756e697473206f72206e6f742ea9022d20606f70745f636f6e74656e745f737263603a20416e206f7074696f6e616c20706172616d65746572206f6620747970652060436f6e74656e74536f75726365602c2077686963682063616e20696e636c756465206120555249206f722061207265666572656e636520746f206120636f6e74656e7420736f7572636520746861742070726f7669646573206d6f72652064657461696c732061626f7574207468652061737365742e25022d20606f70745f64657363603a20416e206f7074696f6e616c20706172616d65746572206f66207479706520604465736372697074696f6e602c207768696368206973206120737472696e672070726f766964696e6720612073686f7274206465736372697074696f6e206f7220636f6d6d656e746172792061626f7574207468652061737365742e00242323204576656e7473004501456d6974732060526567756c6174656441737365745265676973746572656460206576656e74207768656e20746865206173736574206973207375636365737366756c6c7920726567697374657265642e002469737375655f73627414011873796d626f6c2901012c417373657453796d626f6c0001106e616d653101012441737365744e616d6500012c6465736372697074696f6e8505014c4f7074696f6e3c4465736372697074696f6e3e000114696d616765990301544f7074696f6e3c436f6e74656e74536f757263653e00013065787465726e616c5f75726c990301544f7074696f6e3c436f6e74656e74536f757263653e0001288c4973737565732061206e657720536f756c626f756e6420546f6b656e2028534254292e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2e09022d206073796d626f6c603a205468652073796d626f6c206f6620746865205342542077686963682073686f756c6420726570726573656e74206120737472696e672077697468206f6e6c7920757070657263617365204c6174696e206368617261637465727320776974682061206d6178696d756d206c656e677468206f6620372e85022d20606e616d65603a20546865206e616d65206f6620746865205342542077686963682073686f756c6420726570726573656e74206120737472696e672077697468206f6e6c7920757070657263617365206f72206c6f77657263617365204c6174696e20636861726163746572732c206e756d626572732c206f72207370616365732c20776974682061206d6178696d756d206c656e677468206f662033332edc2d20606465736372697074696f6e603a20546865206465736372697074696f6e206f6620746865205342542e20284f7074696f6e616c2949012d2060696d616765603a205468652055524c206f72206964656e74696669657220666f722074686520696d616765206173736f636961746564207769746820746865205342542e20284f7074696f6e616c2965012d206065787465726e616c5f75726c603a205468652055524c20706f696e74696e6720746f20616e2065787465726e616c207265736f757263652072656c6174656420746f20746865205342542e20284f7074696f6e616c29487365745f7362745f65787069726174696f6e0c01286163636f756e745f6964000130543a3a4163636f756e7449640001307362745f61737365745f69640d010130417373657449644f663c543e0001386e65775f657870697265735f6174cd0201444f7074696f6e3c543a3a4d6f6d656e743e000220290153657473207468652065787069726174696f6e2064617465206f66206120536f756c626f756e6420546f6b656e20285342542920666f722074686520676976656e206163636f756e742e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2ea82d206061737365745f6964603a20546865204944206f66207468652053425420746f207570646174652e01012d20606163636f756e745f6964603a20546865204944206f6620746865206163636f756e7420746f20736574207468652065787069726174696f6e20666f722ef42d20606e65775f657870697265735f6174603a20546865206e65772065787069726174696f6e2074696d657374616d7020666f7220746865205342542e6c62696e645f726567756c617465645f61737365745f746f5f7362740801307362745f61737365745f69640d010130417373657449644f663c543e000148726567756c617465645f61737365745f69640d010130417373657449644f663c543e000328cc42696e6473206120726567756c6174656420617373657420746f206120536f756c626f756e6420546f6b656e2028534254292e004101546869732066756e6374696f6e2062696e6473206120726567756c6174656420617373657420746f206120737065636966696564205342542c20656e737572696e672074686520617373657420616e648c74686520534254206d656574207468652072657175697265642063726974657269612e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2e0d012d20607362745f61737365745f6964603a20546865204944206f66207468652053425420746f2062696e642074686520726567756c6174656420617373657420746f2ef82d2060726567756c617465645f61737365745f6964603a20546865204944206f662074686520726567756c6174656420617373657420746f2062696e642e38726567756c6174655f617373657404012061737365745f69640d010130417373657449644f663c543e000418a1014d61726b7320616e20617373657420617320726567756c617465642c20726570726573656e74696e672074686174207468652061737365742077696c6c206f6e6c79206f706572617465206265747765656e204b59432d76657269666965642077616c6c6574732e0034232320506172616d657465727300a82d20606f726967696e603a20546865206f726967696e206f6620746865207472616e73616374696f6e2ea82d206061737365745f6964603a20546865206964656e746966696572206f66207468652061737365742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e110a04184f7074696f6e04045401940108104e6f6e6500000010536f6d650400940000010000150a0c3c70616c6c65745f6d756c74697369671870616c6c6574144572726f72040454000154404d696e696d756d5468726573686f6c640000047c5468726573686f6c64206d7573742062652032206f7220677265617465722e3c416c7265616479417070726f766564000104ac43616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e444e6f417070726f76616c734e65656465640002049c43616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e44546f6f4665775369676e61746f72696573000304a854686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e48546f6f4d616e795369676e61746f72696573000404ac54686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e545369676e61746f726965734f75744f664f726465720005040d01546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e5853656e6465724e6f74496e5369676e61746f7269657300060411015468652073656e646572207761736e277420636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e2062652e404e6f74496e5369676e61746f72696573000704e454686520676976656e206163636f756e74204944206973206e6f742070726573656e74656420696e20746865207369676e61746f726965732e50416c7265616479496e5369676e61746f72696573000804f454686520676976656e206163636f756e7420494420697320616c72656164792070726573656e74656420696e20746865207369676e61746f726965732e204e6f74466f756e64000904dc4d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e204e6f744f776e6572000a042d014f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e2c4e6f54696d65706f696e74000b041d014e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e3857726f6e6754696d65706f696e74000c042d014120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e4c556e657870656374656454696d65706f696e74000d04f4412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e34416c726561647953746f726564000e04a0546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e30576569676874546f6f4c6f77000f04d0546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e345a65726f5468726573686f6c64001004745468726573686f6c642073686f756c64206e6f74206265207a65726f2e544d756c7469736967416c7265616479457869737473001104ac546865206d756c7469736967206163636f756e7420697320616c726561647920726567697374657265642e58556e6b6e6f776e4d756c74697369674163636f756e74001204b0436f72726573706f6e64696e67206d756c7469736967206163636f756e74207761736e277420666f756e642e885369676e61746f726965734172654e6f74556e697175654f72556e6f726465726564001304e85369676e61746f72696573206c69737420756e6f726465726564206f7220636f6e7461696e73206475706c69636174656420656e74726965732e44416c726561647944697370617463686564001404c043616c6c20776974682074686520676976656e20686173682077617320616c726561647920646973706174636865642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909190a0c3870616c6c65745f7574696c6974791870616c6c6574144572726f7204045400010430546f6f4d616e7943616c6c730000045c546f6f206d616e792063616c6c7320626174636865642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909091d0a0c3870616c6c65745f7374616b696e6710736f72613c4475726174696f6e5772617070657200000801107365637328010c7536340001146e616e6f7310010c7533320000210a083870616c6c65745f7374616b696e67345374616b696e674c656467657204045400001401147374617368000130543a3a4163636f756e744964000114746f74616cfc013042616c616e63654f663c543e000118616374697665fc013042616c616e63654f663c543e000124756e6c6f636b696e67250a01f0426f756e6465645665633c556e6c6f636b4368756e6b3c42616c616e63654f663c543e3e2c20543a3a4d6178556e6c6f636b696e674368756e6b733e00013c636c61696d65645f72657761726473310a0194426f756e6465645665633c457261496e6465782c20543a3a486973746f727944657074683e0000250a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401290a0453000004002d0a01185665633c543e0000290a083870616c6c65745f7374616b696e672c556e6c6f636b4368756e6b041c42616c616e636501180008011476616c7565fc011c42616c616e636500010c657261e5020120457261496e64657800002d0a000002290a00310a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401100453000004008d0401185665633c543e0000350a083870616c6c65745f7374616b696e672c4e6f6d696e6174696f6e7304045400000c011c74617267657473390a01ac426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61784e6f6d696e6174696f6e733e0001307375626d69747465645f696e100120457261496e64657800012873757070726573736564bc0110626f6f6c0000390a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400510201185665633c543e00003d0a083870616c6c65745f7374616b696e6734416374697665457261496e666f0000080114696e646578100120457261496e6465780001147374617274cd02012c4f7074696f6e3c7536343e0000410a00000408100000450a083870616c6c65745f7374616b696e673c457261526577617264506f696e747304244163636f756e744964010000080114746f74616c10012c526577617264506f696e74000128696e646976696475616c490a018042547265654d61703c4163636f756e7449642c20526577617264506f696e743e0000490a042042547265654d617008044b0100045601100004004d0a0000004d0a000002510a00510a00000408001000550a000002590a00590a083870616c6c65745f7374616b696e6738556e6170706c696564536c61736808244163636f756e74496401001c42616c616e636501180014012476616c696461746f720001244163636f756e74496400010c6f776e18011c42616c616e63650001186f7468657273d50101645665633c284163636f756e7449642c2042616c616e6365293e0001247265706f7274657273510201385665633c4163636f756e7449643e0001187061796f757418011c42616c616e636500005d0a00000408b01800610a0c3870616c6c65745f7374616b696e6720736c617368696e6734536c617368696e675370616e7300001001287370616e5f696e6465781001245370616e496e6465780001286c6173745f7374617274100120457261496e6465780001486c6173745f6e6f6e7a65726f5f736c617368100120457261496e6465780001147072696f728d0401345665633c457261496e6465783e0000650a0c3870616c6c65745f7374616b696e6720736c617368696e67285370616e5265636f7264041c42616c616e636501180008011c736c617368656418011c42616c616e6365000120706169645f6f757418011c42616c616e63650000690a0000026d0a006d0a0000040810bc00710a103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144572726f72040454000164344e6f74436f6e74726f6c6c6572000004644e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f745374617368000104504e6f742061207374617368206163636f756e742e34416c7265616479426f6e64656400020460537461736820697320616c726561647920626f6e6465642e34416c726561647950616972656400030474436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d7074795461726765747300040460546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e646578000504404475706c696361746520696e6465782e44496e76616c6964536c617368496e64657800060484536c617368207265636f726420696e646578206f7574206f6620626f756e64732e40496e73756666696369656e74426f6e6400070c590143616e6e6f74206861766520612076616c696461746f72206f72206e6f6d696e61746f7220726f6c652c20776974682076616c7565206c657373207468616e20746865206d696e696d756d20646566696e65642062793d01676f7665726e616e6365202873656520604d696e56616c696461746f72426f6e646020616e6420604d696e4e6f6d696e61746f72426f6e6460292e20496620756e626f6e64696e67206973207468651501696e74656e74696f6e2c20606368696c6c6020666972737420746f2072656d6f7665206f6e65277320726f6c652061732076616c696461746f722f6e6f6d696e61746f722e304e6f4d6f72654368756e6b730008049043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b000904a043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e646564546172676574000a04c8417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264000b0458496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73000c0478496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e69717565000d04804974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564000e0409015265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e54496e636f7272656374486973746f72794465707468000f04c0496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e73001004b0496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e2042616453746174650011043901496e7465726e616c20737461746520686173206265636f6d6520736f6d65686f7720636f7272757074656420616e6420746865206f7065726174696f6e2063616e6e6f7420636f6e74696e75652e38546f6f4d616e795461726765747300120494546f6f206d616e79206e6f6d696e6174696f6e207461726765747320737570706c6965642e244261645461726765740013043d0141206e6f6d696e6174696f6e207461726765742077617320737570706c69656420746861742077617320626c6f636b6564206f72206f7468657277697365206e6f7420612076616c696461746f722e4043616e6e6f744368696c6c4f74686572001404550154686520757365722068617320656e6f75676820626f6e6420616e6420746875732063616e6e6f74206265206368696c6c656420666f72636566756c6c7920627920616e2065787465726e616c20706572736f6e2e44546f6f4d616e794e6f6d696e61746f72730015084d0154686572652061726520746f6f206d616e79206e6f6d696e61746f727320696e207468652073797374656d2e20476f7665726e616e6365206e6565647320746f2061646a75737420746865207374616b696e67b473657474696e677320746f206b656570207468696e6773207361666520666f72207468652072756e74696d652e44546f6f4d616e7956616c696461746f7273001608550154686572652061726520746f6f206d616e792076616c696461746f722063616e6469646174657320696e207468652073797374656d2e20476f7665726e616e6365206e6565647320746f2061646a75737420746865d47374616b696e672073657474696e677320746f206b656570207468696e6773207361666520666f72207468652072756e74696d652e40436f6d6d697373696f6e546f6f4c6f77001704e0436f6d6d697373696f6e20697320746f6f206c6f772e204d757374206265206174206c6561737420604d696e436f6d6d697373696f6e602e2c426f756e644e6f744d657400180458536f6d6520626f756e64206973206e6f74206d65742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909750a0c2873705f7374616b696e671c6f6666656e6365384f6666656e636544657461696c7308205265706f727465720100204f6666656e64657201f4000801206f6666656e646572f401204f6666656e6465720001247265706f7274657273510201345665633c5265706f727465723e0000790a00000408c830007d0a000002810a00810a0000040800290500850a00000408890a3000890a0c1c73705f636f72651863727970746f244b65795479706549640000040040011c5b75383b20345d00008d0a0c3870616c6c65745f73657373696f6e1870616c6c6574144572726f7204045400011430496e76616c696450726f6f6600000460496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f7249640001049c4e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b65790002046452656769737465726564206475706c6963617465206b65792e184e6f4b657973000304a44e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e244e6f4163636f756e7400040419014b65792073657474696e67206163636f756e74206973206e6f74206c6976652c20736f206974277320696d706f737369626c6520746f206173736f6369617465206b6579732e04744572726f7220666f72207468652073657373696f6e2070616c6c65742e910a083870616c6c65745f6772616e6470612c53746f726564537461746504044e01100110104c6976650000003050656e64696e6750617573650801307363686564756c65645f61741001044e00011464656c61791001044e000100185061757365640002003450656e64696e67526573756d650801307363686564756c65645f61741001044e00011464656c61791001044e00030000950a083870616c6c65745f6772616e6470614c53746f72656450656e64696e674368616e676508044e0110144c696d697400001001307363686564756c65645f61741001044e00011464656c61791001044e0001406e6578745f617574686f726974696573990a016c426f756e646564417574686f726974794c6973743c4c696d69743e000118666f72636564f10101244f7074696f6e3c4e3e0000990a101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401d8045300000400d401185665633c543e00009d0a0c3870616c6c65745f6772616e6470611870616c6c6574144572726f7204045400011c2c50617573654661696c65640000080501417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a42865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c65640001081101417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e67000204e8417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e000304bc43616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f66000404310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f660005043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400060415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909a10a101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401e8045300000400a50a01185665633c543e0000a50a000002e800a90a10346672616d655f737570706f727418747261697473106d69736334577261707065724f706171756504045401ad0a000800e502000000ad0a0104540000ad0a084070616c6c65745f696d5f6f6e6c696e6564426f756e6465644f70617175654e6574776f726b53746174650c4c506565724964456e636f64696e674c696d697400584d756c746941646472456e636f64696e674c696d697400384164647265737365734c696d6974000008011c706565725f6964b10a019c5765616b426f756e6465645665633c75382c20506565724964456e636f64696e674c696d69743e00014865787465726e616c5f616464726573736573b50a012d015765616b426f756e6465645665633c5765616b426f756e6465645665633c75382c204d756c746941646472456e636f64696e674c696d69743e2c204164647265737365734c696d69740a3e0000b10a101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401080453000004003001185665633c543e0000b50a101c73705f636f72651c626f756e646564407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401b10a045300000400b90a01185665633c543e0000b90a000002b10a00bd0a0c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144572726f7204045400010828496e76616c69644b6579000004604e6f6e206578697374656e74207075626c6963206b65792e4c4475706c696361746564486561727462656174000104544475706c696361746564206865617274626561742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909c10a00000408000d0100c50a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401c90a045300000400cd0a01185665633c543e0000c90a082c6f726d6c5f746f6b656e732c42616c616e63654c6f636b041c42616c616e63650118000801086964150101384c6f636b4964656e746966696572000118616d6f756e7418011c42616c616e63650000cd0a000002c90a00d10a082c6f726d6c5f746f6b656e732c4163636f756e7444617461041c42616c616e63650118000c01106672656518011c42616c616e6365000120726573657276656418011c42616c616e636500011866726f7a656e18011c42616c616e63650000d50a101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401d90a045300000400dd0a01185665633c543e0000d90a082c6f726d6c5f746f6b656e732c52657365727665446174610844526573657276654964656e74696669657201a81c42616c616e63650118000801086964a80144526573657276654964656e746966696572000118616d6f756e7418011c42616c616e63650000dd0a000002d90a00e10a0c2c6f726d6c5f746f6b656e73186d6f64756c65144572726f720404540001203442616c616e6365546f6f4c6f77000004585468652062616c616e636520697320746f6f206c6f775c416d6f756e74496e746f42616c616e63654661696c65640001049c43616e6e6f7420636f6e7665727420416d6f756e7420696e746f2042616c616e63652074797065544c69717569646974795265737472696374696f6e73000204d04661696c65642062656361757365206c6971756964697479207265737472696374696f6e732064756520746f206c6f636b696e67404d61784c6f636b734578636565646564000304b44661696c6564206265636175736520746865206d6178696d756d206c6f636b7320776173206578636565646564244b656570416c6976650004048c5472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e74484578697374656e7469616c4465706f736974000504e856616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f7369742c446561644163636f756e740006048842656e6566696369617279206163636f756e74206d757374207072652d65786973743c546f6f4d616e79526573657276657300070004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909e50a0c3c6f726d6c5f63757272656e63696573186d6f64756c65144572726f7204045400010c5c416d6f756e74496e746f42616c616e63654661696c6564000004bc556e61626c6520746f20636f6e766572742074686520416d6f756e74207479706520696e746f2042616c616e63652e3442616c616e6365546f6f4c6f770001044c42616c616e636520697320746f6f206c6f772e344465706f7369744661696c6564000204784465706f73697420726573756c74206973206e6f7420657870656374656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909e90a00000408101d0100ed0a04204254726565536574040454017901000400a105000000f10a0c3074726164696e675f706169721870616c6c6574144572726f720404540001104454726164696e6750616972457869737473000004a05265676973746572696e672074726164696e67207061697220616c7265616479206578697374732e50466f7262696464656e4261736541737365744964000104010154686520737065636966696564206261736520617373657420494420666f72207468652074726164696e672070616972206973206e6f7420616c6c6f7765642e444964656e746963616c4173736574496473000204ec546865207370656369666965642062617365206173736574204944206973207468652073616d65206173207461726765742061737365742049442e5854726164696e6750616972446f65736e744578697374000304bc54726164696e672070616972206973206e6f74207265676973746572656420666f7220676976656e2044455849642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909f50a000004182901310108bc9903850500f90a0c18636f6d6d6f6e287072696d697469766573244173736574496e666f00001c011873796d626f6c2901012c417373657453796d626f6c0001106e616d653101012441737365744e616d65000124707265636973696f6e08014042616c616e6365507265636973696f6e00012c69735f6d696e7461626c65bc0110626f6f6c00012861737365745f74797065fd0a0124417373657454797065000138636f6e74656e745f736f75726365990301544f7074696f6e3c436f6e74656e74536f757263653e00012c6465736372697074696f6e8505014c4f7074696f6e3c4465736372697074696f6e3e0000fd0a0c18636f6d6d6f6e287072696d697469766573244173736574547970650001101c526567756c61720000000c4e465400010024536f756c626f756e6400020024526567756c6174656400030000010b08186173736574732c41737365745265636f726404045400012818417269747930000000184172697479310400050b014441737365745265636f72644172673c543e000100184172697479320800050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e000200184172697479330c00050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e000300184172697479341000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e000400184172697479351400050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e000500184172697479361800050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e000600184172697479371c00050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e000700184172697479382000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e000800184172697479392400050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e0000050b014441737365745265636f72644172673c543e00090000050b08186173736574733841737365745265636f72644172670404540001242847656e657269634933320400090b010c6933320000002847656e65726963553634040028010c7536340001002c47656e65726963553132380400180110753132380002003047656e65726963553878333204000401205b75383b2033325d0003002c47656e657269634832353604002c0110483235360004002c47656e6572696348353132040085040110483531320005002c4c6561664173736574496404000d010130417373657449644f663c543e0006004841737365745265636f72644173736574496404000d010130417373657449644f663c543e00070014457874726104000d0b0158543a3a457874726141737365745265636f726441726700080000090b0000050b000d0b0c18636f6d6d6f6e287072696d6974697665736841737365744964457874726141737365745265636f72644172670c1444455849640110144c73744964017901244163636f756e7449640104010c14444558496404001001144445584964000000144c737449640400790101144c73744964000100244163636f756e74496404000401244163636f756e74496400020000110b0c186173736574731870616c6c6574144572726f720404540001345041737365744964416c7265616479457869737473000004a0416e2061737365742077697468206120676976656e20494420616c7265616479206578697374732e40417373657449644e6f7445786973747300010490416e2061737365742077697468206120676976656e204944206e6f74206578697374732e4c496e73756666696369656e7442616c616e6365000204b441206e756d626572206973206f7574206f662072616e6765206f66207468652062616c616e636520747970652e48496e76616c6964417373657453796d626f6c0003049d0153796d626f6c206973206e6f742076616c69642e204974206d75737420636f6e7461696e206f6e6c7920757070657263617365206c6174696e2063686172616374657273206f72206e756d626572732c206c656e6774682069732066726f6d203120746f20372e40496e76616c696441737365744e616d65000404f5014e616d65206973206e6f742076616c69642e204974206d75737420636f6e7461696e206f6e6c7920757070657263617365206f72206c6f77657263617365206c6174696e2063686172616374657273206f72206e756d62657273206f72207370616365732c206c656e6774682069732066726f6d203120746f2033332e40496e76616c6964507265636973696f6e0005048d01507265636973696f6e2076616c7565206973206e6f742076616c69642c2069742073686f756c6420726570726573656e742061206e756d626572206f6620646563696d616c20706c6163657320666f72206e756d6265722c206d61782069732033302e604173736574537570706c7949734e6f744d696e7461626c65000604b04d696e74696e6720666f7220706172746963756c61722061737365742069642069732064697361626c65642e44496e76616c696441737365744f776e65720007049043616c6c657220646f6573206e6f74206f776e207265717565737465642061737365742e2c496e635265664572726f7200080488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e50496e76616c6964436f6e74656e74536f75726365000904e101436f6e74656e7420736f75726365206973206e6f742076616c69642e204974206d757374206265206173636969206f6e6c7920616e642060636f6d6d6f6e3a3a41535345545f434f4e54454e545f534f555243455f4d41585f4c454e475448602063686172616374657273206c6f6e67206174206d61782e48496e76616c69644465736372697074696f6e000a048d014465736372697074696f6e206973206e6f742076616c69642e204974206d7573742062652060636f6d6d6f6e3a3a41535345545f4445534352495054494f4e5f4d41585f4c454e475448602063686172616374657273206c6f6e67206174206d61782e24446561644173736574000b04dc546865206173736574206973206e6f74206d696e7461626c6520616e642069747320696e697469616c2062616c616e636520697320302e204f766572666c6f77000c0454436f6d7075746174696f6e206f766572666c6f772e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909150b0c18636f6d6d6f6e287072696d6974697665731c444558496e666f041c41737365744964010d01000c0134626173655f61737365745f69640d01011c4173736574496400015c73796e7468657469635f626173655f61737365745f69640d01011c4173736574496400012469735f7075626c6963bc0110626f6f6c0000190b0c2c6465785f6d616e616765721870616c6c6574144572726f72040454000110484445584964416c7265616479457869737473000004a0444558207769746820676976656e20696420697320616c726561647920726567697374657265642e3c444558446f65734e6f74457869737400010490444558207769746820676976656e204964206973206e6f7420726567697374657265642e3c496e76616c696446656556616c756500020429014e756d657269632076616c75652070726f766964656420617320666565206973206e6f742076616c69642c20652e672e206f7574206f662062617369732d706f696e742072616e67652e40496e76616c69644163636f756e744964000304a04163636f756e74207769746820676976656e204964206973206e6f7420726567697374657265642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909091d0b08886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c50446973747269627574696f6e4163636f756e7473045c446973747269627574696f6e4163636f756e744461746101210b00140138786f725f616c6c6f636174696f6e210b015c446973747269627574696f6e4163636f756e744461746100012c76616c5f686f6c64657273210b015c446973747269627574696f6e4163636f756e7444617461000134736f72615f636974697a656e73210b015c446973747269627574696f6e4163636f756e744461746100014073746f7265735f616e645f73686f7073210b015c446973747269627574696f6e4163636f756e744461746100012070726f6a65637473210b015c446973747269627574696f6e4163636f756e74446174610000210b08886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c5c446973747269627574696f6e4163636f756e7444617461044c446973747269627574696f6e4163636f756e7401250b0008011c6163636f756e74250b014c446973747269627574696f6e4163636f756e7400012c636f656666696369656e743d01011446697865640000250b08886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c4c446973747269627574696f6e4163636f756e7408244163636f756e744964010034546563684163636f756e744964014d0101081c4163636f756e7404000001244163636f756e7449640000002c546563684163636f756e7404004d010134546563684163636f756e74496400010000290b04204254726565536574040454010d01000400ad040000002d0b00000408181800310b0c886d756c7469636f6c6c61746572616c5f626f6e64696e675f63757276655f706f6f6c1870616c6c6574144572726f7204045400013c58507269636543616c63756c6174696f6e4661696c6564000004b8416e206572726f72206f63637572726564207768696c652063616c63756c6174696e67207468652070726963652e8c4661696c6564546f43616c63756c6174655072696365576974686f7574496d706163740001042d014661696c757265207768696c652063616c63756c6174696e672070726963652069676e6f72696e67206e6f6e2d6c696e656172697479206f66206c697175696469747920736f757263652e5843616e6e6f7445786368616e67655769746853656c66000204a854686520706f6f6c2063616e277420706572666f726d2065786368616e6765206f6e20697473656c662e444e6f74456e6f7567685265736572766573000304f849742773206e6f7420656e6f75676820726573657276657320696e2074686520706f6f6c20746f20706572666f726d20746865206f7065726174696f6e2e74506f6f6c416c7265616479496e697469616c697a6564466f7250616972000404e0417474656d707420746f20696e697469616c697a6520706f6f6c20666f722070616972207468617420616c7265616479206578697374732e48506f6f6c4e6f74496e697469616c697a6564000504ac417474656d707420746f2067657420696e666f20666f7220756e696e697469616c697a656420706f6f6c2e54536c6970706167654c696d697445786365656465640006043101496e64696361746564206c696d69747320666f7220736c69707061676520686173206e6f74206265656e206d657420647572696e67207472616e73616374696f6e20657865637574696f6e2e384e6f7468696e67546f436c61696d0007043901456974686572207573657220686173206e6f2070656e64696e672072657761726473206f722063757272656e74206c696d697420697320657863656564656420617420746865206d6f6d656e742e5452657761726473537570706c7953686f7274616765000804290155736572206861732070656e64696e67207265776172642c20627574207265776172647320737570706c7920697320696e73756666696369656e7420617420746865206d6f6d656e742e70556e737570706f72746564436f6c6c61746572616c41737365744964000904cc496e6469636174656420636f6c6c61746572616c206173736574206973206e6f7420656e61626c656420666f7220706f6f6c2e5046656543616c63756c6174696f6e4661696c6564000a04bc436f756c64206e6f742063616c63756c6174652066656520696e636c7564696e672073656c6c2070656e616c74792e3043616e7445786368616e6765000b0435014c697175696469747920736f757263652063616e27742065786368616e67652061737365747320776974682074686520676976656e20494473206f6e2074686520676976656e2044455849642e2c496e635265664572726f72000c0488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e3c41726974686d657469634572726f72000d04c0416e206572726f72206f63637572656420647572696e672062616c616e6365207479706520636f6e76657273696f6e2e644672656552657365727665734163636f756e744e6f74536574000e048046726565207265736572766573206163636f756e74206973206e6f742073657404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909350b0c24746563686e6963616c1870616c6c6574144572726f720404540001543c53746f726167654f766572666c6f77000004f84572726f72732073686f756c6420686176652068656c7066756c20646f63756d656e746174696f6e206173736f6369617465642077697468207468656d2e4c496e73756666696369656e7442616c616e63650001047842616c616e636520746f6f206c6f7720746f2073656e642076616c75652e30416c72656164794578697374000204505377617020616c7265616479206578697374732e30496e76616c696450726f6f6600030458537761702070726f6f6620697320696e76616c69642e38536f757263654d69736d6174636800040458536f7572636520646f6573206e6f74206d617463682e38416c7265616479436c61696d656400050478537761702068617320616c7265616479206265656e20636c61696d65642e4c436c61696d416374696f6e4d69736d6174636800060458436c61696d20616374696f6e206d69736d617463682e444475726174696f6e4e6f74506173736564000704e44475726174696f6e20686173206e6f74207965742070617373656420666f7220746865207377617020746f2062652063616e63656c6c65642e404f6e6c79526567756c617241737365740008042d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c7920726567756c61722076616c75657320696e7369646520697420697320616c6c6f776564484f6e6c79526567756c61724163636f756e740009042d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c7920726567756c61722076616c75657320696e7369646520697420697320616c6c6f776564484f6e6c79526567756c617242616c616e6365000a042d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c7920726567756c61722076616c75657320696e7369646520697420697320616c6c6f776564604f6e6c7950757265546563686e6963616c4163636f756e74000b042d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c7920726567756c61722076616c75657320696e7369646520697420697320616c6c6f776564204f766572666c6f77000c0474476f7420616e206f766572666c6f7720616674657220616464696e672e5c546563684163636f756e7449644d757374426550757265000d041d01496620617267756d656e74206d75737420626520746563686e6963616c2c20616e64206f6e6c79207075726520746563686e6963616c2076616c756520697320616c6c6f77656480556e61626c65546f4765745265707246726f6d546563684163636f756e744964000e0819014974206973206e6f7420706f7369626c6520746f206578747261637420636f64652066726f6d20604163636f756e74496433326020617320726570726573656e746174696f6e586f722066696e6420697420696e2073746f726167652e74526570726573656e7461746976654d7573744265537570706f72746564000f04110154797065206d7573742073706f7274206d617070696e672066726f6d206861736820746f207370656369616c20737562736574206f6620604163636f756e74496433326070546563684163636f756e74496449734e6f745265676973746572656400100859014974206973206e6f7420706f7369626c6520746f2066696e64207265636f726420696e2073746f72616765206d61702061626f757420604163636f756e74496433326020726570726573656e746174696f6e20666f7248746563686e6963616c206163636f756e742e384e6f74496d706c656d656e746564001104cc546869732066756e6374696f6e206f722061626c696c697479206973207374696c6c206e6f7420696d706c656d656e7465642e544465636f64654163636f756e7449644661696c6564001204a44661696c656420746f206465636f646520604163636f756e744964602066726f6d206120686173682e6c4173736f6369617465644163636f756e7449644e6f74466f756e640013040d014173736f63696174656420604163636f756e74496460206e6f7420666f756e642077697468206120676976656e2060546563686e6963616c4163636f756e744964602ea04f7065726174696f6e576974684162737472616374436865636b696e674973496d706f7369626c65001404bc4f7065726174696f6e207769746820616273747261637420636865636b696e6720697320696d706f737369626c652e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909390b000004080d010d01003d0b00000408000000410b0c20706f6f6c5f78796b1870616c6c6574144572726f720404540001050150556e61626c65546f43616c63756c6174654665650000044d01497420697320696d706f737369626c6520746f2063616c63756c6174652066656520666f7220736f6d6520706169722073776170206f7065726174696f6e2c206f72206f74686572206f7065726174696f6e2e8c4661696c6564546f43616c63756c6174655072696365576974686f7574496d706163740001042d014661696c757265207768696c652063616c63756c6174696e672070726963652069676e6f72696e67206e6f6e2d6c696e656172697479206f66206c697175696469747920736f757263652e48556e61626c65546f47657442616c616e636500020480497320697320696d706f737369626c6520746f206765742062616c616e63652e88496d706f737369626c65546f446563696465417373657450616972416d6f756e7473000304a0496d706f737369626c6520746f20646563696465206173736574207061697220616d6f756e74732ea0506f6f6c50616972526174696f416e645061697253776170526174696f4973446966666572656e74000404c8506f6f6c207061697220726174696f20616e642070616972207377617020726174696f2061726520646966666572656e742ea45061697253776170416374696f6e4665654973536d616c6c65725468616e5265636f6d6d656e646564000504c450616972207377617020616374696f6e2066656520697320736d616c6c6572207468616e207265636f6d6d656e6465642e74536f7572636542616c616e636549734e6f744c61726765456e6f7567680006048c536f757263652062616c616e6365206973206e6f74206c6172676520656e6f7567682e7454617267657442616c616e636549734e6f744c61726765456e6f7567680007048c5461726765742062616c616e6365206973206e6f74206c6172676520656e6f7567682e60556e61626c65546f4465726976654665654163636f756e74000804a44974206973206e6f7420706f737369626c6520746f2064657269766520666565206163636f756e742e4c4665654163636f756e744973496e76616c69640009046c54686520666565206163636f756e7420697320696e76616c69642e9c536f75726365416e64436c69656e744163636f756e74446f4e6f744d617463684173457175616c000a04c4536f7572636520616e6420636c69656e74206163636f756e747320646f206e6f74206d6174636820617320657175616c2e4c4173736574734d7573744e6f74426553616d65000b0494496e2074686973206361736520617373657473206d757374206e6f742062652073616d652ea4496d706f737369626c65546f4465636964654465706f7369744c6971756964697479416d6f756e7473000c04bc496d706f737369626c6520746f20646563696465206465706f736974206c697175696469747920616d6f756e74732e9c496e76616c69644465706f7369744c697175696469747942617369634173736574416d6f756e74000d04b0496e76616c6964206465706f736974206c6971756964697479206261736520617373657420616d6f756e742ea0496e76616c69644465706f7369744c69717569646974795461726765744173736574416d6f756e74000e04b8496e76616c6964206465706f736974206c69717569646974792074617267657420617373657420616d6f756e742ed85061697253776170416374696f6e4d696e696d756d4c69717569646974794973536d616c6c65725468616e5265636f6d6d656e646564000f04fc50616972207377617020616374696f6e206d696e696d756d206c697175696469747920697320736d616c6c6572207468616e207265636f6d6d656e6465642eb044657374696e6174696f6e416d6f756e744f664c697175696469747949734e6f744c61726765456e6f756768001004d044657374696e6174696f6e20616d6f756e74206f66206c6971756964697479206973206e6f74206c6172676520656e6f7567682e80536f7572636542617365416d6f756e7449734e6f744c61726765456e6f7567680011049c536f75726365206261736520616d6f756e74206973206e6f74206c6172676520656e6f7567682e8054617267657442617365416d6f756e7449734e6f744c61726765456e6f7567680012049c546172676574206261736520616d6f756e74206973206e6f74206c6172676520656e6f7567682e34506f6f6c4973496e76616c6964001304a45468652062616c616e636520737472756374757265206f6620706f6f6c20697320696e76616c69642e2c506f6f6c4973456d7074790014047454686520706f6f6c2068617320656d707479206c69717569646974792e685a65726f56616c7565496e416d6f756e74506172616d65746572001504bc416d6f756e7420706172616d6574657220686173207a65726f2076616c75652c20697420697320696e76616c69642e5c4163636f756e7442616c616e63654973496e76616c69640016047c546865206163636f756e742062616c616e636520697320696e76616c69642ea0496e76616c69644465706f7369744c697175696469747944657374696e6174696f6e416d6f756e74001704b4496e76616c6964206465706f736974206c69717569646974792064657374696e6174696f6e20616d6f756e742ea0496e697469616c4c697175646974794465706f736974526174696f4d7573744265446566696e6564001804c0496e697469616c206c6971756964697479206465706f73697420726174696f206d75737420626520646566696e65642e6c54656368417373657449734e6f74526570726573656e7461626c6500190494546563686e6963616c206173736574206973206e6f7420726570726573656e7461626c652e64556e61626c65546f4465636964654d61726b65724173736574001a04b0556e61626c65206f7220696d706f737369626c6520746f20646563696465206d61726b65722061737365742e50556e61626c65546f476574417373657452657072001b04c4556e61626c65206f7220696d706f737369626c6520746f2067657420617373657420726570726573656e746174696f6e2ea8496d706f737369626c65546f44656369646557697468647261774c6971756964697479416d6f756e7473001c04c0496d706f737369626c6520746f20646563696465207769746864726177206c697175696469747920616d6f756e74732ea0496e76616c696457697468647261774c697175696469747942617369634173736574416d6f756e74001d04b4496e76616c6964207769746864726177206c6971756964697479206261736520617373657420616d6f756e742ea4496e76616c696457697468647261774c69717569646974795461726765744173736574416d6f756e74001e04bc496e76616c6964207769746864726177206c69717569646974792074617267657420617373657420616d6f756e742e68536f7572636542617365416d6f756e744973546f6f4c61726765001f0480536f75726365206261736520616d6f756e7420697320746f6f206c617267652eb8536f7572636542616c616e63654f664c6971756964697479546f6b656e7349734e6f744c61726765456e6f756768002004c0536f757263652062616c616e6365206f66206c6971756964697479206973206e6f74206c6172676520656e6f7567682e9844657374696e6174696f6e4261736542616c616e636549734e6f744c61726765456e6f756768002104b444657374696e6174696f6e20626173652062616c616e6365206973206e6f74206c6172676520656e6f7567682ea044657374696e6174696f6e54617267657442616c616e636549734e6f744c61726765456e6f756768002204b444657374696e6174696f6e20626173652062616c616e6365206973206e6f74206c6172676520656e6f7567682e7c496e76616c69644173736574466f724c69717569646974794d61726b696e670023049c417373657420666f72206c6971756964697479206d61726b696e6720697320696e76616c69642e4841737365744465636f64696e674572726f72002404604572726f7220696e206173736574206465636f64696e672e8c43616c63756c6174656456616c756549734f75744f6644657369726564426f756e6473002504a843616c63756c617465642076616c7565206973206f7574206f66206465736972656420626f756e64732ea842617365417373657449734e6f744d61746368656457697468416e794173736574417267756d656e7473002604dc5468652062617365206173736574206973206e6f74206d617463686564207769746820616e7920617373657420617267756d656e74732e6c44657374696e6174696f6e416d6f756e744d757374426553616d650027040501536f6d652076616c756573206e65656420746f2062652073616d652c207468652064657374696e6174696f6e20616d6f756e74206d7573742062652073616d652e58536f75726365416d6f756e744d757374426553616d65002804f0536f6d652076616c756573206e65656420746f2062652073616d652c2074686520736f7572636520616d6f756e74206d7573742062652073616d652e6c506f6f6c496e697469616c697a6174696f6e4973496e76616c6964002904c854686520706f6f6c20696e697469616c697a6174696f6e20697320696e76616c696420616e6420686173206661696c65642e60506f6f6c4973416c7265616479496e697469616c697a6564002a048054686520706f6f6c20697320616c726561647920696e697469616c697a65642e84496e76616c69644d696e696d756d426f756e6456616c75654f6642616c616e6365002b04c0546865206d696e696d756d20626f756e642076616c756573206f662062616c616e63652061726520696e76616c69642ed4496d706f737369626c65546f44656369646556616c69645061697256616c75657346726f6d52616e6765466f7254686973506f6f6c002c041901497420697320696d706f737369626c6520746f206465636964652076616c696420706169722076616c7565732066726f6d2072616e676520666f72207468697320706f6f6c2e5052616e676556616c7565734973496e76616c6964002d04e8546869732072616e67652076616c756573206973206e6f742076616c6964792062792072756c6573206f6620636f72726563742072616e67652eac43616c63756c6174656456616c756549734e6f744d656574735265717569726564426f756e646172696573002e04f05468652076616c75657320746861742069732063616c63756c61746564206973206f7574206f7574206f6620726571756972656420626f756e64732e9447657474696e6746656546726f6d44657374696e6174696f6e4973496d706f737369626c65002f04e0496e207468697320636173652067657474696e67206665652066726f6d2064657374696e6174696f6e20697320696d706f737369626c652e7446697865645772617070657243616c63756c6174696f6e4661696c6564003004e84d6174682063616c63756c6174696f6e2077697468206669786564206e756d62657220686173206661696c656420746f20636f6d706c6574652e58546869734361736549734e6f74537570706f72746564003104fc546869732063617365206966206e6f7420737570706f72746564206279206c6f676963206f6620706f6f6c206f662076616c69646174696f6e20636f64652e7c506f6f6c426563616d65496e76616c696441667465724f7065726174696f6e00320494506f6f6c206265636f6d657320696e76616c6964206166746572206f7065726174696f6e2e84556e61626c65546f436f6e766572744173736574546f5465636841737365744964003304a4556e61626c6520746f20636f6e7665727420617373657420746f20746563682061737365742069642e84556e61626c65546f476574584f525061727446726f6d4d61726b65724173736574003404a4556e61626c6520746f2067657420584f5220706172742066726f6d206d61726b65722061737365742e5c506f6f6c546f6b656e537570706c794f766572666c6f77003504c4506f6f6c20746f6b656e20737570706c79206861732072656163686564206c696d6974206f66206461746120747970652e2c496e635265664572726f720036082101436f756c646e277420696e637265617365207265666572656e636520636f756e74657220666f7220746865206163636f756e7420746861742061646473206c69717569646974792ec901497420697320657870656374656420746f206e657665722068617070656e206265636175736520696620746865206163636f756e74206861732066756e647320746f20616464206c69717569646974792c2069742068617320612070726f76696465722066726f6d2062616c616e6365732e84556e61626c65546f4465706f736974586f724c6573735468616e4d696e696d756d0037046501556e61626c6520746f2070726f76696465206c697175696469747920626563617573652069747320584f522070617274206973206c6573736572207468616e20746865206d696e696d756d2076616c75652028302e3030372950556e737570706f7274656451756f7465506174680038045501417474656d707420746f2071756f74652076696120756e737570706f7274656420706174682c20692e652e20626f7468206f757470757420616e6420696e70757420746f6b656e7320617265206e6f7420584f522e684e6f74456e6f756768556e6c6f636b65644c6971756964697479003904a44e6f7420656e6f75676820756e6c6f636b6564206c697175696469747920746f2077697468647261779c556e61626c65546f437265617465506f6f6c57697468496e646976697369626c65417373657473003a04b043616e6e6f7420637265617465206120706f6f6c207769746820696e646976697369626c652061737365747390556e61626c65546f4f70657261746557697468496e646976697369626c65417373657473003b04cc556e61626c6520746f2070726f63656564206f7065726174696f6e207769746820696e646976697369626c6520617373657473784e6f74456e6f7567684c69717569646974794f75744f664661726d696e67003c04bc4e6f7420656e6f756768206c6971756964697479206f7574206f66206661726d696e6720746f2077697468647261775c5461726765744173736574497352657374726963746564003d04c443616e6e6f7420637265617465206120706f6f6c20776974682072657374726963746564207461726765742061737365745c526573747269637465644368616d656c656f6e506f6f6c003e046452657374726963746564204368616d656c656f6e20706f6f6c5c4e6f74456e6f7567684f75747075745265736572766573003f048c4f7574707574206173736574207265736572766573206973206e6f7420656e6f7567686c4173736574526567756c6174696f6e73436865636b4661696c656400400478417373657420526567756c6174696f6e7320436865636b206661696c656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909450b0c3473705f61726974686d65746963287065725f7468696e67731c5065726d696c6c0000040010010c7533320000490b0c3c6c69717569646974795f70726f78791870616c6c6574144572726f720404540001505c556e617661696c61626c6545786368616e67655061746800000425014e6f20726f7574652065786973747320696e206120676976656e2044455820666f7220676976656e20706172616d657465727320746f206361727279206f7574207468652073776170384d61784665654578636565646564000104404d6178206665652065786365656465643c496e76616c696446656556616c7565000204d84665652076616c7565206f757473696465206f662074686520626173697320706f696e74732072616e6765205b302e2e31303030305d54496e73756666696369656e744c6971756964697479000304e84e6f6e65206f662074686520736f75726365732068617320656e6f75676820726573657276657320746f20657865637574652061207472616465404167677265676174696f6e4572726f72000404bc556e61626c6520746f2061676772656761746520746865206c69717569646974792066726f6d20736f75726365732e4043616c63756c6174696f6e4572726f72000504b453706563696669656420706172616d6574657273206c65616420746f2061726974686d65746963206572726f7250536c6970706167654e6f74546f6c6572617465640006043101536c697070616765206569746865722065786365656473206d696e696d756d20746f6c657261746564206f7574707574206f72206d6178696d756d20746f6c65726174656420696e7075742e3c466f7262696464656e46696c746572000704a853656c65637465642066696c746572696e672072657175657374206973206e6f7420616c6c6f7765642e8c4661696c6564546f43616c63756c6174655072696365576974686f7574496d706163740008042d014661696c757265207768696c652063616c63756c6174696e672070726963652069676e6f72696e67206e6f6e2d6c696e656172697479206f66206c697175696469747920736f757263652e74556e61626c65546f53776170496e646976697369626c6541737365747300090484556e61626c6520746f207377617020696e646976697369626c652061737365747374556e61626c65546f456e61626c654c6971756964697479536f75726365000a0484556e61626c6520746f20656e61626c65206c697175696469747920736f75726365744c6971756964697479536f75726365416c7265616479456e61626c6564000b048c4c697175696469747920736f7572636520697320616c726561647920656e61626c656478556e61626c65546f44697361626c654c6971756964697479536f75726365000c0488556e61626c6520746f2064697361626c65206c697175696469747920736f75726365784c6971756964697479536f75726365416c726561647944697361626c6564000d04904c697175696469747920736f7572636520697320616c72656164792064697361626c656450496e76616c6964526563656976657273496e666f000e04c4496e666f726d6174696f6e2061626f757420737761702062617463682072656365697665727320697320696e76616c6964784661696c6564546f5472616e7366657241646172436f6d6d697373696f6e000f04d44661696c757265207768696c65207472616e7366657272696e6720636f6d6d697373696f6e20746f2041444152206163636f756e7468496e76616c696441444152436f6d6d697373696f6e526174696f0010047c4144415220636f6d6d697373696f6e20726174696f206578636565647320314c496e73756666696369656e7442616c616e63650011049853656e64657220646f6e2774206861766520656e6f7567682061737365742062616c616e63656054686553616d6553656e646572416e645265636569766572001204a853656e64657220616e642072656365697665722073686f756c64206e6f74206265207468652073616d65304261644c6971756964697479001304e8496e7465726e616c206572726f722e204c697175696469747920736f757263652072657475726e65642077726f6e67206c69717569646974792e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909094d0b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012c045300000400a50301185665633c543e0000510b084470616c6c65745f636f6c6c65637469766514566f74657308244163636f756e74496401002c426c6f636b4e756d626572011000140114696e64657810013450726f706f73616c496e6465780001247468726573686f6c6410012c4d656d626572436f756e7400011061796573510201385665633c4163636f756e7449643e0001106e617973510201385665633c4163636f756e7449643e00010c656e6410012c426c6f636b4e756d6265720000550b0c4470616c6c65745f636f6c6c6563746976651870616c6c6574144572726f72080454000449000128244e6f744d656d6265720000045c4163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0001047c4475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e670002044c50726f706f73616c206d7573742065786973742857726f6e67496e646578000304404d69736d61746368656420696e646578344475706c6963617465566f7465000404584475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a6564000504804d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c79000604010154686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c73000704fc54686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c576569676874000804d054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e677468000904d054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909590b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012c045300000400a50301185665633c543e00005d0b0c4470616c6c65745f636f6c6c6563746976651870616c6c6574144572726f72080454000449000128244e6f744d656d6265720000045c4163636f756e74206973206e6f742061206d656d626572444475706c696361746550726f706f73616c0001047c4475706c69636174652070726f706f73616c73206e6f7420616c6c6f7765643c50726f706f73616c4d697373696e670002044c50726f706f73616c206d7573742065786973742857726f6e67496e646578000304404d69736d61746368656420696e646578344475706c6963617465566f7465000404584475706c696361746520766f74652069676e6f72656448416c7265616479496e697469616c697a6564000504804d656d626572732061726520616c726561647920696e697469616c697a65642120546f6f4561726c79000604010154686520636c6f73652063616c6c20776173206d61646520746f6f206561726c792c206265666f72652074686520656e64206f662074686520766f74696e672e40546f6f4d616e7950726f706f73616c73000704fc54686572652063616e206f6e6c792062652061206d6178696d756d206f6620604d617850726f706f73616c7360206163746976652070726f706f73616c732e4c57726f6e6750726f706f73616c576569676874000804d054686520676976656e2077656967687420626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e4c57726f6e6750726f706f73616c4c656e677468000904d054686520676976656e206c656e67746820626f756e6420666f72207468652070726f706f73616c2077617320746f6f206c6f772e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909610b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401650b045300000400690b01185665633c543e0000650b0000040c10cd050000690b000002650b006d0b00000408710b1800710b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400510201185665633c543e0000750b0c4070616c6c65745f64656d6f6372616379147479706573385265666572656e64756d496e666f0c2c426c6f636b4e756d62657201102050726f706f73616c01cd051c42616c616e6365011801081c4f6e676f696e670400790b01c05265666572656e64756d5374617475733c426c6f636b4e756d6265722c2050726f706f73616c2c2042616c616e63653e0000002046696e6973686564080120617070726f766564bc0110626f6f6c00010c656e6410012c426c6f636b4e756d62657200010000790b0c4070616c6c65745f64656d6f6372616379147479706573405265666572656e64756d5374617475730c2c426c6f636b4e756d62657201102050726f706f73616c01cd051c42616c616e636501180014010c656e6410012c426c6f636b4e756d62657200012070726f706f73616ccd05012050726f706f73616c0001247468726573686f6c6499010134566f74655468726573686f6c6400011464656c617910012c426c6f636b4e756d62657200011474616c6c797d0b013854616c6c793c42616c616e63653e00007d0b0c4070616c6c65745f64656d6f63726163791474797065731454616c6c79041c42616c616e63650118000c01106179657318011c42616c616e63650001106e61797318011c42616c616e636500011c7475726e6f757418011c42616c616e63650000810b0c4070616c6c65745f64656d6f637261637910766f746518566f74696e67101c42616c616e63650118244163636f756e74496401002c426c6f636b4e756d6265720110204d6178566f746573000108184469726563740c0114766f746573850b01f4426f756e6465645665633c285265666572656e64756d496e6465782c204163636f756e74566f74653c42616c616e63653e292c204d6178566f7465733e00012c64656c65676174696f6e73910b015044656c65676174696f6e733c42616c616e63653e0001147072696f72950b017c5072696f724c6f636b3c426c6f636b4e756d6265722c2042616c616e63653e0000002844656c65676174696e6714011c62616c616e636518011c42616c616e63650001187461726765740001244163636f756e744964000128636f6e76696374696f6ed5050128436f6e76696374696f6e00012c64656c65676174696f6e73910b015044656c65676174696f6e733c42616c616e63653e0001147072696f72950b017c5072696f724c6f636b3c426c6f636b4e756d6265722c2042616c616e63653e00010000850b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401890b0453000004008d0b01185665633c543e0000890b00000408109d01008d0b000002890b00910b0c4070616c6c65745f64656d6f63726163791474797065732c44656c65676174696f6e73041c42616c616e6365011800080114766f74657318011c42616c616e636500011c6361706974616c18011c42616c616e63650000950b0c4070616c6c65745f64656d6f637261637910766f7465245072696f724c6f636b082c426c6f636b4e756d62657201101c42616c616e6365011800080010012c426c6f636b4e756d626572000018011c42616c616e63650000990b00000408cd059901009d0b0000040810a10b00a10b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400510201185665633c543e0000a50b0c4070616c6c65745f64656d6f63726163791870616c6c6574144572726f7204045400015c2056616c75654c6f770000043456616c756520746f6f206c6f773c50726f706f73616c4d697373696e670001045c50726f706f73616c20646f6573206e6f742065786973743c416c726561647943616e63656c65640002049443616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365444475706c696361746550726f706f73616c0003045450726f706f73616c20616c7265616479206d6164654c50726f706f73616c426c61636b6c69737465640004046850726f706f73616c207374696c6c20626c61636b6c6973746564444e6f7453696d706c654d616a6f72697479000504a84e6578742065787465726e616c2070726f706f73616c206e6f742073696d706c65206d616a6f726974792c496e76616c69644861736800060430496e76616c69642068617368284e6f50726f706f73616c000704504e6f2065787465726e616c2070726f706f73616c34416c72656164795665746f6564000804984964656e74697479206d6179206e6f74207665746f20612070726f706f73616c207477696365445265666572656e64756d496e76616c696400090484566f746520676976656e20666f7220696e76616c6964207265666572656e64756d2c4e6f6e6557616974696e67000a04504e6f2070726f706f73616c732077616974696e67204e6f74566f746572000b04c454686520676976656e206163636f756e7420646964206e6f7420766f7465206f6e20746865207265666572656e64756d2e304e6f5065726d697373696f6e000c04c8546865206163746f7220686173206e6f207065726d697373696f6e20746f20636f6e647563742074686520616374696f6e2e44416c726561647944656c65676174696e67000d0488546865206163636f756e7420697320616c72656164792064656c65676174696e672e44496e73756666696369656e7446756e6473000e04fc546f6f206869676820612062616c616e6365207761732070726f7669646564207468617420746865206163636f756e742063616e6e6f74206166666f72642e344e6f7444656c65676174696e67000f04a0546865206163636f756e74206973206e6f742063757272656e746c792064656c65676174696e672e28566f74657345786973740010085501546865206163636f756e742063757272656e746c792068617320766f74657320617474616368656420746f20697420616e6420746865206f7065726174696f6e2063616e6e6f74207375636365656420756e74696ce87468657365206172652072656d6f7665642c20656974686572207468726f7567682060756e766f746560206f722060726561705f766f7465602e44496e7374616e744e6f74416c6c6f776564001104d854686520696e7374616e74207265666572656e64756d206f726967696e2069732063757272656e746c7920646973616c6c6f7765642e204e6f6e73656e73650012049444656c65676174696f6e20746f206f6e6573656c66206d616b6573206e6f2073656e73652e3c57726f6e675570706572426f756e6400130450496e76616c696420757070657220626f756e642e3c4d6178566f74657352656163686564001404804d6178696d756d206e756d626572206f6620766f74657320726561636865642e1c546f6f4d616e79001504804d6178696d756d206e756d626572206f66206974656d7320726561636865642e3c566f74696e67506572696f644c6f7700160454566f74696e6720706572696f6420746f6f206c6f7704b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909a90b0c1c6465785f6170691870616c6c6574144572726f72040454000108744c6971756964697479536f75726365416c7265616479456e61626c65640000048c4c697175696469747920736f7572636520697320616c726561647920656e61626c6564784c6971756964697479536f75726365416c726561647944697361626c6564000104904c697175696469747920736f7572636520697320616c72656164792064697361626c656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909ad0b00000408102c00b10b0c286574685f6272696467652072657175657374733c4f6666636861696e5265717565737404045400010c204f7574676f696e6708000d0601484f7574676f696e67526571756573743c543e00002c011048323536000000304c6f6164496e636f6d696e6704004d0601584c6f6164496e636f6d696e67526571756573743c543e00010020496e636f6d696e670800f5050148496e636f6d696e67526571756573743c543e00002c01104832353600020000b50b0c286574685f62726964676520726571756573747334526571756573745374617475730001181c50656e64696e670000001846726f7a656e00010038417070726f76616c735265616479000200184661696c6564040060013444697370617463684572726f7200030010446f6e650004001842726f6b656e080060013444697370617463684572726f72000060013444697370617463684572726f7200050000b90b04204254726565536574040454015d06000400bd0b000000bd0b0000025d0600c10b000002ad0b00c50b00000408100d0100c90b00000408104d0300cd0b0420425472656553657404045401000004005102000000d10b10286574685f627269646765207265717565737473206f7574676f696e6730457468506565727353796e6300000c013c69735f6272696467655f7265616479bc0110626f6f6c00013069735f786f725f7265616479bc0110626f6f6c00013069735f76616c5f7265616479bc0110626f6f6c0000d50b08286574685f627269646765304272696467655374617475730001082c496e697469616c697a6564000000244d6967726174696e6700010000d90b0c286574685f6272696467651870616c6c6574144572726f720404540001590144487474704665746368696e674572726f72000004504572726f72206665746368696e6720485454502e3c4163636f756e744e6f74466f756e64000104484163636f756e74206e6f7420666f756e642e24466f7262696464656e00020428466f7262696464656e2e68526571756573744973416c726561647952656769737465726564000304785265717565737420697320616c726561647920726567697374657265642e5c4661696c6564546f4c6f61645472616e73616374696f6e000404944661696c656420746f206c6f61642073696465636861696e207472616e73616374696f6e2e544661696c6564546f4c6f6164507265636973696f6e0005047c4661696c656420746f206c6f616420746f6b656e20707265636973696f6e2e3c556e6b6e6f776e4d6574686f64496400060448556e6b6e6f776e206d6574686f642049442e50496e76616c696446756e6374696f6e496e70757400070480496e76616c696420636f6e74726163742066756e6374696f6e20696e7075742e40496e76616c69645369676e61747572650008045c496e76616c69642070656572207369676e61747572652e2c496e76616c696455696e740009044c496e76616c69642075696e742076616c75652e34496e76616c6964416d6f756e74000a0454496e76616c696420616d6f756e742076616c75652e38496e76616c696442616c616e6365000b0458496e76616c69642062616c616e63652076616c75652e34496e76616c6964537472696e67000c0454496e76616c696420737472696e672076616c75652e2c496e76616c696442797465000d044c496e76616c696420627974652076616c75652e38496e76616c696441646472657373000e0458496e76616c696420616464726573732076616c75652e38496e76616c696441737365744964000f045c496e76616c69642061737365742069642076616c75652e40496e76616c69644163636f756e74496400100464496e76616c6964206163636f756e742069642076616c75652e2c496e76616c6964426f6f6c0011044c496e76616c696420626f6f6c2076616c75652e2c496e76616c6964483235360012044c496e76616c696420683235362076616c75652e30496e76616c6964417272617900130450496e76616c69642061727261792076616c75652e30556e6b6e6f776e4576656e740014045c556e6b6e6f776e20636f6e7472616374206576656e742e4c556e6b6e6f776e546f6b656e4164647265737300150458556e6b6e6f776e20746f6b656e20616464726573732e604e6f4c6f63616c4163636f756e74466f725369676e696e670016049c4e6f206c6f63616c206163636f756e7420666f72207369676e696e6720617661696c61626c652e48556e737570706f727465644173736574496400170454556e737570706f727465642061737365742069642e4c4661696c6564546f5369676e4d6573736167650018045c4661696c656420746f207369676e206d6573736167652e744661696c6564546f53656e645369676e65645472616e73616374696f6e001904784661696c656420746f2073656e64207369676e6564206d6573736167652e68546f6b656e49734e6f744f776e65644279546865417574686f72001a0484546f6b656e206973206e6f74206f776e65642062792074686520617574686f722e4c546f6b656e4973416c72656164794164646564001b045c546f6b656e20697320616c72656164792061646465642e444475706c69636174656452657175657374001c044c4475706c69636174656420726571756573742e40556e737570706f72746564546f6b656e001d0454546f6b656e20697320756e737570706f727465642e48556e6b6e6f776e5065657241646472657373001e0454556e6b6e6f776e207065657220616464726573732e4c457468416269456e636f64696e674572726f72001f0470457468657265756d2041424920656e636f64696e67206572726f722e4c4574684162694465636f64696e674572726f7200200470457468657265756d20414249206465636f64696e67206572726f722e584574685472616e73616374696f6e49734661696c65640021047c457468657265756d207472616e73616374696f6e206973206661696c65642e644574685472616e73616374696f6e497353756363656564656400220488457468657265756d207472616e73616374696f6e206973207375636365656465642e5c4574685472616e73616374696f6e497350656e64696e6700230480457468657265756d207472616e73616374696f6e2069732070656e64696e672e404574684c6f6757617352656d6f76656400240464457468657265756d206c6f67207761732072656d6f7665642e344e6f50656e64696e6750656572002504404e6f2070656e64696e6720706565722e4057726f6e6750656e64696e67506565720026044c57726f6e672070656e64696e6720706565722e4c546f6f4d616e7950656e64696e6750656572730027045c546f6f206d616e792070656e64696e672070656572732e504661696c6564546f476574417373657442794964002804744661696c656420746f2067657420616e2061737365742062792069642e4043616e744164644d6f726550656572730029045443616e277420616464206d6f72652070656572732e4c43616e7452656d6f76654d6f72655065657273002a046043616e27742072656d6f7665206d6f72652070656572732e48506565724973416c72656164794164646564002b04585065657220697320616c72656164792061646465642e34556e6b6e6f776e506565724964002c0440556e6b6e6f776e20706565722069642e4043616e745265736572766546756e6473002d045043616e277420726573657276652066756e64732e38416c7265616479436c61696d6564002e046846756e64732061726520616c726561647920636c61696d65642e5c4661696c6564546f4c6f6164426c6f636b486561646572002f04984661696c656420746f206c6f61642073756273747261746520626c6f636b206865616465722e644661696c6564546f4c6f616446696e616c697a656448656164003004a04661696c656420746f206c6f6164207375627374726174652066696e616c697a656420686561642e58556e6b6e6f776e436f6e74726163744164647265737300310464556e6b6e6f776e20636f6e747261637420616464726573732e50496e76616c6964436f6e7472616374496e7075740032045c496e76616c696420636f6e747261637420696e7075742e705265717565737449734e6f744f776e65644279546865417574686f720033048c52657175657374206973206e6f74206f776e65642062792074686520617574686f722e644661696c6564546f5061727365547848617368496e43616c6c003404ac4661696c656420746f207061727365207472616e73616374696f6e206861736820696e20612063616c6c2e445265717565737449734e6f7452656164790035045452657175657374206973206e6f742072656164792e38556e6b6e6f776e5265717565737400360440556e6b6e6f776e20726571756573742e78526571756573744e6f7446696e616c697a65644f6e53696465636861696e0037049852657175657374206973206e6f742066696e616c697a6564206f6e2053696465636861696e2e38556e6b6e6f776e4e6574776f726b00380440556e6b6e6f776e206e6574776f726b2e68436f6e74726163744973496e4d6967726174696f6e53746167650039047c436f6e747261637420697320696e206d6967726174696f6e2073746167652e74436f6e747261637449734e6f74496e4d6967726174696f6e5374616765003a048c436f6e7472616374206973206e6f74206f6e206d6967726174696f6e2073746167652e84436f6e74726163744973416c7265616479496e4d6967726174696f6e5374616765003b049c436f6e747261637420697320616c726561647920696e206d6967726174696f6e2073746167652e2c556e617661696c61626c65003c047446756e6374696f6e616c69747920697320756e617661696c61626c652e444661696c6564546f556e72657365727665003d04684661696c656420746f20756e726573657276652061737365742e8453696465636861696e41737365744973416c726561647952656769737465726564003e04a45468652073696465636861696e20617373657420697320616c7265647920726567697374657265642e5c45787065637465644f7574676f696e6752657175657374003f0474457870656374656420616e206f7574676f696e6720726571756573742e5c4578706563746564496e636f6d696e675265717565737400400474457870656374656420616e20696e636f6d696e6720726571756573742e38556e6b6e6f776e4173736574496400410444556e6b6e6f776e2061737365742069642e584a736f6e53657269616c697a6174696f6e4572726f72004204644661696c656420746f2073657269616c697a65204a534f4e2e604a736f6e446573657269616c697a6174696f6e4572726f720043046c4661696c656420746f20646573657269616c697a65204a534f4e2e7c4661696c6564546f4c6f616453696465636861696e4e6f6465506172616d73004404a44661696c656420746f206c6f61642073696465636861696e206e6f646520706172616d65746572732e884661696c6564546f4c6f616443757272656e7453696465636861696e486569676874004504a04661696c656420746f206c6f61642063757272656e742073696465636861696e206865696768742e484661696c6564546f4c6f6164497355736564004604a84661696c656420746f2071756572792073696465636861696e20277573656427207661726961626c652e9c5472616e73616374696f6e4d69676874486176654661696c6564447565546f4761734c696d6974004704e453696465636861696e207472616e73616374696f6e206d696768742068617665206661696c65642064756520746f20676173206c696d69742e4c4578706563746564584f525472616e736665720048047c41207472616e73666572206f6620584f52207761732065787065637465642e3c556e61626c65546f5061794665657300490470556e61626c6520746f20706179207472616e7366657220666565732e2443616e63656c6c6564004a049054686520726571756573742077617320707572706f73656c792063616e63656c6c65642e64556e737570706f727465644173736574507265636973696f6e004b0470556e737570706f7274656420617373657420707265636973696f6e2e2c4e6f6e5a65726f44757374004c04384e6f6e2d7a65726f20647573742e2c496e635265664572726f72004d0488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e144f74686572004e0438556e6b6e6f776e206572726f722e58457870656374656450656e64696e6752657175657374004f046445787065637465642070656e64696e6720726571756573742e4845787065637465644574684e6574776f726b00500468457870656374656420457468657265756d206e6574776f726b2e4852656d6f766564416e64526566756e6465640051048452657175657374207761732072656d6f76656420616e6420726566756e6465642e58417574686f726974794163636f756e744e6f7453657400520474417574686f72697479206163636f756e74206973206e6f74207365742e384e6f74456e6f7567685065657273005304a84e6f7420656e6f7567682070656572732070726f76696465642c206e656564206174206c656173742031405265616453746f726167654572726f72005404ac4661696c656420746f20726561642076616c75652066726f6d206f6666636861696e2073746f726167652e3c556e736166654d6967726174696f6e0055040501427269646765206e6565647320746f2068617665206174206c65617374203320706565727320666f72206d6967726174696f6e2e20416464206e6577207065657204b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909dd0b000004101000101000e10b000004083d013d0100e50b0c4870737761705f646973747269627574696f6e1870616c6c6574144572726f720404540001184043616c63756c6174696f6e4572726f720000042d014572726f72206f6363757272656420647572696e672063616c63756c6174696f6e2c20652e672e20756e646572666c6f772f6f766572666c6f77206f6620736861726520616d6f756e742e48537562736372697074696f6e41637469766500010421014572726f72207768696c6520617474656d7074696e6720746f20737562736372696265204163636f756e7420776869636820697320616c726561647920737562736372696265642e4c556e6b6e6f776e537562736372697074696f6e00020419014572726f72207768696c6520617474656d7074696e6720746f20756e737562736372696265204163636f756e74207768696368206973206e6f7420737562736372696265642e40496e76616c69644672657175656e637900030465014572726f72207768696c652073657474696e67206672657175656e63792c20737562736372697074696f6e2063616e206f6e6c7920626520696e766f6b656420666f72206672657175656e63792076616c7565203e3d20312e5c5a65726f436c61696d61626c65496e63656e7469766573000404190143616e277420636c61696d20696e63656e7469766573206173206e6f6e6520697320617661696c61626c6520666f72206163636f756e7420617420746865206d6f6d656e742e2c496e635265664572726f7200050488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909e90b083c70616c6c65745f6d756c7469736967204d756c7469736967102c426c6f636b4e756d62657201101c42616c616e63650118244163636f756e7449640100304d6178417070726f76616c7300001001107768656eb501015854696d65706f696e743c426c6f636b4e756d6265723e00011c6465706f73697418011c42616c616e63650001246465706f7369746f720001244163636f756e744964000124617070726f76616c73ed0b018c426f756e6465645665633c4163636f756e7449642c204d6178417070726f76616c733e0000ed0b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400510201185665633c543e0000f10b0c3c70616c6c65745f6d756c74697369671870616c6c6574144572726f72040454000138404d696e696d756d5468726573686f6c640000047c5468726573686f6c64206d7573742062652032206f7220677265617465722e3c416c7265616479417070726f766564000104ac43616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e444e6f417070726f76616c734e65656465640002049c43616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e44546f6f4665775369676e61746f72696573000304a854686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e48546f6f4d616e795369676e61746f72696573000404ac54686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e545369676e61746f726965734f75744f664f726465720005040d01546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e4c53656e646572496e5369676e61746f726965730006040d015468652073656e6465722077617320636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e27742062652e204e6f74466f756e64000704dc4d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e204e6f744f776e65720008042d014f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e2c4e6f54696d65706f696e740009041d014e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e3857726f6e6754696d65706f696e74000a042d014120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e4c556e657870656374656454696d65706f696e74000b04f4412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e3c4d6178576569676874546f6f4c6f77000c04d0546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e34416c726561647953746f726564000d04a0546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909f50b101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401f90b045300000400010c01185665633c543e0000f90b04184f7074696f6e04045401fd0b0108104e6f6e6500000010536f6d650400fd0b0000010000fd0b084070616c6c65745f7363686564756c6572245363686564756c656414104e616d6501041043616c6c01cd052c426c6f636b4e756d62657201103450616c6c6574734f726967696e01e504244163636f756e7449640100001401206d617962655f6964c10101304f7074696f6e3c4e616d653e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6ccd05011043616c6c0001386d617962655f706572696f646963710601944f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d6265723e3e0001186f726967696ee504013450616c6c6574734f726967696e0000010c000002f90b00050c0c4070616c6c65745f7363686564756c65721870616c6c6574144572726f72040454000114404661696c6564546f5363686564756c65000004644661696c656420746f207363686564756c6520612063616c6c204e6f74466f756e640001047c43616e6e6f742066696e6420746865207363686564756c65642063616c6c2e5c546172676574426c6f636b4e756d626572496e50617374000204a4476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e4852657363686564756c654e6f4368616e6765000304f052657363686564756c65206661696c6564206265636175736520697420646f6573206e6f74206368616e6765207363686564756c65642074696d652e144e616d6564000404d0417474656d707420746f207573652061206e6f6e2d6e616d65642066756e6374696f6e206f6e2061206e616d6564207461736b2e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909090c0000020d0c000d0c00000408bcc90100110c083c69726f68615f6d6967726174696f6e5850656e64696e674d756c74697369674163636f756e740404540000080148617070726f76696e675f6163636f756e7473510201445665633c543a3a4163636f756e7449643e0001286d6967726174655f6174f10101584f7074696f6e3c543a3a426c6f636b4e756d6265723e0000150c0c3c69726f68615f6d6967726174696f6e1870616c6c6574144572726f72040454000128585075626c69634b657950617273696e674661696c6564000004684661696c656420746f207061727365207075626c6963206b6579585369676e617475726550617273696e674661696c6564000104644661696c656420746f207061727365207369676e61747572656c5369676e6174757265566572696669636174696f6e4661696c6564000204684661696c656420746f20766572696679207369676e61747572653c4163636f756e744e6f74466f756e640003046849726f6861206163636f756e74206973206e6f7420666f756e64445075626c69634b65794e6f74466f756e640004045c5075626c6963206b6579206973206e6f7420666f756e64505075626c69634b6579416c726561647955736564000504685075626c6963206b657920697320616c72656164792075736564584163636f756e74416c72656164794d696772617465640006048449726f6861206163636f756e7420697320616c7265616479206d696772617465645c526566657272616c4d6967726174696f6e4661696c656400070464526566657272616c206d6967726174696f6e206661696c6564584d756c74695369674372656174696f6e4661696c65640008049c4d696c74692d7369676e6174757265206163636f756e74206372656174696f6e206661696c65645c5369676e61746f72794164646974696f6e4661696c6564000904d05369676e61746f7279206164646974696f6e20746f206d756c74692d7369676e6174757265206163636f756e74206661696c656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909190c101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400510201185665633c543e00001d0c0c4470616c6c65745f6d656d626572736869701870616c6c6574144572726f7208045400044900010c34416c72656164794d656d62657200000444416c72656164792061206d656d6265722e244e6f744d656d626572000104344e6f742061206d656d6265722e38546f6f4d616e794d656d6265727300020444546f6f206d616e79206d656d626572732e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909210c000002250c00250c086470616c6c65745f656c656374696f6e735f70687261676d656e2853656174486f6c64657208244163636f756e74496401001c42616c616e63650118000c010c77686f0001244163636f756e7449640001147374616b6518011c42616c616e636500011c6465706f73697418011c42616c616e63650000290c086470616c6c65745f656c656374696f6e735f70687261676d656e14566f74657208244163636f756e74496401001c42616c616e63650118000c0114766f746573510201385665633c4163636f756e7449643e0001147374616b6518011c42616c616e636500011c6465706f73697418011c42616c616e636500002d0c0c6470616c6c65745f656c656374696f6e735f70687261676d656e1870616c6c6574144572726f7204045400014430556e61626c65546f566f7465000004c043616e6e6f7420766f7465207768656e206e6f2063616e64696461746573206f72206d656d626572732065786973742e1c4e6f566f746573000104944d75737420766f746520666f72206174206c65617374206f6e652063616e6469646174652e30546f6f4d616e79566f7465730002048443616e6e6f7420766f7465206d6f7265207468616e2063616e646964617465732e504d6178696d756d566f74657345786365656465640003049843616e6e6f7420766f7465206d6f7265207468616e206d6178696d756d20616c6c6f7765642e284c6f7742616c616e6365000404c443616e6e6f7420766f74652077697468207374616b65206c657373207468616e206d696e696d756d2062616c616e63652e3c556e61626c65546f506179426f6e6400050478566f7465722063616e206e6f742070617920766f74696e6720626f6e642e2c4d7573744265566f746572000604404d757374206265206120766f7465722e4c4475706c69636174656443616e646964617465000704804475706c6963617465642063616e646964617465207375626d697373696f6e2e44546f6f4d616e7943616e6469646174657300080498546f6f206d616e792063616e646964617465732068617665206265656e20637265617465642e304d656d6265725375626d6974000904884d656d6265722063616e6e6f742072652d7375626d69742063616e6469646163792e3852756e6e657255705375626d6974000a048852756e6e65722063616e6e6f742072652d7375626d69742063616e6469646163792e68496e73756666696369656e7443616e64696461746546756e6473000b049443616e64696461746520646f6573206e6f74206861766520656e6f7567682066756e64732e244e6f744d656d626572000c04344e6f742061206d656d6265722e48496e76616c69645769746e65737344617461000d04e05468652070726f766964656420636f756e74206f66206e756d626572206f662063616e6469646174657320697320696e636f72726563742e40496e76616c6964566f7465436f756e74000e04cc5468652070726f766964656420636f756e74206f66206e756d626572206f6620766f74657320697320696e636f72726563742e44496e76616c696452656e6f756e63696e67000f04fc5468652072656e6f756e63696e67206f726967696e2070726573656e74656420612077726f6e67206052656e6f756e63696e676020706172616d657465722e48496e76616c69645265706c6163656d656e74001004fc50726564696374696f6e20726567617264696e67207265706c6163656d656e74206166746572206d656d6265722072656d6f76616c2069732077726f6e672e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909310c08387665737465645f7265776172647328526577617264496e666f00000c01146c696d697418011c42616c616e636500013c746f74616c5f617661696c61626c6518011c42616c616e636500011c726577617264739106017c42547265654d61703c526577617264526561736f6e2c2042616c616e63653e0000350c08387665737465645f726577617264733443726f77646c6f616e496e666f0c1c41737365744964010d012c426c6f636b4e756d6265720110244163636f756e744964010000140148746f74616c5f636f6e747269627574696f6e18011c42616c616e636500011c726577617264736901015c5665633c28417373657449642c2042616c616e6365293e00012c73746172745f626c6f636b10012c426c6f636b4e756d6265720001186c656e67746810012c426c6f636b4e756d62657200011c6163636f756e740001244163636f756e7449640000390c00000408008906003d0c08387665737465645f726577617264734443726f77646c6f616e55736572496e666f041c41737365744964010d0100080130636f6e747269627574696f6e18011c42616c616e636500012072657761726465646901015c5665633c28417373657449642c2042616c616e6365293e0000410c0c387665737465645f726577617264731870616c6c6574144572726f7204045400015c384e6f7468696e67546f436c61696d000004a04163636f756e7420686173206e6f2070656e64696e67207265776172647320746f20636c61696d2e48436c61696d4c696d69744578636565646564000104ec4163636f756e74206861732070656e64696e6720726577617264732062757420697420686173206e6f74206265656e20766573746564207965742e4c556e68616e646c656452657761726454797065000204dc417474656d707420746f20636c61696d2072657761726473206f6620747970652c207768696368206973206e6f742068616e646c65642e5452657761726473537570706c7953686f727461676500030849014163636f756e7420686f6c64696e67206465646963617465642072657761726420726573657276657320697320656d7074792e2054686973206c696b656c79206d65616e73207468617420736f6d65206f66807265776172642070726f6772616d6d657320686176652066696e69736865642e2c496e635265664572726f7200040488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e5043616e745375627472616374536e617073686f74000504f0417474656d707420746f207375627472616374206d6f72652076696120736e617073686f74207468616e2061737369676e656420746f20757365722e4c43616e7443616c63756c617465526577617264000604944661696c656420746f20706572666f726d207265776172642063616c63756c6174696f6e2e444e6f52657761726473466f72417373657400070498546865726520617265206e6f207265776172647320666f72207468652061737365742049442e3c41726974686d657469634572726f720008041101536f6d657468696e672069732077726f6e6720776974682061726974686d65746963202d206f766572666c6f772068617070656e65642c20666f72206578616d706c652e544e756d626572436f6e76657273696f6e4572726f72000904150154686973206572726f722061707065617273206f6e2077726f6e6720636f6e76657273696f6e206f662061206e756d62657220696e746f20616e6f7468657220747970652e64556e61626c65546f4765744261736541737365745072696365000a046501556e61626c6520746f20676574206261736520617373657420707269636520696e20584f522e20584f522d6261736520617373657420706169722073686f756c64206578697374206f6e20506f6c6b6173776170204445582e5843726f77646c6f616e416c7265616479457869737473000b04ac43726f77646c6f616e207769746820676976656e2074616720616c726561647920726567697374657265644857726f6e6743726f77646c6f616e496e666f000c046c57726f6e672063726f77646c6f616e2064617461207061737365649843726f77646c6f616e52657761726473446973747269627574696f6e4e6f7453746172746564000d04b443726f77646c6f616e207265776172647320646973747269627574696f6e206973206e6f7420737461727465645843726f77646c6f616e446f65734e6f74457869737473000e046443726f77646c6f616e20646f6573206e6f74206578697374735c4e6f7443726f77646c6f616e5061727469636970616e74000f048455736572206973206e6f742063726f77646c6f616e207061727469636970616e74445a65726f56657374696e67506572696f640010045856657374696e6720706572696f64206973207a65726f5c57726f6e6756657374696e67506572696f64436f756e74001104ac4e756d626572206f66207665737473206973207a65726f206f72206c657373207468616e20636c61696d7364496e73756666696369656e7442616c616e6365546f4c6f636b00120498496e73756666696369656e7420616d6f756e74206f662062616c616e636520746f206c6f636b24416d6f756e744c6f770013049454686520766573746564207472616e7366657220616d6f756e7420697320746f6f206c6f776c4d617856657374696e675363686564756c65734578636565646564001404e44661696c6564206265636175736520746865206d6178696d756d2076657374696e67207363686564756c6573207761732065786365656465645c50656e64696e675363686564756c654e6f744578697374001504bc4661696c6564206265636175736520746865205363686564756c6520746f20756e6c6f636b206e6f742065786973745057726f6e675363686564756c6556617269616e74001604c04661696c656420626563617573652075736564206e6f7420636f7272656374205363686564756c652056617269616e7404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909450c0c3c70616c6c65745f6964656e7469747914747970657330526567697374726174696f6e0c1c42616c616e63650118344d61784a756467656d656e7473004c4d61784164646974696f6e616c4669656c647300000c01286a756467656d656e7473490c01fc426f756e6465645665633c28526567697374726172496e6465782c204a756467656d656e743c42616c616e63653e292c204d61784a756467656d656e74733e00011c6465706f73697418011c42616c616e6365000110696e666fb10601844964656e74697479496e666f3c4d61784164646974696f6e616c4669656c64733e0000490c101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454014d0c045300000400510c01185665633c543e00004d0c0000040810490700510c0000024d0c00550c0000040818590c00590c101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540100045300000400510201185665633c543e00005d0c101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401610c045300000400690c01185665633c543e0000610c04184f7074696f6e04045401650c0108104e6f6e6500000010536f6d650400650c0000010000650c0c3c70616c6c65745f6964656e7469747914747970657334526567697374726172496e666f081c42616c616e63650118244163636f756e7449640100000c011c6163636f756e740001244163636f756e74496400010c66656518011c42616c616e63650001186669656c6473410701384964656e746974794669656c64730000690c000002610c006d0c0c3c70616c6c65745f6964656e746974791870616c6c6574144572726f7204045400014848546f6f4d616e795375624163636f756e74730000045c546f6f206d616e7920737562732d6163636f756e74732e204e6f74466f756e64000104504163636f756e742069736e277420666f756e642e204e6f744e616d6564000204504163636f756e742069736e2774206e616d65642e28456d707479496e64657800030430456d70747920696e6465782e284665654368616e6765640004043c466565206973206368616e6765642e284e6f4964656e74697479000504484e6f206964656e7469747920666f756e642e3c537469636b794a756467656d656e7400060444537469636b79206a756467656d656e742e384a756467656d656e74476976656e000704404a756467656d656e7420676976656e2e40496e76616c69644a756467656d656e7400080448496e76616c6964206a756467656d656e742e30496e76616c6964496e6465780009045454686520696e64657820697320696e76616c69642e34496e76616c6964546172676574000a04585468652074617267657420697320696e76616c69642e34546f6f4d616e794669656c6473000b046c546f6f206d616e79206164646974696f6e616c206669656c64732e44546f6f4d616e7952656769737472617273000c04e84d6178696d756d20616d6f756e74206f66207265676973747261727320726561636865642e2043616e6e6f742061646420616e79206d6f72652e38416c7265616479436c61696d6564000d04704163636f756e7420494420697320616c7265616479206e616d65642e184e6f74537562000e047053656e646572206973206e6f742061207375622d6163636f756e742e204e6f744f776e6564000f04885375622d6163636f756e742069736e2774206f776e65642062792073656e6465722e744a756467656d656e74466f72446966666572656e744964656e74697479001004d05468652070726f7669646564206a756467656d656e742077617320666f72206120646966666572656e74206964656e746974792e584a756467656d656e745061796d656e744661696c6564001104f84572726f722074686174206f6363757273207768656e20746865726520697320616e20697373756520706179696e6720666f72206a756467656d656e742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909710c000002750c00750c081c6661726d696e6728506f6f6c4661726d657204045400000c011c6163636f756e74000130543a3a4163636f756e744964000114626c6f636b100138543a3a426c6f636b4e756d62657200011877656967687418011c42616c616e63650000790c0c1c6661726d696e671870616c6c6574144572726f720404540001042c496e635265664572726f7200000488496e6372656d656e74206163636f756e74207265666572656e6365206572726f722e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909097d0c080c7873743453796e746865746963496e666f041853796d626f6c010102000801407265666572656e63655f73796d626f6c0102011853796d626f6c0001246665655f726174696f3d01011446697865640000810c0c0c7873741870616c6c6574144572726f7204045400013058507269636543616c63756c6174696f6e4661696c6564000004b8416e206572726f72206f63637572726564207768696c652063616c63756c6174696e67207468652070726963652e54536c6970706167654c696d697445786365656465640001043101496e64696361746564206c696d69747320666f7220736c69707061676520686173206e6f74206265656e206d657420647572696e67207472616e73616374696f6e20657865637574696f6e2e3043616e7445786368616e676500020435014c697175696469747920736f757263652063616e27742065786368616e67652061737365747320776974682074686520676976656e20494473206f6e2074686520676976656e2044455849642e5453796e746865746963446f65734e6f7445786973740003047c53796e74686574696320617373657420646f6573206e6f742065786973742e4853796d626f6c446f65734e6f744578697374000404e4417474656d707420746f20656e61626c652073796e746865746963206173736574207769746820696e6578697374656e742073796d626f6c2e8853796d626f6c416c72656164795265666572656e636564546f53796e746865746963000508b4417474656d707420746f20656e61626c652073796e74686574696320617373657420776974682073796d626f6cc07468617420697320616c7265616479207265666572656e63656420746f20616e6f746865722073796e7468657469632e5453796e74686574696349734e6f74456e61626c6564000604dc417474656d707420746f2064697361626c652073796e7468657469632061737365742074686174206973206e6f7420656e61626c65642e404f7261636c6551756f74654572726f72000704804572726f722071756f74696e672070726963652066726f6d206f7261636c652e3c496e76616c6964466565526174696f00080460496e76616c69642066656520726174696f2076616c75652e64496e646976697369626c655265666572656e63654173736574000904845265666572656e6365206173736574206d75737420626520646976697369626c656843616e74456e61626c65496e646976697369626c654173736574000a048453796e746865746963206173736574206d75737420626520646976697369626c658453796e7468657469634261736542757953656c6c4c696d69744578636565646564000b04f4496e7075742f6f757470757420616d6f756e74206f662073796e7468657469632062617365206173736574206578636565647320746865206c696d697404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909850c082c70726963655f746f6f6c734c416767726567617465645072696365496e666f000008010c627579890c01245072696365496e666f00011073656c6c890c01245072696365496e666f0000890c082c70726963655f746f6f6c73245072696365496e666f000014013870726963655f6661696c7572657310010c75333200012c73706f745f707269636573a504014456656344657175653c42616c616e63653e000134617665726167655f707269636518011c42616c616e63650001306e656564735f757064617465bc0110626f6f6c00013c6c6173745f73706f745f707269636518011c42616c616e636500008d0c0c2c70726963655f746f6f6c731870616c6c6574144572726f7204045400011c7441766572616765507269636543616c63756c6174696f6e4661696c6564000004984661696c656420746f2063616c63756c617465206e657720617665726167652070726963652e80557064617465417665726167655769746853706f7450726963654661696c6564000104a04661696c656420746f20616464206e65772073706f7420707269636520746f20617665726167652e64496e73756666696369656e7453706f7450726963654461746100020855014569746865722073706f74207072696365207265636f72647320686173206265656e207265736574206f72206e6f7420696e697469616c697a6564207965742e20576169742074696c6c2073706f74207072696365b071756f7465206973207265636f766572656420616e64207370616e20697320726563616c63756c617465642e50556e737570706f7274656451756f746550617468000304985265717565737465642071756f74652070617468206973206e6f7420737570706f727465642e644661696c6564546f51756f7465417665726167655072696365000404b44661696c656420746f20706572666f726d2071756f746520746f2067657420617665726167652070726963652e584173736574416c726561647952656769737465726564000504904173736574496420686173206265656e20616c726561647920726567697374657265642e5843616e744475706c69636174654c6173745072696365000604450153706f7420707269636520666f7220617373657420686173206e6f74206368616e6765642062757420696e666f20666f72206c6173742073706f7420707269636520697320756e617661696c61626c652e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909910c083463657265735f7374616b696e672c5374616b696e67496e666f00000801246465706f736974656418011c42616c616e636500011c7265776172647318011c42616c616e63650000950c0c3463657265735f7374616b696e671870616c6c6574144572726f72040454000108445374616b696e67506f6f6c497346756c6c000004505374616b696e6720706f6f6c2069732066756c6c30556e617574686f72697a656400010430556e617574686f72697a656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909990c085863657265735f6c69717569646974795f6c6f636b65723853746f7261676556657273696f6e000108085631000000085632000100009d0c000002a10c00a10c085863657265735f6c69717569646974795f6c6f636b6572204c6f636b496e666f0c1c42616c616e63650118184d6f6d656e7401281c41737365744964010d010010012c706f6f6c5f746f6b656e7318011c42616c616e636500014c756e6c6f636b696e675f74696d657374616d702801184d6f6d656e7400011c61737365745f610d01011c4173736574496400011c61737365745f620d01011c417373657449640000a50c0c5863657265735f6c69717569646974795f6c6f636b65721870616c6c6574144572726f7204045400011440506f6f6c446f65734e6f7445786973740000044c506f6f6c20646f6573206e6f742065786973746c496e73756666696369656e744c6971756964697479546f4c6f636b00010478496e73756666696369656e74206c697175696469747920746f206c6f636b44496e76616c696450657263656e746167650002047050657263656e746167652067726561746572207468616e203130302530556e617574686f72697a65640003044c556e617574686f72697a65642061636365737364496e76616c6964556e6c6f636b696e6754696d657374616d7000040480556e6c6f636b696e6720646174652063616e6e6f7420626520696e207061737404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909a90c084863657265735f746f6b656e5f6c6f636b65723853746f7261676556657273696f6e00010808563100000008563200010000ad0c000002b10c00b10c084863657265735f746f6b656e5f6c6f636b657234546f6b656e4c6f636b496e666f0c1c42616c616e63650118184d6f6d656e7401281c41737365744964010d01000c0118746f6b656e7318011c42616c616e636500014c756e6c6f636b696e675f74696d657374616d702801184d6f6d656e7400012061737365745f69640d01011c417373657449640000b50c0c4863657265735f746f6b656e5f6c6f636b65721870616c6c6574144572726f7204045400011854496e76616c69644e756d6265724f66546f6b656e73000004704e756d626572206f6620746f6b656e7320657175616c73207a65726f30556e617574686f72697a65640001044c556e617574686f72697a65642061636365737364496e76616c6964556e6c6f636b696e6754696d657374616d7000020480556e6c6f636b696e6720646174652063616e6e6f7420626520696e2070617374384e6f74456e6f75676846756e6473000304404e6f7420656e6f7567682066756e6473384e6f74556e6c6f636b65645965740004045c546f6b656e73206e6f7420756e6c6f636b656420796574504c6f636b496e666f446f65734e6f744578697374000504604c6f636b20696e666f20646f6573206e6f7420657869737404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909b90c000004082c0000bd0c086463657265735f676f7665726e616e63655f706c6174666f726d28566f74696e67496e666f00000c0134766f74696e675f6f7074696f6e10010c75333200013c6e756d6265725f6f665f766f74657318011c42616c616e636500013c61737365745f77697468647261776ebc0110626f6f6c0000c10c086463657265735f676f7665726e616e63655f706c6174666f726d20506f6c6c496e666f181c41737365744964010d01184d6f6d656e7401282c537472696e674c696d697400304f7074696f6e734c696d697400285469746c654c696d697400404465736372697074696f6e4c696d69740000180128706f6c6c5f61737365740d01011c41737365744964000150706f6c6c5f73746172745f74696d657374616d702801184d6f6d656e74000148706f6c6c5f656e645f74696d657374616d702801184d6f6d656e740001147469746c6519020164426f756e646564537472696e673c5469746c654c696d69743e00012c6465736372697074696f6e6507017c426f756e646564537472696e673c4465736372697074696f6e4c696d69743e00011c6f7074696f6e736d0701d0426f756e6465645665633c426f756e646564537472696e673c537472696e674c696d69743e2c204f7074696f6e734c696d69743e0000c50c086463657265735f676f7665726e616e63655f706c6174666f726d3853746f7261676556657273696f6e00010c08563100000008563200010008563300020000c90c0c6463657265735f676f7665726e616e63655f706c6174666f726d1870616c6c6574144572726f7204045400014038506f6c6c497346696e697368656400000440506f6c6c2069732066696e697368656440506f6c6c49734e6f74537461727465640001044c506f6c6c206973206e6f742073746172746564384e6f74456e6f75676846756e6473000204404e6f7420656e6f7567682066756e647328566f746544656e6965640003042c566f74652064656e69656454496e76616c6964537461727454696d657374616d700004045c496e76616c69642073746172742074696d657374616d704c496e76616c6964456e6454696d657374616d7000050454496e76616c696420656e642074696d657374616d7044506f6c6c49734e6f7446696e697368656400060450506f6c6c206973206e6f742066696e697368656450496e76616c69644e756d6265724f66566f7465730007045c496e76616c6964206e756d626572206f6620766f7465735446756e6473416c726561647957697468647261776e0008046046756e647320616c72656164792077697468647261776e2c50496e76616c6964566f74696e674f7074696f6e7300090458496e76616c696420766f74696e67206f7074696f6e7350546f6f4d616e79566f74696e674f7074696f6e73000a045c546f6f206d616e7920766f74696e67206f7074696f6e73404475706c69636174654f7074696f6e73000b04444475706c6963617465206f7074696f6e7340506f6c6c446f65734e6f744578697374000c044c506f6c6c20646f6573206e6f7420657869737434496e76616c69644f7074696f6e000d0438496e76616c6964206f7074696f6e204e6f74566f746564000e04244e6f7420766f74656430556e617574686f72697a6564000f0430556e617574686f72697a656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909cd0c083c63657265735f6c61756e63687061641c494c4f496e666f101c42616c616e63650118244163636f756e7449640100184d6f6d656e7401281c41737365744964010d0100600134696c6f5f6f7267616e697a65720001244163636f756e744964000138746f6b656e735f666f725f696c6f18011c42616c616e6365000150746f6b656e735f666f725f6c697175696469747918011c42616c616e6365000124696c6f5f707269636518011c42616c616e6365000120736f66745f63617018011c42616c616e6365000120686172645f63617018011c42616c616e63650001406d696e5f636f6e747269627574696f6e18011c42616c616e63650001406d61785f636f6e747269627574696f6e18011c42616c616e636500012c726566756e645f74797065bc0110626f6f6c0001446c69717569646974795f70657263656e7418011c42616c616e63650001346c697374696e675f707269636518011c42616c616e636500012c6c6f636b75705f6461797310010c75333200013c73746172745f74696d657374616d702801184d6f6d656e74000134656e645f74696d657374616d702801184d6f6d656e74000150636f6e7472696275746f72735f76657374696e67d10c0190436f6e7472696275746f727356657374696e673c42616c616e63652c204d6f6d656e743e0001307465616d5f76657374696e67d50c01705465616d56657374696e673c42616c616e63652c204d6f6d656e743e00012c736f6c645f746f6b656e7318011c42616c616e636500013066756e64735f72616973656418011c42616c616e6365000124737563636565646564bc0110626f6f6c0001186661696c6564bc0110626f6f6c0001246c705f746f6b656e7318011c42616c616e6365000144636c61696d65645f6c705f746f6b656e73bc0110626f6f6c00014066696e6973685f74696d657374616d702801184d6f6d656e74000128626173655f61737365740d01011c417373657449640000d10c083c63657265735f6c61756e63687061644c436f6e7472696275746f727356657374696e67081c42616c616e63650118184d6f6d656e740128000c015466697273745f72656c656173655f70657263656e7418011c42616c616e636500013876657374696e675f706572696f642801184d6f6d656e7400013c76657374696e675f70657263656e7418011c42616c616e63650000d50c083c63657265735f6c61756e63687061642c5465616d56657374696e67081c42616c616e63650118184d6f6d656e740128001001647465616d5f76657374696e675f746f74616c5f746f6b656e7318011c42616c616e63650001887465616d5f76657374696e675f66697273745f72656c656173655f70657263656e7418011c42616c616e636500014c7465616d5f76657374696e675f706572696f642801184d6f6d656e740001507465616d5f76657374696e675f70657263656e7418011c42616c616e63650000d90c000004080d010000dd0c083c63657265735f6c61756e636870616440436f6e747269627574696f6e496e666f041c42616c616e636501180014014466756e64735f636f6e747269627574656418011c42616c616e6365000134746f6b656e735f626f7567687418011c42616c616e6365000138746f6b656e735f636c61696d656418011c42616c616e6365000144636c61696d696e675f66696e6973686564bc0110626f6f6c0001406e756d6265725f6f665f636c61696d7310010c7533320000e10c0c3c63657265735f6c61756e63687061641870616c6c6574144572726f720404540001a840494c4f416c726561647945786973747300000470494c4f20666f7220746f6b656e20616c7265616479206578697374734c506172616d6574657243616e7442655a65726f0001045c506172616d657465722063616e2774206265207a65726f38496e76616c6964536f6674436170000204a8536f6674206361702073686f756c64206265206d696e696d756d20353025206f6620686172642063617068496e76616c69644d696e696d756d436f6e747269627574696f6e00030425014d696e696d756d20636f6e747269627574696f6e206d75737420626520657175616c206f722067726561746572207468616e20302e3031206261736520617373657420746f6b656e7368496e76616c69644d6178696d756d436f6e747269627574696f6e000404f84d6178696d756d20636f6e747269627574696f6e206d7573742062652067726561746572207468616e206d696e696d756d20636f6e747269627574696f6e5c496e76616c69644c697175696469747950657263656e74000504c04d696e696d756d20353125206f66207261697365642066756e6473206d75737420676f20746f206c697175696469747944496e76616c69644c6f636b757044617973000604784c6f636b75702064617973206d757374206265206d696e696d756d20333054496e76616c6964537461727454696d657374616d700007047053746172742074696d657374616d7020626520696e206675747572654c496e76616c6964456e6454696d657374616d70000804c8456e642074696d657374616d70206d7573742062652067726561746572207468616e2073746172742074696d657374616d7030496e76616c69645072696365000904b04c697374696e67207072696365206d7573742062652067726561746572207468616e20494c4f20707269636584496e76616c69644e756d6265724f66546f6b656e73466f724c6971756964697479000a0498496e76616c6964206e756d626572206f6620746f6b656e7320666f72206c69717569646974796c496e76616c69644e756d6265724f66546f6b656e73466f72494c4f000b0480496e76616c6964206e756d626572206f6620746f6b656e7320666f7220494c4f68496e76616c6964466972737452656c6561736550657263656e74000c048c46697273742072656c656173652070657263656e742063616e2774206265207a65726f54496e76616c696456657374696e6750657263656e74000d045c496e76616c69642076657374696e672070657263656e7450496e76616c696456657374696e67506572696f64000e047056657374696e6720706572696f642063616e2774206265207a65726f384e6f74456e6f7567684365726573000f04404e6f7420656e6f7567682043455245533c4e6f74456e6f756768546f6b656e73001004544e6f7420656e6f75676820494c4f20746f6b656e7334494c4f4e6f74537461727465640011043c494c4f206e6f74207374617274656434494c4f497346696e697368656400120440494c4f2069732066696e69736865642c4c43616e74436f6e74726962757465496e494c4f0013045c43616e277420636f6e7472696275746520696e20494c4f304861726443617049734869740014043c486172642063617020697320686974504e6f74456e6f756768546f6b656e73546f427579001504604e6f7420656e6f75676820746f6b656e7320746f2062757968436f6e747269627574696f6e49734c6f7765725468656e4d696e00160478436f6e747269627574696f6e206973206c6f776572207468616e206d696e6c436f6e747269627574696f6e49734269676765725468656e4d61780017047c436f6e747269627574696f6e20697320626967676572207468616e206d6178384e6f74456e6f75676846756e6473001804404e6f7420656e6f7567682066756e64733c494c4f446f65734e6f74457869737400190470494c4f20666f7220746f6b656e20646f6573206e6f7420657869737440494c4f49734e6f7446696e6973686564001a044c494c4f206973206e6f742066696e697368656440506f6f6c446f65734e6f744578697374001b044c506f6f6c20646f6573206e6f7420657869737430556e617574686f72697a6564001c0430556e617574686f72697a65644443616e74436c61696d4c50546f6b656e73001d045443616e277420636c61696d204c5020746f6b656e734c46756e6473416c7265616479436c61696d6564001e045446756e647320616c726561647920636c61696d6564384e6f7468696e67546f436c61696d001f04404e6f7468696e6720746f20636c61696d2c494c4f49734661696c656400200434494c4f206973206661696c656438494c4f497353756363656564656400210440494c4f206973207375636365656465646c43616e74437265617465494c4f466f724c6973746564546f6b656e0022048443616e27742063726561746520494c4f20666f72206c697374656420746f6b656e5c4163636f756e7449734e6f7457686974656c6973746564002304684163636f756e74206973206e6f742077686974656c697374656478496e76616c69645465616d466972737452656c6561736550657263656e74002404a05465616d2066697273742072656c656173652070657263656e742063616e2774206265207a65726f64496e76616c69645465616d56657374696e6750657263656e74002504705465616d20696e76616c69642076657374696e672070657263656e7460496e76616c69645465616d56657374696e67506572696f64002604845465616d2076657374696e6720706572696f642063616e2774206265207a65726f644e6f74456e6f7567685465616d546f6b656e73546f4c6f636b002704784e6f7420656e6f756768207465616d20746f6b656e7320746f206c6f636b44496e76616c696446656550657263656e740028048c496e76616c6964206665652070657263656e74206f6e207261697365642066756e6473544261736541737365744e6f74537570706f72746564002904d8417373657420696e2077686963682066756e647320617265206265696e6720726169736564206973206e6f7420737570706f7274656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909e50c086064656d657465725f6661726d696e675f706c6174666f726d24546f6b656e496e666f04244163636f756e7449640100001c01586661726d735f746f74616c5f6d756c7469706c69657210010c7533320001607374616b696e675f746f74616c5f6d756c7469706c69657210010c75333200013c746f6b656e5f7065725f626c6f636b18011c42616c616e63650001406661726d735f616c6c6f636174696f6e18011c42616c616e63650001487374616b696e675f616c6c6f636174696f6e18011c42616c616e636500013c7465616d5f616c6c6f636174696f6e18011c42616c616e63650001307465616d5f6163636f756e740001244163636f756e7449640000e90c000002ed0c00ed0c086064656d657465725f6661726d696e675f706c6174666f726d2055736572496e666f041c41737365744964010d0100180128626173655f61737365740d01011c41737365744964000128706f6f6c5f61737365740d01011c417373657449640001307265776172645f61737365740d01011c4173736574496400011c69735f6661726dbc0110626f6f6c000134706f6f6c65645f746f6b656e7318011c42616c616e636500011c7265776172647318011c42616c616e63650000f10c000002f50c00f50c086064656d657465725f6661726d696e675f706c6174666f726d20506f6f6c44617461041c41737365744964010d01002401286d756c7469706c69657210010c75333200012c6465706f7369745f66656518011c42616c616e636500011c69735f636f7265bc0110626f6f6c00011c69735f6661726dbc0110626f6f6c000150746f74616c5f746f6b656e735f696e5f706f6f6c18011c42616c616e636500011c7265776172647318011c42616c616e6365000164726577617264735f746f5f62655f646973747269627574656418011c42616c616e636500012869735f72656d6f766564bc0110626f6f6c000128626173655f61737365740d01011c417373657449640000f90c086064656d657465725f6661726d696e675f706c6174666f726d3853746f7261676556657273696f6e00010808563100000008563200010000fd0c0c6064656d657465725f6661726d696e675f706c6174666f726d1870616c6c6574144572726f7204045400013458546f6b656e416c7265616479526567697374657265640000046c546f6b656e20697320616c726561647920726567697374657265645c546f6b656e506572426c6f636b43616e7442655a65726f00010474546f6b656e2070657220626c6f636b2063616e2774206265207a65726f6c496e76616c6964416c6c6f636174696f6e506172616d657465727300020474496e76616c696420616c6c6f636174696f6e20706172616d657465727344496e76616c69644d756c7469706c696572000304a04d756c7469706c696572206d7573742062652067726561746572206f7220657175616c20746f203144496e76616c69644465706f7369744665650004044c496e76616c6964206465706f7369742066656568526577617264546f6b656e49734e6f74526567697374657265640005045c546f6b656e206973206e6f74207265676973746572656444506f6f6c416c72656164794578697374730006044c506f6f6c20616c72656164792065786973747344496e73756666696369656e7446756e647300070448496e73756666696369656e742046756e64732c5a65726f52657761726473000804305a65726f205265776172647340506f6f6c446f65734e6f7445786973740009044c506f6f6c20646f6573206e6f7420657869737450496e73756666696369656e744c50546f6b656e73000a0458496e73756666696369656e74204c5020746f6b656e7358506f6f6c446f65734e6f744861766552657761726473000b046c506f6f6c20646f6573206e6f74206861766520726577617264732c30556e617574686f72697a6564000c0430556e617574686f72697a656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909010d0c4070616c6c65745f626167735f6c697374106c697374104e6f646508045400044900001401086964000130543a3a4163636f756e74496400011070726576350201504f7074696f6e3c543a3a4163636f756e7449643e0001106e657874350201504f7074696f6e3c543a3a4163636f756e7449643e0001246261675f7570706572280120543a3a53636f726500011473636f7265280120543a3a53636f72650000050d0c4070616c6c65745f626167735f6c697374106c6973740c426167080454000449000008011068656164350201504f7074696f6e3c543a3a4163636f756e7449643e0001107461696c350201504f7074696f6e3c543a3a4163636f756e7449643e0000090d00000228000d0d0c4070616c6c65745f626167735f6c6973741870616c6c6574144572726f72080454000449000104104c6973740400110d01244c6973744572726f72000004b441206572726f7220696e20746865206c69737420696e7465726661636520696d706c656d656e746174696f6e2e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909110d0c4070616c6c65745f626167735f6c697374106c697374244c6973744572726f72000110244475706c6963617465000000284e6f7448656176696572000100304e6f74496e53616d65426167000200304e6f64654e6f74466f756e6400030000150d089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365345265616479536f6c7574696f6e04045400000c0120737570706f727473190d01b0426f756e646564537570706f7274733c543a3a4163636f756e7449642c20543a3a4d617857696e6e6572733e00011473636f726539020134456c656374696f6e53636f726500011c636f6d707574653102013c456c656374696f6e436f6d707574650000190d101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401c108045300000400bd0801185665633c543e00001d0d089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736534526f756e64536e617073686f740404540000080118766f74657273210d013c5665633c566f7465724f663c543e3e00011c74617267657473510201445665633c543a3a4163636f756e7449643e0000210d000002250d00250d0000040c0028390a00290d101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012d0d045300000400310d01185665633c543e00002d0d0000040c3902101000310d0000022d0d00350d0c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365187369676e6564405369676e65645375626d697373696f6e0c244163636f756e74496401001c42616c616e6365011820536f6c7574696f6e0189070010010c77686f0001244163636f756e74496400011c6465706f73697418011c42616c616e63650001307261775f736f6c7574696f6e85070154526177536f6c7574696f6e3c536f6c7574696f6e3e00012063616c6c5f66656518011c42616c616e63650000390d0c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144572726f720404540001386850726544697370617463684561726c795375626d697373696f6e000004645375626d697373696f6e2077617320746f6f206561726c792e6c507265446973706174636857726f6e6757696e6e6572436f756e740001048857726f6e67206e756d626572206f662077696e6e6572732070726573656e7465642e6450726544697370617463685765616b5375626d697373696f6e000204905375626d697373696f6e2077617320746f6f207765616b2c2073636f72652d776973652e3c5369676e6564517565756546756c6c0003044901546865207175657565207761732066756c6c2c20616e642074686520736f6c7574696f6e20776173206e6f7420626574746572207468616e20616e79206f6620746865206578697374696e67206f6e65732e585369676e656443616e6e6f745061794465706f73697400040494546865206f726967696e206661696c656420746f2070617920746865206465706f7369742e505369676e6564496e76616c69645769746e657373000504a05769746e657373206461746120746f20646973706174636861626c6520697320696e76616c69642e4c5369676e6564546f6f4d756368576569676874000604b8546865207369676e6564207375626d697373696f6e20636f6e73756d657320746f6f206d756368207765696768743c4f637743616c6c57726f6e67457261000704984f4357207375626d697474656420736f6c7574696f6e20666f722077726f6e6720726f756e645c4d697373696e67536e617073686f744d65746164617461000804a8536e617073686f74206d657461646174612073686f756c6420657869737420627574206469646e27742e58496e76616c69645375626d697373696f6e496e646578000904d06053656c663a3a696e736572745f7375626d697373696f6e602072657475726e656420616e20696e76616c696420696e6465782e3843616c6c4e6f74416c6c6f776564000a04985468652063616c6c206973206e6f7420616c6c6f776564206174207468697320706f696e742e3846616c6c6261636b4661696c6564000b044c5468652066616c6c6261636b206661696c65642c426f756e644e6f744d6574000c0448536f6d6520626f756e64206e6f74206d657438546f6f4d616e7957696e6e657273000d049c5375626d697474656420736f6c7574696f6e2068617320746f6f206d616e792077696e6e657273040d014572726f72206f66207468652070616c6c657420746861742063616e2062652072657475726e656420696e20726573706f6e736520746f20646973706174636865732e3d0d04184f7074696f6e04045401410d0108104e6f6e6500000010536f6d650400410d0000010000410d081062616e642042616e6452617465042c426c6f636b4e756d62657201100014011476616c756518011c42616c616e63650001306c6173745f7570646174656428010c7536340001486c6173745f757064617465645f626c6f636b10012c426c6f636b4e756d626572000128726571756573745f696428010c75363400012c64796e616d69635f6665653d01011446697865640000450d0000040810010200490d0c1062616e641870616c6c6574144572726f720804540004490001204c556e617574686f72697a656452656c61796572000004a4416e20756e74727573746564206163636f756e7420747269656420746f2072656c617920646174612e58416c7265616479415472757374656452656c61796572000104390141207265717565737420746f2061646420616e206163636f756e742c20776869636820697320616c7265616479206120747275737465642072656c617965722c2077617320737570706c6965642e344e6f5375636852656c61796572000204350141207265717565737420746f2072656d6f766520616e206163636f756e742c207768696368206973206e6f74206120747275737465642072656c617965722c2077617320737570706c6965642e5852617465436f6e76657273696f6e4f766572666c6f77000304cc52656c61796564207261746520697320746f6f2062696720746f2062652073746f72656420696e207468652070616c6c65742e5c52617465486173496e76616c696454696d657374616d700004046c526174652068617320696e76616c69642074696d657374616d702e2c5261746545787069726564000504d052617465206973206578706972656420616e642063616e2774206265207573656420756e74696c206e657874207570646174652e6844796e616d696346656543616c63756c6174696f6e4572726f72000604904572726f7220647572696e672064796e616d6963206665652063616c63756c6174696f6e6c496e76616c696444796e616d6963466565506172616d65746572730007048c44796e616d69632066656520706172616d65746572732061726520696e76616c69642c04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909094d0d04204254726565536574040454015902000400510d000000510d000002590200550d0c306f7261636c655f70726f78791870616c6c6574144572726f72040454000108504f7261636c65416c7265616479456e61626c6564000000544f7261636c65416c726561647944697361626c656400010004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909590d08686865726d65735f676f7665726e616e63655f706c6174666f726d404865726d6573566f74696e67496e666f042c537472696e674c696d697400000c0134766f74696e675f6f7074696f6e61020168426f756e646564537472696e673c537472696e674c696d69743e0001406e756d6265725f6f665f6865726d657318011c42616c616e63650001406865726d65735f77697468647261776ebc0110626f6f6c00005d0d08686865726d65735f676f7665726e616e63655f706c6174666f726d384865726d6573506f6c6c496e666f18244163636f756e7449640100184d6f6d656e7401282c537472696e674c696d697400304f7074696f6e734c696d697400285469746c654c696d697400404465736372697074696f6e4c696d6974000020011c63726561746f720001244163636f756e7449640001346865726d65735f6c6f636b656418011c42616c616e6365000150706f6c6c5f73746172745f74696d657374616d702801184d6f6d656e74000148706f6c6c5f656e645f74696d657374616d702801184d6f6d656e740001147469746c6519020164426f756e646564537472696e673c5469746c654c696d69743e00012c6465736372697074696f6e6507017c426f756e646564537472696e673c4465736372697074696f6e4c696d69743e00016063726561746f725f6865726d65735f77697468647261776ebc0110626f6f6c00011c6f7074696f6e736d0701d0426f756e6465645665633c426f756e646564537472696e673c537472696e674c696d69743e2c204f7074696f6e734c696d69743e0000610d08686865726d65735f676f7665726e616e63655f706c6174666f726d3853746f7261676556657273696f6e00010808563100000008563200010000650d0c686865726d65735f676f7665726e616e63655f706c6174666f726d1870616c6c6574144572726f7204045400014c40506f6c6c49734e6f74537461727465640000044c506f6c6c204973204e6f74205374617274656438506f6c6c497346696e697368656400010440506f6c6c2049732046696e697368656454496e76616c6964537461727454696d657374616d700002045c496e76616c69642053746172742054696d657374616d704c496e76616c6964456e6454696d657374616d7000030458496e76616c696420456e642054696d657374616d702c784e6f74456e6f7567684865726d6573466f724372656174696e67506f6c6c0004048c4e6f7420456e6f756768204865726d657320466f72204372656174696e6720506f6c6c5446756e6473416c726561647957697468647261776e0005045c46756e647320416c72656164792057697468647261776e44506f6c6c49734e6f7446696e697368656400060450506f6c6c204973204e6f742046696e697368656440596f754172654e6f7443726561746f720007044c596f7520417265204e6f742043726561746f7230556e617574686f72697a656400080430556e617574686f72697a656440506f6c6c446f65734e6f74457869737400090450506f6c6c20446f6573204e6f742045786973742c604e6f74456e6f7567684865726d6573466f72566f74696e67000a04704e6f7420456e6f756768204865726d657320466f7220566f74696e6730416c7265616479566f746564000b0434416c7265616479566f7465642c70496e76616c69644d696e696d756d4475726174696f6e4f66506f6c6c000c0480496e76616c6964204d696e696d756d204475726174696f6e204f6620506f6c6c70496e76616c69644d6178696d756d4475726174696f6e4f66506f6c6c000d0480496e76616c6964204d6178696d756d204475726174696f6e204f6620506f6c6c204e6f74566f746564000e04244e6f7420566f74656450496e76616c6964566f74696e674f7074696f6e73000f0458496e76616c696420566f74696e67204f7074696f6e7350546f6f4d616e79566f74696e674f7074696f6e730010045c546f6f204d616e7920566f74696e67204f7074696f6e7334496e76616c69644f7074696f6e00110438496e76616c6964204f7074696f6e404475706c69636174654f7074696f6e73001204444475706c6963617465206f7074696f6e7304b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909690d083c70616c6c65745f707265696d616765345265717565737453746174757308244163636f756e74496401001c42616c616e6365011801082c556e72657175657374656408011c6465706f736974d9010150284163636f756e7449642c2042616c616e63652900010c6c656e10010c753332000000245265717565737465640c011c6465706f7369746d0d01704f7074696f6e3c284163636f756e7449642c2042616c616e6365293e000114636f756e7410010c75333200010c6c656ef101012c4f7074696f6e3c7533323e000100006d0d04184f7074696f6e04045401d9010108104e6f6e6500000010536f6d650400d9010000010000710d000004082c1000750d101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e0000790d0c3c70616c6c65745f707265696d6167651870616c6c6574144572726f7204045400011818546f6f426967000004a0507265696d61676520697320746f6f206c6172676520746f2073746f7265206f6e2d636861696e2e30416c72656164794e6f746564000104a4507265696d6167652068617320616c7265616479206265656e206e6f746564206f6e2d636861696e2e344e6f74417574686f72697a6564000204c85468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e2e204e6f744e6f746564000304fc54686520707265696d6167652063616e6e6f742062652072656d6f7665642073696e636520697420686173206e6f7420796574206265656e206e6f7465642e2452657175657374656400040409014120707265696d616765206d6179206e6f742062652072656d6f766564207768656e20746865726520617265206f75747374616e64696e672072657175657374732e304e6f745265717565737465640005042d0154686520707265696d61676520726571756573742063616e6e6f742062652072656d6f7665642073696e6365206e6f206f75747374616e64696e672072657175657374732065786973742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909097d0d0c286f726465725f626f6f6b286f726465725f626f6f6b244f72646572426f6f6b04045400002001346f726465725f626f6f6b5f69647102018c4f72646572426f6f6b49643c417373657449644f663c543e2c20543a3a44455849643e0001187374617475737502013c4f72646572426f6f6b5374617475730001346c6173745f6f726465725f6964180128543a3a4f7264657249640001247469636b5f73697a657d0201284f726465725072696365000134737465705f6c6f745f73697a657d02012c4f72646572566f6c756d650001306d696e5f6c6f745f73697a657d02012c4f72646572566f6c756d650001306d61785f6c6f745f73697a657d02012c4f72646572566f6c756d6500012c746563685f737461747573810d014c4f72646572426f6f6b546563685374617475730000810d0c286f726465725f626f6f6b1474797065734c4f72646572426f6f6b54656368537461747573000108145265616479000000205570646174696e6700010000850d0000040871021800890d0c286f726465725f626f6f6b2c6c696d69745f6f72646572284c696d69744f7264657204045400002401086964180128543a3a4f7264657249640001146f776e6572000130543a3a4163636f756e7449640001107369646579020130507269636556617269616e7400011470726963657d0201284f72646572507269636500013c6f726967696e616c5f616d6f756e747d02012c4f72646572566f6c756d65000118616d6f756e747d02012c4f72646572566f6c756d6500011074696d6528012c4d6f6d656e744f663c543e0001206c6966657370616e28012c4d6f6d656e744f663c543e000128657870697265735f6174100144426c6f636b4e756d626572466f723c543e00008d0d0000040871027d0200910d101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540118045300000400a50401185665633c543e0000950d101c73705f636f72651c626f756e64656444626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b017d020456017d02045300000400990d013842547265654d61703c4b2c20563e0000990d042042547265654d617008044b017d020456017d020004009d0d0000009d0d000002a10d00a10d000004087d027d0200a50d0000040800710200a90d101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e64656456656308045401850d045300000400ad0d01185665633c543e0000ad0d000002850d00b10d0c286f726465725f626f6f6b1870616c6c6574144572726f720404540001b440556e6b6e6f776e4f72646572426f6f6b000004bc4f7264657220626f6f6b20646f6573206e6f7420657869737420666f7220746869732074726164696e67207061697248496e76616c69644f72646572426f6f6b496400010454496e76616c6964206f7264657220626f6f6b206964584f72646572426f6f6b416c7265616479457869737473000204bc4f7264657220626f6f6b20616c72656164792065786973747320666f7220746869732074726164696e67207061697244556e6b6e6f776e4c696d69744f72646572000304f44c696d6974206f7264657220646f6573206e6f7420657869737420666f7220746869732074726164696e67207061697220616e64206f726465722069645c4c696d69744f72646572416c7265616479457869737473000404f44c696d6974206f7264657220616c72656164792065786973747320666f7220746869732074726164696e67207061697220616e64206f72646572206964644c696d69744f7264657253746f726167654f766572666c6f770005043d01497420697320696d706f737369626c6520746f20696e7365727420746865206c696d6974206f7264657220626563617573652074686520626f756e64732068617665206265656e2072656163686564545570646174654c696d69744f726465724572726f72000604a8497420697320696d706f737369626c6520746f2075706461746520746865206c696d6974206f726465725444656c6574654c696d69744f726465724572726f72000704a8497420697320696d706f737369626c6520746f2064656c65746520746865206c696d6974206f7264657244426c6f636b5363686564756c6546756c6c000804c045787069726174696f6e207363686564756c6520666f722065787069726174696f6e20626c6f636b2069732066756c6c4845787069726174696f6e4e6f74466f756e64000904c4436f756c64206e6f742066696e642065787069726174696f6e20696e20676976656e20626c6f636b207363686564756c65384e6f44617461466f725072696365000a0490546865726520617265206e6f20626964732f61736b7320666f7220746865207072696365404e6f4167677265676174656444617461000b04d0546865726520617265206e6f206167677265676174656420626964732f61736b7320666f7220746865206f7264657220626f6f6b744e6f74456e6f7567684c6971756964697479496e4f72646572426f6f6b000c0405015468657265206973206e6f7420656e6f756768206c697175696469747920696e20746865206f7264657220626f6f6b20746f20636f76657220746865206465616ca0466f7262696464656e546f4372656174654f72646572426f6f6b5769746853616d65417373657473000d04e843616e6e6f7420637265617465206f7264657220626f6f6b207769746820657175616c206261736520616e642074617267657420617373657473504e6f74416c6c6f77656451756f74654173736574000e048501546865206173736574206973206e6f7420616c6c6f77656420746f2062652071756f74652e204f6e6c79207468652064657820626173652061737365742063616e20626520612071756f746520617373657420666f72206f7264657220626f6f6b3c4e6f74416c6c6f7765644445584964000f04bc4f72646572626f6f6b732063616e6e6f742062652063726561746564207769746820676976656e206465782069642e6453796e74686574696341737365744973466f7262696464656e001004b853796e746865746963206173736574732061726520666f7262696464656e20666f72206f7264657220626f6f6b2e30557365724861734e6f4e66740011040101557365722063616e6e6f742063726561746520616e206f7264657220626f6f6b2077697468204e4654206966207468657920646f6e27742068617665204e46543c496e76616c69644c6966657370616e0012047c4c6966657370616e206578636565647320646566696e6564206c696d69747348496e76616c69644f72646572416d6f756e740013040501546865206f7264657220616d6f756e7420286c696d6974206f72206d61726b65742920646f6573206e6f74206d6565742074686520726571756972656d656e747358496e76616c69644c696d69744f726465725072696365001404d0546865206c696d6974206f7264657220707269636520646f6573206e6f74206d6565742074686520726571756972656d656e7473844c696d69744f7264657250726963654973546f6f46617246726f6d5370726561640015042501557365722063616e6e6f742073657420746865207072696365206f66206c696d6974206f7264657220746f6f206661722066726f6d2061637475616c206d61726b65742070726963654854726164696e674973466f7262696464656e001604f4417420746865206d6f6d656e742c2054726164696e6720697320666f7262696464656e20696e207468652063757272656e74206f7264657220626f6f6b84506c6163656d656e744f664c696d69744f72646572734973466f7262696464656e0017043101417420746865206d6f6d656e742c2055736572732063616e6e6f7420706c616365206e6577206c696d6974206f726465727320696e207468652063757272656e74206f7264657220626f6f6b9043616e63656c6c6174696f6e4f664c696d69744f72646572734973466f7262696464656e0018043d01417420746865206d6f6d656e742c2055736572732063616e6e6f742063616e63656c207468656972206c696d6974206f726465727320696e207468652063757272656e74206f7264657220626f6f6b74557365724861734d6178436f756e744f664f70656e65644f72646572730019043d01557365722068617320746865206d617820617661696c61626c6520636f756e74206f66206f70656e206c696d6974206f726465727320696e207468652063757272656e74206f7264657220626f6f6b845072696365526561636865644d6178436f756e744f664c696d69744f7264657273001a04e901497420697320696d706f737369626c6520746f20706c61636520746865206c696d6974206f72646572206265636175736520626f756e6473206f6620746865206d617820636f756e74206f66206f7264657273206174207468652063757272656e742070726963652068617665206265656e20726561636865649c4f72646572426f6f6b526561636865644d6178436f756e744f66507269636573466f7253696465001b04c901497420697320696d706f737369626c6520746f20706c61636520746865206c696d6974206f72646572206265636175736520626f756e6473206f6620746865206d617820636f756e74206f662070726963657320666f722074686520736964652068617665206265656e20726561636865645c416d6f756e7443616c63756c6174696f6e4661696c6564001c04b8416e206572726f72206f63637572726564207768696c652063616c63756c6174696e672074686520616d6f756e7458507269636543616c63756c6174696f6e4661696c6564001d04b4416e206572726f72206f63637572726564207768696c652063616c63756c6174696e672074686520707269636530556e617574686f72697a6564001e044c556e617574686f72697a656420616374696f6e30496e76616c69644173736574001f0434496e76616c69642061737365743c496e76616c69645469636b53697a6500200444496e76616c6964207469636b2073697a6548496e76616c6964537465704c6f7453697a6500210454496e76616c69642073746570206c6f742073697a6544496e76616c69644d696e4c6f7453697a6500220450496e76616c6964206d696e206c6f742073697a6544496e76616c69644d61784c6f7453697a6500230450496e76616c6964206d6178206c6f742073697a657c5469636b53697a65416e64537465704c6f7453697a65417265546f6f42696700240441015469636b2073697a6520262073746570206c6f742073697a652061726520746f6f2062696720616e64207468656972206d756c7469706c69636174696f6e206f766572666c6f77732042616c616e63658c5469636b53697a65416e64537465704c6f7453697a654c6f7365507265636973696f6e002504590350726f64756374206f66207469636b20616e642073746570206c6f742073697a657320676f6573206f7574206f6620707265636973696f6e2e204974206d7573742062652061636375726174656c7920726570726573656e7465642062792066697865642d707265636973696f6e20666c6f617420746f2070726576656e7420726f756e64696e67206572726f72732e20492e652e207468652070726f647563742073686f756c64206e6f742068617665206d6f7265207468616e203138206469676974732061667465722074686520636f6d6d612e7c4d61784c6f7453697a6549734d6f72655468616e546f74616c537570706c79002604ec4d6178206c6f742073697a652063616e6e6f74206265206d6f7265207468617420746f74616c20737570706c79206f66206261736520617373657454536c6970706167654c696d697445786365656465640027042d01496e64696361746564206c696d697420666f7220736c69707061676520686173206e6f74206265656e206d657420647572696e67207472616e73616374696f6e20657865637574696f6e2eac4d61726b65744f7264657273416c6c6f7765644f6e6c79466f72496e646976697369626c65417373657473002804d44d61726b6574206f72646572732061726520616c6c6f776564206f6e6c7920666f7220696e646976697369626c652061737365747380466f7262696464656e537461747573546f44656c6574654f72646572426f6f6b0029044501497420697320706f737369626c6520746f2064656c65746520616e206f726465722d626f6f6b206f6e6c792077697468207468652073746174757365733a204f6e6c7943616e63656c206f722053746f704c4f72646572426f6f6b49734e6f74456d707479002a04b8497420697320706f737369626c6520746f2064656c657465206f6e6c7920656d707479206f726465722d626f6f6b80466f7262696464656e537461747573546f5570646174654f72646572426f6f6b002b044501497420697320706f737369626c6520746f2075706461746520616e206f726465722d626f6f6b206f6e6c792077697468207468652073746174757365733a204f6e6c7943616e63656c206f722053746f70444f72646572426f6f6b49734c6f636b6564002c0401014f7264657220426f6f6b206973206c6f636b656420666f7220746563686e6963616c206d61696e74656e616e63652e2054727920616761696e206c617465722e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909b50d08206b656e736574737538537461626c65636f696e496e666f041c41737365744964010d01000801206261645f6465627418011c42616c616e6365000154737461626c65636f696e5f706172616d65746572739d020174537461626c65636f696e506172616d65746572733c417373657449643e0000b90d08206b656e736574737578537461626c65636f696e436f6c6c61746572616c4964656e746966696572041c41737365744964010d010008014c636f6c6c61746572616c5f61737365745f69640d01011c4173736574496400014c737461626c65636f696e5f61737365745f69640d01011c417373657449640000bd0d08206b656e736574737538436f6c6c61746572616c496e666f04184d6f6d656e7401280014013c7269736b5f706172616d657465727391020160436f6c6c61746572616c5269736b506172616d6574657273000140746f74616c5f636f6c6c61746572616c18011c42616c616e6365000144737461626c65636f696e5f737570706c7918011c42616c616e63650001506c6173745f6665655f7570646174655f74696d652801184d6f6d656e74000150696e7465726573745f636f656666696369656e748c01244669786564553132380000c10d08206b656e736574737568436f6c6c61746572616c697a656444656274506f736974696f6e08244163636f756e74496401001c41737365744964010d01001801146f776e65720001244163636f756e74496400014c636f6c6c61746572616c5f61737365745f69640d01011c41737365744964000144636f6c6c61746572616c5f616d6f756e7418011c42616c616e636500014c737461626c65636f696e5f61737365745f69640d01011c417373657449640001106465627418011c42616c616e6365000150696e7465726573745f636f656666696369656e748c01244669786564553132380000c50d101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e6465645665630804540118045300000400a50401185665633c543e0000c90d0c206b656e73657473751870616c6c6574144572726f720404540001483c41726974686d657469634572726f720000003057726f6e67417373657449640001002c4344504e6f74466f756e6400020058436f6c6c61746572616c496e666f4e6f74466f756e6400030058436f6c6c61746572616c42656c6f774d696e696d616c0004001c4344505361666500050024434450556e736166650006003c4344504c696d69745065725573657200070458546f6f206d616e792043445073207065722075736572544f7065726174696f6e4e6f745065726d69747465640008007c556e636f6c6c656374656453746162696c697479466565546f6f536d616c6c000904c4556e636f6c6c65637465642073746162696c6974792066656520697320746f6f20736d616c6c20666f72206163637275653448617264436170537570706c79000a003c41636372756557726f6e6754696d65000b00485a65726f4c69717569646174696f6e4c6f74000c0401014c69717569646174696f6e206c6f742073657420696e207269736b20706172616d6574657273206973207a65726f2c2063616e6e6f74206c6971756964617465404c69717569646174696f6e4c696d6974000d04644c69717569646174696f6e206c696d697420726561636865644857726f6e67426f72726f77416d6f756e7473000e045057726f6e6720626f72726f7720616d6f756e74736053796d626f6c4e6f74456e61626c656442794f7261636c65000f0058537461626c65636f696e496e666f4e6f74466f756e640010008c436f6c6c61746572616c4e6f7452656769737465726564496e5072696365546f6f6c73001104b0436f6c6c61746572616c206d757374206265207265676973746572656420696e205072696365546f6f6c732e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909cd0d00000408d10d2c00d10d00000408c5020000d50d08306272696467655f70726f78793442726964676552657175657374041c41737365744964010d0100200118736f757263654903013847656e657269634163636f756e74000110646573744903013847656e657269634163636f756e7400012061737365745f69640d01011c41737365744964000118616d6f756e7418011c42616c616e6365000118737461747573ad0201344d65737361676553746174757300013c73746172745f74696d65706f696e74fd04014047656e6572696354696d65706f696e74000134656e645f74696d65706f696e74fd04014047656e6572696354696d65706f696e74000124646972656374696f6ed90d01404d657373616765446972656374696f6e0000d90d0c306272696467655f7479706573147479706573404d657373616765446972656374696f6e0001081c496e626f756e64000000204f7574626f756e6400010000dd0d00000408c5022c00e10d00000408c5020d0100e50d0c306272696467655f70726f78791870616c6c6574144572726f72040454000120485061746849734e6f74417661696c61626c650000004057726f6e674163636f756e744b696e64000100604e6f74456e6f7567684c6f636b65644c6971756964697479000200204f766572666c6f77000300505472616e736665724c696d6974526561636865640004004c4173736574416c72656164794c696d697465640005003c41737365744e6f744c696d697465640006004857726f6e674c696d697453657474696e677300070004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909e90d10607375627374726174655f6272696467655f6368616e6e656c1c696e626f756e641870616c6c6574144572726f7204045400011c38496e76616c69644e6574776f726b000004944d6573736167652063616d652066726f6d20616e20696e76616c6964206e6574776f726b2e50496e76616c6964536f757263654368616e6e656c0001040d014d6573736167652063616d652066726f6d20616e20696e76616c6964206f7574626f756e64206368616e6e656c206f6e2074686520457468657265756d20736964652e44496e76616c6964436f6d6d69746d656e74000204885375626d697474656420696e76616c696420636f6d6d69746d656e7420747970652e30496e76616c69644e6f6e6365000304804d6573736167652068617320616e20756e6578706563746564206e6f6e63652e54496e76616c69645265776172644672616374696f6e00040464496e636f727265637420726577617264206672616374696f6e38436f6e7472616374457869737473000504705468697320636f6e747261637420616c7265616479206578697374734043616c6c456e636f64654661696c65640006045443616c6c20656e636f64696e67206661696c65642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909ed0d0c306272696467655f74797065731474797065736847656e65726963436f6d6d69746d656e7457697468426c6f636b0c2c426c6f636b4e756d62657201102c4d61784d6573736167657300284d61785061796c6f61640000080130626c6f636b5f6e756d62657210012c426c6f636b4e756d626572000128636f6d6d69746d656e74050901c463726174653a3a47656e65726963436f6d6d69746d656e743c4d61784d657373616765732c204d61785061796c6f61643e0000f10d10607375627374726174655f6272696467655f6368616e6e656c206f7574626f756e641870616c6c6574144572726f7204045400011c3c5061796c6f6164546f6f4c617267650000049c546865206d657373616765207061796c6f616420657863656564732062797465206c696d69742e54517565756553697a654c696d69745265616368656400010421014e6f206d6f7265206d657373616765732063616e2062652071756575656420666f7220746865206368616e6e656c20647572696e67207468697320636f6d6d6974206379636c652e304d6178476173546f6f426967000204ac4d6178696d756d2067617320666f72207175657565642062617463682065786365656473206c696d69742e1c4e6f46756e64730003049c43616e6e6f7420706179207468652066656520746f207375626d69742061206d6573736167652e204f766572666c6f770004045843616e6e6f7420696e6372656d656e74206e6f6e6365344368616e6e656c4578697374730005046c54686973206368616e6e656c20616c726561647920657869737473305a65726f496e74657276616c00060460496e74657276616c2063616e6e6f74206265207a65726f2e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909f50d00000408b9020d0100f90d00000408b9021000fd0d0c5070617261636861696e5f6272696467655f6170701870616c6c6574144572726f7204045400014050546f6b656e49734e6f74526567697374657265640000004841707049734e6f7452656769737465726564000100384e6f74456e6f75676846756e647300020038496e76616c69644e6574776f726b00030058546f6b656e416c72656164795265676973746572656400040050417070416c7265616479526567697374657265640005004043616c6c456e636f64654661696c65640006045443616c6c20656e636f64696e67206661696c65642e2c57726f6e67416d6f756e7400070448416d6f756e74206d757374206265203e2030505472616e736665724c696d69745265616368656400080040556e6b6e6f776e507265636973696f6e000900444d65737361676549644e6f74466f756e64000a006c496e76616c696444657374696e6174696f6e50617261636861696e000b0060496e76616c696444657374696e6174696f6e506172616d73000c007052656c6179636861696e41737365744e6f7452656769737465726564000d00644e6f7452656c61795472616e7366657261626c654173736574000e006452656c6179636861696e417373657452656769737465726564000f0004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909010e101c73705f636f72651c626f756e64656444626f756e6465645f62747265655f7365743c426f756e6465644254726565536574080454012503045300000400050e012c42547265655365743c543e0000050e042042547265655365740404540125030004002d03000000090e101c73705f636f72651c626f756e64656444626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b01250304560131030453000004000d0e013842547265654d61703c4b2c20563e00000d0e042042547265654d617008044b0125030456013103000400110e000000110e000002150e00150e000004082503310300190e0c486272696467655f646174615f7369676e65721870616c6c6574144572726f720404540001384450616c6c6574496e697469616c697a65640000005050616c6c65744e6f74496e697469616c697a6564000100285065657245786973747300020034506565724e6f7445786973747300030030546f6f4d75636850656572730004005c4661696c6564546f5665726966795369676e617475726500050030506565724e6f74466f756e6400060040546f6f4d756368417070726f76616c7300070044417070726f76616c734e6f74466f756e64000800485369676e6174757265734e6f74466f756e640009005048617350656e64696e6750656572557064617465000a0068446f6e744861766550656e64696e675065657255706461746573000b004c4e6574776f726b4e6f74537570706f72746564000c00585369676e6174757265416c7265616479457869737473000d0004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909091d0e0c446d756c74697369675f76657269666965721870616c6c6574144572726f7204045400012c44496e76616c6964496e6974506172616d7300000030546f6f4d7563685065657273000100544e6574776f726b4e6f74496e697469616c697a656400020064496e76616c69644e756d6265724f665369676e61747572657300030040496e76616c69645369676e61747572650004005c4e6f7454727573746564506565725369676e61747572650005002850656572457869737473000600284e6f537563685065657200070040496e76616c69644e6574776f726b496400080068436f6d6d69746d656e744e6f74466f756e64496e446967657374000900384475706c69636174656450656572000a0004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909210e00000408b902950900250e0c507375627374726174655f6272696467655f6170701870616c6c6574144572726f7204045400012050546f6b656e49734e6f745265676973746572656400000038496e76616c69644e6574776f726b00010058546f6b656e416c7265616479526567697374657265640002004043616c6c456e636f64654661696c65640003045443616c6c20656e636f64696e67206661696c65642e2c57726f6e67416d6f756e7400040448416d6f756e74206d757374206265203e203040556e6b6e6f776e507265636973696f6e0005003057726f6e67417373657449640006003857726f6e674163636f756e74496400070004b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909290e101c73705f636f72651c626f756e6465642c626f756e6465645f76656328426f756e646564566563080454012d050453000004002d0e01185665633c543e00002d0e0000022d0500310e0c2c70616c6c65745f7375646f1870616c6c6574144572726f720404540001042c526571756972655375646f0000047c53656e646572206d75737420626520746865205375646f206163636f756e7404644572726f7220666f7220746865205375646f2070616c6c6574350e0c186661756365741870616c6c6574144572726f7204045400010c4441737365744e6f74537570706f727465640000045c4173736574206973206e6f7420737570706f727465642e40416d6f756e7441626f76654c696d697400010458416d6f756e742069732061626f7665206c696d69742e444e6f74456e6f7567685265736572766573000204504e6f7420656e6f7567682072657365727665732e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909390e0c2071615f746f6f6c731870616c6c6574144572726f7204045400013c3c41726974686d657469634572726f72000004584572726f7220696e2063616c63756c6174696f6e732e3c4275794c6573735468616e53656c6c000104d44275792070726963652063616e6e6f74206265206c6f776572207468616e2073656c6c207072696365206f6620616e2061737365746843616e6e6f7446696c6c556e6b6e6f776e4f72646572426f6f6b0002046d01446964206e6f742066696e6420616e206f7264657220626f6f6b207769746820676976656e20696420746f2066696c6c2e204c696b656c7920616e206572726f722077697468206f7264657220626f6f6b206372656174696f6e2e584f72646572426f6f6b416c7265616479457869737473000304644f7264657220426f6f6b20616c72656164792065786973747338496e636f727265637450726963650004085501507269636520737465702c20626573742070726963652c20616e6420776f727374207072696365206d7573742062652061206d756c7469706c65206f66206f7264657220626f6f6b2773207469636b2073697a652e8450726963652073746570206d75737420616c736f206265206e6f6e2d7a65726f2e40456d70747952616e646f6d52616e6765000504610150726f76696465642072616e676520697320696e636f72726563742c20636865636b2074686174206c6f77657220626f756e64206973206c657373206f7220657175616c207468616e20746865207570706572206f6e652e584f75744f66426f756e647352616e646f6d52616e67650006044d015468652072616e676520666f722067656e65726174696e67206f7264657220616d6f756e7473206d7573742062652077697468696e206f7264657220626f6f6b27732061636365707465642076616c7565732e34546f6f4d616e794f7264657273000704a454686520636f756e74206f662063726561746564206f726465727320697320746f6f206c617267652e34546f6f4d616e79507269636573000804a454686520636f756e74206f662070726963657320746f2066696c6c20697320746f6f206c617267652e544173736574734d7573744265446976697369626c65000904d443616e6e6f7420696e697469616c697a6520706f6f6c207769746820666f72206e6f6e2d646976697369626c65206173736574732e484173736574416c7265616479457869737473000a04d043616e6e6f74207265676973746572206e6577206173736574206265636175736520697420616c7265616479206578697374732e40556e6b6e6f776e53796e746865746963000b04a8436f756c64206e6f742066696e6420616c7265616479206578697374696e672073796e7468657469632e40556e6b6e6f776e4d6362634173736574000c04a443616e6e6f7420696e697469616c697a65204d43424320666f7220756e6b6e6f776e2061737365742e60496e636f7272656374436f6c6c61746572616c4173736574000d04a90154424344206d75737420626520696e697469616c697a6564207573696e6720646966666572656e74206669656c642f66756e6374696f6e20287365652060746263645f636f6c6c61746572616c6020616e64206054626364436f6c6c61746572616c496e70757460292e6c5265666572656e6365417373657450726963654e6f74466f756e64000e088d0143616e6e6f7420646564756365207072696365206f662073796e74686574696320626173652061737365742062656361757365207468657265206973206e6f206578697374696e6720707269636520666f72207265666572656e63652061737365742e1501596f752063616e20757365206070726963655f746f6f6c735f7365745f61737365745f7072696365602065787472696e73696320746f20736574206974732070726963652e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909093d0e083c61706f6c6c6f5f706c6174666f726d3c4c656e64696e67506f736974696f6e0438426c6f636b4e756d626572466f720110000c01386c656e64696e675f616d6f756e7418011c42616c616e63650001406c656e64696e675f696e74657265737418011c42616c616e63650001486c6173745f6c656e64696e675f626c6f636b100138426c6f636b4e756d626572466f720000410e042042547265654d617008044b010d01045601450e000400490e000000450e083c61706f6c6c6f5f706c6174666f726d44426f72726f77696e67506f736974696f6e0438426c6f636b4e756d626572466f72011000140144636f6c6c61746572616c5f616d6f756e7418011c42616c616e6365000140626f72726f77696e675f616d6f756e7418011c42616c616e6365000148626f72726f77696e675f696e74657265737418011c42616c616e63650001506c6173745f626f72726f77696e675f626c6f636b100138426c6f636b4e756d626572466f72000144626f72726f77696e675f7265776172647318011c42616c616e63650000490e0000024d0e004d0e000004080d01450e00510e083c61706f6c6c6f5f706c6174666f726d20506f6f6c496e666f000040013c746f74616c5f6c697175696469747918011c42616c616e6365000138746f74616c5f626f72726f77656418011c42616c616e6365000140746f74616c5f636f6c6c61746572616c18011c42616c616e636500014862617369635f6c656e64696e675f7261746518011c42616c616e636500014c70726f6669745f6c656e64696e675f7261746518011c42616c616e6365000138626f72726f77696e675f7261746518011c42616c616e6365000158626f72726f77696e675f726577617264735f7261746518011c42616c616e63650001346c6f616e5f746f5f76616c756518011c42616c616e63650001546c69717569646174696f6e5f7468726573686f6c6418011c42616c616e63650001606f7074696d616c5f7574696c697a6174696f6e5f7261746518011c42616c616e6365000124626173655f7261746518011c42616c616e6365000130736c6f70655f726174655f3118011c42616c616e6365000130736c6f70655f726174655f3218011c42616c616e6365000138726573657276655f666163746f7218011c42616c616e636500011c7265776172647318011c42616c616e636500012869735f72656d6f766564bc0110626f6f6c0000550e0c3c61706f6c6c6f5f706c6174666f726d1870616c6c6574144572726f7204045400018030556e617574686f72697a656400000430556e617574686f72697a6564484173736574416c72656164794c697374656400010450417373657420616c7265616479206c697374656454496e76616c6964506f6f6c506172616d65746572730002045c496e76616c696420706f6f6c20706172616d657465727340506f6f6c446f65734e6f7445786973740003044c506f6f6c20646f6573206e6f7420657869737450496e76616c69644c656e64696e67416d6f756e74000404a054686520616d6f756e742074686174206973206265696e67206c656e7420697320696e76616c69646c436f6c6c61746572616c546f6b656e446f65734e6f74457869737400050480436f6c6c61746572616c20746f6b656e20646f6573206e6f74206578697374735c4e6f4c656e64696e67416d6f756e74546f426f72726f770006046c4e6f206c656e64696e6720616d6f756e7420746f20626f72726f778053616d65436f6c6c61746572616c416e64426f72726f77696e674173736574730007049053616d6520626f72726f77696e6720616e6420636f6c6c61746572616c20617373657473704e6f4c6971756964697479466f72426f72726f77696e674173736574000804804e6f206c697175696469747920666f7220626f72726f77696e672061737365742c4e6f7468696e674c656e74000904304e6f7468696e67206c656e745c496e76616c6964436f6c6c61746572616c416d6f756e74000a0464496e76616c696420636f6c6c61746572616c20616d6f756e747443616e4e6f745472616e73666572426f72726f77696e67416d6f756e74000b048443616e206e6f74207472616e7366657220626f72726f77696e6720616d6f756e747843616e4e6f745472616e73666572436f6c6c61746572616c416d6f756e74000c048843616e206e6f74207472616e7366657220636f6c6c61746572616c20616d6f756e74404e6f52657761726473546f436c61696d000d044c4e6f207265776172647320746f20636c61696d5c556e61626c65546f5472616e7366657252657761726473000e0468556e61626c6520746f207472616e73666572207265776172647364496e73756666696369656e744c656e64696e67416d6f756e74000f046c496e73756666696369656e74206c656e64696e6720616d6f756e74544c656e64696e67416d6f756e7445786365656465640010045c4c656e64696e6720616d6f756e742065786365656465646c43616e4e6f745472616e736665724c656e64696e67416d6f756e740011047c43616e206e6f74207472616e73666572206c656e64696e6720616d6f756e743c4e6f7468696e67426f72726f776564001204404e6f7468696e6720626f72726f776564704e6f6e6578697374656e74426f72726f77696e67506f736974696f6e001304784e6f6e6578697374656e7420626f72726f77696e6720706f736974696f6e384e6f7468696e67546f5265706179001404404e6f7468696e6720746f2072657061797443616e4e6f745472616e736665724c656e64696e67496e7465726573740015048443616e206e6f74207472616e73666572206c656e64696e6720696e74657265737468556e61626c65546f5472616e73666572436f6c6c61746572616c00160474556e61626c6520746f207472616e7366657220636f6c6c61746572616c74556e61626c65546f5472616e73666572416d6f756e74546f526570617900170488556e61626c6520746f207472616e7366657220616d6f756e7420746f2072657061796c43616e4e6f7457697468647261774c656e64696e67416d6f756e740018047c43616e206e6f74207769746864726177206c656e64696e6720616d6f756e747843616e4e6f745472616e73666572426f72726f77696e67526577617264730019048843616e206e6f74207472616e7366657220626f72726f77696e6720726577617264736c43616e4e6f745472616e73666572416d6f756e74546f5265706179001a048043616e206e6f74207472616e7366657220616d6f756e7420746f2072657061798043616e4e6f745472616e73666572416d6f756e74546f446576656c6f70657273001b049443616e206e6f74207472616e7366657220616d6f756e7420746f20646576656c6f7065727348496e76616c69644c69717569646174696f6e001c0474557365722073686f756c64206e6f74206265206c69717569646174656434506f6f6c497352656d6f766564001d043c506f6f6c2069732072656d6f76656458496e76616c6964426f72726f77696e67416d6f756e74001e0460496e76616c696420626f72726f77696e6720616d6f756e7448496e76616c69644c6f616e546f56616c7565001f0454496e76616c6964206c6f616e20746f2076616c756504b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909590e083c657874656e6465645f61737365747358536f756c626f756e64546f6b656e4d657461646174610c184d6f6d656e7401281c41737365744964010d01604d6178526567756c6174656441737365747350657253425400000c013065787465726e616c5f75726c990301544f7074696f6e3c436f6e74656e74536f757263653e0001246973737565645f61742801184d6f6d656e74000140726567756c617465645f6173736574735d0e01c8426f756e64656442547265655365743c417373657449642c204d6178526567756c617465644173736574735065725342543e00005d0e101c73705f636f72651c626f756e64656444626f756e6465645f62747265655f7365743c426f756e6465644254726565536574080454010d01045300000400290b012c42547265655365743c543e0000610e0c3c657874656e6465645f6173736574731870616c6c6574144572726f7204045400013078536f756c626f756e6441737365744e6f744f7065726174696f6e61626c65000004bc534254206973206e6f74206f7065726174696f6e61626c6520627920616e79206173736574206f7065726174696f6e74536f756c626f756e6441737365744e6f745472616e7366657261626c650001045c534254206973206e6f74207472616e7366657261626c6588416c6c496e766f6c766564557365727353686f756c64486f6c6456616c69645342540002041d01416c6c20696e766f6c766564207573657273206f66206120726567756c61746564206173736574206f7065726174696f6e2073686f756c6420686f6c642076616c69642053425480526567756c6174656441737365744e6f4f776e65644279534254497373756572000304b8416c6c20416c6c6f77656420617373657473206d757374206265206f776e656420627920534254206973737565724441737365744e6f74526567756c6174656400040490416c6c20416c6c6f77656420617373657473206d75737420626520726567756c617465642c5342544e6f74466f756e6400050434534254206e6f7420666f756e642c4e6f745342544f776e65720006048843616c6c6572206973206e6f7420746865206f776e6572206f662074686520534254884e6f74416c6c6f776564546f526567756c617465536f756c626f756e6441737365740007046c4e6f7420616c6c6f77656420746f20726567756c6174652053425448496e76616c696445787465726e616c55726c00080450496e76616c69642045787465726e616c2055524c74526567756c61746564417373657473506572534254457863656564656400090484526567756c61746564204173736574732070657220534254206578636565646564644f6e6c7941737365744f776e657243616e526567756c617465000a04744f6e6c79206173736574206f776e65722063616e20726567756c617465544173736574416c7265616479526567756c61746564000b0468417373657420697320616c726561647920726567756c6174656404b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909650e102873705f72756e74696d651c67656e657269634c756e636865636b65645f65787472696e73696348556e636865636b656445787472696e736963101c4164647265737301001043616c6c01d904245369676e617475726501690e144578747261016d0e00040030000000690e082873705f72756e74696d65384d756c74695369676e617475726500010c1c45643235353139040049050148656432353531393a3a5369676e61747572650000001c53723235353139040079050148737232353531393a3a5369676e617475726500010014456364736104003103014065636473613a3a5369676e6174757265000200006d0e0000041c710e750e790e7d0e850e890e8d0e00710e10306672616d655f73797374656d28657874656e73696f6e7348636865636b5f737065635f76657273696f6e40436865636b5370656356657273696f6e04045400000000750e10306672616d655f73797374656d28657874656e73696f6e7340636865636b5f74785f76657273696f6e38436865636b547856657273696f6e04045400000000790e10306672616d655f73797374656d28657874656e73696f6e7334636865636b5f67656e6573697330436865636b47656e65736973040454000000007d0e10306672616d655f73797374656d28657874656e73696f6e733c636865636b5f6d6f7274616c69747938436865636b4d6f7274616c69747904045400000400810e010c4572610000810e102873705f72756e74696d651c67656e657269630c6572610c4572610001010420496d6d6f7274616c0000001c4d6f7274616c31040008000001001c4d6f7274616c32040008000002001c4d6f7274616c33040008000003001c4d6f7274616c34040008000004001c4d6f7274616c35040008000005001c4d6f7274616c36040008000006001c4d6f7274616c37040008000007001c4d6f7274616c38040008000008001c4d6f7274616c3904000800000900204d6f7274616c313004000800000a00204d6f7274616c313104000800000b00204d6f7274616c313204000800000c00204d6f7274616c313304000800000d00204d6f7274616c313404000800000e00204d6f7274616c313504000800000f00204d6f7274616c313604000800001000204d6f7274616c313704000800001100204d6f7274616c313804000800001200204d6f7274616c313904000800001300204d6f7274616c323004000800001400204d6f7274616c323104000800001500204d6f7274616c323204000800001600204d6f7274616c323304000800001700204d6f7274616c323404000800001800204d6f7274616c323504000800001900204d6f7274616c323604000800001a00204d6f7274616c323704000800001b00204d6f7274616c323804000800001c00204d6f7274616c323904000800001d00204d6f7274616c333004000800001e00204d6f7274616c333104000800001f00204d6f7274616c333204000800002000204d6f7274616c333304000800002100204d6f7274616c333404000800002200204d6f7274616c333504000800002300204d6f7274616c333604000800002400204d6f7274616c333704000800002500204d6f7274616c333804000800002600204d6f7274616c333904000800002700204d6f7274616c343004000800002800204d6f7274616c343104000800002900204d6f7274616c343204000800002a00204d6f7274616c343304000800002b00204d6f7274616c343404000800002c00204d6f7274616c343504000800002d00204d6f7274616c343604000800002e00204d6f7274616c343704000800002f00204d6f7274616c343804000800003000204d6f7274616c343904000800003100204d6f7274616c353004000800003200204d6f7274616c353104000800003300204d6f7274616c353204000800003400204d6f7274616c353304000800003500204d6f7274616c353404000800003600204d6f7274616c353504000800003700204d6f7274616c353604000800003800204d6f7274616c353704000800003900204d6f7274616c353804000800003a00204d6f7274616c353904000800003b00204d6f7274616c363004000800003c00204d6f7274616c363104000800003d00204d6f7274616c363204000800003e00204d6f7274616c363304000800003f00204d6f7274616c363404000800004000204d6f7274616c363504000800004100204d6f7274616c363604000800004200204d6f7274616c363704000800004300204d6f7274616c363804000800004400204d6f7274616c363904000800004500204d6f7274616c373004000800004600204d6f7274616c373104000800004700204d6f7274616c373204000800004800204d6f7274616c373304000800004900204d6f7274616c373404000800004a00204d6f7274616c373504000800004b00204d6f7274616c373604000800004c00204d6f7274616c373704000800004d00204d6f7274616c373804000800004e00204d6f7274616c373904000800004f00204d6f7274616c383004000800005000204d6f7274616c383104000800005100204d6f7274616c383204000800005200204d6f7274616c383304000800005300204d6f7274616c383404000800005400204d6f7274616c383504000800005500204d6f7274616c383604000800005600204d6f7274616c383704000800005700204d6f7274616c383804000800005800204d6f7274616c383904000800005900204d6f7274616c393004000800005a00204d6f7274616c393104000800005b00204d6f7274616c393204000800005c00204d6f7274616c393304000800005d00204d6f7274616c393404000800005e00204d6f7274616c393504000800005f00204d6f7274616c393604000800006000204d6f7274616c393704000800006100204d6f7274616c393804000800006200204d6f7274616c393904000800006300244d6f7274616c31303004000800006400244d6f7274616c31303104000800006500244d6f7274616c31303204000800006600244d6f7274616c31303304000800006700244d6f7274616c31303404000800006800244d6f7274616c31303504000800006900244d6f7274616c31303604000800006a00244d6f7274616c31303704000800006b00244d6f7274616c31303804000800006c00244d6f7274616c31303904000800006d00244d6f7274616c31313004000800006e00244d6f7274616c31313104000800006f00244d6f7274616c31313204000800007000244d6f7274616c31313304000800007100244d6f7274616c31313404000800007200244d6f7274616c31313504000800007300244d6f7274616c31313604000800007400244d6f7274616c31313704000800007500244d6f7274616c31313804000800007600244d6f7274616c31313904000800007700244d6f7274616c31323004000800007800244d6f7274616c31323104000800007900244d6f7274616c31323204000800007a00244d6f7274616c31323304000800007b00244d6f7274616c31323404000800007c00244d6f7274616c31323504000800007d00244d6f7274616c31323604000800007e00244d6f7274616c31323704000800007f00244d6f7274616c31323804000800008000244d6f7274616c31323904000800008100244d6f7274616c31333004000800008200244d6f7274616c31333104000800008300244d6f7274616c31333204000800008400244d6f7274616c31333304000800008500244d6f7274616c31333404000800008600244d6f7274616c31333504000800008700244d6f7274616c31333604000800008800244d6f7274616c31333704000800008900244d6f7274616c31333804000800008a00244d6f7274616c31333904000800008b00244d6f7274616c31343004000800008c00244d6f7274616c31343104000800008d00244d6f7274616c31343204000800008e00244d6f7274616c31343304000800008f00244d6f7274616c31343404000800009000244d6f7274616c31343504000800009100244d6f7274616c31343604000800009200244d6f7274616c31343704000800009300244d6f7274616c31343804000800009400244d6f7274616c31343904000800009500244d6f7274616c31353004000800009600244d6f7274616c31353104000800009700244d6f7274616c31353204000800009800244d6f7274616c31353304000800009900244d6f7274616c31353404000800009a00244d6f7274616c31353504000800009b00244d6f7274616c31353604000800009c00244d6f7274616c31353704000800009d00244d6f7274616c31353804000800009e00244d6f7274616c31353904000800009f00244d6f7274616c3136300400080000a000244d6f7274616c3136310400080000a100244d6f7274616c3136320400080000a200244d6f7274616c3136330400080000a300244d6f7274616c3136340400080000a400244d6f7274616c3136350400080000a500244d6f7274616c3136360400080000a600244d6f7274616c3136370400080000a700244d6f7274616c3136380400080000a800244d6f7274616c3136390400080000a900244d6f7274616c3137300400080000aa00244d6f7274616c3137310400080000ab00244d6f7274616c3137320400080000ac00244d6f7274616c3137330400080000ad00244d6f7274616c3137340400080000ae00244d6f7274616c3137350400080000af00244d6f7274616c3137360400080000b000244d6f7274616c3137370400080000b100244d6f7274616c3137380400080000b200244d6f7274616c3137390400080000b300244d6f7274616c3138300400080000b400244d6f7274616c3138310400080000b500244d6f7274616c3138320400080000b600244d6f7274616c3138330400080000b700244d6f7274616c3138340400080000b800244d6f7274616c3138350400080000b900244d6f7274616c3138360400080000ba00244d6f7274616c3138370400080000bb00244d6f7274616c3138380400080000bc00244d6f7274616c3138390400080000bd00244d6f7274616c3139300400080000be00244d6f7274616c3139310400080000bf00244d6f7274616c3139320400080000c000244d6f7274616c3139330400080000c100244d6f7274616c3139340400080000c200244d6f7274616c3139350400080000c300244d6f7274616c3139360400080000c400244d6f7274616c3139370400080000c500244d6f7274616c3139380400080000c600244d6f7274616c3139390400080000c700244d6f7274616c3230300400080000c800244d6f7274616c3230310400080000c900244d6f7274616c3230320400080000ca00244d6f7274616c3230330400080000cb00244d6f7274616c3230340400080000cc00244d6f7274616c3230350400080000cd00244d6f7274616c3230360400080000ce00244d6f7274616c3230370400080000cf00244d6f7274616c3230380400080000d000244d6f7274616c3230390400080000d100244d6f7274616c3231300400080000d200244d6f7274616c3231310400080000d300244d6f7274616c3231320400080000d400244d6f7274616c3231330400080000d500244d6f7274616c3231340400080000d600244d6f7274616c3231350400080000d700244d6f7274616c3231360400080000d800244d6f7274616c3231370400080000d900244d6f7274616c3231380400080000da00244d6f7274616c3231390400080000db00244d6f7274616c3232300400080000dc00244d6f7274616c3232310400080000dd00244d6f7274616c3232320400080000de00244d6f7274616c3232330400080000df00244d6f7274616c3232340400080000e000244d6f7274616c3232350400080000e100244d6f7274616c3232360400080000e200244d6f7274616c3232370400080000e300244d6f7274616c3232380400080000e400244d6f7274616c3232390400080000e500244d6f7274616c3233300400080000e600244d6f7274616c3233310400080000e700244d6f7274616c3233320400080000e800244d6f7274616c3233330400080000e900244d6f7274616c3233340400080000ea00244d6f7274616c3233350400080000eb00244d6f7274616c3233360400080000ec00244d6f7274616c3233370400080000ed00244d6f7274616c3233380400080000ee00244d6f7274616c3233390400080000ef00244d6f7274616c3234300400080000f000244d6f7274616c3234310400080000f100244d6f7274616c3234320400080000f200244d6f7274616c3234330400080000f300244d6f7274616c3234340400080000f400244d6f7274616c3234350400080000f500244d6f7274616c3234360400080000f600244d6f7274616c3234370400080000f700244d6f7274616c3234380400080000f800244d6f7274616c3234390400080000f900244d6f7274616c3235300400080000fa00244d6f7274616c3235310400080000fb00244d6f7274616c3235320400080000fc00244d6f7274616c3235330400080000fd00244d6f7274616c3235340400080000fe00244d6f7274616c3235350400080000ff0000850e10306672616d655f73797374656d28657874656e73696f6e732c636865636b5f6e6f6e636528436865636b4e6f6e636504045400000400e5020120543a3a496e6465780000890e10306672616d655f73797374656d28657874656e73696f6e7330636865636b5f7765696768742c436865636b576569676874040454000000008d0e0c1c786f725f66656524657874656e73696f6e604368617267655472616e73616374696f6e5061796d656e74040454000004010c746970fc013042616c616e63654f663c543e0000910e08446672616d656e6f64655f72756e74696d651c52756e74696d650000000025011853797374656d011853797374656d401c4163636f756e7401010402000c4101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e74000010040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b57656967687401001c180000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e000010040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010405102c8000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101040510300400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d6265720100101000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801002c80000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e18446967657374010034040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301004404001ca0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e001d01204e4f54453a20546865206974656d20697320756e626f756e6420616e642073686f756c64207468657265666f7265206e657665722062652072656164206f6e20636861696e2ed020497420636f756c64206f746865727769736520696e666c6174652074686520506f562073697a65206f66206120626c6f636b2e002d01204576656e747320686176652061206c6172676520696e2d6d656d6f72792073697a652e20426f7820746865206576656e747320746f206e6f7420676f206f75742d6f662d6d656d6f7279fc206a75737420696e206361736520736f6d656f6e65207374696c6c207265616473207468656d2066726f6d2077697468696e207468652072756e74696d652e284576656e74436f756e74010010100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f70696373010104022ca9030400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000ad0304000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e545570677261646564546f553332526566436f756e740100bc0400044d012054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e605570677261646564546f547269706c65526566436f756e740100bc0400085d012054727565206966207765206861766520757067726164656420736f2074686174204163636f756e74496e666f20636f6e7461696e73207468726565207479706573206f662060526566436f756e74602e2046616c736548202864656661756c7429206966206e6f742e38457865637574696f6e50686173650000a103040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01b10301501830426c6f636b57656967687473c103f901624fd75a000b00204aa9d10113ffffffffffffffff02c0cd1700010b0098d4e853011347e17a14ae47e1ba010b0098f73e5d0113ffffffffffffffbf01000002c0cd1700010b00202753c8011347e17a14ae47e1fa010b00204aa9d10113ffffffffffffffff01070088526a7413000000000000004002c0cd170000000004d020426c6f636b20262065787472696e7369637320776569676874733a20626173652076616c75657320616e64206c696d6974732e2c426c6f636b4c656e677468d1033000005400000070000000700004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e38426c6f636b48617368436f756e741010fa000000045501204d6178696d756d206e756d626572206f6620626c6f636b206e756d62657220746f20626c6f636b2068617368206d617070696e677320746f206b65657020286f6c64657374207072756e6564206669727374292e204462576569676874d9034040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e1c56657273696f6edd03a10538736f72612d73756273747261746538736f72612d73756273747261746501000000640000000100000068df6acb689907609b0400000037e397fc7c91f5e40100000040fe3ad401f8959a06000000d2bc9897eed08f1503000000f78b278be53f454c02000000ab3c0572291feb8b0100000037c8bb1350a9a2a80300000049a15104d14de433010000003c174d7764069e61020000007b08daa9d117c89b01000000d83dc51e16a813fc01000000f8e0c25200c466cc010000007714ae7197b0467401000000fa5dc115e8dd759b030000008fd89fd41faef87601000000c890b8837395d703010000005cb928f4410f41fc01000000cbca25e39f14238702000000bc9d89904f5b923f0100000049eaaf1b548a0cb00100000091d5df18b0d2cf5801000000ed99c5acb25eedf503000000eb4d485ae89fbcb5010000008e688fe9454ac970010000004ee6f974cd3d43f90200000098deaed7652aeff90100000064000000000484204765742074686520636861696e27732063757272656e742076657273696f6e2e2853533538507265666978ed0308450014a8205468652064657369676e61746564205353353820707265666978206f66207468697320636861696e2e0039012054686973207265706c6163657320746865202273733538466f726d6174222070726f7065727479206465636c6172656420696e2074686520636861696e20737065632e20526561736f6e20697331012074686174207468652072756e74696d652073686f756c64206b6e6f772061626f7574207468652070726566697820696e206f7264657220746f206d616b6520757365206f662069742061737020616e206964656e746966696572206f662074686520636861696e2e01f103001042616265011042616265402845706f6368496e64657801002820000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f7269746965730100f5030400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f740100050420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f740100050420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e65737301000480000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e6050656e64696e6745706f6368436f6e6669674368616e67650000090404000461012050656e64696e672065706f636820636f6e66696775726174696f6e206368616e676520746861742077696c6c206265206170706c696564207768656e20746865206e6578742065706f636820697320656e61637465642e384e65787452616e646f6d6e657373010004800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e3c4e657874417574686f7269746965730100f50304000460204e6578742065706f636820617574686f7269746965732e305365676d656e74496e6465780100101000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f8205765206d616b6520612074726164652d6f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101040510150404000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a656400001d0404000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e4c417574686f7256726652616e646f6d6e6573730100c10104001015012054686973206669656c642073686f756c6420616c7761797320626520706f70756c6174656420647572696e6720626c6f636b2070726f63657373696e6720756e6c6573731901207365636f6e6461727920706c61696e20736c6f74732061726520656e61626c65642028776869636820646f6e277420636f6e7461696e206120565246206f7574707574292e0049012049742069732073657420696e20606f6e5f66696e616c697a65602c206265666f72652069742077696c6c20636f6e7461696e207468652076616c75652066726f6d20746865206c61737420626c6f636b2e2845706f636853746172740100bd01200000000000000000145d012054686520626c6f636b206e756d62657273207768656e20746865206c61737420616e642063757272656e742065706f6368206861766520737461727465642c20726573706563746976656c7920604e2d316020616e641420604e602e4901204e4f54453a20576520747261636b207468697320697320696e206f7264657220746f20616e6e6f746174652074686520626c6f636b206e756d626572207768656e206120676976656e20706f6f6c206f66590120656e74726f7079207761732066697865642028692e652e20697420776173206b6e6f776e20746f20636861696e206f6273657276657273292e2053696e63652065706f6368732061726520646566696e656420696e590120736c6f74732c207768696368206d617920626520736b69707065642c2074686520626c6f636b206e756d62657273206d6179206e6f74206c696e6520757020776974682074686520736c6f74206e756d626572732e204c6174656e657373010010100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e2c45706f6368436f6e6669670000350404000861012054686520636f6e66696775726174696f6e20666f72207468652063757272656e742065706f63682e2053686f756c64206e6576657220626520604e6f6e656020617320697420697320696e697469616c697a656420696e242067656e657369732e3c4e65787445706f6368436f6e666967000035040400082d012054686520636f6e66696775726174696f6e20666f7220746865206e6578742065706f63682c20604e6f6e65602069662074686520636f6e6669672077696c6c206e6f74206368616e6765e82028796f752063616e2066616c6c6261636b20746f206045706f6368436f6e6669676020696e737465616420696e20746861742063617365292e013904000c3445706f63684475726174696f6e282058020000000000000cec2054686520616d6f756e74206f662074696d652c20696e20736c6f74732c207468617420656163682065706f63682073686f756c64206c6173742e1901204e4f54453a2043757272656e746c79206974206973206e6f7420706f737369626c6520746f206368616e6765207468652065706f6368206475726174696f6e20616674657221012074686520636861696e2068617320737461727465642e20417474656d7074696e6720746f20646f20736f2077696c6c20627269636b20626c6f636b2070726f64756374696f6e2e444578706563746564426c6f636b54696d652820701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e384d6178417574686f7269746965731010a08601000488204d6178206e756d626572206f6620617574686f72697469657320616c6c6f776564014d040e2454696d657374616d70012454696d657374616d70080c4e6f7701002820000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e244469645570646174650100bc040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f0151040004344d696e696d756d506572696f642820b80b000000000000104d0120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a5d0120706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c5d012067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c206265a020646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e00012042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010018400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e40496e61637469766549737375616e636501001840000000000000000000000000000000000409012054686520746f74616c20756e697473206f66206f75747374616e64696e672064656163746976617465642062616c616e636520696e207468652073797374656d2e1c4163636f756e74010104020014010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600901205468652042616c616e6365732070616c6c6574206578616d706c65206f662073746f72696e67207468652062616c616e6365206f6620616e206163636f756e742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b19022020202074797065204163636f756e7453746f7265203d2053746f726167654d61705368696d3c53656c663a3a4163636f756e743c52756e74696d653e2c206672616d655f73797374656d3a3a50726f76696465723c52756e74696d653e2c204163636f756e7449642c2053656c663a3a4163636f756e74446174613c42616c616e63653e3e0c20207d102060606000150120596f752063616e20616c736f2073746f7265207468652062616c616e6365206f6620616e206163636f756e7420696e20746865206053797374656d602070616c6c65742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b7420202074797065204163636f756e7453746f7265203d2053797374656d0c20207d102060606000510120427574207468697320636f6d657320776974682074726164656f6666732c2073746f72696e67206163636f756e742062616c616e63657320696e207468652073797374656d2070616c6c65742073746f7265736d0120606672616d655f73797374656d60206461746120616c6f6e677369646520746865206163636f756e74206461746120636f6e747261727920746f2073746f72696e67206163636f756e742062616c616e63657320696e207468652901206042616c616e636573602070616c6c65742c20776869636820757365732061206053746f726167654d61706020746f2073746f72652062616c616e6365732064617461206f6e6c792e4101204e4f54453a2054686973206973206f6e6c79207573656420696e207468652063617365207468617420746869732070616c6c6574206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010402005504040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e20526573657276657301010402006504040004a4204e616d6564207265736572766573206f6e20736f6d65206163636f756e742062616c616e6365732e0001740c484578697374656e7469616c4465706f73697418400000000000000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e204d61784c6f636b7310103200000008f420546865206d6178696d756d206e756d626572206f66206c6f636b7320746861742073686f756c64206578697374206f6e20616e206163636f756e742edc204e6f74207374726963746c7920656e666f726365642c20627574207573656420666f722077656967687420657374696d6174696f6e2e2c4d61785265736572766573101000000000040d0120546865206d6178696d756d206e756d626572206f66206e616d656420726573657276657320746861742063616e206578697374206f6e20616e206163636f756e742e017104026052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100750404000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e0000000004485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c69657201008c40000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e0100790404000000017c04604f7065726174696f6e616c4665654d756c7469706c696572080405545901204120666565206d756c6974706c69657220666f7220604f7065726174696f6e616c602065787472696e7369637320746f20636f6d7075746520227669727475616c207469702220746f20626f6f73742074686569722c20607072696f7269747960004d0120546869732076616c7565206973206d756c7469706c656420627920746865206066696e616c5f6665656020746f206f627461696e206120227669727475616c20746970222074686174206973206c61746572f420616464656420746f20612074697020636f6d706f6e656e7420696e20726567756c617220607072696f72697479602063616c63756c6174696f6e732e4d01204974206d65616e732074686174206120604e6f726d616c60207472616e73616374696f6e2063616e2066726f6e742d72756e20612073696d696c61726c792d73697a656420604f7065726174696f6e616c6041012065787472696e736963202877697468206e6f20746970292c20627920696e636c7564696e672061207469702076616c75652067726561746572207468616e20746865207669727475616c207469702e003c20606060727573742c69676e6f726540202f2f20466f7220604e6f726d616c608c206c6574207072696f72697479203d207072696f726974795f63616c6328746970293b0054202f2f20466f7220604f7065726174696f6e616c601101206c6574207669727475616c5f746970203d2028696e636c7573696f6e5f666565202b2074697029202a204f7065726174696f6e616c4665654d756c7469706c6965723bc4206c6574207072696f72697479203d207072696f726974795f63616c6328746970202b207669727475616c5f746970293b1020606060005101204e6f746520746861742073696e636520776520757365206066696e616c5f6665656020746865206d756c7469706c696572206170706c69657320616c736f20746f2074686520726567756c61722060746970605d012073656e74207769746820746865207472616e73616374696f6e2e20536f2c206e6f74206f6e6c7920646f657320746865207472616e73616374696f6e206765742061207072696f726974792062756d702062617365646101206f6e207468652060696e636c7573696f6e5f666565602c2062757420776520616c736f20616d706c6966792074686520696d70616374206f662074697073206170706c69656420746f20604f7065726174696f6e616c6038207472616e73616374696f6e732e00052c5065726d697373696f6e73012c5065726d697373696f6e7308184f776e65727301010801017d0451020400002c5065726d697373696f6e73010108010189048d040400000191040180000195040624526566657272616c730124526566657272616c730c2452656665727265727300010402000004000040526566657272657242616c616e63657300010402001804000024526566657272616c73010104020051020400000199040000019d04071c52657761726473011c52657761726473342c526573657276657341636301004d010404002456616c4f776e657273010104064d03a1048000000000000000000000000000000000000000000000000000000000000000000475012041206d617020457468416464726573736573202d3e20526577617264496e666f2c207468617420697320636c61696d61626c6520616e642072656d61696e696e672076657374656420616d6f756e74732070657220616464726573733c50737761704661726d4f776e657273010104064d031840000000000000000000000000000000000040507377617057616966754f776e657273010104064d03184000000000000000000000000000000000003c556d694e6674526563656976657273010104064d03a5040400046820554d49204e4654207265636569766572732073746f726167656456616c4275726e656453696e63654c61737456657374696e67010018400000000000000000000000000000000004a020416d6f756e74206f662056414c206275726e65642073696e6365206c6173742076657374696e674c43757272656e74436c61696d61626c6556616c010018400000000000000000000000000000000004710120416d6f756e74206f662056414c2063757272656e746c79206265696e6720766573746564202861676772656761746564206f766572207468652070726576696f757320706572696f64206f662031342c34303020626c6f636b7329304574684164647265737365730101040610a904040004750120416c6c20616464726573736573206172652073706c697420696e20626174636865732c2060416464726573734261746368657360206d617073206261746368206e756d62657220746f206120736574206f66206164647265737365733c546f74616c56616c52657761726473010018400000000000000000000000000000000004310120546f74616c20616d6f756e74206f662056414c20726577617264732065697468657220636c61696d61626c65206e6f77206f7220736f6d652074696d6520696e207468652066757475726544546f74616c436c61696d61626c6556616c010018400000000000000000000000000000000004290120546f74616c20616d6f756e74206f662056414c20746861742063616e20626520636c61696d65642062792075736572732061742063757272656e7420706f696e7420696e2074696d65404d6967726174696f6e50656e64696e670100bc0400042101204120666c616720696e6469636174696e6720776865746865722056414c20726577617264732064617461206d6967726174696f6e20686173206265656e2066696e616c697a65641c556d694e6674730100ad040400048c205468652073746f72616765206f6620617661696c61626c6520554d49204e4654732e34556d694e6674436c61696d6564010104064d03bc040004e02053746f7265732077686574686572206164647265737320616c726561647920636c61696d656420554d49204e465420726577617264732e01b10401840001b5040818586f724665650118586f724665650c20586f72546f56616c01001840000000000000000000000000000000000445012054686520616d6f756e74206f6620584f5220746f2062652072656d696e74656420616e642065786368616e67656420666f722056414c2061742074686520656e64206f66207468652073657373696f6e24586f72546f56586f7201001840000000000000000000000000000000000449012054686520616d6f756e74206f6620584f5220746f2062652072656d696e74656420616e642065786368616e67656420666f722056584f522061742074686520656e64206f66207468652073657373696f6e284d756c7469706c69657201008c40000000c7c147af100e7f0000000000000001b90401880001bd0409384272696467654d756c746973696701384272696467654d756c746973696710204163636f756e74730001040500c10404000464204d756c74697369676e6174757265206163636f756e74732e244d756c7469736967730001080502c504c904040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e1443616c6c730001040604cd040400003c4469737061746368656443616c6c730101080605d104a8000001d50401900001150a0a1c5574696c6974790001dd0401a0044c626174636865645f63616c6c735f6c696d69741010aa2a000004a820546865206c696d6974206f6e20746865206e756d626572206f6620626174636865642063616c6c732e01190a0b28417574686f72736869700128417574686f72736869700418417574686f720000000400046420417574686f72206f662063757272656e7420626c6f636b2e00000000101c5374616b696e67011c5374616b696e679c4054696d6553696e636547656e6573697301001d0a30000000000000000000000000040501205468652074696d65207370616e2073696e63652067656e657369732c20696e6372656d656e7465642061742074686520656e64206f662065616368206572612e3856616c696461746f72436f756e740100101000000000049c2054686520696465616c206e756d626572206f66206163746976652076616c696461746f72732e544d696e696d756d56616c696461746f72436f756e740100101000000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100510204000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010405000004000c0101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e404d696e4e6f6d696e61746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f662061206e6f6d696e61746f722e404d696e56616c696461746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f6620612076616c696461746f722e484d696e696d756d4163746976655374616b65010018400000000000000000000000000000000004110120546865206d696e696d756d20616374697665206e6f6d696e61746f72207374616b65206f6620746865206c617374207375636365737366756c20656c656374696f6e2e344d696e436f6d6d697373696f6e0100b010000000000ce820546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e20746861742076616c696461746f72732063616e207365742e00802049662073657420746f206030602c206e6f206c696d6974206578697374732e184c65646765720001040200210a0400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e1450617965650101040500110504010ce42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e2856616c696461746f72730101040500b40800000c450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e50436f756e746572466f7256616c696461746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d617856616c696461746f7273436f756e7400001004000c310120546865206d6178696d756d2076616c696461746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e284e6f6d696e61746f72730001040500350a040048750120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f207468656972206e6f6d696e6174696f6e20707265666572656e6365732c206e616d656c79207468652076616c696461746f72732074686174582074686579207769736820746f20737570706f72742e003901204e6f7465207468617420746865206b657973206f6620746869732073746f72616765206d6170206d69676874206265636f6d65206e6f6e2d6465636f6461626c6520696e2063617365207468656d01205b60436f6e6669673a3a4d61784e6f6d696e6174696f6e73605d20636f6e66696775726174696f6e206973206465637265617365642e20496e2074686973207261726520636173652c207468657365206e6f6d696e61746f7273650120617265207374696c6c206578697374656e7420696e2073746f726167652c207468656972206b657920697320636f727265637420616e64207265747269657661626c652028692e652e2060636f6e7461696e735f6b657960710120696e6469636174657320746861742074686579206578697374292c206275742074686569722076616c75652063616e6e6f74206265206465636f6465642e205468657265666f72652c20746865206e6f6e2d6465636f6461626c656d01206e6f6d696e61746f72732077696c6c206566666563746976656c79206e6f742d65786973742c20756e74696c20746865792072652d7375626d697420746865697220707265666572656e6365732073756368207468617420697401012069732077697468696e2074686520626f756e6473206f6620746865206e65776c79207365742060436f6e6669673a3a4d61784e6f6d696e6174696f6e73602e006101205468697320696d706c696573207468617420603a3a697465725f6b65797328292e636f756e7428296020616e6420603a3a6974657228292e636f756e74282960206d696768742072657475726e20646966666572656e746d012076616c75657320666f722074686973206d61702e204d6f72656f7665722c20746865206d61696e20603a3a636f756e7428296020697320616c69676e656420776974682074686520666f726d65722c206e616d656c79207468656c206e756d626572206f66206b65797320746861742065786973742e006d01204c6173746c792c20696620616e79206f6620746865206e6f6d696e61746f7273206265636f6d65206e6f6e2d6465636f6461626c652c20746865792063616e206265206368696c6c656420696d6d6564696174656c7920766961b8205b6043616c6c3a3a6368696c6c5f6f74686572605d20646973706174636861626c6520627920616e796f6e652e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e50436f756e746572466f724e6f6d696e61746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d61784e6f6d696e61746f7273436f756e7400001004000c310120546865206d6178696d756d206e6f6d696e61746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e2843757272656e744572610000100400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e2441637469766545726100003d0a040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e0059012054686520616374697665206572612069732074686520657261206265696e672063757272656e746c792072657761726465642e2056616c696461746f7220736574206f66207468697320657261206d757374206265ac20657175616c20746f205b6053657373696f6e496e746572666163653a3a76616c696461746f7273605d2e5445726173537461727453657373696f6e496e6465780001040510100400103101205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e006101204e6f74653a205468697320747261636b7320746865207374617274696e672073657373696f6e2028692e652e2073657373696f6e20696e646578207768656e20657261207374617274206265696e672061637469766529f020666f7220746865206572617320696e20605b43757272656e74457261202d20484953544f52595f44455054482c2043757272656e744572615d602e2c457261735374616b6572730101080505410af80c0000001878204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e48457261735374616b657273436c69707065640101080505410af80c0000002c9820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865dc2060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e484572617356616c696461746f7250726566730101080505410ab40800001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4c4572617356616c696461746f7252657761726400010405101804000c09012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e74730101040510450a14000000000008ac205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3045726156616c4275726e6564010018400000000000000000000000000000000004a82054686520616d6f756e74206f662056414c206275726e656420647572696e672074686973206572612e3845726173546f74616c5374616b65010104051018400000000000000000000000000000000008ec2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f7263654572610100c004000454204d6f6465206f662065726120666f7263696e672e4c536c6173685265776172644672616374696f6e0100b010000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401001840000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c61736865730101040510550a040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100a90304001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e4572610001080505410a5d0a040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e4572610001080505410a18040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e730001040500610a0400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c61736801010405510a650a800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e5443757272656e74506c616e6e656453657373696f6e01001010000000000ce820546865206c61737420706c616e6e65642073657373696f6e207363686564756c6564206279207468652073657373696f6e2070616c6c65742e0071012054686973206973206261736963616c6c7920696e2073796e632077697468207468652063616c6c20746f205b6070616c6c65745f73657373696f6e3a3a53657373696f6e4d616e616765723a3a6e65775f73657373696f6e605d2e4c4f6666656e64696e6756616c696461746f72730100690a040024690120496e6469636573206f662076616c696461746f727320746861742068617665206f6666656e64656420696e20746865206163746976652065726120616e6420776865746865722074686579206172652063757272656e746c79282064697361626c65642e00690120546869732076616c75652073686f756c642062652061207375706572736574206f662064697361626c65642076616c696461746f72732073696e6365206e6f7420616c6c206f6666656e636573206c65616420746f2074686571012076616c696461746f72206265696e672064697361626c65642028696620746865726520776173206e6f20736c617368292e2054686973206973206e656564656420746f20747261636b207468652070657263656e74616765206f6649012076616c696461746f727320746861742068617665206f6666656e64656420696e207468652063757272656e74206572612c20656e737572696e672061206e65772065726120697320666f72636564206966750120604f6666656e64696e6756616c696461746f72735468726573686f6c646020697320726561636865642e205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e6471012077686574686572206120676976656e2076616c696461746f72206861732070726576696f75736c79206f6666656e646564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e38207468652065726120656e64732e384368696c6c5468726573686f6c640000990204000c510120546865207468726573686f6c6420666f72207768656e2075736572732063616e2073746172742063616c6c696e6720606368696c6c5f6f746865726020666f72206f746865722076616c696461746f7273202f5901206e6f6d696e61746f72732e20546865207468726573686f6c6420697320636f6d706172656420746f207468652061637475616c206e756d626572206f662076616c696461746f7273202f206e6f6d696e61746f72732901202860436f756e74466f722a602920696e207468652073797374656d20636f6d706172656420746f2074686520636f6e66696775726564206d61782028604d61782a436f756e7460292e010d0501ac1c384d61784e6f6d696e6174696f6e7310101800000004b4204d6178696d756d206e756d626572206f66206e6f6d696e6174696f6e7320706572206e6f6d696e61746f722e30486973746f72794465707468101054000000508c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00e820466f6c6c6f77696e6720696e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d090120486973746f727944657074682c2063757272656e745f6572615d603a2060457261735374616b657273602c2060457261735374616b657273436c6970706564602c050120604572617356616c696461746f725072656673602c20604572617356616c696461746f72526577617264602c206045726173526577617264506f696e7473602cac206045726173546f74616c5374616b65602c206045726173537461727453657373696f6e496e646578602c8420605374616b696e674c65646765722e636c61696d65645f72657761726473602e00e4204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e2ef820492e652e2061637469766520657261206d75737420616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203ec42063757272656e745f657261202d20686973746f72795f646570746860206d7573742062652067756172616e746565642e001101204966206d6967726174696e6720616e206578697374696e672070616c6c65742066726f6d2073746f726167652076616c756520746f20636f6e6669672076616c75652cec20746869732073686f756c642062652073657420746f2073616d652076616c7565206f72206772656174657220617320696e2073746f726167652e001501204e6f74653a2060486973746f727944657074686020697320757365642061732074686520757070657220626f756e6420666f72207468652060426f756e646564566563601101206974656d20605374616b696e674c65646765722e636c61696d65645f72657761726473602e2053657474696e6720746869732076616c7565206c6f776572207468616ed820746865206578697374696e672076616c75652063616e206c65616420746f20696e636f6e73697374656e6369657320696e20746865150120605374616b696e674c65646765726020616e642077696c6c206e65656420746f2062652068616e646c65642070726f7065726c7920696e2061206d6967726174696f6e2ef020546865207465737420607265647563696e675f686973746f72795f64657074685f616272757074602073686f77732074686973206566666563742e3853657373696f6e735065724572611010060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e10100100000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e101000000000100101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e000d0120546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2053657420746f203020696620736c617368657315012073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f7220696e74657276656e74696f6e2e804d61784e6f6d696e61746f72526577617264656450657256616c696461746f7210100001000010f820546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e00510120466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e390120636c61696d207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e484d6178556e6c6f636b696e674368756e6b7310102000000028050120546865206d6178696d756d206e756d626572206f662060756e6c6f636b696e6760206368756e6b732061205b605374616b696e674c6564676572605d2063616e090120686176652e204566666563746976656c792064657465726d696e657320686f77206d616e7920756e6971756520657261732061207374616b6572206d61792062653820756e626f6e64696e6720696e2e00f8204e6f74653a20604d6178556e6c6f636b696e674368756e6b736020697320757365642061732074686520757070657220626f756e6420666f722074686501012060426f756e64656456656360206974656d20605374616b696e674c65646765722e756e6c6f636b696e67602e2053657474696e6720746869732076616c75650501206c6f776572207468616e20746865206578697374696e672076616c75652063616e206c65616420746f20696e636f6e73697374656e6369657320696e20746865090120605374616b696e674c65646765726020616e642077696c6c206e65656420746f2062652068616e646c65642070726f7065726c7920696e20612072756e74696d650501206d6967726174696f6e2e20546865207465737420607265647563696e675f6d61785f756e6c6f636b696e675f6368756e6b735f616272757074602073686f7773342074686973206566666563742e01710a11204f6666656e63657301204f6666656e6365730c1c5265706f727473000104052c750a040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e6465780101080505790aa5030400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e64657801010405c830040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e0001c400002528486973746f726963616c00000000000d1c53657373696f6e011c53657373696f6e1c2856616c696461746f7273010051020400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e646578010010100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e6765640100bc040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b65797301007d0a0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f727301008d040400148020496e6469636573206f662064697361626c65642076616c696461746f72732e003d01205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e642077686574686572206120676976656e2076616c696461746f722069733d012064697361626c6564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e73642061206e657720736574206f66206964656e7469746965732e204e6578744b657973000104050029050400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010405850a00040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e01250501cc00018d0a0c1c4772616e647061011c4772616e647061181453746174650100910a04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e67650000950a040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000010040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c65640000bd010400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e745365744964010028200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e00010405281004002859012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e0045012054686973206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e2070726f6f66732e20416e2065717569766f636174696f6e2070726f6f66206d7573744d0120636f6e7461696e732061206b65792d6f776e6572736869702070726f6f6620666f72206120676976656e2073657373696f6e2c207468657265666f7265207765206e65656420612077617920746f20746965450120746f6765746865722073657373696f6e7320616e64204752414e44504120736574206964732c20692e652e207765206e65656420746f2076616c6964617465207468617420612076616c696461746f7241012077617320746865206f776e6572206f66206120676976656e206b6579206f6e206120676976656e2073657373696f6e2c20616e642077686174207468652061637469766520736574204944207761735420647572696e6720746861742073657373696f6e2e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e01310501d008384d6178417574686f7269746965731010a0860100045c204d617820417574686f72697469657320696e20757365584d6178536574496453657373696f6e456e74726965732820060000000000000018390120546865206d6178696d756d206e756d626572206f6620656e747269657320746f206b65657020696e207468652073657420696420746f2073657373696f6e20696e646578206d617070696e672e0031012053696e6365207468652060536574496453657373696f6e60206d6170206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e73207468697329012076616c75652073686f756c642072656c61746520746f2074686520626f6e64696e67206475726174696f6e206f66207768617465766572207374616b696e672073797374656d2069733501206265696e6720757365642028696620616e79292e2049662065717569766f636174696f6e2068616e646c696e67206973206e6f7420656e61626c6564207468656e20746869732076616c7565342063616e206265207a65726f2e019d0a0f20496d4f6e6c696e650120496d4f6e6c696e651038486561727462656174416674657201001010000000002c1d012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e207468652063757272656e74242073657373696f6e2e0025012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c642066616c6c350120726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e20546865206964656120697320746f206669727374207761697420666f721901207468652076616c696461746f727320746f2070726f64756365206120626c6f636b20696e207468652063757272656e742073657373696f6e2c20736f207468617420746865a820686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e00390120546869732076616c75652077696c6c206f6e6c79206265207573656420617320612066616c6c6261636b206966207765206661696c20746f2067657420612070726f7065722073657373696f6e2d012070726f677265737320657374696d6174652066726f6d20604e65787453657373696f6e526f746174696f6e602c2061732074686f736520657374696d617465732073686f756c642062650101206d6f7265206163637572617465207468656e207468652076616c75652077652063616c63756c61746520666f7220604865617274626561744166746572602e104b6579730100a10a040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730001080505bd01a90a0400083d0120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206053657373696f6e496e6465786020616e64206041757468496e6465786020746fb02060577261707065724f70617175653c426f756e6465644f70617175654e6574776f726b53746174653e602e38417574686f726564426c6f636b730101080505410a10100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206056616c696461746f7249643c543e6020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e015d0501e40440556e7369676e65645072696f726974792820ffffffffffffffff10f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e0015012054686973206973206578706f73656420736f20746861742069742063616e2062652074756e656420666f7220706172746963756c61722072756e74696d652c207768656eb4206d756c7469706c652070616c6c6574732073656e6420756e7369676e6564207472616e73616374696f6e732e01bd0a2418546f6b656e730118546f6b656e731034546f74616c49737375616e6365010104050d0118400000000000000000000000000000000004902054686520746f74616c2069737375616e6365206f66206120746f6b656e20747970652e144c6f636b730101080205c10ac50a040008d820416e79206c6971756964697479206c6f636b73206f66206120746f6b656e207479706520756e64657220616e206163636f756e742e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e204163636f756e74730101080205c10ad10ac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018b8205468652062616c616e6365206f66206120746f6b656e207479706520756e64657220616e206163636f756e742e00fc204e4f54453a2049662074686520746f74616c2069732065766572207a65726f2c206465637265617365206163636f756e7420726566206163636f756e742e001901204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f7265282062616c616e6365732e2052657365727665730101080205c10ad50a040004a4204e616d6564207265736572766573206f6e20736f6d65206163636f756e742062616c616e6365732e0001090108204d61784c6f636b73101001000000002c4d61785265736572766573101000000000040d0120546865206d6178696d756d206e756d626572206f66206e616d656420726573657276657320746861742063616e206578697374206f6e20616e206163636f756e742e01e10a122843757272656e63696573000000044c4765744e617469766543757272656e637949640d018002000000000000000000000000000000000000000000000000000000000000000001e50a132c54726164696e6750616972012c54726164696e67506169720838456e61626c6564536f75726365730001080502e90aed0a040000584c6f636b65644c6971756964697479536f75726365730100a105040000017d050119010001f10a14184173736574730118417373657473102c41737365744f776e657273000104050d010004000474204173736574204964202d3e204f776e6572204163636f756e74204964284173736574496e666f73010104050d01f50a381054455354105465737400000000044101204173736574204964202d3e202853796d626f6c2c204e616d652c20507265636973696f6e2c204973204d696e7461626c652c20436f6e74656e7420536f757263652c204465736372697074696f6e29304173736574496e666f735632010104050d01f90a3c1054455354105465737400000000000458204173736574204964202d3e204173736574496e666f4841737365745265636f726441737365744964000104050d01010b0400046c204173736574204964202d3e2041737365745265636f72643c543e0181050121010001110b15284445584d616e6167657201284445584d616e616765720420444558496e666f730001040510150b04000000000001190b167c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c017c4d756c7469636f6c6c61746572616c426f6e64696e674375727665506f6f6c4c2c526573657276657341636301004d01040404cc20546563686e6963616c206163636f756e74207573656420746f2073746f726520636f6c6c61746572616c20746f6b656e732e544672656552657365727665734163636f756e7449640000000400004c50656e64696e674672656552657365727665730101040210650104000030496e697469616c507269636501003d01400000a88dec78845e220000000000000004190120427579207072696365207374617274696e6720636f6e7374616e742e2054686973206973207468652070726963652075736572732070617920666f72206e657720584f522e3c50726963654368616e67655374657001003d01400000443945309a7a4800000000000000049020436f656666696369656e747320696e206275792070726963652066756e6374696f6e2e3c50726963654368616e67655261746501003d0140000064a7b3b6e00d0000000000000000005053656c6c5072696365436f656666696369656e7401003d0140000050ecc22b1a0b000000000000000004a1012053657473207468652073656c6c2066756e6374696f6e2061732061206672616374696f6e206f6620746865206275792066756e6374696f6e2c20736f207468657265206973206d617267696e206265747765656e207468652074776f2066756e6374696f6e732e6c416c7761797344697374726962757465436f656666696369656e7401003d0140000014bbf08ac6020000000000000000087d0120436f656666696369656e742077686963682064657465726d696e657320746865206672616374696f6e206f6620696e70757420636f6c6c61746572616c20746f6b656e20746f2062652065786368616e67656420746f20584f5220616e64850120626520646973747269627574656420746f20707265646566696e6564206163636f756e74732e2052656c6576616e7420666f7220746865204275792066756e6374696f6e20287768656e206120757365722062757973206e657720584f52292e1c4261736546656501003d0140008053ee7ba80a00000000000000000004350120426173652066656520696e20584f52207768696368206973206465647563746564206f6e20616c6c207472616465732c2063757272656e746c792069742773206275726e65643a20302e332564446973747269627574696f6e4163636f756e7473456e74727901001d0b6901010400000000000000000000000000000000010400000000000000000000000000000000010400000000000000000000000000000000010400000000000000000000000000000000010400000000000000000000000000000000043901204163636f756e74732074686174207265636569766520323025206275792f73656c6c206d617267696e206163636f7264696e6720746f20707265646566696e65642070726f706f7274696f6e7338456e61626c6564546172676574730100290b040004010120436f6c6c61746572616c2041737365747320616c6c6f77656420746f20626520736f6c642062792074686520746f6b656e20626f6e64696e67206375727665405265666572656e63654173736574496401000d018002000000000000000000000000000000000000000000000000000000000000000411012041737365742074686174206973207573656420746f20636f6d7061726520636f6c6c61746572616c206173736574732062792076616c75652c20652e672e2c204441491c5265776172647301010402002d0b80000000000000000000000000000000000000000000000000000000000000000004990120526567697374727920746f2073746f726520696e666f726d6174696f6e2061626f75742072657761726473206f776e656420627920757365727320696e2050535741502e2028636c61696d5f6c696d69742c20617661696c61626c655f726577617264732930546f74616c52657761726473010018400000000000000000000000000000000004a020546f74616c20616d6f756e74206f66205053574150206f776e6564206279206163636f756e747364496e63656e7469766973656443757272656e636965734e756d010010100000000004e501204e756d626572206f6620726573657276652063757272656e636965732073656c6c696e6720776869636820757365722077696c6c2067657420726577617264732c206e616d656c7920616c6c207265676973746572656420636f6c6c61746572616c732065786365707420505357415020616e642056414c4c496e63656e74697665734163636f756e744964000000040004dc204163636f756e742077686963682073746f7265732061637475616c20505357415020696e74656e64656420666f72207265776172647388417373657473576974684f7074696f6e616c5265776172644d756c7469706c696572000104050d013d01040004150120526577617264206d756c7469706c6965727320666f72207370656369616c206173736574732e204173736574204964203d3e20526577617264204d756c7469706c69657264496e697469616c507377617052657761726473537570706c7901001840000000449840898f97f313080000000008d90120416d6f756e74206f6620505357415020696e697469616c6c792073746f72656420696e206163636f756e742064656469636174656420666f722054424320726577617264732e2041637475616c206163636f756e742062616c616e63652077696c6c206465706c657465206f7665722074696d652c9820686f7765766572207468697320636f6e7374616e74206973206e6f74206d6f64696669656448436f6c6c61746572616c5265736572766573010104050d01184000000000000000000000000000000000042d012043757272656e742072657365727665732062616c616e636520666f7220636f6c6c61746572616c20746f6b656e732c207573656420666f7220636c69656e742075736162696c6974792e018d0501350104484972726564756369626c65526573657276659902040104c42050657263656e74206f662072657365727665207768696368206973206e6f7420696e766f6c76656420696e207377617001310b1724546563686e6963616c0124546563686e6963616c0430546563684163636f756e747300010402004d010400047d01205265676973746572656420746563686e6963616c206163636f756e74206964656e746966696572732e204d61702066726f6d207265707220604163636f756e7449646020696e746f20707572652060546563684163636f756e744964602e0191050145010001350b181c506f6f6c58594b011c506f6f6c58594b142052657365727665730101080202390b2d0b80000000000000000000000000000000000000000000000000000000000000000018bc2055706461746564206166746572206c617374206c6971756964697479206368616e6765206f7065726174696f6e2e3101205b426173652041737365742049642028584f5229202d3e20546172676574204173736574204964203d3e2028426173652042616c616e63652c205461726765742042616c616e6365295d2e5d0120546869732073746f72616765207265636f726473206973206e6f74207573656420617320736f75726365206f6620696e666f726d6174696f6e2c20627574207573656420617320717569636b20636163686520666f72250120696e666f726d6174696f6e207468617420636f6d65732066726f6d2062616c616e63657320666f72206173736574732066726f6d20746563686e6963616c206163636f756e74732e750120466f72206578616d706c652c20636f6d6d756e69636174696f6e207769746820746563686e6963616c206163636f756e747320616e642074686569722073746f72616765206973206e6f74206e65656465642c20616e642074686973ac207061697220746f2062616c616e63652063616368652063616e206265207573656420717569636b6c792e34506f6f6c50726f76696465727300010806063d0b18040008a0204c69717569646974792070726f766964657273206f6620706172746963756c617220706f6f6c2e050120506f6f6c206163636f756e74203d3e204c69717569646974792070726f7669646572206163636f756e74203d3e20506f6f6c20746f6b656e2062616c616e6365304163636f756e74506f6f6c730101080602c10a290b040008c020536574206f6620706f6f6c7320696e207768696368206163636f756e7473206861766520736f6d652073686172652e4101204c69717569646974792070726f7669646572206163636f756e74203d3e20546172676574204173736574206f6620706169722028617373756d696e67206261736520617373657420697320584f522938546f74616c49737375616e6365730001040600180400088c20546f74616c2069737375616e6365206f6620706172746963756c617220706f6f6c2e7c20506f6f6c206163636f756e74203d3e20546f74616c2069737375616e63652850726f706572746965730001080202390b3d0b04000491012050726f70657274696573206f6620706172746963756c617220706f6f6c2e2042617365204173736574203d3e20546172676574204173736574203d3e20285265736572766573204163636f756e742049642c2046656573204163636f756e742049642901950501590108484972726564756369626c65526573657276659902040104c42050657263656e74206f662072657365727665207768696368206973206e6f7420696e766f6c76656420696e207377617040506f6f6c41646a757374506572696f6410105802000004d820486f77206f6674656e20746f20636865636b20616e642061646a757374204368616d656c656f6e20706f6f6c2069737375616e636501410b19384c697175696469747950726f787900019905015d010464496e7465726e616c536c697070616765546f6c6572616e6365450b10e8030000049c2050657263656e74206f6620696e7465726e616c20736c69707061676520746f6c6572616e636501490b1a1c436f756e63696c011c436f756e63696c182450726f706f73616c7301004d0b040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f66000104062cd904040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e67000104062c510b040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d62657273010051020400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000000040004650120546865207072696d65206d656d62657220746861742068656c70732064657465726d696e65207468652064656661756c7420766f7465206265686176696f7220696e2063617365206f6620616273656e746174696f6e732e01b905018d010001550b1b48546563686e6963616c436f6d6d69747465650148546563686e6963616c436f6d6d6974746565182450726f706f73616c730100590b040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f66000104062cd904040004cc2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e18566f74696e67000104062c510b040004b420566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d62657273010051020400043901205468652063757272656e74206d656d62657273206f662074686520636f6c6c6563746976652e20546869732069732073746f72656420736f7274656420286a7573742062792076616c7565292e145072696d65000000040004650120546865207072696d65206d656d62657220746861742068656c70732064657465726d696e65207468652064656661756c7420766f7465206265686176696f7220696e2063617365206f6620616273656e746174696f6e732e01c50501910100015d0b1c2444656d6f6372616379012444656d6f63726163792c3c5075626c696350726f70436f756e74010010100000000004f420546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2c5075626c696350726f70730100610b040004050120546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865207365636f6e64206974656d206973207468652070726f706f73616c2e244465706f7369744f6600010405106d0b04000c842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e00d82054574f582d4e4f54453a20536166652c20617320696e6372656173696e6720696e7465676572206b6579732061726520736166652e3c5265666572656e64756d436f756e74010010100000000004310120546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e344c6f77657374556e62616b6564010010100000000008250120546865206c6f77657374207265666572656e64756d20696e64657820726570726573656e74696e6720616e20756e62616b6564207265666572656e64756d2e20457175616c20746fdc20605265666572656e64756d436f756e74602069662074686572652069736e2774206120756e62616b6564207265666572656e64756d2e405265666572656e64756d496e666f4f660001040510750b04000cb420496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e0009012054574f582d4e4f54453a205341464520617320696e646578657320617265206e6f7420756e64657220616e2061747461636b6572e280997320636f6e74726f6c2e20566f74696e674f660101040500810bd8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105d0120416c6c20766f74657320666f72206120706172746963756c617220766f7465722e2057652073746f7265207468652062616c616e636520666f7220746865206e756d626572206f6620766f74657320746861742077655d012068617665207265636f726465642e20546865207365636f6e64206974656d2069732074686520746f74616c20616d6f756e74206f662064656c65676174696f6e732c20746861742077696c6c2062652061646465642e00e82054574f582d4e4f54453a205341464520617320604163636f756e7449646073206172652063727970746f2068617368657320616e797761792e544c6173745461626c656457617345787465726e616c0100bc0400085901205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c6963282070726f706f73616c2e304e65787445787465726e616c0000990b040010590120546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e550120546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743aa4202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f7268202d20605075626c696350726f70736020697320656d7074792e24426c61636b6c697374000104062c9d0b04000851012041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d626572e82028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e3443616e63656c6c6174696f6e73010104062cbc0400042901205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e01c905019501303c456e6163746d656e74506572696f6410108097060014e82054686520706572696f64206265747765656e20612070726f706f73616c206265696e6720617070726f76656420616e6420656e61637465642e0031012049742073686f756c642067656e6572616c6c792062652061206c6974746c65206d6f7265207468616e2074686520756e7374616b6520706572696f6420746f20656e737572652074686174510120766f74696e67207374616b657273206861766520616e206f70706f7274756e69747920746f2072656d6f7665207468656d73656c7665732066726f6d207468652073797374656d20696e207468652063617365b4207768657265207468657920617265206f6e20746865206c6f73696e672073696465206f66206120766f74652e304c61756e6368506572696f6410100027060004e420486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e30566f74696e67506572696f6410108013030004b820486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e44566f74654c6f636b696e67506572696f64101080970600109020546865206d696e696d756d20706572696f64206f6620766f7465206c6f636b696e672e0065012049742073686f756c64206265206e6f2073686f72746572207468616e20656e6163746d656e7420706572696f6420746f20656e73757265207468617420696e207468652063617365206f6620616e20617070726f76616c2c49012074686f7365207375636365737366756c20766f7465727320617265206c6f636b656420696e746f2074686520636f6e73657175656e636573207468617420746865697220766f74657320656e7461696c2e384d696e696d756d4465706f7369741840000064a7b3b6e00d000000000000000004350120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e38496e7374616e74416c6c6f776564bc04010c550120496e64696361746f7220666f72207768657468657220616e20656d657267656e6379206f726967696e206973206576656e20616c6c6f77656420746f2068617070656e2e20536f6d6520636861696e73206d617961012077616e7420746f207365742074686973207065726d616e656e746c7920746f206066616c7365602c206f7468657273206d61792077616e7420746f20636f6e646974696f6e206974206f6e207468696e67732073756368a020617320616e207570677261646520686176696e672068617070656e656420726563656e746c792e5446617374547261636b566f74696e67506572696f6410100807000004ec204d696e696d756d20766f74696e6720706572696f6420616c6c6f77656420666f72206120666173742d747261636b207265666572656e64756d2e34436f6f6c6f6666506572696f6410100027060004610120506572696f6420696e20626c6f636b7320776865726520616e2065787465726e616c2070726f706f73616c206d6179206e6f742062652072652d7375626d6974746564206166746572206265696e67207665746f65642e204d6178566f7465731010f401000010b020546865206d6178696d756d206e756d626572206f6620766f74657320666f7220616e206163636f756e742e00d420416c736f207573656420746f20636f6d70757465207765696768742c20616e206f7665726c79206269672076616c75652063616e1501206c65616420746f2065787472696e7369632077697468207665727920626967207765696768743a20736565206064656c65676174656020666f7220696e7374616e63652e304d617850726f706f73616c73101064000000040d0120546865206d6178696d756d206e756d626572206f66207075626c69632070726f706f73616c7320746861742063616e20657869737420617420616e792074696d652e2c4d61784465706f73697473101064000000041d0120546865206d6178696d756d206e756d626572206f66206465706f736974732061207075626c69632070726f706f73616c206d6179206861766520617420616e792074696d652e384d6178426c61636b6c697374656410106400000004d820546865206d6178696d756d206e756d626572206f66206974656d732077686963682063616e20626520626c61636b6c69737465642e01a50b1d1844455841504901184445584150490448456e61626c6564536f7572636554797065730100a10504000001d90501a5010001a90b1e2445746842726964676501244574684272696467656834526571756573747351756575650101040510a503040004e020526567697374657265642072657175657374732071756575652068616e646c6564206279206f66662d636861696e20776f726b6572732e2052657175657374730001080506ad0bb10b0400045420526567697374657265642072657175657374732e644c6f6164546f496e636f6d696e6752657175657374486173680101080506ad0b2c800000000000000000000000000000000000000000000000000000000000000000042101205573656420746f206964656e7469667920616e20696e636f6d696e6720726571756573742062792074686520636f72726573706f6e64696e67206c6f616420726571756573742e3c5265717565737453746174757365730001080506ad0bb50b0400044c2052657175657374732073746174757365732e5c526571756573745375626d697373696f6e4865696768740101080506ad0b10100000000004bc205265717565737473207375626d697373696f6e20686569676874206d617020286f6e20737562737472617465292e4052657175657374417070726f76616c730101080506ad0bb90b04000474204f7574676f696e6720726571756573747320617070726f76616c732e3c4163636f756e7452657175657374730101040200c10b04000474205265717565737473206d61646520627920616e206163636f756e742e3c5265676973746572656441737365740001080506c50bfd050400045c2052656769737465726564206173736574206b696e642e5c53696465636861696e4173736574507265636973696f6e0101080506c50b08040008690120507265636973696f6e2028646563696d616c7329206f66206120726567697374657265642073696465636861696e2061737365742e2053686f756c64206265207468652073616d6520617320696e20746865204552432d32302820636f6e74726163742e605265676973746572656453696465636861696e41737365740001080502c90b0d01040004a4205265676973746572656420746f6b656e20604173736574496460206f6e2054686973636861696e2e605265676973746572656453696465636861696e546f6b656e0001080502c50b4d030400049c20526567697374657265642061737365742061646472657373206f6e2053696465636861696e2e1450656572730101040510cd0b0400044c204e6574776f726b207065657273207365742e2c50656e64696e6750656572000104051000040004b0204e6574776f726b2070656e64696e6720286265696e672061646465642f72656d6f7665642920706565722e4c50656e64696e67457468506565727353796e630100d10b0c00000004cc205573656420666f7220636f6d7061746962696c697479207769746820584f5220616e642056414c20636f6e7472616374732e34506565724163636f756e7449640001080502c90b00040004782050656572206163636f756e74204944206f6e2054686973636861696e2e2c50656572416464726573730101080502410a4d03500000000000000000000000000000000000000000046c20506565722061646472657373206f6e2053696465636861696e2e344272696467654163636f756e740001040510000400049101204d756c74692d7369676e61747572652062726964676520706565727327206163636f756e742e20604e6f6e6560206966207468657265206973206e6f206163636f756e7420616e64206e6574776f726b20776974682074686520676976656e2049442e40417574686f726974794163636f756e74000000040004742054686973636861696e20617574686f72697479206163636f756e742e3842726964676553746174757365730001040510d50b0400043c20427269646765207374617475732e54427269646765436f6e74726163744164647265737301010405104d03500000000000000000000000000000000000000000049420536d6172742d636f6e74726163742061646472657373206f6e2053696465636861696e2e60586f724d6173746572436f6e74726163744164647265737301004d03500000000000000000000000000000000000000000048820536f726120584f52206d617374657220636f6e747261637420616464726573732e6056616c4d6173746572436f6e74726163744164647265737301004d03500000000000000000000000000000000000000000048820536f72612056414c206d617374657220636f6e747261637420616464726573732e344e6578744e6574776f726b496401001010000000000464204e657874204e6574776f726b20494420636f756e7465722e444d6967726174696e6752657175657374730100a5030400086901205265717565737473206d6967726174696e672066726f6d2076657273696f6e2027302e312e302720746f2027302e322e30272e2054686573652072657175657374732073686f756c642062652072656d6f7665642066726f6dd020605265717565737473517565756560206265666f7265206d6967726174696f6e2070726f63656475726520737461727465642e5c4272696467655369676e617475726556657273696f6e730101040510e1050402007850656e64696e674272696467655369676e617475726556657273696f6e730001040510e10504000001dd0501a9010001d90b1f445073776170446973747269627574696f6e01445073776170446973747269627574696f6e1848537562736372696265644163636f756e74730001040200dd0b040008b1012053746f726520666f7220696e666f726d6174696f6e2061626f7574206163636f756e747320636f6e7461696e696e6720666565732c207468617420706172746963697061746520696e20696e63656e7469766520646973747269627574696f6e206d656368616e69736d2ed1012046656573204163636f756e74204964202d3e20284445582049642c20506f6f6c204d61726b65722041737365742049642c20446973747269627574696f6e204672657175656e63792c20426c6f636b204f666673657429204672657175656e6379204d555354206265206e6f6e2d7a65726f2e204275726e5261746501003d01400000000000000000000000000000000004f820416d6f756e74206f6620696e63656e7469766520746f6b656e7320746f206265206275726e6564206f6e206561636820646973747269627574696f6e2e384275726e557064617465496e666f0100e10b80000000000000000000000000000000000000000000000000000000000000000004a820284275726e205261746520496e6372656173652044656c74612c204275726e2052617465204d6178294c5368617265686f6c6465724163636f756e747301010402003d01400000000000000000000000000000000004690120496e666f726d6174696f6e2061626f7574206f776e656420706f7274696f6e206f662073746f72656420696e63656e7469766520746f6b656e732e205368617265686f6c646572202d3e204f776e6564204672616374696f6e3c436c61696d61626c6553686172657301003d01400000000000000000000000000000000004b42053756d206f6620616c6c20736861726573206f6620696e63656e7469766520746f6b656e206f776e6572732e3c4275794261636b4672616374696f6e01003d014000008a5d78456301000000000000000004ac204672616374696f6e206f66205053574150207468617420636f756c6420626520627579206261636b656401610601ad010001e50b20204d756c746973696701204d756c746973696704244d756c7469736967730001080502c504e90b040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e01650601b1010c2c4465706f7369744261736518400100000000000000000000000000000018590120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061206d756c746973696720657865637574696f6e206f7220746f842073746f726520612064697370617463682063616c6c20666f72206c617465722e00010120546869732069732068656c6420666f7220616e206164646974696f6e616c2073746f72616765206974656d2077686f73652076616c75652073697a652069733101206034202b2073697a656f662828426c6f636b4e756d6265722c2042616c616e63652c204163636f756e74496429296020627974657320616e642077686f7365206b65792073697a652069738020603332202b2073697a656f66284163636f756e74496429602062797465732e344465706f736974466163746f721840010000000000000000000000000000000c55012054686520616d6f756e74206f662063757272656e6379206e65656465642070657220756e6974207468726573686f6c64207768656e206372656174696e672061206d756c746973696720657865637574696f6e2e00250120546869732069732068656c6420666f7220616464696e67203332206279746573206d6f726520696e746f2061207072652d6578697374696e672073746f726167652076616c75652e384d61785369676e61746f7269657310106400000004ec20546865206d6178696d756d20616d6f756e74206f66207369676e61746f7269657320616c6c6f77656420696e20746865206d756c74697369672e01f10b21245363686564756c657201245363686564756c65720c3c496e636f6d706c65746553696e6365000010040000184167656e64610101040510f50b0400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e184c6f6f6b75700001040504bd01040010f8204c6f6f6b75702066726f6d2061206e616d6520746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e00590120466f72207633202d3e207634207468652070726576696f75736c7920756e626f756e646564206964656e7469746965732061726520426c616b65322d3235362068617368656420746f20666f726d2074686520763430206964656e7469746965732e016d0601b90108344d6178696d756d576569676874203c070010a5d4e813ffffffffffffff7f04290120546865206d6178696d756d207765696768742074686174206d6179206265207363686564756c65642070657220626c6f636b20666f7220616e7920646973706174636861626c65732e504d61785363686564756c6564506572426c6f636b101032000000041d0120546865206d6178696d756d206e756d626572206f66207363686564756c65642063616c6c7320696e2074686520717565756520666f7220612073696e676c6520626c6f636b2e01050c223849726f68614d6967726174696f6e013849726f68614d6967726174696f6e202042616c616e63657300010402c901180400002452656665727265727300010402c901c901040000285075626c69634b65797301010402c901090c0400001c51756f72756d7301010402c901080400001c4163636f756e74000000040000404d696772617465644163636f756e747300010402c901000400005c50656e64696e674d756c74695369674163636f756e747301010402c901110c080000004050656e64696e67526566657272616c7301010402c901510204000001750601c5010001150c234c546563686e6963616c4d656d62657273686970014c546563686e6963616c4d656d62657273686970081c4d656d626572730100190c040004c8205468652063757272656e74206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e145072696d65000000040004a4205468652063757272656e74207072696d65206d656d6265722c206966206f6e65206578697374732e01790601cd0100011d0c2644456c656374696f6e7350687261676d656e0144456c656374696f6e7350687261676d656e141c4d656d626572730100210c04000c74205468652063757272656e7420656c6563746564206d656d626572732e00b820496e76617269616e743a20416c7761797320736f72746564206261736564206f6e206163636f756e742069642e2452756e6e65727355700100210c04001084205468652063757272656e742072657365727665642072756e6e6572732d75702e00590120496e76617269616e743a20416c7761797320736f72746564206261736564206f6e2072616e6b2028776f72736520746f2062657374292e2055706f6e2072656d6f76616c206f662061206d656d6265722c20746865bc206c6173742028692e652e205f626573745f292072756e6e65722d75702077696c6c206265207265706c616365642e2843616e646964617465730100d5010400185901205468652070726573656e742063616e646964617465206c6973742e20412063757272656e74206d656d626572206f722072756e6e65722d75702063616e206e6576657220656e746572207468697320766563746f72d020616e6420697320616c7761797320696d706c696369746c7920617373756d656420746f20626520612063616e6469646174652e007c205365636f6e6420656c656d656e7420697320746865206465706f7369742e00b820496e76617269616e743a20416c7761797320736f72746564206261736564206f6e206163636f756e742069642e38456c656374696f6e526f756e647301001010000000000441012054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e65642c206578636c7564696e6720746865207570636f6d696e67206f6e652e18566f74696e670101040500290c840000000000000000000000000000000000000000000000000000000000000000000cb820566f74657320616e64206c6f636b6564207374616b65206f66206120706172746963756c617220766f7465722e00c42054574f582d4e4f54453a205341464520617320604163636f756e7449646020697320612063727970746f20686173682e017d0601d101242050616c6c65744964150120706872656c65637404d0204964656e74696669657220666f722074686520656c656374696f6e732d70687261676d656e2070616c6c65742773206c6f636b3443616e646964616379426f6e641840000064a7b3b6e00d000000000000000004050120486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e38566f74696e67426f6e644261736518400010a5d4e8000000000000000000000010942042617365206465706f736974206173736f636961746564207769746820766f74696e672e00550120546869732073686f756c642062652073656e7369626c79206869676820746f2065636f6e6f6d6963616c6c7920656e73757265207468652070616c6c65742063616e6e6f742062652061747461636b656420627994206372656174696e67206120676967616e746963206e756d626572206f6620766f7465732e40566f74696e67426f6e64466163746f7218400010a5d4e800000000000000000000000411012054686520616d6f756e74206f6620626f6e642074686174206e65656420746f206265206c6f636b656420666f72206561636820766f746520283332206279746573292e38446573697265644d656d6265727310100d0000000470204e756d626572206f66206d656d6265727320746f20656c6563742e404465736972656452756e6e65727355701010140000000478204e756d626572206f662072756e6e6572735f757020746f206b6565702e305465726d4475726174696f6e1010c08901000c510120486f77206c6f6e6720656163682073656174206973206b6570742e205468697320646566696e657320746865206e65787420626c6f636b206e756d62657220617420776869636820616e20656c656374696f6e5d0120726f756e642077696c6c2068617070656e2e2049662073657420746f207a65726f2c206e6f20656c656374696f6e732061726520657665722074726967676572656420616e6420746865206d6f64756c652077696c6c5020626520696e2070617373697665206d6f64652e344d617843616e646964617465731010e803000014e420546865206d6178696d756d206e756d626572206f662063616e6469646174657320696e20612070687261676d656e20656c656374696f6e2e001501205761726e696e673a2054686520656c656374696f6e2068617070656e73206f6e636861696e2c20616e6420746869732076616c75652077696c6c2064657465726d696e65f4207468652073697a65206f662074686520656c656374696f6e2e205768656e2074686973206c696d69742069732072656163686564206e6f206d6f7265a42063616e646964617465732061726520616363657074656420696e2074686520656c656374696f6e2e244d6178566f7465727310101027000010f820546865206d6178696d756d206e756d626572206f6620766f7465727320746f20616c6c6f7720696e20612070687261676d656e20656c656374696f6e2e001501205761726e696e673a205468697320696d7061637473207468652073697a65206f662074686520656c656374696f6e2077686963682069732072756e206f6e636861696e2ed8205768656e20746865206c696d6974206973207265616368656420746865206e657720766f74657273206172652069676e6f7265642e012d0c273456657374656452657761726473013456657374656452657761726473101c526577617264730101040200310c84000000000000000000000000000000000000000000000000000000000000000000086020526573657276656420666f7220667574757265207573655101204d617070696e67206265747765656e20757365727320616e64207468656972206f776e65642072657761726473206f6620646966666572656e74206b696e64732c20776869636820617265207665737465642e30546f74616c526577617264730100184000000000000000000000000000000000086020526573657276656420666f7220667574757265207573659c20546f74616c20616d6f756e74206f662050535741502070656e64696e6720726577617264732e3843726f77646c6f616e496e666f73000104028906350c0400047020496e666f726d6174696f6e2061626f75742063726f77646c6f616e4843726f77646c6f616e55736572496e666f730001080202390c3d0c040004d020496e666f726d6174696f6e2061626f75742063726f77646c6f616e207265776172647320636c61696d6564206279207573657201850601dd0114784765744d61726b65744d616b6572526577617264734163636f756e744964008054734f90f971a02c609b2d684e61b5573ff6739bc94151fc45d6c34d3600e78504b8204163636f756e747320686f6c64696e672050535741502064656469636174656420666f7220726577617264732e684765744661726d696e67526577617264734163636f756e744964008054734f90f971a02c609b2d684e61b557c5ab779bfebd4b6d74b82c5f991c4a6d007c476574426f6e64696e674375727665526577617264734163636f756e744964008054734f90f971a02c609b2d684e61b5572ead45212d81543b2d6d8124445d63af00444d696e5665737465645472616e7366657218400100000000000000000000000000000004e820546865206d696e696d756d20616d6f756e74207472616e7366657272656420746f2063616c6c20607665737465645f7472616e73666572602e544d6178576569676874466f724175746f436c61696d203c0700d0ed902e13999999999999991904b420546865206d6178696d756d20616d6f756e74206f66206175746f20636c61696d732070657220626c6f636b2e01410c28204964656e7469747901204964656e7469747910284964656e746974794f660001040500450c04000c210120496e666f726d6174696f6e20746861742069732070657274696e656e7420746f206964656e746966792074686520656e7469747920626568696e6420616e206163636f756e742e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e1c53757065724f6600010402003d070400086101205468652073757065722d6964656e74697479206f6620616e20616c7465726e6174697665202273756222206964656e7469747920746f676574686572207769746820697473206e616d652c2077697468696e2074686174510120636f6e746578742e20496620746865206163636f756e74206973206e6f7420736f6d65206f74686572206163636f756e742773207375622d6964656e746974792c207468656e206a75737420604e6f6e65602e18537562734f660101040500550c44000000000000000000000000000000000014b820416c7465726e6174697665202273756222206964656e746974696573206f662074686973206163636f756e742e001d0120546865206669727374206974656d20697320746865206465706f7369742c20746865207365636f6e64206973206120766563746f72206f6620746865206163636f756e74732e00c02054574f582d4e4f54453a204f4b20e2809520604163636f756e7449646020697320612073656375726520686173682e285265676973747261727301005d0c0400104d012054686520736574206f6620726567697374726172732e204e6f7420657870656374656420746f206765742076657279206269672061732063616e206f6e6c79206265206164646564207468726f7567682061a8207370656369616c206f726967696e20286c696b656c79206120636f756e63696c206d6f74696f6e292e0029012054686520696e64657820696e746f20746869732063616e206265206361737420746f2060526567697374726172496e6465786020746f2067657420612076616c69642076616c75652e01ad0601f501183042617369634465706f73697418400000c16ff2862300000000000000000004d42054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564206964656e74697479304669656c644465706f73697418400000c16ff28623000000000000000000042d012054686520616d6f756e742068656c64206f6e206465706f73697420706572206164646974696f6e616c206669656c6420666f7220612072656769737465726564206964656e746974792e445375624163636f756e744465706f73697418400000c16ff286230000000000000000000c65012054686520616d6f756e742068656c64206f6e206465706f73697420666f7220612072656769737465726564207375626163636f756e742e20546869732073686f756c64206163636f756e7420666f7220746865206661637465012074686174206f6e652073746f72616765206974656d27732076616c75652077696c6c20696e637265617365206279207468652073697a65206f6620616e206163636f756e742049442c20616e642074686572652077696c6c350120626520616e6f746865722074726965206974656d2077686f73652076616c7565206973207468652073697a65206f6620616e206163636f756e7420494420706c75732033322062797465732e384d61785375624163636f756e7473101064000000040d0120546865206d6178696d756d206e756d626572206f66207375622d6163636f756e747320616c6c6f77656420706572206964656e746966696564206163636f756e742e4c4d61784164646974696f6e616c4669656c6473101064000000086501204d6178696d756d206e756d626572206f66206164646974696f6e616c206669656c64732074686174206d61792062652073746f72656420696e20616e2049442e204e656564656420746f20626f756e642074686520492f4fe020726571756972656420746f2061636365737320616e206964656e746974792c206275742063616e2062652070726574747920686967682e344d617852656769737472617273101014000000085101204d61786d696d756d206e756d626572206f66207265676973747261727320616c6c6f77656420696e207468652073797374656d2e204e656564656420746f20626f756e642074686520636f6d706c65786974797c206f662c20652e672e2c207570646174696e67206a756467656d656e74732e016d0c291c4661726d696e67011c4661726d696e670c14506f6f6c7301010406105102040004210120506f6f6c732077686f7365206661726d65727320617265207265667265736865642061742074686520737065636966696320626c6f636b2e20426c6f636b203d3e20506f6f6c732c506f6f6c4661726d6572730101040600710c04000494204661726d657273206f662074686520706f6f6c2e20506f6f6c203d3e204661726d657273584c704d696e586f72466f72426f6e757352657761726401001840000000e3c8666c53467b02000000000000014d0701f9010001790c2a1c585354506f6f6c011c585354506f6f6c1444456e61626c656453796e74686574696373000104020d017d0c04000cb82053796e7468657469632061737365747320616e64207468656972207265666572656e63652073796d626f6c732e007501204974277320612070726f6772616d6d657220726573706f6e736962696c69747920746f206b656570207468697320636f6c6c656374696f6e20636f6e73697374656e742077697468205b60456e61626c656453796d626f6c73605d2e38456e61626c656453796d626f6c730001040201020d0104000cb8205265666572656e63652073796d626f6c7320616e642074686569722073796e746865746963206173736574732e008101204974277320612070726f6772616d6d657220726573706f6e736962696c69747920746f206b656570207468697320636f6c6c656374696f6e20636f6e73697374656e742077697468205b60456e61626c656453796e74686574696373605d2e405265666572656e63654173736574496401000d018002000000000000000000000000000000000000000000000000000000000000000415012041737365742074686174206973207573656420746f20636f6d7061726520636f6c6c61746572616c206173736574732062792076616c75652c20652e672e2c204441492e48436f6c6c61746572616c5265736572766573010104050d01184000000000000000000000000000000000042d012043757272656e742072657365727665732062616c616e636520666f7220636f6c6c61746572616c20746f6b656e732c207573656420666f7220636c69656e742075736162696c6974792e7053796e746865746963426173654173736574466c6f6f7250726963650100184000407a10f35a0000000000000000000004a820466c6f6f7220707269636520666f72207468652073796e74686574696320626173652061737365742e01510701fd01047047657453796e7468657469634261736542757953656c6c4c696d69741840ffffffffffffffffffffffffffffffff047c204d6178696d756d207472616461626c6520616d6f756e74206f662058535401810c2b285072696365546f6f6c7301285072696365546f6f6c7308285072696365496e666f73000104060d01850c04000038466173745072696365496e666f73000104060d01850c0400000001050200018d0c2c3043657265735374616b696e67013043657265735374616b696e671040417574686f726974794163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b13204f4204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e672072656d61696e696e6720726577617264731c5374616b6572730101040600910c8000000000000000000000000000000000000000000000000000000000000000000464204163636f756e744964202d3e205374616b696e67496e666f38546f74616c4465706f7369746564010018400000000000000000000000000000000000405265776172647352656d61696e696e6701001840000060521035ac862000000000000000000155070109020001950c2d5043657265734c69717569646974794c6f636b6572015043657265734c69717569646974794c6f636b65721850466565734f7074696f6e4f6e654163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b13204a8204163636f756e7420666f7220636f6c6c656374696e6720666565732066726f6d204f7074696f6e203150466565734f7074696f6e54776f4163636f756e74010000800a0455d92e1fda8dee17b2c58761c8efca490ef2a1a03322dbfea7379481d51704a8204163636f756e7420666f7220636f6c6c656374696e6720666565732066726f6d204f7074696f6e203260466565734f7074696f6e54776f4365726573416d6f756e74010018400000d01309468e15010000000000000004ac20416d6f756e74206f6620434552455320666f72206c6f636b65722066656573206f7074696f6e2074776f40417574686f726974794163636f756e740100008034a5b78f5fbcdc92a28767d63b579690a4b2f6a179931b3ecc87f09fc9366d4704f0204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e6720434552455320616d6f756e74206665655050616c6c657453746f7261676556657273696f6e0100990c0400045c2050616c6c65742073746f726167652076657273696f6e284c6f636b65724461746101010406009d0c040004b420436f6e7461696e7320646174612061626f7574206c6f636b75707320666f722065616368206163636f756e74015907010d020001a50c2e404365726573546f6b656e4c6f636b657201404365726573546f6b656e4c6f636b6572142c466565734163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b1320470204163636f756e7420666f7220636f6c6c656374696e67206665657340417574686f726974794163636f756e74010000800a0455d92e1fda8dee17b2c58761c8efca490ef2a1a03322dbfea7379481d51704bc204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e67206665655050616c6c657453746f7261676556657273696f6e0100a90c0400045c2050616c6c65742073746f726167652076657273696f6e24466565416d6f756e74010018400080e03779c31100000000000000000004ac20416d6f756e74206f6620434552455320666f72206c6f636b65722066656573206f7074696f6e2074776f3c546f6b656e4c6f636b6572446174610101040600ad0c040000015d070111020001b50c2f5c4365726573476f7665726e616e6365506c6174666f726d015c4365726573476f7665726e616e6365506c6174666f726d1018566f74696e670001080606b90cbd0c040004c8204120766f7465206f66206120706172746963756c6172207573657220666f72206120706172746963756c617220706f6c6c20506f6c6c44617461000104062cc10c0400005050616c6c657453746f7261676556657273696f6e0100c50c0400045c2050616c6c65742073746f726167652076657273696f6e40417574686f726974794163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b13204c8204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206372656174696e67206120706f6c6c0161070115020001c90c303843657265734c61756e6368706164013843657265734c61756e6368706164244050656e616c746965734163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b1320484204163636f756e7420666f7220636f6c6c656374696e672070656e616c746965734843657265734275726e466565416d6f756e74010018400000e8890423c78a0000000000000000047420416d6f756e74206f6620434552455320666f72206275726e20666565644365726573466f72436f6e747269627574696f6e496e494c4f01001840000064a7b3b6e00d000000000000000004a020416d6f756e74206f6620434552455320666f7220636f6e747269627574696f6e20696e20494c4f5c46656550657263656e744f6e52616973656446756e6473010018400000c16ff2862300000000000000000004b8204665652070657263656e74206f6e207261697365642066756e647320696e207375636365737366756c20494c4f40417574686f726974794163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b132040501204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e67204345524553206275726e20616d6f756e742066656510494c4f73000104060d01cd0c04000034436f6e747269627574696f6e730101080606d90cdd0cd40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c57686974656c6973746564436f6e7472696275746f7273010051020400006057686974656c6973746564496c6f4f7267616e697a657273010051020400000175070121020001e10c315844656d657465724661726d696e67506c6174666f726d015844656d657465724661726d696e67506c6174666f726d1828546f6b656e496e666f73000104060d01e50c0400002455736572496e666f730101040600e90c04000014506f6f6c730101080606390bf10c0400005050616c6c657453746f7261676556657273696f6e0100f90c0400045c2050616c6c65742073746f726167652076657273696f6e40417574686f726974794163636f756e7401000080fc096e24663f4dd1e2d48092c73213354c067c0c715ec68e7fcad185da62680100284665654163636f756e7401000080fc096e24663f4dd1e2d48092c73213354c067c0c715ec68e7fcad185da6268010444204163636f756e7420666f7220666565730179070125020001fd0c3220426167734c6973740120426167734c6973740c244c6973744e6f6465730001040500010d04000c8020412073696e676c65206e6f64652c2077697468696e20736f6d65206261672e000501204e6f6465732073746f7265206c696e6b7320666f727761726420616e64206261636b2077697468696e207468656972207265737065637469766520626167732e4c436f756e746572466f724c6973744e6f646573010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170204c697374426167730001040528050d04000c642041206261672073746f72656420696e2073746f726167652e0019012053746f7265732061206042616760207374727563742c2077686963682073746f726573206865616420616e64207461696c20706f696e7465727320746f20697473656c662e017d0701290204344261675468726573686f6c6473090d09192103290000000000000032000000000000003d000000000000004b000000000000005c0000000000000071000000000000008b00000000000000aa00000000000000d10000000000000000010000000000003a010000000000008101000000000000d8010000000000004302000000000000c60200000000000067030000000000002c040000000000001e050000000000004706000000000000b3070000000000007209000000000000960b000000000000360e0000000000006e110000000000006115000000000000391a0000000000002a20000000000000742700000000000065300000000000005d3b000000000000d14800000000000051590000000000008f6d0000000000006386000000000000d7a400000000000032ca00000000000004f800000000000038300100000000002975010000000000bac90100000000007531020000000000b1b0020000000000c34c030000000000330c04000000000005f70400000000000e170600000000005d78070000000000bd29090000000000533d0b000000000060c90d000000000032e910000000000044be140000000000aa71190000000000c7351f0000000000674826000000000059f52e0000000000999939000000000036a746000000000018aa560000000000db4d6a0000000000ff64820000000000b8f19f0000000000be30c400000000008fa6f00000000000b22f270100000000ac146a01000000007922bc01000000008fc8200200000000b23d9c02000000001ead330300000000ec6ded03000000000847d104000000008dc2e8050000000001943f0700000000c115e40800000000d8e2e70a00000000b093600d0000000089a568100000000065962014000000004641b018000000005e89481e0000000008662525000000008465902d0000000055c1e337000000004d258e4400000000bc511754000000006eca25670000000067cf857e000000000fea319b00000000786a5dbe00000000314581e90000000084db6b1e010000004f57545f01000000f069f2ae01000000c96c9b10020000008a1b6688020000003467561b03000000873793cf03000000045ba8ac040000004268d7bb0500000071f37a0807000000663f80a0080000007b82fc940a00000025ffe3fa0c000000b49aeaeb0f0000006559978713000000764896f41700000008fc56621d00000061fb080b24000000e7640b362c0000000ee6e93a36000000430e078542000000e2451b98510000006499b8156400000087740ec47a00000054ce35969600000024b55eb6b800000032514c92e2000000e32ca5ea15010000dae4bbe554010000df939926a201000093ee40e900020000a5f9582575020000b4eab2b803030000f5f7729bb203000095230b208904000099c0b54190050000bcd5b804d3060000e8207aec5e080000974e558c440a0000a8c54439980c00000934cde3720f0000848d4b23f31200002f7dd67d3e170000978c6dfa821c000099a84c0ef9220000d08a0bfae52a0000cbcddeaf9e340000c23c0e628b400000bbcebedf2b4f00004c2cd2ee1c610000da3436dc1e7700002846fe881d920000a35d914a3ab300004b66c607d8db0000cac1c414aa0d01003570eb6cc64a01009784180ebc95010073a8ef64aef101003bcb0bf07662020075c0a382ceec02007b69dde07f96030019c942d4a5660400b62cba51f76505008b012ce1249f0600c81af62f4b1f080066852b9a7ff60900ff2ce98c7c380c00c93c61f974fd0e0083f2f3b21763120040444494cd8d1600a10332bd3faa1b005248624036ef21000443dc4ae39f2900247ceb5ab30e33005a889eadc0a03e00040890df0ed24c00c8f36c1fbc3a5e006463b5985f95730030a5b659d9c68d001825e26fe7e7ad00f08c39efe650d50070d3eddf3ea80501f05efb990ff44001b027801be4af8901a03819db4de7e201e07d294888565002409f40cc8192d602a075a467f7397b038068f440b131450400f63bc765ee3c05405a02555bcf6c06001222ba938de10780b2fc3429c4aa09004667699297db0b8014931ace828b0e000d3db30d53d71100530fff675ce21500fea6be80f4d71a0028d48cff42ed2000fce043487b632800369e364f978a3100c2345ecbb0c43c00e40b03aa1c8a4a00005375c9746e5b004ca34cfac526700060914a832491890010ec8966f8bda800b0bcfc0f65fbceffffffffffffffffacd020546865206c697374206f66207468726573686f6c64732073657061726174696e672074686520766172696f757320626167732e00490120496473206172652073657061726174656420696e746f20756e736f727465642062616773206163636f7264696e6720746f2074686569722073636f72652e205468697320737065636966696573207468656101207468726573686f6c64732073657061726174696e672074686520626167732e20416e20696427732062616720697320746865206c6172676573742062616720666f722077686963682074686520696427732073636f7265b8206973206c657373207468616e206f7220657175616c20746f20697473207570706572207468726573686f6c642e006501205768656e20696473206172652069746572617465642c2068696768657220626167732061726520697465726174656420636f6d706c6574656c79206265666f7265206c6f77657220626167732e2054686973206d65616e735901207468617420697465726174696f6e206973205f73656d692d736f727465645f3a20696473206f66206869676865722073636f72652074656e6420746f20636f6d65206265666f726520696473206f66206c6f7765722d012073636f72652c206275742070656572206964732077697468696e206120706172746963756c6172206261672061726520736f7274656420696e20696e73657274696f6e206f726465722e006820232045787072657373696e672074686520636f6e7374616e74004d01205468697320636f6e7374616e74206d75737420626520736f7274656420696e207374726963746c7920696e6372656173696e67206f726465722e204475706c6963617465206974656d7320617265206e6f742c207065726d69747465642e00410120546865726520697320616e20696d706c696564207570706572206c696d6974206f66206053636f72653a3a4d4158603b20746861742076616c756520646f6573206e6f74206e65656420746f2062652101207370656369666965642077697468696e20746865206261672e20466f7220616e792074776f207468726573686f6c64206c697374732c206966206f6e6520656e647320776974683101206053636f72653a3a4d4158602c20746865206f74686572206f6e6520646f6573206e6f742c20616e64207468657920617265206f746865727769736520657175616c2c207468652074776f7c206c697374732077696c6c20626568617665206964656e746963616c6c792e003820232043616c63756c6174696f6e005501204974206973207265636f6d6d656e64656420746f2067656e65726174652074686520736574206f66207468726573686f6c647320696e20612067656f6d6574726963207365726965732c2073756368207468617441012074686572652065786973747320736f6d6520636f6e7374616e7420726174696f2073756368207468617420607468726573686f6c645b6b202b20315d203d3d20287468726573686f6c645b6b5d202ad020636f6e7374616e745f726174696f292e6d6178287468726573686f6c645b6b5d202b2031296020666f7220616c6c20606b602e005901205468652068656c7065727320696e2074686520602f7574696c732f6672616d652f67656e65726174652d6261677360206d6f64756c652063616e2073696d706c69667920746869732063616c63756c6174696f6e2e002c2023204578616d706c6573005101202d20496620604261675468726573686f6c64733a3a67657428292e69735f656d7074792829602c207468656e20616c6c20696473206172652070757420696e746f207468652073616d65206261672c20616e64b0202020697465726174696f6e206973207374726963746c7920696e20696e73657274696f6e206f726465722e6101202d20496620604261675468726573686f6c64733a3a67657428292e6c656e2829203d3d203634602c20616e6420746865207468726573686f6c6473206172652064657465726d696e6564206163636f7264696e6720746f11012020207468652070726f63656475726520676976656e2061626f76652c207468656e2074686520636f6e7374616e7420726174696f20697320657175616c20746f20322e6501202d20496620604261675468726573686f6c64733a3a67657428292e6c656e2829203d3d20323030602c20616e6420746865207468726573686f6c6473206172652064657465726d696e6564206163636f7264696e6720746f59012020207468652070726f63656475726520676976656e2061626f76652c207468656e2074686520636f6e7374616e7420726174696f20697320617070726f78696d6174656c7920657175616c20746f20312e3234382e6101202d20496620746865207468726573686f6c64206c69737420626567696e7320605b312c20322c20332c202e2e2e5d602c207468656e20616e20696420776974682073636f72652030206f7220312077696c6c2066616c6cf0202020696e746f2062616720302c20616e20696420776974682073636f726520322077696c6c2066616c6c20696e746f2062616720312c206574632e00302023204d6967726174696f6e00610120496e20746865206576656e7420746861742074686973206c6973742065766572206368616e6765732c206120636f7079206f6620746865206f6c642062616773206c697374206d7573742062652072657461696e65642e5d012057697468207468617420604c6973743a3a6d696772617465602063616e2062652063616c6c65642c2077686963682077696c6c20706572666f726d2074686520617070726f707269617465206d6967726174696f6e2e010d0d3368456c656374696f6e50726f76696465724d756c746950686173650168456c656374696f6e50726f76696465724d756c746950686173652814526f756e64010010100100000018ac20496e7465726e616c20636f756e74657220666f7220746865206e756d626572206f6620726f756e64732e00550120546869732069732075736566756c20666f722064652d6475706c69636174696f6e206f66207472616e73616374696f6e73207375626d697474656420746f2074686520706f6f6c2c20616e642067656e6572616c6c20646961676e6f7374696373206f66207468652070616c6c65742e004d012054686973206973206d6572656c7920696e6372656d656e746564206f6e6365207065722065766572792074696d65207468617420616e20757073747265616d2060656c656374602069732063616c6c65642e3043757272656e74506861736501003d020400043c2043757272656e742070686173652e38517565756564536f6c7574696f6e0000150d0400043d012043757272656e74206265737420736f6c7574696f6e2c207369676e6564206f7220756e7369676e65642c2071756575656420746f2062652072657475726e65642075706f6e2060656c656374602e20536e617073686f7400001d0d04000c7020536e617073686f742064617461206f662074686520726f756e642e005d01205468697320697320637265617465642061742074686520626567696e6e696e67206f6620746865207369676e656420706861736520616e6420636c65617265642075706f6e2063616c6c696e672060656c656374602e38446573697265645461726765747300001004000ccc2044657369726564206e756d626572206f66207461726765747320746f20656c65637420666f72207468697320726f756e642e00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e40536e617073686f744d657461646174610000b50804000c9820546865206d65746164617461206f6620746865205b60526f756e64536e617073686f74605d00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e645369676e65645375626d697373696f6e4e657874496e646578010010100000000024010120546865206e65787420696e64657820746f2062652061737369676e656420746f20616e20696e636f6d696e67207369676e6564207375626d697373696f6e2e007501204576657279206163636570746564207375626d697373696f6e2069732061737369676e6564206120756e6971756520696e6465783b207468617420696e64657820697320626f756e6420746f207468617420706172746963756c61726501207375626d697373696f6e20666f7220746865206475726174696f6e206f662074686520656c656374696f6e2e204f6e20656c656374696f6e2066696e616c697a6174696f6e2c20746865206e65787420696e6465782069733020726573657420746f20302e0069012057652063616e2774206a7573742075736520605369676e65645375626d697373696f6e496e64696365732e6c656e2829602c206265636175736520746861742773206120626f756e646564207365743b20706173742069747359012063617061636974792c2069742077696c6c2073696d706c792073617475726174652e2057652063616e2774206a7573742069746572617465206f76657220605369676e65645375626d697373696f6e734d6170602cf4206265636175736520697465726174696f6e20697320736c6f772e20496e73746561642c2077652073746f7265207468652076616c756520686572652e5c5369676e65645375626d697373696f6e496e64696365730100290d0400186d01204120736f727465642c20626f756e64656420766563746f72206f6620602873636f72652c20626c6f636b5f6e756d6265722c20696e64657829602c20776865726520656163682060696e6465786020706f696e747320746f2061782076616c756520696e20605369676e65645375626d697373696f6e73602e007101205765206e65766572206e65656420746f2070726f63657373206d6f7265207468616e20612073696e676c65207369676e6564207375626d697373696f6e20617420612074696d652e205369676e6564207375626d697373696f6e7375012063616e206265207175697465206c617267652c20736f2077652772652077696c6c696e6720746f207061792074686520636f7374206f66206d756c7469706c6520646174616261736520616363657373657320746f206163636573732101207468656d206f6e6520617420612074696d6520696e7374656164206f662072656164696e6720616e64206465636f64696e6720616c6c206f66207468656d206174206f6e63652e505369676e65645375626d697373696f6e734d61700001040510350d04001c7420556e636865636b65642c207369676e656420736f6c7574696f6e732e00690120546f676574686572207769746820605375626d697373696f6e496e6469636573602c20746869732073746f726573206120626f756e64656420736574206f6620605369676e65645375626d697373696f6e7360207768696c65ec20616c6c6f77696e6720757320746f206b656570206f6e6c7920612073696e676c65206f6e6520696e206d656d6f727920617420612074696d652e0069012054776f78206e6f74653a20746865206b6579206f6620746865206d617020697320616e206175746f2d696e6372656d656e74696e6720696e6465782077686963682075736572732063616e6e6f7420696e7370656374206f72f4206166666563743b2077652073686f756c646e2774206e65656420612063727970746f67726170686963616c6c7920736563757265206861736865722e544d696e696d756d556e7472757374656453636f7265000039020400105d0120546865206d696e696d756d2073636f7265207468617420656163682027756e747275737465642720736f6c7574696f6e206d7573742061747461696e20696e206f7264657220746f20626520636f6e7369646572656428206665617369626c652e00b82043616e206265207365742076696120607365745f6d696e696d756d5f756e747275737465645f73636f7265602e018107012d024c34556e7369676e656450686173651010960000000480204475726174696f6e206f662074686520756e7369676e65642070686173652e2c5369676e656450686173651010960000000478204475726174696f6e206f6620746865207369676e65642070686173652e544265747465725369676e65645468726573686f6c64b01000000000084d0120546865206d696e696d756d20616d6f756e74206f6620696d70726f76656d656e7420746f2074686520736f6c7574696f6e2073636f7265207468617420646566696e6573206120736f6c7574696f6e2061737820226265747465722220696e20746865205369676e65642070686173652e5c426574746572556e7369676e65645468726573686f6c64b01020a10700084d0120546865206d696e696d756d20616d6f756e74206f6620696d70726f76656d656e7420746f2074686520736f6c7574696f6e2073636f7265207468617420646566696e6573206120736f6c7574696f6e2061738020226265747465722220696e2074686520556e7369676e65642070686173652e384f6666636861696e52657065617410101200000010b42054686520726570656174207468726573686f6c64206f6620746865206f6666636861696e20776f726b65722e00610120466f72206578616d706c652c20696620697420697320352c2074686174206d65616e732074686174206174206c65617374203520626c6f636b732077696c6c20656c61707365206265747765656e20617474656d7074738420746f207375626d69742074686520776f726b6572277320736f6c7574696f6e2e3c4d696e657254785072696f72697479282065666666666666e604250120546865207072696f72697479206f662074686520756e7369676e6564207472616e73616374696f6e207375626d697474656420696e2074686520756e7369676e65642d7068617365505369676e65644d61785375626d697373696f6e731010100000001ce4204d6178696d756d206e756d626572206f66207369676e6564207375626d697373696f6e7320746861742063616e206265207175657565642e005501204974206973206265737420746f2061766f69642061646a757374696e67207468697320647572696e6720616e20656c656374696f6e2c20617320697420696d706163747320646f776e73747265616d2064617461650120737472756374757265732e20496e20706172746963756c61722c20605369676e65645375626d697373696f6e496e64696365733c543e6020697320626f756e646564206f6e20746869732076616c75652e20496620796f75f42075706461746520746869732076616c756520647572696e6720616e20656c656374696f6e2c20796f75205f6d7573745f20656e7375726520746861744d0120605369676e65645375626d697373696f6e496e64696365732e6c656e282960206973206c657373207468616e206f7220657175616c20746f20746865206e65772076616c75652e204f74686572776973652cf020617474656d70747320746f207375626d6974206e657720736f6c7574696f6e73206d617920636175736520612072756e74696d652070616e69632e3c5369676e65644d617857656967687420400b28c41ed253011347e17a14ae47e1ba1494204d6178696d756d20776569676874206f662061207369676e656420736f6c7574696f6e2e005d01204966205b60436f6e6669673a3a4d696e6572436f6e666967605d206973206265696e6720696d706c656d656e74656420746f207375626d6974207369676e656420736f6c7574696f6e7320286f757473696465206f663d0120746869732070616c6c6574292c207468656e205b604d696e6572436f6e6669673a3a736f6c7574696f6e5f776569676874605d206973207573656420746f20636f6d7061726520616761696e73743020746869732076616c75652e405369676e65644d6178526566756e647310100400000004190120546865206d6178696d756d20616d6f756e74206f6620756e636865636b656420736f6c7574696f6e7320746f20726566756e64207468652063616c6c2066656520666f722e405369676e656452657761726442617365184000008a5d784563010000000000000000048820426173652072657761726420666f722061207369676e656420736f6c7574696f6e445369676e65644465706f73697442617365184020500dd2f5b1d901000000000000000004902042617365206465706f73697420666f722061207369676e656420736f6c7574696f6e2e445369676e65644465706f736974427974651840855f419407000000000000000000000004a0205065722d62797465206465706f73697420666f722061207369676e656420736f6c7574696f6e2e4c5369676e65644465706f73697457656967687418400000000000000000000000000000000004a8205065722d776569676874206465706f73697420666f722061207369676e656420736f6c7574696f6e2e444d6178456c656374696e67566f746572731010d43000000c5d0120546865206d6178696d756d206e756d626572206f6620656c656374696e6720766f7465727320746f2070757420696e2074686520736e617073686f742e20417420746865206d6f6d656e742c20736e617073686f7473590120617265206f6e6c79206f76657220612073696e676c6520626c6f636b2c20627574206f6e6365206d756c74692d626c6f636b20656c656374696f6e732061726520696e74726f647563656420746865792077696c6c842074616b6520706c616365206f766572206d756c7469706c6520626c6f636b732e4c4d6178456c65637461626c6554617267657473ed0308ffff04010120546865206d6178696d756d206e756d626572206f6620656c65637461626c65207461726765747320746f2070757420696e2074686520736e617073686f742e284d617857696e6e6572731010b004000010350120546865206d6178696d756d206e756d626572206f662077696e6e65727320746861742063616e20626520656c656374656420627920746869732060456c656374696f6e50726f7669646572604020696d706c656d656e746174696f6e2e005101204e6f74653a2054686973206d75737420616c776179732062652067726561746572206f7220657175616c20746f2060543a3a4461746150726f76696465723a3a646573697265645f746172676574732829602e384d696e65724d61784c656e67746810109a994b0000384d696e65724d617857656967687420400b28c41ed253011347e17a14ae47e1ba00544d696e65724d6178566f746573506572566f7465721010180000000001390d341042616e64011042616e64103c5472757374656452656c61796572730000cd0b0400002c53796d626f6c52617465730101040201023d0d0400004053796d626f6c436865636b426c6f636b0101080202450dbc0400005044796e616d6963466565506172616d65746572730100d908c000000000000000000000000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000001c9080145020c5847657442616e64526174655374616c65506572696f642820e093040000000000048c20526174652065787069726174696f6e20706572696f6420696e207365636f6e64732e6c47657442616e64526174655374616c65426c6f636b506572696f64101058020000048420526174652065787069726174696f6e20706572696f6420696e20626c6f636b733c4d617852656c617953796d626f6c73101064000000041101204d6178696d756d206e756d626572206f662073796d626f6c7320746861742063616e2062652072656c617965642077697468696e20612073696e676c652063616c6c2e01490d352c4f7261636c6550726f7879012c4f7261636c6550726f78790838456e61626c65644f7261636c657301004d0d0400003c53796d626f6c50726f766964657273000104020102590204000001dd080155020001550d36604865726d6573476f7665726e616e6365506c6174666f726d01604865726d6573476f7665726e616e6365506c6174666f726d18344865726d6573566f74696e67730001080606b90c590d040004c8204120766f7465206f66206120706172746963756c6172207573657220666f72206120706172746963756c617220706f6c6c384865726d6573506f6c6c44617461000104062c5d0d040000644d696e696d756d4865726d6573566f74696e67416d6f756e74010018400000a0dec5adc935360000000000000000884d696e696d756d4865726d6573416d6f756e74466f724372656174696e67506f6c6c01001840000080f64ae1c7022d150000000000000040417574686f726974794163636f756e740100008096ea3c9c0be7bbc7b0656a1983db5eed75210256891a9609012362e36815b132048101204163636f756e7420776869636820686173207065726d697373696f6e7320666f72206368616e67696e67204865726d6573206d696e696d756d20616d6f756e7420666f7220766f74696e6720616e64206372656174696e67206120706f6c6c5050616c6c657453746f7261676556657273696f6e0100610d0400045c2050616c6c65742073746f726167652076657273696f6e01e108015d020001650d3720507265696d6167650120507265696d6167650824537461747573466f72000104062c690d0400049020546865207265717565737420737461747573206f66206120676976656e20686173682e2c507265696d616765466f7200010406710d750d04000001e5080169020001790d38244f72646572426f6f6b01244f72646572426f6f6b28284f72646572426f6f6b730001040271027d0d0400045501205468652073746f7261676520636f6e7461696e732074686520696e666f726d6174696f6e2061626f7574206f7264657220626f6f6b2c206974277320706172616d657465727320616e642073746174757365732e2c4c696d69744f72646572730001080202850d890d0400044101205468652073746f7261676520636f6e7461696e732074686520696e666f726d6174696f6e2061626f757420616c6c206c696d6974206f726465727320696e20616c6c206f7264657220626f6f6b732e104269647300010802028d0d910d04000411012054686520696e64657820636f6e7461696e7320746865206c69737420776974682074686520626964206f72646572206069646020666f7220656163682070726963652e1041736b7300010802028d0d910d04000411012054686520696e64657820636f6e7461696e7320746865206c6973742077697468207468652061736b206f72646572206069646020666f7220656163682070726963652e384167677265676174656442696473010104027102950d04000495012054686520696e64657820636f6e7461696e7320746865206167677265676174656420696e666f726d6174696f6e2061626f75742062696473207769746820746f74616c20766f6c756d65206f66206f726465727320666f7220656163682070726963652e384167677265676174656441736b73010104027102950d04000495012054686520696e64657820636f6e7461696e7320746865206167677265676174656420696e666f726d6174696f6e2061626f75742061736b73207769746820746f74616c20766f6c756d65206f66206f726465727320666f7220656163682070726963652e3c557365724c696d69744f72646572730001080202a50d910d0400045d012054686520696e64657820636f6e7461696e7320746865206c697374207769746820746865206f72646572206069646020666f7220746865207573657220696e20646966666572656e74206f7264657220626f6f6b732e4445787069726174696f6e734167656e64610101040610a90d04000405012054686520746563682073746f726167652074686174206973207573656420696e20746865206f726465722065787069726174696f6e206d656368616e69736d2e3c416c69676e6d656e74437572736f720001040271021804000435012054686520746563682073746f726167652074686174206973207573656420647572696e67207468652070726f63657373206f66207570646174696e6720746865206f7264657220626f6f6b2e68496e636f6d706c65746545787069726174696f6e7353696e636500001004000cb0204561726c6965737420626c6f636b207769746820696e636f6d706c6574652065787069726174696f6e733b0d0120576569676874206c696d6974206d69676874206e6f7420616c6c6f7720746f2066696e69736820616c6c2065787069726174696f6e7320666f72206120626c6f636b8420736f2074686579206d69676874206265206f70657261746564206c617465722e01e908016d020001b10d39204b656e736574737501204b656e7365747375284c4c69717569646174656454686973426c6f636b0100bc040008710120466c616720696e646963617465732074686174206c69717569646174696f6e20746f6f6b20706c61636520696e207468697320626c6f636b2e204f6e6c79206f6e65206c69717569646174696f6e2070657220626c6f636b206973a820616c6c6f7765642c2074686520666c61672069732064726f7070656420657665727920626c6f636b2e3c537461626c65636f696e496e666f73000104060d01b50d0400045820537461626c65636f696e20706172616d65746572733c436f6c6c61746572616c496e666f7300010406b90dbd0d040008750120506172616d657465727320666f7220636f6c6c61746572616c732c20696e636c756465207269736b20706172616d657465727320616e6420696e74657265737420726563616c63756c6174696f6e20636f656666696369656e74732e0501204d61702028436f6c6c61746572616c2061737365742069642c20537461626c65636f696e206173736574206964203d3e20436f6c6c61746572616c496e666f2924426f72726f7754617801009902040008710120426f72726f777320746178206170706c696564206f6e20626f72726f7720616d6f756e7420696e20616e7920737461626c65636f696e20616e64207573656420746f20627579206261636b20616e6420696e63656e746976697a6574204b454e2e2049742069732061207269736b20706172616d657465722e384b61726d61426f72726f7754617801009902040004610120426f72726f7720746178206170706c696564206f6e20626f72726f7720616d6f756e7420696e204b584f5220616e64207573656420746f20627579206261636b20616e6420696e63656e746976697a65204b41524d412e3454626364426f72726f7754617801009902040004410120426f72726f7720746178206170706c696564206f6e20626f72726f7720616d6f756e7420696e204b584f5220616e64207573656420746f20627579206261636b20616e64206275726e20544243442e484c69717569646174696f6e50656e616c74790100990204000450204c69717569646174696f6e2070656e616c7479244e6578744344504964010018400000000000000000000000000000000004702043445020636f756e746572207573656420666f7220434450206964344344504465706f7369746f72790001040618c10d040004e82053746f72616765206f6620616c6c20434450732c207768657265206b6579206973206120756e6971756520434450206964656e746966696572344364704f776e6572496e6465780001040600c50d040004310120496e646578206c696e6b73206f776e657220746f20434450206964732c206e6f74206e65656465642062792070726f746f636f6c2c2062757420757365642062792066726f6e742d656e6401f50801890218644b656e496e63656e7469766552656d696e7450657263656e74990204500459012050657263656e74206f66204b454e20627579206261636b20746861742069732072656d696e74656420616e6420676f657320746f2044656d65746572206661726d696e6720696e63656e746976697a6174696f6e2e6c4b61726d61496e63656e7469766552656d696e7450657263656e74990204500461012050657263656e74206f66204b41524d4120627579206261636b20746861742069732072656d696e74656420616e6420676f657320746f2044656d65746572206661726d696e6720696e63656e746976697a6174696f6e2e3c4d6178436470735065724f776e657210101027000004bc204d6178696d756d206e756d626572206f66204344502074686174206f6e6520757365722063616e20637265617465644d696e696d616c53746162696c6974794665654163637275651840000064a7b3b6e00d0000000000000000045101204d696e696d616c20756e636f6c6c65637465642066656520696e20737461626c65636f696e2074686174207472696767657273206f6666636861696e20776f726b657220746f2063616c6c206163637275652e40556e7369676e65645072696f726974792820999999999999991904f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e44556e7369676e65644c6f6e67657669747928200a0000000000000004e0204120636f6e66696775726174696f6e20666f72206c6f6e676576697479206f6620756e7369676e6564207472616e73616374696f6e732e01c90d3a304c65616650726f766964657201304c65616650726f766964657204304c61746573744469676573740000610904000438204c6174657374206469676573740001a5020000632c42726964676550726f7879012c42726964676550726f78791c305472616e73616374696f6e730001080202cd0dd50d0400001c53656e646572730001080502dd0d00040000304c6f636b65644173736574730101080202e10d184000000000000000000000000000000000049d0120416d6f756e74206f6620617373657473206c6f636b65642062792062726964676520666f72207370656369666963206e6574776f726b2e204d61702028284e6574776f726b2049442c20417373657420494429203d3e204c6f636b656420616d6f756e74292e345472616e736665724c696d69740100fd08500000407ba5f06381960a00000000000058020000041901204d6178696d756d20616d6f756e74206f662061737365747320746861742063616e2062652077697468647261776e20647572696e6720706572696f64206f662074696d652e54436f6e73756d65645472616e736665724c696d69740100184000000000000000000000000000000000046420436f6e73756d6564207472616e73666572206c696d69742e6c5472616e736665724c696d6974556e6c6f636b5363686564756c65010104021018400000000000000000000000000000000004b4205363686564756c6520666f7220636f6e73756d6564207472616e73666572206c696d6974207265647563652e344c696d69746564417373657473010104020d01bc04000484204173736574732077697468207472616e73666572206c696d69746174696f6e2e01f90801a9020001e50d6774537562737472617465427269646765496e626f756e644368616e6e656c0174537562737472617465427269646765496e626f756e644368616e6e656c04344368616e6e656c4e6f6e63657301010406b902282000000000000000000001010901b1020c40556e7369676e65645072696f726974792820999999999999991904f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e44556e7369676e65644c6f6e6765766974792820580200000000000004e0204120636f6e66696775726174696f6e20666f72206c6f6e676576697479206f6620756e7369676e6564207472616e73616374696f6e732e34546869734e6574776f726b4964c5020801000001e90d6a785375627374726174654272696467654f7574626f756e644368616e6e656c01785375627374726174654272696467654f7574626f756e644368616e6e656c1020496e74657276616c010010100a000000049820496e74657276616c206265747765656e20636f6d6d697474696e67206d657373616765732e344d65737361676551756575657301010406b9020d09040008cd01204d657373616765732077616974696e6720746f20626520636f6d6d69747465642e20546f20757064617465207468652071756575652c207573652060617070656e645f6d6573736167655f71756575656020616e64206074616b655f6d6573736167655f717565756560206d6574686f6473b42028746f206b65657020636f72726563742076616c756520696e205b517565756573546f74616c4761735d292e344368616e6e656c4e6f6e63657301010406b9022820000000000000000000404c6174657374436f6d6d69746d656e7400010406b902ed0d04000001690901b5020434546869734e6574776f726b4964c5020801000001f10d6b44537562737472617465446973706174636801445375627374726174654469737061746368000001bd0200006c4850617261636861696e427269646765417070014850617261636861696e427269646765417070102841737365744b696e64730001080606f50d71090400004853696465636861696e507265636973696f6e0001080606f50d0804000058416c6c6f77656450617261636861696e4173736574730101080606f90dad040400003c52656c6179636861696e417373657400010406b9020d01040000016d0901d1020001fd0d6d40427269646765446174615369676e65720140427269646765446174615369676e65720c14506565727300010406c502010e040004182050656572734450656e64696e675065657255706461746501010406c502bc040004382050656e64696e6720706565727324417070726f76616c730101080606dd0d090e0400042820417070726f76616c73017d09011d030c40556e7369676e65645072696f726974792820999999999999991904f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e44556e7369676e65644c6f6e6765766974792820580200000000000004e0204120636f6e66696775726174696f6e20666f72206c6f6e676576697479206f6620756e7369676e6564207472616e73616374696f6e732e204d617850656572731010320000000001190e6e404d756c7469736967566572696669657201404d756c746973696756657269666965720420506565724b65797300010405c502010e04000001810901410308204d617850656572731010320000000034546869734e6574776f726b4964c50208010000011d0e6f485375627374726174654272696467654170700148537562737472617465427269646765417070102841737365744b696e64730001080606f50d71090400004853696465636861696e507265636973696f6e0001080606f50d080400004053696465636861696e417373657449640001080606f50d95090400004054686973636861696e417373657449640001080606210e0d010400000185090145030001250e71144265656679011442656566790c2c417574686f7269746965730100290e04000470205468652063757272656e7420617574686f726974696573207365743856616c696461746f7253657449640100282000000000000000000474205468652063757272656e742076616c696461746f72207365742069643c4e657874417574686f7269746965730100290e040004ec20417574686f72697469657320736574207363686564756c656420746f2062652075736564207769746820746865206e6578742073657373696f6e000000005b105375646f01105375646f040c4b6579000000040004842054686520604163636f756e74496460206f6620746865207375646f206b65792e019d090159030001310e03184661756365740001a109015d030001350e501c5161546f6f6c730001a5090161030001390e703841706f6c6c6f506c6174666f726d013841706f6c6c6f506c6174666f726d283c557365724c656e64696e67496e666f0001080606d90c3d0e040004ac204c656e74206173736574202d3e204163636f756e744964202d3e204c656e64696e67506f736974696f6e4455736572426f72726f77696e67496e666f0001080606d90c410e040004150120426f72726f776564206173736574202d3e204163636f756e744964202d3e2028436f6c6c61746572616c2061737365742c20426f72726f77696e67506f736974696f6e2920506f6f6c44617461000104060d01510e04000030506f6f6c734279426c6f636b00010406100d01040004fc20426c6f636b4e756d626572202d3e20417373657449642028666f72207570646174696e6720706f6f6c7320696e7465726573747320627920626c6f636b2940417574686f726974794163636f756e740100008004beb508e2b0da93e9ab77d65934562f55d11452f0582a31f61d2257fa4e3625003c54726561737572794163636f756e7401000080987579f1d0158f7d3507f0516ac156547f0d3066bbffca4bb6d186291bbd7c1100384c656e64696e675265776172647301001840000000ed95c28f055a2a00000000000004602044656661756c74206c656e64696e67207265776172647340426f72726f77696e675265776172647301001840000080f64ae1c7022d1500000000000004682044656661756c7420626f72726f77696e672072657761726473584c656e64696e6752657761726473506572426c6f636b0100184000fcd471dd2f8700000000000000000004882044656661756c74206c656e64696e6720726577617264732070657220626c6f636b60426f72726f77696e6752657761726473506572426c6f636b01001840008ce48eed974300000000000000000004682044656661756c7420626f72726f77696e67207265776172647301090a0191030840556e7369676e65645072696f726974792820999999999999991904f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e44556e7369676e65644c6f6e6765766974792820050000000000000004e0204120636f6e66696775726174696f6e20666f72206c6f6e676576697479206f6620756e7369676e6564207472616e73616374696f6e732e01550e7238457874656e6465644173736574730138457874656e6465644173736574730c38536f756c626f756e644173736574000104060d01590e040004b0204d617070696e672066726f6d20534254202861737365745f69642920746f20697473206d6574616461746178526567756c617465644173736574546f536f756c626f756e644173736574010104060d010d0180020000000000000000000000000000000000000000000000000000000000000004c0204d617070696e672066726f6d20526567756c6174656420617373657420696420746f205342542061737365742069643453425445787069726174696f6e0001080606c10a28040004e0204d617070696e672066726f6d2053425420617373657420696420746f206974732065787069726174696f6e20706572206163636f756e74010d0a01950304604d6178526567756c6174656441737365747350657253425410101027000004dc204d6178206e756d626572206f6620726567756c617465642061737365747320706572206f6e6520536f756c626f756e6420546f6b656e01610e73650e041c40436865636b5370656356657273696f6e710e1038436865636b547856657273696f6e750e1030436865636b47656e65736973790e2c38436865636b4d6f7274616c6974797d0e2c28436865636b4e6f6e6365850ea82c436865636b576569676874890ea8604368617267655472616e73616374696f6e5061796d656e748d0ea8910e \ No newline at end of file diff --git a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/assetsettings/AssetSettingsViewModelTest.kt b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/assetsettings/AssetSettingsViewModelTest.kt index 4def8aeaf..76afdf170 100644 --- a/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/assetsettings/AssetSettingsViewModelTest.kt +++ b/feature_assets_impl/src/test/java/jp/co/soramitsu/feature_assets_impl/presentation/assetsettings/AssetSettingsViewModelTest.kt @@ -49,11 +49,11 @@ import jp.co.soramitsu.feature_assets_api.presentation.AssetsRouter import jp.co.soramitsu.feature_assets_impl.presentation.screens.fullassetsettings.FullAssetSettingsViewModel import jp.co.soramitsu.feature_assets_impl.presentation.states.AssetSettingsState import jp.co.soramitsu.test_data.TestAssets +import jp.co.soramitsu.test_data.TestTokens.daiToken +import jp.co.soramitsu.test_data.TestTokens.ethToken import jp.co.soramitsu.test_data.TestTokens.pswapToken import jp.co.soramitsu.test_data.TestTokens.valToken import jp.co.soramitsu.test_data.TestTokens.xorToken -import jp.co.soramitsu.test_data.TestTokens.xstToken -import jp.co.soramitsu.test_data.TestTokens.xstusdToken import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest @@ -367,7 +367,7 @@ class AssetSettingsViewModelTest { verify(assetsInteractor).tokenFavoriteOff(listOf("0x0200050000000000000000000000000000000000000000000000000000000000")) viewModel.onFavoriteClick(mappedModels[3]) advanceUntilIdle() - verify(assetsInteractor).tokenFavoriteOff(listOf("0x0200080000000000000000000000000000000000000000000000000000000000")) + verify(assetsInteractor).tokenFavoriteOff(listOf("0x0200060000000000000000000000000000000000000000000000000000000000")) viewModel.onFavoriteClick(mappedModels[5]) advanceUntilIdle() verify(assetsInteractor).tokenFavoriteOff(listOf("token_id")) @@ -521,14 +521,14 @@ class AssetSettingsViewModelTest { true, ), Asset( - xstusdToken, + daiToken, visibility[3], 4, TestAssets.balance(BigDecimal.ONE), true ), Asset( - xstToken, + ethToken, visibility[4], 5, TestAssets.balance(BigDecimal.ONE), diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8b700441b..53aa77ccf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,13 @@ [versions] -agp = "8.7.0" +agp = "8.7.1" kotlin = "1.9.24" appcompat = "1.7.0" coroutines = "1.8.1" coreKtx = "1.13.1" constraint = "2.2.0-alpha05" biometric = "1.1.0" -navigation = "2.8.2" -navigationCompose = "2.8.2" +navigation = "2.8.3" +navigationCompose = "2.8.3" lottie = "4.2.0" insetter = "0.6.1" workManager = "2.9.1" @@ -24,11 +24,11 @@ androidxTestExtJunit = "1.2.1" androidxTestEspressoCore = "3.6.1" archCoreTest = "2.2.0" archComponents = "2.8.6" -activityCompose = "1.9.2" +activityCompose = "1.9.3" material = "1.12.0" fragmentKtx = "1.8.4" permission = "1.7.1" -compose-bom = "2024.09.03" +compose-bom = "2024.10.00" composeLifecycle = "2.8.6" composeConstraintLayout = "1.1.0-alpha05" firebasebom = "32.7.0" @@ -48,7 +48,7 @@ webSocketLib = "2.14" web3j = "4.6.0-android" zXing = "3.3.3" zXingEmbedded = "4.3.0" -activityKtx = "1.9.2" +activityKtx = "1.9.3" xserializationjson = "1.6.3" gson = "2.10.1" datastore = "1.0.0" @@ -56,13 +56,13 @@ room = "2.6.1" lazySodium = "5.0.2" jna = "5.8.0" kover = "0.8.3" -soramitsuSoracard = "1.1.18" +soramitsuSoracard = "1.1.20" soramitsuXnetworking = "1.0.10" soramitsuXsubstrate = "1.2.7" soramitsuUicore = "0.2.37" soramitsuXbackup = "1.2.2" soramitsuXcrypto = "1.2.6" -soramitsuAndroidFoundation = "0.0.1" +soramitsuAndroidFoundation = "0.0.2" [libraries] soramitsu-android-foundation = { module = "jp.co.soramitsu:android-foundation", version.ref = "soramitsuAndroidFoundation" } diff --git a/test_data/src/main/java/jp/co/soramitsu/test_data/Tokens.kt b/test_data/src/main/java/jp/co/soramitsu/test_data/Tokens.kt index c7780ebea..bc7b05074 100644 --- a/test_data/src/main/java/jp/co/soramitsu/test_data/Tokens.kt +++ b/test_data/src/main/java/jp/co/soramitsu/test_data/Tokens.kt @@ -85,7 +85,7 @@ object TestTokens { ) val ethToken = Token( - "0x0200060000000000000000000000000000000000000000000000000000000000", + "0x0200070000000000000000000000000000000000000000000000000000000000", "ethereum", "ETH", 18, @@ -145,7 +145,7 @@ object TestTokens { ) val daiToken = Token( - "0x020009", + "0x0200060000000000000000000000000000000000000000000000000000000000", "dai stable", "DAI", 18, From efa303fb1d03ccd56661abe00d374cc547a3641b Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 29 Oct 2024 10:54:09 +0300 Subject: [PATCH 38/43] mwr-911 --- .../assetdetails/AssetDetailsViewModel.kt | 56 +++++++++++++++---- .../presentation/profile/ProfileViewModel.kt | 5 +- .../util/SoraCardContractUtil.kt | 5 ++ .../details/SoraCardDetailsViewModel.kt | 5 +- .../cardshub/CardsHubViewModel.kt | 4 +- gradle/libs.versions.toml | 8 +-- 6 files changed, 65 insertions(+), 18 deletions(-) diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt index aa82b6a11..70986ca3b 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt @@ -70,7 +70,9 @@ import jp.co.soramitsu.feature_blockexplorer_api.data.SoraConfigManager import jp.co.soramitsu.feature_blockexplorer_api.domain.TransactionHistoryHandler import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter +import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardGateHubContract +import jp.co.soramitsu.feature_sora_card_api.util.readyToStartGatehubOnboarding import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData import jp.co.soramitsu.sora.substrate.runtime.SubstrateOptionsProvider @@ -92,6 +94,7 @@ class AssetDetailsViewModel @AssistedInject constructor( private val resourceManager: ResourceManager, private val soraConfigManager: SoraConfigManager, private val coroutineManager: CoroutineManager, + private val soraCardInteractor: SoraCardInteractor, ) : BaseViewModel() { @AssistedFactory @@ -157,7 +160,8 @@ class AssetDetailsViewModel @AssistedInject constructor( tokenName = asset.token.name, tokenIcon = asset.token.iconUri(), tokenSymbol = asset.token.symbol, - poolsCardTitle = resourceManager.getString(R.string.asset_details_your_pools).format(asset.token.symbol), + poolsCardTitle = resourceManager.getString(R.string.asset_details_your_pools) + .format(asset.token.symbol), price = asset.token.formatFiatOrEmpty( asset.token.fiatPrice, numbersFormatter, @@ -176,12 +180,19 @@ class AssetDetailsViewModel @AssistedInject constructor( numbersFormatter, ), frozenBalance = if (assetId == SubstrateOptionsProvider.feeAssetId) { - asset.token.printBalance(xorAssetBalance?.frozen ?: BigDecimal.ZERO, numbersFormatter, AssetHolder.ROUNDING) + asset.token.printBalance( + xorAssetBalance?.frozen ?: BigDecimal.ZERO, + numbersFormatter, + AssetHolder.ROUNDING + ) } else { null }, frozenBalanceFiat = if (assetId == SubstrateOptionsProvider.feeAssetId) { - asset.token.printFiat(xorAssetBalance?.frozen ?: BigDecimal.ZERO, numbersFormatter) + asset.token.printFiat( + xorAssetBalance?.frozen ?: BigDecimal.ZERO, + numbersFormatter + ) } else { null }, @@ -257,17 +268,41 @@ class AssetDetailsViewModel @AssistedInject constructor( state = curState.copy( state = curState.state.copy( xorBalance = FrozenXorDetailsModel( - token.printBalance(xorBalance.frozen, numbersFormatter, AssetHolder.ROUNDING), + token.printBalance( + xorBalance.frozen, + numbersFormatter, + AssetHolder.ROUNDING, + ), token.printFiat(xorBalance.frozen, numbersFormatter), - token.printBalance(xorBalance.bonded, numbersFormatter, AssetHolder.ROUNDING), + token.printBalance( + xorBalance.bonded, + numbersFormatter, + AssetHolder.ROUNDING, + ), token.printFiat(xorBalance.bonded, numbersFormatter), - token.printBalance(xorBalance.locked, numbersFormatter, AssetHolder.ROUNDING), + token.printBalance( + xorBalance.locked, + numbersFormatter, + AssetHolder.ROUNDING, + ), token.printFiat(xorBalance.locked, numbersFormatter), - token.printBalance(xorBalance.reserved, numbersFormatter, AssetHolder.ROUNDING), + token.printBalance( + xorBalance.reserved, + numbersFormatter, + AssetHolder.ROUNDING, + ), token.printFiat(xorBalance.reserved, numbersFormatter), - token.printBalance(xorBalance.redeemable, numbersFormatter, AssetHolder.ROUNDING), + token.printBalance( + xorBalance.redeemable, + numbersFormatter, + AssetHolder.ROUNDING, + ), token.printFiat(xorBalance.redeemable, numbersFormatter), - token.printBalance(xorBalance.unbonding, numbersFormatter, AssetHolder.ROUNDING), + token.printBalance( + xorBalance.unbonding, + numbersFormatter, + AssetHolder.ROUNDING, + ), token.printFiat(xorBalance.unbonding, numbersFormatter), ) ) @@ -284,6 +319,7 @@ class AssetDetailsViewModel @AssistedInject constructor( } fun onBuyCrypto() { - _launchSoraCardSignIn.value = createSoraCardGateHubContract() + if (soraCardInteractor.basicStatus.value.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding()) + _launchSoraCardSignIn.value = createSoraCardGateHubContract() } } diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt index 0c2e82d4a..2700667cc 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt @@ -50,6 +50,7 @@ import jp.co.soramitsu.feature_select_node_api.SelectNodeRouter import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardContract import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardGateHubContract +import jp.co.soramitsu.feature_sora_card_api.util.readyToStartGatehubOnboarding import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus import jp.co.soramitsu.oauth.base.sdk.contract.OutwardsScreen @@ -200,7 +201,9 @@ class ProfileViewModel @Inject constructor( } fun showBuyCrypto() { - _launchSoraCardSignIn.value = createSoraCardGateHubContract() + if (soraCardInteractor.basicStatus.value.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding()) { + _launchSoraCardSignIn.value = createSoraCardGateHubContract() + } } fun showSelectNode() { diff --git a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt index f5b7260ba..f961ab4e1 100644 --- a/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt +++ b/feature_sora_card_api/src/main/java/jp/co/soramitsu/feature_sora_card_api/util/SoraCardContractUtil.kt @@ -40,10 +40,15 @@ import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.common.util.Flavor import jp.co.soramitsu.oauth.base.sdk.SoraCardEnvironmentType import jp.co.soramitsu.oauth.base.sdk.SoraCardKycCredentials +import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardBasicContractData import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardFlow +fun IbanStatus?.readyToStartGatehubOnboarding(): Boolean { + return (this != null) && (this == IbanStatus.ACTIVE) +} + fun createSoraCardBasicContract() = SoraCardBasicContractData( apiKey = BuildConfig.SORA_CARD_API_KEY, domain = BuildConfig.SORA_CARD_DOMAIN, diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index 804e1365a..09c63ea9f 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -46,6 +46,7 @@ import jp.co.soramitsu.common.presentation.viewmodel.BaseViewModel import jp.co.soramitsu.common.util.BuildUtils import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardGateHubContract +import jp.co.soramitsu.feature_sora_card_api.util.readyToStartGatehubOnboarding import jp.co.soramitsu.oauth.base.sdk.contract.IbanInfo import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData @@ -165,7 +166,9 @@ class SoraCardDetailsViewModel @Inject constructor( } fun onExchangeXorClick() { - _launchSoraCard.value = createSoraCardGateHubContract() + if (soraCardInteractor.basicStatus.value.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding()) { + _launchSoraCard.value = createSoraCardGateHubContract() + } } fun onSettingsOptionClick(position: Int, context: Context?) { diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt index ef9221a2a..3a87d7315 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt @@ -77,9 +77,9 @@ import jp.co.soramitsu.feature_referral_api.ReferralRouter import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardContract import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardGateHubContract +import jp.co.soramitsu.feature_sora_card_api.util.readyToStartGatehubOnboarding import jp.co.soramitsu.feature_wallet_api.launcher.WalletRouter import jp.co.soramitsu.feature_wallet_impl.domain.CardsHubInteractorImpl -import jp.co.soramitsu.oauth.base.sdk.contract.IbanStatus import jp.co.soramitsu.oauth.base.sdk.contract.OutwardsScreen import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardCommonVerification import jp.co.soramitsu.oauth.base.sdk.contract.SoraCardContractData @@ -454,7 +454,7 @@ class CardsHubViewModel @Inject constructor( if (!connectionManager.isConnected) return if (soraCardInteractor.basicStatus.value.initialized) { _state.value.cards.filterIsInstance().firstOrNull()?.let { card -> - if (card.ibanBalance?.ibanStatus == IbanStatus.ACTIVE) { + if (card.ibanBalance?.ibanStatus.readyToStartGatehubOnboarding()) { _launchSoraCardSignIn.value = createSoraCardGateHubContract() } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 53aa77ccf..1bc8bd25c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -56,13 +56,13 @@ room = "2.6.1" lazySodium = "5.0.2" jna = "5.8.0" kover = "0.8.3" -soramitsuSoracard = "1.1.20" +soramitsuSoracard = "1.1.21" soramitsuXnetworking = "1.0.10" soramitsuXsubstrate = "1.2.7" soramitsuUicore = "0.2.37" -soramitsuXbackup = "1.2.2" -soramitsuXcrypto = "1.2.6" -soramitsuAndroidFoundation = "0.0.2" +soramitsuXbackup = "1.2.3" +soramitsuXcrypto = "1.2.7" +soramitsuAndroidFoundation = "0.0.3" [libraries] soramitsu-android-foundation = { module = "jp.co.soramitsu:android-foundation", version.ref = "soramitsuAndroidFoundation" } From 4a10f583803cfdf4175f16754328a89f08e7aa79 Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 29 Oct 2024 11:36:09 +0300 Subject: [PATCH 39/43] release soralution v3.8.6.1 141 --- app/build.gradle.kts | 8 ++++---- .../presentation/profile/ProfileViewModelTest.kt | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 280c97da8..c59000924 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,7 +19,7 @@ kotlin { jvmToolchain(17) } -// soralution 140 3.8.6.0 2024.10.21 +// soralution 141 3.8.6.1 2024.10.29 // sora dae 118 3.8.5.3 2024.10.23 android { @@ -30,8 +30,8 @@ android { applicationId = "jp.co.soramitsu.sora" minSdk = 26 targetSdk = 34 - versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 140 - versionName = "3.8.6.0" + versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 141 + versionName = "3.8.6.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true // resConfigs "en", "ru", "es", "fr", "de", "nb", "in", "tr", "ar" @@ -172,7 +172,7 @@ play { serviceAccountCredentials = file(System.getenv("CI_PLAY_KEY") ?: "../key/fake.json") track = "internal" releaseStatus = ReleaseStatus.DRAFT - releaseName = "3.8.6.0 - SORA Card Improvements" + releaseName = "3.8.6.1 - SORA Card Improvements" defaultToAppBundles = true } diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt index dba2d7ca3..95cac909c 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModelTest.kt @@ -198,13 +198,13 @@ class ProfileViewModelTest { @Test fun `call showBuyCrypto EXPECT navigate to buy crypto screen`() { every { soraCardInteractor.basicStatus } returns - MutableStateFlow( - soraCardBasicStatusTest.copy( - initialized = true, - verification = SoraCardCommonVerification.Pending, - ibanInfo = IbanInfo("", IbanStatus.ACTIVE, "", "") - ) + MutableStateFlow( + soraCardBasicStatusTest.copy( + initialized = true, + verification = SoraCardCommonVerification.Pending, + ibanInfo = IbanInfo("", IbanStatus.ACTIVE, "", "") ) + ) initViewModel() profileViewModel.showBuyCrypto() val launch = profileViewModel.launchSoraCardSignIn.getOrAwaitValue() From d646c6812deb381800e92ea123f137a14eabe689 Mon Sep 17 00:00:00 2001 From: arvifox Date: Tue, 29 Oct 2024 23:39:31 +0300 Subject: [PATCH 40/43] mwr-911 fix from google console --- .../compose/components/BasicBannerCard.kt | 9 +++++++- .../presentation/compose/states/CardState.kt | 2 +- .../assetdetails/AssetDetailsViewModel.kt | 5 ++--- .../presentation/profile/ProfileScreen.kt | 21 +++++++++++-------- .../profile/ProfileScreenState.kt | 2 ++ .../presentation/profile/ProfileViewModel.kt | 5 ++--- .../details/SoraCardDetailsScreen.kt | 1 + .../details/SoraCardDetailsViewModel.kt | 11 ++++++---- .../details/SoraCardMainSoraContentCard.kt | 12 +++++++---- .../presentation/cardshub/BuyXorCard.kt | 4 ++++ .../presentation/cardshub/CardsHubFragment.kt | 5 +++-- .../cardshub/CardsHubViewModel.kt | 15 +++++++------ 12 files changed, 59 insertions(+), 33 deletions(-) diff --git a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/BasicBannerCard.kt b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/BasicBannerCard.kt index a397f0d47..cfb154389 100644 --- a/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/BasicBannerCard.kt +++ b/common/src/main/java/jp/co/soramitsu/common/presentation/compose/components/BasicBannerCard.kt @@ -71,13 +71,14 @@ fun BasicBannerCard( title: String, description: String, button: String, + buttonEnabled: Boolean = true, onButtonClicked: () -> Unit, closeEnabled: Boolean, onCloseCard: () -> Unit, ) { ContentCard( modifier = Modifier.fillMaxWidth(), - onClick = onButtonClicked, + onClick = if (buttonEnabled) onButtonClicked else null, ) { Box( modifier = Modifier @@ -103,6 +104,7 @@ fun BasicBannerCard( description = description, button = button, onStartClicked = onButtonClicked, + buttonEnabled = buttonEnabled, ) Image( @@ -144,6 +146,7 @@ private fun CardContent( title: String, description: String, button: String, + buttonEnabled: Boolean, onStartClicked: () -> Unit, ) { Column( @@ -174,6 +177,7 @@ private fun CardContent( .padding(top = Dimens.x1_5), text = button, size = Size.ExtraSmall, + enabled = buttonEnabled, order = Order.PRIMARY, onClick = onStartClicked, ) @@ -188,6 +192,7 @@ private fun PreviewBasicBannerCard1() { title = "Some title of banner card, let it be longeeerr", description = "Long description of banner card, The quick brown fox jumps over the lazy dog, The quick brown fox jumps over the lazy dog.And I, even I Artaxerxes the king, do make a decree to all the treasurers which are beyond the river, that whatsoever Ezra the priest, the scribe of the law of the God of heaven, shall require of you, it be done speedily", button = "Just button title", + buttonEnabled = true, closeEnabled = true, onCloseCard = {}, onButtonClicked = {}, @@ -202,6 +207,7 @@ private fun PreviewBasicBannerCard12() { title = "Some title", description = "Long description of banner", button = "Just button title", + buttonEnabled = true, closeEnabled = false, onCloseCard = {}, onButtonClicked = {}, @@ -216,6 +222,7 @@ private fun PreviewBasicBannerCard2() { title = "Title", description = "Description", button = "Button", + buttonEnabled = true, closeEnabled = true, onCloseCard = {}, onButtonClicked = {}, diff --git a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/states/CardState.kt b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/states/CardState.kt index 5e3162e8f..306810f7e 100644 --- a/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/states/CardState.kt +++ b/common_wallet/src/main/java/jp/co/soramitsu/common_wallet/presentation/compose/states/CardState.kt @@ -133,7 +133,7 @@ data class SoraCardState( override val loading: Boolean, ) : BasicBannerCardState(loading) -data object BuyXorState : BasicBannerCardState(false) +data class BuyXorState(val canStartGatehub: Boolean) : BasicBannerCardState(false) data object ReferralState : BasicBannerCardState(false) diff --git a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt index 70986ca3b..a0cabcdbb 100644 --- a/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt +++ b/feature_assets_impl/src/main/java/jp/co/soramitsu/feature_assets_impl/presentation/screens/assetdetails/AssetDetailsViewModel.kt @@ -197,7 +197,7 @@ class AssetDetailsViewModel @AssistedInject constructor( null }, isTransferableBalanceAvailable = asset.balance.transferable > BigDecimal.ZERO, - buyCryptoAvailable = soraCard && (asset.token.id == SubstrateOptionsProvider.feeAssetId), + buyCryptoAvailable = soraCard && (asset.token.id == SubstrateOptionsProvider.feeAssetId) && soraCardInteractor.basicStatus.value.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding(), ) ) } @@ -319,7 +319,6 @@ class AssetDetailsViewModel @AssistedInject constructor( } fun onBuyCrypto() { - if (soraCardInteractor.basicStatus.value.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding()) - _launchSoraCardSignIn.value = createSoraCardGateHubContract() + _launchSoraCardSignIn.value = createSoraCardGateHubContract() } } diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt index 439e20f53..f76b49ed5 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreen.kt @@ -85,15 +85,17 @@ internal fun ProfileItems( icon = R.drawable.ic_buy_crypto, onClick = onSoraCardClick, ) - CategoryItem( - modifier = Modifier - .testTagAsId("BuyXor") - .padding(top = Dimens.x2), - title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), - subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), - icon = R.drawable.ic_settings_buy_crypto, - onClick = onBuyCrypto, - ) + if (state.canStartGatehubOnboarding) { + CategoryItem( + modifier = Modifier + .testTagAsId("BuyXor") + .padding(top = Dimens.x2), + title = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_title), + subtitle = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), + icon = R.drawable.ic_settings_buy_crypto, + onClick = onBuyCrypto, + ) + } } CategoryItem( modifier = Modifier @@ -179,6 +181,7 @@ private fun PreviewProfile() { soraCardStatusStringRes = R.string.more_menu_sora_card_subtitle, soraCardStatusIconDrawableRes = R.drawable.ic_connection_indicator_green, soraCardIbanError = null, + canStartGatehubOnboarding = true, ), onAccountsClick = { }, onSoraCardClick = { }, diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreenState.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreenState.kt index 4cea16d4e..e37919e17 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreenState.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileScreenState.kt @@ -44,6 +44,7 @@ internal data class ProfileScreenState( val soraCardStatusStringRes: Int, val soraCardIbanError: String?, val soraCardStatusIconDrawableRes: Int?, + val canStartGatehubOnboarding: Boolean, ) internal val initialProfileScreenState = @@ -56,4 +57,5 @@ internal val initialProfileScreenState = soraCardStatusIconDrawableRes = null, soraCardNeedUpdate = false, soraCardIbanError = null, + canStartGatehubOnboarding = false, ) diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt index 2700667cc..a9795e776 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/profile/ProfileViewModel.kt @@ -138,6 +138,7 @@ class ProfileViewModel @Inject constructor( soraCardStatusIconDrawableRes = soraCardStatusIconDrawableRes, soraCardEnabled = soraConfigManager.getSoraCard(), soraCardNeedUpdate = it.needInstallUpdate, + canStartGatehubOnboarding = it.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding(), ) } .launchIn(viewModelScope) @@ -201,9 +202,7 @@ class ProfileViewModel @Inject constructor( } fun showBuyCrypto() { - if (soraCardInteractor.basicStatus.value.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding()) { - _launchSoraCardSignIn.value = createSoraCardGateHubContract() - } + _launchSoraCardSignIn.value = createSoraCardGateHubContract() } fun showSelectNode() { diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt index ff615b76f..e8930a46c 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsScreen.kt @@ -155,6 +155,7 @@ private fun PreviewSoraCardDetailsScreen() { balance = "3665.50", phone = "987654", soraCardMenuActions = SoraCardMenuAction.entries, + canStartGatehubFlow = true, ), soraCardReferralBannerCardState = true, soraCardRecentActivitiesCardState = SoraCardRecentActivitiesCardState( diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt index 09c63ea9f..18e63f6be 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardDetailsViewModel.kt @@ -81,6 +81,7 @@ class SoraCardDetailsViewModel @Inject constructor( balance = null, phone = null, soraCardMenuActions = SoraCardMenuAction.entries, + canStartGatehubFlow = false, ), soraCardSettingsCard = SoraCardSettingsCardState( soraCardSettingsOptions = SoraCardSettingsOption.entries, @@ -116,10 +117,11 @@ class SoraCardDetailsViewModel @Inject constructor( soraCardMainSoraContentCardState = local.soraCardMainSoraContentCardState.copy( balance = basicStatus.ibanInfo?.balance, phone = phoneFormatted, + canStartGatehubFlow = basicStatus.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding(), ), soraCardSettingsCard = local.soraCardSettingsCard?.copy( phone = phoneFormatted.orEmpty(), - ) + ), ) } } @@ -165,10 +167,11 @@ class SoraCardDetailsViewModel @Inject constructor( } } + /** + * only clickable if IBAN is issued + */ fun onExchangeXorClick() { - if (soraCardInteractor.basicStatus.value.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding()) { - _launchSoraCard.value = createSoraCardGateHubContract() - } + _launchSoraCard.value = createSoraCardGateHubContract() } fun onSettingsOptionClick(position: Int, context: Context?) { diff --git a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt index 852c70fcd..35a7779b6 100644 --- a/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt +++ b/feature_sora_card_impl/src/main/java/jp/co/soramitsu/feature_sora_card_impl/presentation/details/SoraCardMainSoraContentCard.kt @@ -70,6 +70,7 @@ data class SoraCardMainSoraContentCardState( val phone: String?, val actionsEnabled: Boolean = false, val soraCardMenuActions: List, + val canStartGatehubFlow: Boolean, ) { val menuState: List @@ -180,7 +181,7 @@ fun SoraCardMainSoraContentCard( .padding(horizontal = Dimens.x1) .weight(1f), size = Size.Large, - enabled = true, + enabled = soraCardMainSoraContentCardState.canStartGatehubFlow, order = Order.PRIMARY, onClick = onExchangeXor, text = stringResource(id = jp.co.soramitsu.oauth.R.string.exchange_xor), @@ -206,7 +207,8 @@ private fun PreviewMainSoraContentCard() { soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( balance = "3644.50", phone = "", - soraCardMenuActions = SoraCardMenuAction.entries + soraCardMenuActions = SoraCardMenuAction.entries, + canStartGatehubFlow = true, ), onShowMoreClick = {}, onIconButtonClick = { _ -> }, @@ -222,7 +224,8 @@ private fun PreviewMainSoraContentCard2() { soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( balance = "3644.50", phone = "", - soraCardMenuActions = SoraCardMenuAction.entries + soraCardMenuActions = SoraCardMenuAction.entries, + canStartGatehubFlow = true, ), onShowMoreClick = {}, onIconButtonClick = { _ -> }, @@ -238,7 +241,8 @@ private fun PreviewMainSoraContentCard3() { soraCardMainSoraContentCardState = SoraCardMainSoraContentCardState( balance = null, phone = "", - soraCardMenuActions = SoraCardMenuAction.entries + soraCardMenuActions = SoraCardMenuAction.entries, + canStartGatehubFlow = true, ), onShowMoreClick = {}, onIconButtonClick = { _ -> }, diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/BuyXorCard.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/BuyXorCard.kt index 15daa0795..f0d3ab5eb 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/BuyXorCard.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/BuyXorCard.kt @@ -42,6 +42,7 @@ import jp.co.soramitsu.common.presentation.compose.theme.SoraAppTheme @Composable fun BuyXorCard( + buttonEnabled: Boolean, onCloseCard: () -> Unit, onBuyXorClicked: () -> Unit, ) { @@ -50,6 +51,7 @@ fun BuyXorCard( title = stringResource(id = R.string.buy_crypto_buy_xor_banner_title), description = stringResource(id = R.string.buy_crypto_buy_xor_with_fiat_subtitle), button = stringResource(id = R.string.common_buy_xor), + buttonEnabled = buttonEnabled, closeEnabled = true, onButtonClicked = onBuyXorClicked, onCloseCard = onCloseCard, @@ -61,6 +63,7 @@ fun BuyXorCard( private fun PreviewBuyXorCard01() { SoraAppTheme { BuyXorCard( + buttonEnabled = true, onCloseCard = {}, onBuyXorClicked = {}, ) @@ -72,6 +75,7 @@ private fun PreviewBuyXorCard01() { private fun PreviewBuyXorCard02() { SoraAppTheme { BuyXorCard( + buttonEnabled = true, onCloseCard = {}, onBuyXorClicked = {}, ) diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubFragment.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubFragment.kt index 646d626ac..9e0de8070 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubFragment.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubFragment.kt @@ -210,8 +210,9 @@ private fun CardsMainScreen( onStartClicked = onBackupBannerClick, ) } - BuyXorState -> { + is BuyXorState -> { BuyXorCard( + buttonEnabled = cardState.canStartGatehub, onBuyXorClicked = onBuyXorClick, onCloseCard = onBuyXorClose, ) @@ -260,7 +261,7 @@ private fun PreviewCardsMainScreen() { accountAddress = "", loading = true, cards = listOf( - BuyXorState, ReferralState, BackupWalletState, + BuyXorState(true), ReferralState, BackupWalletState, ), ), {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {} diff --git a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt index 3a87d7315..0e92b209c 100644 --- a/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt +++ b/feature_wallet_impl/src/main/java/jp/co/soramitsu/feature_wallet_impl/presentation/cardshub/CardsHubViewModel.kt @@ -74,6 +74,7 @@ import jp.co.soramitsu.feature_main_api.launcher.MainRouter import jp.co.soramitsu.feature_polkaswap_api.domain.interfaces.PoolsInteractor import jp.co.soramitsu.feature_polkaswap_api.launcher.PolkaswapRouter import jp.co.soramitsu.feature_referral_api.ReferralRouter +import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardBasicStatus import jp.co.soramitsu.feature_sora_card_api.domain.SoraCardInteractor import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardContract import jp.co.soramitsu.feature_sora_card_api.util.createSoraCardGateHubContract @@ -218,9 +219,13 @@ class CardsHubViewModel @Inject constructor( } CardHubType.BUY_XOR_TOKEN -> { - flowOf( - cardHub to BuyXorState - ) + soraCardInteractor.basicStatus + .map { soraCardBasicStatus: SoraCardBasicStatus -> + cardHub to BuyXorState(soraCardBasicStatus.ibanInfo?.ibanStatus.readyToStartGatehubOnboarding()) + } + .onStart { + cardHub to BuyXorState(false) + } } } } @@ -454,9 +459,7 @@ class CardsHubViewModel @Inject constructor( if (!connectionManager.isConnected) return if (soraCardInteractor.basicStatus.value.initialized) { _state.value.cards.filterIsInstance().firstOrNull()?.let { card -> - if (card.ibanBalance?.ibanStatus.readyToStartGatehubOnboarding()) { - _launchSoraCardSignIn.value = createSoraCardGateHubContract() - } + _launchSoraCardSignIn.value = createSoraCardGateHubContract() } } } From ffbe2def37d153eff89cad27b38a4b4f68c4696a Mon Sep 17 00:00:00 2001 From: arvifox Date: Wed, 30 Oct 2024 11:18:19 +0300 Subject: [PATCH 41/43] release soralution v3.8.6.2 142 --- app/build.gradle.kts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c59000924..7a2dab680 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,7 +19,7 @@ kotlin { jvmToolchain(17) } -// soralution 141 3.8.6.1 2024.10.29 +// soralution 142 3.8.6.2 2024.10.30 // sora dae 118 3.8.5.3 2024.10.23 android { @@ -30,8 +30,8 @@ android { applicationId = "jp.co.soramitsu.sora" minSdk = 26 targetSdk = 34 - versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 141 - versionName = "3.8.6.1" + versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 142 + versionName = "3.8.6.2" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true // resConfigs "en", "ru", "es", "fr", "de", "nb", "in", "tr", "ar" @@ -172,7 +172,7 @@ play { serviceAccountCredentials = file(System.getenv("CI_PLAY_KEY") ?: "../key/fake.json") track = "internal" releaseStatus = ReleaseStatus.DRAFT - releaseName = "3.8.6.1 - SORA Card Improvements" + releaseName = "3.8.6.2 - SORA Card Improvements" defaultToAppBundles = true } From 3b2d2d5aaa98ae547b397278205521c9ca0d3e16 Mon Sep 17 00:00:00 2001 From: arvifox Date: Thu, 31 Oct 2024 16:52:33 +0300 Subject: [PATCH 42/43] mwr-1031 --- app/build.gradle.kts | 2 ++ .../soramitsu/sora/splash/domain/MigrationManager.kt | 1 - .../sora/splash/presentation/SplashViewModel.kt | 4 +++- .../sora/splash/presentation/SplashViewModelTest.kt | 12 ++++++++++-- .../data/repository/UserRepositoryImpl.kt | 6 +++--- .../feature_main_impl/domain/PinCodeInteractor.kt | 8 ++++++-- .../presentation/pincode/PinCodeViewModel.kt | 5 ----- .../domain/PinCodeInteractorTest.kt | 1 + .../sora/substrate/runtime/RuntimeManager.kt | 2 +- 9 files changed, 26 insertions(+), 15 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7a2dab680..55fe0c71d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -239,11 +239,13 @@ dependencies { implementation(libs.webSocketLibDep) + testImplementation(project(":test_data")) testImplementation(libs.coroutineTestDep) testImplementation(libs.junitDep) testImplementation(libs.mockkDep) testImplementation(libs.mockitoKotlinDep) testImplementation(libs.archCoreTestDep) + testImplementation(libs.truthDep) kover(project(":common")) kover(project(":common_wallet")) diff --git a/app/src/main/java/jp/co/soramitsu/sora/splash/domain/MigrationManager.kt b/app/src/main/java/jp/co/soramitsu/sora/splash/domain/MigrationManager.kt index fa496df5e..eb8f23c86 100644 --- a/app/src/main/java/jp/co/soramitsu/sora/splash/domain/MigrationManager.kt +++ b/app/src/main/java/jp/co/soramitsu/sora/splash/domain/MigrationManager.kt @@ -66,7 +66,6 @@ class MigrationManager @Inject constructor( FirebaseWrapper.log("Migration ma done") } } - userRepository.defaultGlobalCards() return true } } diff --git a/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt b/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt index 52b0e65b0..a80184a54 100644 --- a/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt +++ b/app/src/main/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModel.kt @@ -37,6 +37,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.fragment.SingleLiveEvent import jp.co.soramitsu.androidfoundation.fragment.trigger import jp.co.soramitsu.common.logger.FirebaseWrapper @@ -49,6 +50,7 @@ import kotlinx.coroutines.launch @HiltViewModel class SplashViewModel @Inject constructor( private val interactor: SplashInteractor, + coroutineManager: CoroutineManager, ) : BaseViewModel() { private val _runtimeInitiated = MutableLiveData() @@ -73,7 +75,7 @@ class SplashViewModel @Inject constructor( loadingTextVisiblity.trigger() } } - viewModelScope.launch { + viewModelScope.launch(coroutineManager.io) { interactor.checkMigration() } } diff --git a/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt b/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt index 2fbd4a485..240811e01 100644 --- a/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt +++ b/app/src/test/java/jp/co/soramitsu/sora/splash/presentation/SplashViewModelTest.kt @@ -35,12 +35,14 @@ package jp.co.soramitsu.sora.splash.presentation import androidx.arch.core.executor.testing.InstantTaskExecutorRule import io.mockk.every import io.mockk.mockkObject +import jp.co.soramitsu.androidfoundation.coroutine.CoroutineManager import jp.co.soramitsu.androidfoundation.testing.MainCoroutineRule import jp.co.soramitsu.androidfoundation.testing.getOrAwaitValue import jp.co.soramitsu.common.logger.FirebaseWrapper import jp.co.soramitsu.feature_account_api.domain.model.OnboardingState import jp.co.soramitsu.sora.splash.domain.SplashInteractor import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest @@ -53,6 +55,7 @@ import org.junit.runner.RunWith import org.mockito.BDDMockito.given import org.mockito.Mock import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.whenever @ExperimentalCoroutinesApi @RunWith(MockitoJUnitRunner::class) @@ -68,13 +71,18 @@ class SplashViewModelTest { @Mock private lateinit var interactor: SplashInteractor + @Mock + private lateinit var coroutineManager: CoroutineManager + private lateinit var splashViewModel: SplashViewModel + @OptIn(ExperimentalStdlibApi::class) @Before - fun setUp() { + fun setUp() = runTest { mockkObject(FirebaseWrapper) every { FirebaseWrapper.log("Splash next screen true") } returns Unit - splashViewModel = SplashViewModel(interactor) + whenever(coroutineManager.io).thenReturn(this.coroutineContext[CoroutineDispatcher]!!) + splashViewModel = SplashViewModel(interactor, coroutineManager) } @Test diff --git a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryImpl.kt b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryImpl.kt index d35631cb0..1c1757174 100644 --- a/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryImpl.kt +++ b/feature_account_impl/src/main/java/jp/co/soramitsu/feature_account_impl/data/repository/UserRepositoryImpl.kt @@ -60,7 +60,7 @@ class UserRepositoryImpl( private val userDatasource: UserDatasource, private val credentialsDatasource: CredentialsDatasource, private val db: AppDatabase, - private val coroutineManager: CoroutineManager, + coroutineManager: CoroutineManager, private val languagesHolder: LanguagesHolder, ) : UserRepository { @@ -188,14 +188,14 @@ class UserRepositoryImpl( val count = db.globalCardsHubDao().count() if (count == 0) { db.globalCardsHubDao().insert( - CardHubType.values() + CardHubType.entries .filter { !it.boundToAccount } .map { cardType -> GlobalCardHubLocal( cardId = cardType.hubName, visibility = true, sortOrder = cardType.order, - collapsed = false + collapsed = false, ) } ) diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractor.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractor.kt index fd0bd7d6e..921510e53 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractor.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractor.kt @@ -84,8 +84,12 @@ class PinCodeInteractor @Inject constructor( return if (isFetched) { userRepository.needsMigration(soraAccount) } else { - val irohaData = credentialsRepository.getIrohaData(soraAccount) - val needs = walletRepository.needsMigration(irohaData.address) + val needs = if (credentialsRepository.retrieveMnemonic(soraAccount).split(" ").size == 15) { + val irohaData = credentialsRepository.getIrohaData(soraAccount) + walletRepository.needsMigration(irohaData.address) + } else { + false + } userRepository.saveNeedsMigration(needs, soraAccount) userRepository.saveIsMigrationFetched(true, soraAccount) userRepository.needsMigration(soraAccount) diff --git a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt index a9fee0994..7c6087766 100644 --- a/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt +++ b/feature_main_impl/src/main/java/jp/co/soramitsu/feature_main_impl/presentation/pincode/PinCodeViewModel.kt @@ -74,10 +74,6 @@ class PinCodeViewModel @Inject constructor( connectionManager: ConnectionManager, ) : BaseViewModel(), WithProgress by progress { - companion object { - private const val COMPLETE_PIN_CODE_DELAY: Long = 12 - } - internal var state by mutableStateOf( PinCodeScreenState( maxDotsCount = PinCodeInteractor.PINCODE_LENGTH, @@ -269,7 +265,6 @@ class PinCodeViewModel @Inject constructor( private fun pinCodeEntered() { viewModelScope.launch { tryCatch { - delay(COMPLETE_PIN_CODE_DELAY) if (PinCodeAction.CREATE_PIN_CODE == action) { if (tempCode.isEmpty()) { tempCode = inputedCode diff --git a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractorTest.kt b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractorTest.kt index 56ad8be40..f9ed2497e 100644 --- a/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractorTest.kt +++ b/feature_main_impl/src/test/java/jp/co/soramitsu/feature_main_impl/domain/PinCodeInteractorTest.kt @@ -196,6 +196,7 @@ class PinCodeInteractorTest { given(userRepository.getCurSoraAccount()).willReturn(account) given(userRepository.isMigrationFetched(account)).willReturn(false) given(credentialsRepository.getIrohaData(account)).willReturn(irohaData) + given(credentialsRepository.retrieveMnemonic(account)).willReturn("qwe asd zxc vbn tyu qwe asd zxc vbn tyu qwe asd zxc vbn tyu") given(walletRepository.needsMigration(address)).willReturn(needsMigration) interactor.needsMigration() diff --git a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt index 977b4d8ed..8b5b91457 100644 --- a/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt +++ b/sorasubstrate/src/main/java/jp/co/soramitsu/sora/substrate/runtime/RuntimeManager.kt @@ -283,6 +283,6 @@ class RuntimeManager @Inject constructor( private sealed class MetadataSource { data class Cache(val replaceCache: Boolean) : MetadataSource() - object SoraNet : MetadataSource() + data object SoraNet : MetadataSource() } } From ed878d3ab0208063c199a1f8595b7a227f4e04c1 Mon Sep 17 00:00:00 2001 From: arvifox Date: Thu, 31 Oct 2024 17:57:07 +0300 Subject: [PATCH 43/43] release soralution v3.8.6.3 143 --- app/build.gradle.kts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 55fe0c71d..34fa614dc 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,7 +19,7 @@ kotlin { jvmToolchain(17) } -// soralution 142 3.8.6.2 2024.10.30 +// soralution 143 3.8.6.3 2024.10.31 // sora dae 118 3.8.5.3 2024.10.23 android { @@ -30,8 +30,8 @@ android { applicationId = "jp.co.soramitsu.sora" minSdk = 26 targetSdk = 34 - versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 142 - versionName = "3.8.6.2" + versionCode = System.getenv("CI_BUILD_ID")?.toInt() ?: 143 + versionName = "3.8.6.3" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled = true // resConfigs "en", "ru", "es", "fr", "de", "nb", "in", "tr", "ar" @@ -172,7 +172,7 @@ play { serviceAccountCredentials = file(System.getenv("CI_PLAY_KEY") ?: "../key/fake.json") track = "internal" releaseStatus = ReleaseStatus.DRAFT - releaseName = "3.8.6.2 - SORA Card Improvements" + releaseName = "3.8.6.3 - SORA Card Improvements" defaultToAppBundles = true }