diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..1cd48550
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,22 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.{kt,kts}]
+indent_size = 4
+indent_style = space
+ij_kotlin_allow_trailing_comma = true
+ij_kotlin_allow_trailing_comma_on_call_site = true
+ij_kotlin_name_count_to_use_star_import = 2147483647
+ij_kotlin_name_count_to_use_star_import_for_members = 2147483647
+ij_kotlin_packages_to_use_import_on_demand = unset
+ktlint_code_style = android_studio
+ktlint_function_naming_ignore_when_annotated_with = Composable
+ktlint_standard_function-expression-body = disabled
+ktlint_standard_function-signature = disabled
+ktlint_standard_trailing-comma-on-call-site = disabled
+max_line_length = 100
diff --git a/.gitignore b/.gitignore
index 958eea26..43dc9de3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,13 +1,8 @@
/releases/
.gradle
/local.properties
-/.idea/caches
-/.idea/libraries
-/.idea/modules.xml
-/.idea/workspace.xml
-/.idea/navEditor.xml
-/.idea/assetWizardSettings.xml
-/.idea/deploymentTargetDropDown.xml
+/.idea/*
+!/.idea/vcs.xml
.DS_Store
/build
/captures
@@ -16,3 +11,4 @@
keystore.properties
*.keystore
local.properties
+/lib/build
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 26d33521..00000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index b589d56e..00000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
deleted file mode 100644
index b268ef36..00000000
--- a/.idea/deploymentTargetSelector.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
deleted file mode 100644
index 2e12cc38..00000000
--- a/.idea/gradle.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
deleted file mode 100644
index bb449370..00000000
--- a/.idea/kotlinc.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 9218e2b5..00000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 8f4b0919..4d760f2f 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -10,5 +10,9 @@
+
+
+
+
-
+
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 7338059e..9a2f88b5 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,8 +1,13 @@
+import dev.detekt.gradle.Detekt
import java.io.FileInputStream
import java.util.Properties
plugins {
- id("com.android.application")
+ alias(libs.plugins.android.application)
+ alias(libs.plugins.detekt)
+ alias(libs.plugins.hilt)
+ alias(libs.plugins.kotlin.compose)
+ alias(libs.plugins.ksp)
}
java {
@@ -11,6 +16,24 @@ java {
}
}
+detekt {
+ basePath.set(rootDir)
+ buildUponDefaultConfig = true
+ config.setFrom(rootProject.file("config/detekt/detekt.yml"))
+ ignoredBuildTypes = listOf("release")
+ parallel = true
+ source.setFrom(files("../src"))
+}
+
+tasks.withType().configureEach {
+ setSource(files("../src"))
+ include("**/*.kt")
+ include("**/*.kts")
+ exclude("**/build/**")
+ exclude("**/com/android/messaging/datamodel/**")
+ exclude("**/com/android/messaging/debug/**")
+}
+
android {
compileSdk = 36
buildToolsVersion = "36.1.0"
@@ -39,6 +62,7 @@ android {
buildFeatures {
buildConfig = true
resValues = true
+ compose = true
}
sourceSets.getByName("main") {
@@ -72,8 +96,12 @@ android {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
- proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),
- "../proguard.flags", "../proguard-release.flags")
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "../proguard.flags",
+ "../proguard-release.flags"
+ )
+
if (useKeystoreProperties) {
signingConfig = signingConfigs.getByName("release")
}
@@ -91,16 +119,61 @@ android {
}
dependencies {
- implementation("androidx.appcompat:appcompat:1.7.1")
- implementation("androidx.preference:preference:1.2.1")
- implementation("androidx.palette:palette:1.0.0")
- implementation("androidx.recyclerview:recyclerview:1.4.0")
- implementation("com.github.bumptech.glide:glide:5.0.4")
- implementation("com.google.guava:guava:33.4.8-android")
- implementation("com.googlecode.libphonenumber:libphonenumber:8.13.52")
- implementation("com.google.code.findbugs:jsr305:3.0.2")
+ implementation(libs.androidx.appcompat)
+ implementation(libs.androidx.palette)
+ implementation(libs.androidx.preference)
+ implementation(libs.androidx.recyclerview)
+
+ implementation(platform(libs.androidx.compose.bom))
+ implementation(libs.androidx.activity.compose)
+ implementation(libs.androidx.compose.foundation)
+ implementation(libs.androidx.compose.foundation.layout)
+ implementation(libs.androidx.compose.material.icons.extended)
+ implementation(libs.androidx.compose.material3)
+ implementation(libs.androidx.compose.ui)
+ implementation(libs.androidx.compose.ui.tooling.preview)
+
+ implementation(libs.androidx.lifecycle.livedata.ktx)
+ implementation(libs.androidx.lifecycle.runtime.compose)
+ implementation(libs.androidx.lifecycle.viewmodel.compose)
+ implementation(libs.androidx.lifecycle.viewmodel.ktx)
+
+ implementation(libs.coil.compose)
+ implementation(libs.glide)
+
+ implementation(libs.hilt.android)
+ ksp(libs.hilt.compiler)
+
+ implementation(libs.guava)
+ implementation(libs.jsr305)
+
+ implementation(libs.kotlinx.coroutines.android)
+
+ implementation(libs.libphonenumber)
implementation(project(":lib:platform_frameworks_opt_chips"))
implementation(project(":lib:platform_frameworks_opt_photoviewer"))
implementation(project(":lib:platform_frameworks_opt_vcard"))
+
+ debugImplementation(libs.androidx.compose.ui.test.manifest)
+ debugImplementation(libs.androidx.compose.ui.tooling)
+
+ testImplementation(libs.junit4)
+ testImplementation(libs.kotlinx.coroutines.test)
+ testImplementation(libs.mockk)
+ testImplementation(libs.mockk.agent)
+ testImplementation(libs.mockk.android)
+ testImplementation(libs.robolectric)
+ testImplementation(libs.turbine)
+
+ androidTestImplementation(platform(libs.androidx.compose.bom))
+ androidTestImplementation(libs.androidx.compose.ui.test.junit4)
+
+ androidTestImplementation(libs.hilt.android.testing)
+ kspAndroidTest(libs.hilt.compiler)
+
+ androidTestImplementation(libs.mockk)
+ androidTestImplementation(libs.mockk.agent)
+ androidTestImplementation(libs.mockk.android)
+ androidTestImplementation(libs.turbine)
}
diff --git a/build.gradle.kts b/build.gradle.kts
index 137ace6e..55e7ddaa 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,10 +1,45 @@
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.the
+import org.jlleitschuh.gradle.ktlint.KtlintExtension
+
plugins {
- id("com.android.application") version "9.0.0" apply false
+ alias(libs.plugins.android.application) apply false
+ alias(libs.plugins.hilt) apply false
+ alias(libs.plugins.kotlin.compose) apply false
+ alias(libs.plugins.ksp) apply false
+ alias(libs.plugins.ktlint)
}
buildscript {
dependencies {
- classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.3.0")
- classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:2.3.5")
+ classpath(libs.hilt.gradle.plugin)
+ classpath(libs.kotlin.gradle.plugin)
+ classpath(libs.ksp.gradle.plugin)
+ }
+}
+
+val ktlintCliVersion: String = the()
+ .named("libs")
+ .findVersion("ktlint")
+ .get()
+ .requiredVersion
+
+configure {
+ version.set(ktlintCliVersion)
+
+ filter {
+ exclude("**/build/**")
+ }
+}
+
+subprojects {
+ apply(plugin = "org.jlleitschuh.gradle.ktlint")
+
+ configure {
+ version.set(ktlintCliVersion)
+
+ filter {
+ exclude("**/build/**")
+ }
}
}
diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml
new file mode 100644
index 00000000..a0631a34
--- /dev/null
+++ b/config/detekt/detekt.yml
@@ -0,0 +1,23 @@
+config:
+ validation: true
+ warningsAsErrors: true
+
+complexity:
+ LongParameterList:
+ ignoreDefaultParameters: true
+ TooManyFunctions:
+ ignoreAnnotatedFunctions:
+ - Preview
+
+naming:
+ FunctionNaming:
+ ignoreAnnotated:
+ - Composable
+
+style:
+ MagicNumber:
+ ignoreCompanionObjectPropertyDeclaration: true
+ ignorePropertyDeclaration: true
+ UnusedPrivateFunction:
+ ignoreAnnotated:
+ - Preview
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
new file mode 100644
index 00000000..99fe9844
--- /dev/null
+++ b/gradle/libs.versions.toml
@@ -0,0 +1,89 @@
+[versions]
+agp = "9.1.0"
+detekt = "2.0.0-alpha.2"
+hilt = "2.59.2"
+kotlin = "2.3.20"
+ksp = "2.3.6"
+ktlint = "1.8.0"
+ktlint-gradle = "14.2.0"
+
+activity-compose = "1.13.0"
+appcompat = "1.7.1"
+coil = "3.4.0"
+compose-bom = "2026.03.01"
+coroutines = "1.10.2"
+glide = "5.0.5"
+guava = "33.5.0-android"
+jsr305 = "3.0.2"
+libphonenumber = "9.0.26"
+lifecycle = "2.10.0"
+palette = "1.0.0"
+preference = "1.2.1"
+recyclerview = "1.4.0"
+
+
+junit4 = "4.13.2"
+mockk = "1.14.9"
+robolectric = "4.16.1"
+turbine = "1.2.1"
+
+[libraries]
+androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity-compose" }
+androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
+
+androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose-bom" }
+androidx-compose-foundation = { module = "androidx.compose.foundation:foundation" }
+androidx-compose-foundation-layout = { module = "androidx.compose.foundation:foundation-layout" }
+androidx-compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" }
+androidx-compose-material3 = { module = "androidx.compose.material3:material3" }
+androidx-compose-ui = { module = "androidx.compose.ui:ui" }
+androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" }
+androidx-compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" }
+androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" }
+androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" }
+
+androidx-lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycle" }
+androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycle" }
+androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" }
+androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
+
+androidx-palette = { module = "androidx.palette:palette", version.ref = "palette" }
+androidx-preference = { module = "androidx.preference:preference", version.ref = "preference" }
+androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" }
+
+coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" }
+glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" }
+
+guava = { module = "com.google.guava:guava", version.ref = "guava" }
+jsr305 = { module = "com.google.code.findbugs:jsr305", version.ref = "jsr305" }
+
+hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }
+hilt-android-testing = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" }
+hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" }
+
+kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
+kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }
+
+libphonenumber = { module = "com.googlecode.libphonenumber:libphonenumber", version.ref = "libphonenumber" }
+
+junit4 = { module = "junit:junit", version.ref = "junit4" }
+mockk = { module = "io.mockk:mockk", version.ref = "mockk" }
+mockk-agent = { module = "io.mockk:mockk-agent", version.ref = "mockk" }
+mockk-android = { module = "io.mockk:mockk-android", version.ref = "mockk" }
+robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" }
+turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" }
+
+hilt-gradle-plugin = { module = "com.google.dagger:hilt-android-gradle-plugin", version.ref = "hilt" }
+kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
+ksp-gradle-plugin = { module = "com.google.devtools.ksp:symbol-processing-gradle-plugin", version.ref = "ksp" }
+
+[plugins]
+android-application = { id = "com.android.application", version.ref = "agp" }
+android-library = { id = "com.android.library", version.ref = "agp" }
+
+detekt = { id = "dev.detekt", version.ref = "detekt" }
+hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
+
+kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
+ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
+ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint-gradle" }
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index 3a087bb7..96f92386 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -5,6 +5,22 @@
false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -12,6 +28,9 @@
+
+
+
@@ -20,18 +39,38 @@
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
@@ -43,12 +82,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -56,6 +116,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -66,12 +140,23 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -80,6 +165,9 @@
+
+
+
@@ -88,6 +176,9 @@
+
+
+
@@ -96,6 +187,9 @@
+
+
+
@@ -104,11 +198,17 @@
+
+
+
+
+
+
@@ -117,6 +217,9 @@
+
+
+
@@ -125,6 +228,9 @@
+
+
+
@@ -133,11 +239,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -146,40 +269,548 @@
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -188,6 +819,9 @@
+
+
+
@@ -196,10 +830,22 @@
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -209,6 +855,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -217,13 +877,19 @@
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
@@ -233,6 +899,9 @@
+
+
+
@@ -241,6 +910,9 @@
+
+
+
@@ -249,6 +921,9 @@
+
+
+
@@ -257,21 +932,30 @@
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
@@ -281,6 +965,9 @@
+
+
+
@@ -289,6 +976,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -297,11 +998,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -310,6 +1028,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -318,6 +1050,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -326,6 +1077,9 @@
+
+
+
@@ -334,6 +1088,9 @@
+
+
+
@@ -347,6 +1104,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -355,6 +1126,9 @@
+
+
+
@@ -363,11 +1137,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -376,6 +1166,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -385,6 +1219,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -394,6 +1239,9 @@
+
+
+
@@ -402,23 +1250,41 @@
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
@@ -430,6 +1296,9 @@
+
+
+
@@ -438,11 +1307,22 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -451,24 +1331,84 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
@@ -477,29 +1417,76 @@
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
+
+
@@ -508,6 +1495,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -516,6 +1520,9 @@
+
+
+
@@ -524,6 +1531,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -532,6 +1591,9 @@
+
+
+
@@ -540,6 +1602,9 @@
+
+
+
@@ -548,6 +1613,9 @@
+
+
+
@@ -556,6 +1624,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -564,6 +1654,9 @@
+
+
+
@@ -572,6 +1665,9 @@
+
+
+
@@ -580,14 +1676,100 @@
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -596,11 +1778,17 @@
+
+
+
+
+
+
@@ -609,6 +1797,150 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -617,14 +1949,39 @@
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -633,6 +1990,9 @@
+
+
+
@@ -641,6 +2001,9 @@
+
+
+
@@ -649,6 +2012,9 @@
+
+
+
@@ -657,194 +2023,341 @@
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
@@ -855,44 +2368,59 @@
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
@@ -902,6 +2430,9 @@
+
+
+
@@ -910,285 +2441,408 @@
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
-
-
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
-
-
+
+
@@ -1198,6 +2852,12 @@
+
+
+
+
+
+
@@ -1214,6 +2874,9 @@
+
+
+
@@ -1222,6 +2885,9 @@
+
+
+
@@ -1235,6 +2901,9 @@
+
+
+
@@ -1248,6 +2917,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1256,6 +2942,14 @@
+
+
+
+
+
+
+
+
@@ -1269,6 +2963,12 @@
+
+
+
+
+
+
@@ -1285,6 +2985,12 @@
+
+
+
+
+
+
@@ -1293,6 +2999,12 @@
+
+
+
+
+
+
@@ -1309,6 +3021,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -1316,6 +3039,9 @@
+
+
+
@@ -1324,6 +3050,9 @@
+
+
+
@@ -1332,29 +3061,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
@@ -1369,6 +3259,9 @@
+
+
+
@@ -1377,6 +3270,12 @@
+
+
+
+
+
+
@@ -1385,13 +3284,30 @@
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1414,9 +3330,9 @@
-
-
-
+
+
+
@@ -1426,6 +3342,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1434,6 +3366,12 @@
+
+
+
+
+
+
@@ -1442,6 +3380,12 @@
+
+
+
+
+
+
@@ -1450,6 +3394,12 @@
+
+
+
+
+
+
@@ -1459,6 +3409,14 @@
+
+
+
+
+
+
+
+
@@ -1466,13 +3424,16 @@
+
+
+
-
-
-
+
+
+
-
-
+
+
@@ -1485,6 +3446,11 @@
+
+
+
+
+
@@ -1495,9 +3461,9 @@
-
-
-
+
+
+
@@ -1507,6 +3473,12 @@
+
+
+
+
+
+
@@ -1531,6 +3503,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1539,157 +3531,398 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
@@ -1699,6 +3932,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1707,6 +3957,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1725,6 +4002,12 @@
+
+
+
+
+
+
@@ -1753,6 +4036,12 @@
+
+
+
+
+
+
@@ -1766,6 +4055,9 @@
+
+
+
@@ -1774,6 +4066,9 @@
+
+
+
@@ -1782,6 +4077,363 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1798,6 +4450,9 @@
+
+
+
@@ -1819,6 +4474,9 @@
+
+
+
@@ -1835,13 +4493,8 @@
-
-
-
-
-
-
-
+
+
@@ -1859,6 +4512,9 @@
+
+
+
@@ -1875,6 +4531,9 @@
+
+
+
@@ -1891,6 +4550,9 @@
+
+
+
@@ -1899,6 +4561,9 @@
+
+
+
@@ -1912,16 +4577,118 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
@@ -1931,6 +4698,9 @@
+
+
+
@@ -1947,6 +4717,9 @@
+
+
+
@@ -1963,6 +4736,9 @@
+
+
+
@@ -1979,6 +4755,9 @@
+
+
+
@@ -1995,6 +4774,9 @@
+
+
+
@@ -2011,6 +4793,9 @@
+
+
+
@@ -2027,6 +4812,9 @@
+
+
+
@@ -2043,6 +4831,9 @@
+
+
+
@@ -2069,6 +4860,9 @@
+
+
+
@@ -2085,6 +4879,9 @@
+
+
+
@@ -2101,6 +4898,9 @@
+
+
+
@@ -2117,6 +4917,9 @@
+
+
+
@@ -2125,6 +4928,9 @@
+
+
+
@@ -2141,6 +4947,9 @@
+
+
+
@@ -2149,6 +4958,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2157,6 +4986,12 @@
+
+
+
+
+
+
@@ -2170,6 +5005,12 @@
+
+
+
+
+
+
@@ -2178,6 +5019,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2191,6 +5085,12 @@
+
+
+
+
+
+
@@ -2199,6 +5099,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2207,6 +5121,9 @@
+
+
+
@@ -2215,6 +5132,12 @@
+
+
+
+
+
+
@@ -2253,6 +5176,9 @@
+
+
+
@@ -2261,6 +5187,9 @@
+
+
+
@@ -2289,6 +5218,9 @@
+
+
+
@@ -2297,6 +5229,12 @@
+
+
+
+
+
+
@@ -2330,6 +5268,12 @@
+
+
+
+
+
+
@@ -2338,6 +5282,12 @@
+
+
+
+
+
+
@@ -2346,6 +5296,9 @@
+
+
+
@@ -2354,6 +5307,12 @@
+
+
+
+
+
+
@@ -2362,6 +5321,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2370,11 +5349,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2384,6 +5383,14 @@
+
+
+
+
+
+
+
+
@@ -2391,6 +5398,12 @@
+
+
+
+
+
+
@@ -2399,6 +5412,9 @@
+
+
+
@@ -2415,6 +5431,9 @@
+
+
+
@@ -2436,6 +5455,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2446,6 +5492,11 @@
+
+
+
+
+
@@ -2458,6 +5509,12 @@
+
+
+
+
+
+
@@ -2466,173 +5523,575 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
+
+
+
@@ -2658,6 +6117,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2666,6 +6142,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2675,6 +6165,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -2691,6 +6192,14 @@
+
+
+
+
+
+
+
+
@@ -2698,6 +6207,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2706,6 +6240,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2728,11 +6276,21 @@
+
+
+
+
+
+
+
+
+
+
@@ -2740,6 +6298,12 @@
+
+
+
+
+
+
@@ -2748,6 +6312,9 @@
+
+
+
@@ -2756,6 +6323,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2764,6 +6351,12 @@
+
+
+
+
+
+
@@ -2772,6 +6365,9 @@
+
+
+
@@ -2780,43 +6376,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+