diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 00000000..89fbd297 --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: MIT + +name: Android Tests + +on: + pull_request: + push: + branches: [ main, stable-* ] + +permissions: + contents: read + +jobs: + validation: + name: Validate Gradle Wrapper + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 + with: + distribution: 'temurin' + java-version: '17' + check-latest: true + cache: 'gradle' + - name: Validate Gradle Wrapper + uses: gradle/actions/wrapper-validation@ed408507eac070d1f99cc633dbcf757c94c7933a # v4.4.3 + + test: + name: Unit tests + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 + with: + distribution: 'temurin' + java-version: '17' + check-latest: true + cache: 'gradle' + - name: Unit tests + run: bash ./gradlew test --stacktrace --no-configuration-cache diff --git a/build.gradle b/build.gradle index 18580941..a8bde5e2 100644 --- a/build.gradle +++ b/build.gradle @@ -9,6 +9,12 @@ buildscript { ext { daggerVersion = "2.57.1" kotlinVersion = "2.2.20" + jUnitVersion = "4.13.2" + androidXTestVersion = "1.3.0" + androidXEspressoTestVersion = "3.7.0" + mockkVersion = "1.14.5" + mockitoVersion = "5.20.0" + mockitoKotlinVersion = "6.0.0" } } diff --git a/core/build.gradle b/core/build.gradle index bf5abc4e..caed4bf9 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -21,6 +21,12 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + testOptions { + unitTests { + includeAndroidResources = true + } + } + compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 @@ -41,9 +47,15 @@ dependencies { implementation 'androidx.core:core-ktx:1.16.0' implementation 'androidx.appcompat:appcompat:1.7.1' implementation 'com.google.android.material:material:1.13.0' - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.3.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0' + + testImplementation "junit:junit:$jUnitVersion" + testImplementation 'androidx.test:core:1.7.0' + testImplementation 'org.robolectric:robolectric:4.16' + testImplementation "org.mockito:mockito-core:$mockitoVersion" + testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion" + testImplementation "io.mockk:mockk:$mockkVersion" + androidTestImplementation "androidx.test.ext:junit:$androidXTestVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$androidXEspressoTestVersion" } afterEvaluate { diff --git a/core/src/main/java/com/nextcloud/android/common/core/utils/DateFormatter.kt b/core/src/main/java/com/nextcloud/android/common/core/utils/DateFormatter.kt index 3031f785..873efb9f 100644 --- a/core/src/main/java/com/nextcloud/android/common/core/utils/DateFormatter.kt +++ b/core/src/main/java/com/nextcloud/android/common/core/utils/DateFormatter.kt @@ -1,9 +1,10 @@ -/** +/* * Nextcloud Android Common Library * * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: MIT */ + package com.nextcloud.android.common.core.utils import android.content.Context diff --git a/core/src/test/java/com/nextcloud/android/common/core/utils/DateFormatterTest.kt b/core/src/test/java/com/nextcloud/android/common/core/utils/DateFormatterTest.kt new file mode 100644 index 00000000..5f1ee776 --- /dev/null +++ b/core/src/test/java/com/nextcloud/android/common/core/utils/DateFormatterTest.kt @@ -0,0 +1,98 @@ +/* + * Nextcloud Android Common Library + * + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: MIT + */ + +package com.nextcloud.android.common.core.utils + +import android.content.Context +import android.os.Build +import androidx.test.core.app.ApplicationProvider +import com.nextcloud.android.common.core.R +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale + +/** + * DateFormatter tests checking the different formats relative/absolute date formatting. + */ +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [Build.VERSION_CODES.Q]) +class DateFormatterTest { + private lateinit var dateFormatter: DateFormatter + private lateinit var context: Context + + @Before + fun setUp() { + context = ApplicationProvider.getApplicationContext() + // Force a specific locale to make tests independent of the test environment's locale + val config = context.resources.configuration + config.setLocale(Locale.US) + val localizedContext = context.createConfigurationContext(config) + dateFormatter = DateFormatter(localizedContext) + } + + @Test + fun `Test 'now' formatting`() { + val calendar = Calendar.getInstance() + val formattedDate = dateFormatter.getConditionallyRelativeFormattedTimeSpan(calendar) + val expected = context.getString(R.string.date_formatting_now) + assertEquals(expected, formattedDate) + } + + @Test + fun `Test relative minutes formatting`() { + val calendar = Calendar.getInstance() + calendar.add(Calendar.MINUTE, -5) + val formattedDate = dateFormatter.getConditionallyRelativeFormattedTimeSpan(calendar) + val expected = context.getString(R.string.date_formatting_relative_minutes, 5) + assertEquals(expected, formattedDate) + } + + @Test + fun `Test relative hours formatting`() { + val calendar = Calendar.getInstance() + calendar.add(Calendar.HOUR, -3) + val formattedDate = dateFormatter.getConditionallyRelativeFormattedTimeSpan(calendar) + val expected = context.resources.getQuantityString(R.plurals.date_formatting_relative_hours, 3, 3) + assertEquals(expected, formattedDate) + } + + @Test + fun `Test day of the week formatting`() { + val calendar = Calendar.getInstance() + calendar.add(Calendar.DAY_OF_YEAR, -4) + val sdf = SimpleDateFormat("EEE", Locale.US) + val expected = sdf.format(calendar.time) + val formattedDate = dateFormatter.getConditionallyRelativeFormattedTimeSpan(calendar) + assertEquals(expected, formattedDate) + } + + @Test + fun `Test month and day formatting`() { + val calendar = Calendar.getInstance() + calendar.add(Calendar.DAY_OF_YEAR, -100) + val sdf = SimpleDateFormat("MMM d", Locale.US) + val expected = sdf.format(calendar.time) + val formattedDate = dateFormatter.getConditionallyRelativeFormattedTimeSpan(calendar) + assertEquals(expected, formattedDate) + } + + @Test + fun `Test full date formatting`() { + val calendar = Calendar.getInstance() + calendar.add(Calendar.YEAR, -2) + val sdf = SimpleDateFormat("MMM d, yyyy", Locale.US) + val expected = sdf.format(calendar.time) + val formattedDate = dateFormatter.getConditionallyRelativeFormattedTimeSpan(calendar) + assertEquals(expected, formattedDate) + } +} diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys index 1860f132..493f9bdf 100644 --- a/gradle/verification-keyring.keys +++ b/gradle/verification-keyring.keys @@ -593,6 +593,34 @@ KrnduWWXAJ9Adm9Mz4yoxrosHSkp5BWzXBUt4A== =AtDT -----END PGP PUBLIC KEY BLOCK----- +pub A40E24B5B408DBD5 +uid Robolectric Developers + +sub 6A2038967E03726F +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBFRdA40BCAC0zSALsOjfjr+gO8q+HV4qPWuIRB8S4z//jCEpKypyCRR9sA0W +IDHG6OqG5fO1bP6VsHvSx32E8YUf0bi8eGgpKj5gJ9jmausRvRHtUHJ0pvZRBw51 +z4amYVr+NdVoyqLXBgBYeFlEYI04rQH9W8r1bCk8RKGJFNvO6ikTN9opLRkvZ7A6 +7VKlQGMd0sSJ3MAhzKUkM+ZWeCb/TG0xSrhJHcrFUORdV5zaX61anOTSst4HOTuL +ByIZq1RMxKP4UJIWH2NYVUC1Bdn5CbY5mJysqQXjobPwG/cNAyBjsDBCh2VMnFY6 +geCHL3BowNd8gHUr0wjGKOipRmyfOJoTspMfABEBAAG0NVJvYm9sZWN0cmljIERl +dmVsb3BlcnMgPHJvYm9sZWN0cmljQGdvb2dsZWdyb3Vwcy5jb20+zsBNBFRdA40B +CADhMeWEVcUNBLRWDatdlvc7q3jZEyejhSl3zw0I15yhoBbuW+ZnOTG4fkIr9SRo +4whm2NZ7eemEnQ6tuGhVXUqPIxWAwBteY0ZBhwNGhMql+IIdOE9WIo82yV4gj1Lo +2rjxaxG4Rd7FQnys5f+XyFZ8vaXpmpH9VeFjc1Ls550DUP8iVvIoKI65Ve5RMZc9 +e3AeP8FZqJpc3q+Al2f/FAO8+tiD/J849aP4aqUKiwvHk/nxle8FwepQyvXRrSpF +Nz2uK5bgIXQrxgcKLPjl6s9l8SKnTwg6ok0EcJjGuHjzCeFNp/WFpAeJAxmAZ/qU +br0TBp6jxXoMc/RqdO79MPX5ABEBAAHCwF8EGAECAAkFAlRdA40CGwwACgkQpA4k +tbQI29WOzgf8D487fhQSsH87OJfpoSPf9p2wGzgNFAc+sb0gUy8rMmc/xySKGfZ2 +BZFT/CAQsOzGZ/KSM3og+FFgDcm8GWpSfZNymXnmM8aCaEyNj4arENxwhU4BEnKY +Ff8PIDoCjAqBbSWuTa2RzaWlawEEg4hItheFmw/My/tbo62N4zn98IYU//50PNDu +Db1lvOi4SVFglXRoM+jS2X6E9R3Z7sYceClr2EDN2k+RbvB6ngOiu52FvC9ZZPJn +fK9/XHFtKcQ64yu3pbeXwiuqyr4TSpzGJNm7czyVylHZfvkZYVhmZCEG9xQ0lzHs +haXmkfqi5ZJMEtXwNP1dWIMhIGgY4aLehw== +=8RJA +-----END PGP PUBLIC KEY BLOCK----- + pub A41F13C999945293 sub 8183E80D264EE073 -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -1353,6 +1381,18 @@ ikmfPIGVw73RF3HXjJ8GVqTkqbo4ZpgTw/7Z3+fAYE/vxquhnpl2HvE= =5tlI -----END PGP PUBLIC KEY BLOCK----- +pub D46C5610D06E7001 +sub 00E25FE3776F21F2 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZsO4fRYJKwYBBAHaRw8BAQdAcxaiyqFbaECpSz7mhsXzopzN9Cxwv80WlWGN +gM3qpOi4OARmw7h9EgorBgEEAZdVAQUBAQdA45tqjMbTvozvroU+Z0nApYG0r3Zl +gI27fUSEIetPuEIDAQgHiH4EGBYKACYWIQTlLweHelgF+a9KsKzUbFYQ0G5wAQUC +ZsO4fQIbDAUJBaOagAAKCRDUbFYQ0G5wAZG1AP4m+dkpV5g3AT7Lws/lUDrKrdTr +5noqEjUmwUNCiuTOugEArO87llEEIabZngdpe7D+dvJ7Bb+BSX2fzHKmrsE6uwY= +=9gxs +-----END PGP PUBLIC KEY BLOCK----- + pub D9C565AA72BA2FDD sub 9121AD263441EEDD -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -1386,6 +1426,42 @@ zU7kkPUpKBx6hHg/zJnwTVAY/g4+Iw6CHwBhw+2/KoMpjQ63VqjwQZ6+VIwdsSCh =Uwqi -----END PGP PUBLIC KEY BLOCK----- +pub E08F28E25BD93E9F +uid Jens Nyman + +sub D7B501D37A3AE550 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDNBGQdnjEBDADm35hD/kMiNXVocImrrdOkA4xvNQ8OLirzETb5DSSocIW+OBLZ +V3k5OiKTqYxlZIa9JT8XLLVc8pi9Is/x/xjoodEYSsj0LL0BODMeyt6ECmfi0brN +CqKv1J46cuWun0iSog3KaGrMx1tcNAVvYHdDuBlZ8X1BbaFwSqdNv1Hq9LkfOUwB +kafs8vXc+5THSkB2XAq9v4B+P9Rl4fwMPsjgkS0X/3JNMq0dqlUXuxNTj9h/dNAv +l7sYEBF5gY1wqmVbesHWurl8Bqbq6wvDualZ0ccGyisaaz2FxIKuQHBK63ffxXVF +/AABfDBsS1nx83qK3T7LFemSwQ+hMdKjck4Vng7RbB/FlUNZlbTiyrwZP9492YG7 +k5EcbB1K9tIPJDccYN3zkmYbaEAHL8j7PnTq7XyRPrNYFLKWBBa3sYz21+d8Ym2+ +ExuFgqvtnyToeKVfGX+mNbftrVK4j2OL6fZMmkDL/6niG34UJvHdsKvqVddTMPXM +1jlZYh35WbM1eIEAEQEAAbQeSmVucyBOeW1hbiA8am55bWFuQGdvb2dsZS5jb20+ +zsDNBGQdnjEBDADQUQl5FP5g6/KTI0aAe05jJk8rkLK7nMQK7ayHdij5RmuRPJO6 +snlEPmSpd80BL9sCuCq8Fo87Al6NcD8Fd39IZl/n7ZbKZHfcSQNkyKlGoNMprAtA +nh4rFdhG8Fn8Z+HRP5VcwG9BUIzvScyCLF4f4gGaaOAMd57I4q1+PsgvUZbGee74 +wqfLBspnkut0CEblr//nYf+Vkoo6EfSwi9QbJLYacy/3IrfByUIyUyrwEGFWMpul +RXFzTRExpnX2j9g+XZO12LHMxJQ2ptOI70m4JDGd8MnPnvMofLsy65DBz/5qZKtV +8haE73KKSWjJi9d81kwAzZR9WjltDDhyYOYYpDFcK4x0Py/XB5Unj1jf49PrgF16 +NVlfRh7vS6VeqUoNHYAR5qagftBiDZQ317GpRpm3LUidqyiFexlLhYHGdUk/vpAO +SCK6azGBmW+dXx/BCC9fX6wVVRv0LNeAWgnyf13SG0d0jFJjzxqRzXclsffo/oEd +JV7MQqo+ZHcdI8sAEQEAAcLA/AQYAQoAJhYhBC7okAcK6TGMOtNSDOCPKOJb2T6f +BQJkHZ4xAhsMBQkDwmcAAAoJEOCPKOJb2T6fNkoMAIVtequTvVXw9Ax92uPbmCDg +iNB2aiF4U23e5ZTPvSMWZlMx8hgI2vMCgRGcNOcEQcIyvFy1dZ5qxqzd/QjFvaY5 +2JutEUbeXvNfKmzjn2VzDiW/SHAc8KnWlAmJfqY+SPSIJNJ72Qc0EkxuGbjbWW+y +eazFuDOafej5Cw/nRTMvAVm5hElNKtdRztQVJOOBPEFefbb9YG9gcVVo0Jxs2WY4 +1rh+GjK8rB/PnK4NicQcbh1hk21enla6j2jYKNhCJkifw0HXsa185cnISSv6fVsG +H8tCCDoaZ8mXhU0W49n+NyWhRdHM9Gr9USkYVsHzJTZgTk429CI+ThEMjsxeIpJH +Qu/m64DNlDu0rrzHpgjyUedNB05QEwEtxv3nMKryLcYifLhbrk4ktLIMtYLdDgJe +ddn3I+ytL779X+SOCm292NQdg9+M6hkvgITfIoPe/seHjc0hP5COIbrfDeIdciyJ +1c3wN0nS/z6/50wBTdmj11Kx3Phb0uKtekcn3BVXug== +=vsHi +-----END PGP PUBLIC KEY BLOCK----- + pub E16AB52D79FD224F sub 5A34A5E06B936F93 -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -1781,6 +1857,21 @@ WASB7yEJYwsl =qHo0 -----END PGP PUBLIC KEY BLOCK----- +pub F5C81DE10A0B8ECC +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDNBGY/odABDADzlZ1BXT0zN3rL+z4HP8r/2xM6zN950fwRimBTOiT6uE8aQSxq +283R/gIgM+yQBGjStLP3k/TsFJ2FCz7sug+7s1RP70ymkshalTRg+9QHBr2MU1Cx +Xoh3fiH8BLOb3FIxH1wdAtOOoNxbz64Ftcptu3L0I1y2qEwOGNOyvqbntdCuwNbX +/zwZUyb3tOVVrrZ5bp+6jMoBKEEWS7effqhGqXLlO4yTMBXR4pwzhch2IGCe+4M3 +a5C2SIJbR70PMk6aJ2+no2LycYRYJx/t2umAbxuCtwT6t/xh8v5ekbXAu5G3h5y+ +T2bF8rjMhVe6DBgJ08uFge3Oom5a5uZx8sQASdLCng8nKjGO4Q8jWmsEj+OiHnnX +g0oKkirnWbAVrWysgNKAXfwGfDBG95K1F67kVhNjXTx0MDcxpsT9TPxz/nDuzRpQ +ey5M11+Bl/fEM5UuzRpPgPd//bU+L3FgEUguB4kzsiYlhsUQRyCq1x868AchLWey +vaVIq2DY101GIP0AEQEAAQ== +=tKA2 +-----END PGP PUBLIC KEY BLOCK----- + pub F6D4A1D411E9D1AE uid Christopher Povirk @@ -1930,6 +2021,18 @@ SQQYEQIACQUCSagpTwIbDAAKCRADdM8ujdG9/auQAKCCtFUmslioIPSjZkWVLJpo =YmFm -----END PGP PUBLIC KEY BLOCK----- +pub 04C8C902FEFB1A01 +sub 741DB70D5BD02528 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xjMEaFhhgRYJKwYBBAHaRw8BAQdA8Tl+3HkVTIQq7QvPzpgZV6i7/z0LabiWTt3G +fH8CKuzOOARoWGGBEgorBgEEAZdVAQUBAQdAaPAe0Es6+EY3/PwrQP5FynZnJL4x +BR9vZ6+Z3pYRaxYDAQgHwn4EGBYKACYWIQSvdRKvZv5ABNhN7IoEyMkC/vsaAQUC +aFhhgQIbDAUJBaOagAAKCRAEyMkC/vsaAX4YAP9RAqd/WoIBEi2Ix9DMStr1mOCF +xF+S3TSFWPLVVVoo+gD9FGYeKnDDga+F1O3zW0ghkiaYxdpuD21/ySNA0+W3/gc= +=CTOR +-----END PGP PUBLIC KEY BLOCK----- + pub 056ACA74D46000BF uid Norman Maurer @@ -2073,6 +2176,34 @@ fVJykhD1P8/4BedOSN7DqsnvIUfFaQ== =iddT -----END PGP PUBLIC KEY BLOCK----- +pub 07D3516820BCF6B1 +uid Ben Manes + +sub 11F4CE313A637CC1 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBF3HgdMBCAC3ET5ipFXdZ9GGMbtsCQ3HGT40saajsNDOdov2nMJxzKkVe3wk +sN3bpgbsqBU9ykVkIhX8zV5+v8DOBzkV0pJ2eLjFa9jBPvNjV+KoK2BAI5pzNzYg +sHPwo1aRXdI0MvCy+7iaIiiGF4/O16AhU4LmALHnaRQZCyuN6VOQ8rlqNvcczwUf +J2DQeLHqR/tsch7S01hGpPAptBeu19PyAlQsntYN0yLCLKoe9dFXWCDkvd1So5LF +6So+ryPqupumBbh4WxCmTp9qwDJYJItjAE0zyPe890FurOtxrFTwtRtX6d6qGKkY +/B4T3r0tTE1EiOUpmSnxmGNItMh7/l5UtnHjABEBAAG0H0JlbiBNYW5lcyA8YmVu +Lm1hbmVzQGdtYWlsLmNvbT7OwE0EXceB0wEIAK7dVAoqZqBw9twxk6psNcTmIrfQ +bvjasKl/+PfLCfBNklD/nwe0CLz799fFSFMezCg43ZPCKIescCQ5t74r0D6O/QTG +MpUyZD+w4JhZkMQYy2HjImfMNtPVOWb+XaLku/RloPt9MSG2mtA25TTp295N4mzM +PKq0r1PzSa8jj4Yfn3AzzSXXLq6PwoDiljQ91IWBvJL2IAUAMaxSxzq3UqJnlbX2 +h0yMM+VC0nbSmbkK8mUNltg1EnngJKV1mKRG+Y1GDmZZ1Es19tEwUMsV9x1gt05Y +lecC31woUkL0//8i1kWuWG7dqRMf/8cXaTFA1brVJ33b/G0VQP/a03UaVd8AEQEA +AcLAdgQYAQgAIBYhBGNe5ic0Xzwd1CKy4gfTUWggvPaxBQJdx4HTAhsMAAoJEAfT +UWggvPaxrJIIAKJsimeWznAmR9fUH/u0ONaTaEQZlhwBKvTGn8MPBKAnl50HK5A1 +AXtEe4KTSR7ohAZ/K0wsmVd4Qi7v0O+A9qTEE/mIb5zT3kVuFG772cISRGpC+inh +8Dtl2G56s7K45tbPz6jdnZHLBY9eUr4X/2ImI7+q2+Z05G6KQm031XGC8BS8A1lG +2XOMvb3qnRMnMapeHJ6vjoIeX9iPtO1foSmdkOCJpBs5ZEU5nnHzXEjv1tAPsTAP +N+vBAduNAOSqGTA6hXparbf1loeHqnsZcedCQMxDQf/tja3Do8flUzx8MmQkoXY8 +i6QmtRdrToqqt1n1jGq9Ka7lRjq0xJHAZak= +=7mDz +-----END PGP PUBLIC KEY BLOCK----- + pub 083891AD4774845A uid Eclipse Project for JAXB @@ -2302,6 +2433,31 @@ LDL7A4GNor2DcqTyOw3cjy0= =pzVO -----END PGP PUBLIC KEY BLOCK----- +pub 17A27CE7A60FF5F0 +sub E86F52398AF20855 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBF/AfL8BCADpdkr7+1epRZLZJ6/si+Aj6fmELbzWHZmSSUYmRszcCgPq78xy +bsW/d0grOOEEn9I/5N22gOoEumcFAsN6hn1thjsZyXLmaBfRj+8vri/zigAqrE7W +zk7mKKK3IUuEi1rDqoEwGQbzHFP9UxiIouiWbYGhbkER0E8zDwmPlWZDXoQEzqWT +KcgxAXldiZ6l0FACtxgU3n9oOq0hNQBqfpn22BM2FPjZDrM4rEfbeSt8ztORIviw +7G9oUtYsbTbDvvADCL0wW05GcNz6BvcmDm79d+fk+5gb+GIaHurWuyTtmw5HCeXW +QcKN1S96Wfm5Dz6UMOMeXujlvK1rxmsIIl3BABEBAAHOwE0EX8B8vwEIAOkm8U7a +QLAJ0FtUuY6ru+JQM3yHhIBA7dADpoyq+f/WN86Es9vw7gavO6tnJPnYh1IozEmQ +4/OaXfKir2G8geLR6hvCsclgXT+RUS9Z60XBFWWhYwX8OrkdfHNnZPeSM8pwiQbh +L8QGfF5AiJzG34ecIPekBWL0l0nYtVblAHQ5oKCv0h2e/cPylyBgJUGCtF0pLKuY +l/jeH44UPz6ZUfTL662zbz7AGn8yX62h5PXyH2ZVuuwA2+vuAZCeTP+cQ7OGlIj/ +EDmggsSrcjVa/G/v+O9lPw9SGnnjoEzX+Ng+tEJNUEx22gvAISajFfM+XWVxVEqs +z0B4U6PLa2feuVsAEQEAAcLAdgQYAQgAIBYhBD8F3anzFzAeknE21BeifOemD/Xw +BQJfwHy/AhsMAAoJEBeifOemD/XwJ3cH/27Z8H7Bx53msUwaNO0RbWJNz65xrecM +w5dvRVjjERYm+5UA5oQdySozlgrpWCAx8q13OMVpGRhodebFEqDZDHsjvJgm10Q7 +Q9fHkP56lCgxt68WPwmof8bkTYC8l9PmPfqdJgQlyX0zqOzxjETCfe+f1gc/m1lx +tgnUeD3/ktyTkYu1hTt8rWM1ceCnZ08bIcjwjFZJDHZl+BmQ52zxUHJ5JAExZNn3 +vWkvn9JHGWPh6M7evaCcNAdv20A9AB45/aZlYRUN8hCI6xpHiMt4/tDbiImzko74 +zzMvjuz0NEEhREM8f0ld3G/7Meh/OudSEgtQAmwJ0UMZWJWaZ0FhnLI= +=nrrN +-----END PGP PUBLIC KEY BLOCK----- + pub 1AAAA7AB37293D3E uid DiffPlug LLC (release signing key) @@ -2359,6 +2515,85 @@ Eg== =k22w -----END PGP PUBLIC KEY BLOCK----- +pub 1DA784CCB5C46DD5 +uid Rafael Winterhalter + +sub A7E989B0634097AC +sub 7999BEFBA1039E8B +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=1ntv +-----END PGP PUBLIC KEY BLOCK----- + pub 1F7A8F87B9D8F501 uid Download @@ -3084,6 +3319,50 @@ SN7ABUYQJ4prOXJlUQQrmnhs8zqMdNV4nDRbiKDdyemlwXi2 =f38L -----END PGP PUBLIC KEY BLOCK----- +pub 3F00DB67AE236E2E +uid Pete Bentley + +sub 6B7EF7B18190F4A9 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +8NDEEKe1MmtJ2sOJrXaEDaeIBbaVgX76 +=/V8u +-----END PGP PUBLIC KEY BLOCK----- + pub 3FAAD2CD5ECBB314 uid Rob Tompkins @@ -3646,6 +3925,42 @@ uAngfd6DOtCKYtNKP7xqDu/2bMU23cxGaRj2ToH4RfCClg1B =rv9Q -----END PGP PUBLIC KEY BLOCK----- +pub 689CBE64F4BC997F +uid Szczepan Faber + +sub C0058C509A81C102 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDNBGAofm8BDADhvXfCdHebhi2I1nd+n+1cTk0Kfv8bq4BQ1T2O85XlFpp1jaIR +70GAm2MOt8+eEXt/TuPkVBWnJovDpBbkUfYWxSIpPxJzcxWV+4WJi/25fBOq2EuP +QQhkqHQRECQ0CsogzsqI/Tn3FksiGKB7v67hAetM3KpwZ5IlG8chLoaeDf7k3P3S +fBWO9MFxYW/7K5G3vqARKXHvzq/jYiXziMDeWIKswwTPqfeDc89tsEdE6GMT6m2u +ECaulbHlzEzazSAh322/yyf/nfVZ/yZhK1y0MjvwpOhGxFbay5hA7L4bHAwR3qb9 +YGiPIL+K97TYY1G5+3X0TSvTIg4VsW5VDu50oB2iYK7uGE08GhT4uc73tiDlZm8L +BUwT/KtKT7g++LYwAMeZJ5+rfIKKxblXUN06vz9stylo1rNVhTXftuqqO+x5uVGG +KlOWzx3p9N3nqrufwuoQNvIMzCAvJZNm99j/Y/40wsrUkBxVBGNs6nEpQ6c5lvf3 +24Dfk3nY/7Fts1cAEQEAAbQjU3pjemVwYW4gRmFiZXIgPHN6Y3plcGlxQGdtYWls +LmNvbT7OwM0EYCh+bwEMALVHwkeMzw/wcUboKcEUmmXmiGgwDn4xac47U9x75JgC +OqQE1+4Hxu5qULrPlCLLP1PDmD2PK/QUwbGpjjEuw4YxI6JjuOQ9sQa7HbzRVOmw +0kd0T4hr4Xa37D3E4oAxqwpeXcPsUWewtpjoqjLpTDBuaRpp/x3sFFmM9+s2ci4S +614yppuWqu4X/u7w5CbWFYMKl/N5aqK5RYYMAgPUqsI4J0NKwb5UszFuatFevTvD +MuwOf9LfW7kun13s0Z+/+hWGlNhk38ahIR8PSr4yT1pR271dUQKCTtZUFC6ObVAY +WAaEzrJ2XuJMnbHjpciv9WqaXFLpda7eE4TucmjU3+W29kWer9ts48EkD8Hv+a8T +BXXzK8KBi0ACUJi6uma1DWdUk6tqe2CniwirRzR1mWhKfOmQqr487pH5h0jMSPN8 +Dhyyuw4Ef2BLmTQmvbDYv9bwkeisskKjg108OoWOid1tbXudFdPQWqNc8FVPMlde +kza4cC4qBd+vjVcKHrEx3wARAQABwsD8BBgBCAAmFiEEFHtpGhkJdiSQL06paJy+ +ZPS8mX8FAmAofm8CGwwFCQPCZwAACgkQaJy+ZPS8mX9PxQwAn+LmPCqO6ig0fsgi +nOhUaoM2QX6A//IiFDXa2pY3bKaWf5LAYpuvRAyMsGPI3ceAnwfFSMXjktlssmD5 +bQKFisEuCuFQ0B+dlMO/+BZ1Id1Nldi8yKRTfcffgONO4kuKGKN7MKWPBX6/cJfA +pwHV7QubGEl/b/UNjPVFv34QCLU1ZFhVKHO582m0N94dwkwThaQQZX/op+cT2kSC +DWn7zl38KoYSy/6ThxKyIWKimiEpug0VeRHDoYw2NUyVvidj/F3jsnbEiNTH1Rpp +DzXuJbN7c/fxaAAhlAgxnt/hvrECPylnA98CPd1tBl8Q6IDcgbXmIa/jLS+Rqv5Q +xUNYlwhcFP9WxU8RwzxIHo9SiVRUaLcqit5eVI+eZbcL+TZP5b8wtLoKr199Ej2F +xNkL3+InFdjTH2Ir6RZpmqeY4NI6ujL41iUru20RzTNCAQA8jgmCMq9kDxaykpzd +SvFHnyijywCZB1jblPtxo2UqRO/qhPfqSkoVcpWmxgiPUFOr +=0bww +-----END PGP PUBLIC KEY BLOCK----- + pub 6A65176A0FB1CD0B sub EA8543C570FAF804 sub CA890A5FA09CFD80 @@ -4380,6 +4695,38 @@ XwCWdYzvSwRp =Hi5G -----END PGP PUBLIC KEY BLOCK----- +pub 7C7D8456294423BA +uid Henri Tremblay + +sub 9842FE565AA0601E +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDiBEvsZw4RBADH20nX+H1xvMBYmXRj1Aae4dRr6Y6qI7QRWHO6Z7/dxr9bk/NN +Yjq5KsVOQxZzloVdtqx75rznT7fZq98g7Nq9IeEtB6k4tnh6XQLhljJMk0a3mzdt +q3VzdxeVbwCaPJ0zixv8XPTAH6MpRJUvP9XjzxwaYHrjwcQ1LslW4TrIzwCgi5rf +jChLCyKcaL05gqUjl4lmefED/iqOwYZw5pJ8+X+OHUViiOB43wsJt1brAhPj4KgB +ODStcE6WlHFKi7YzcYNLzYMebSGYn6bj65b3qNf6rybWD1hGUFK4122Q7+HCH9Ic +J+rr8HwjGFo/yxI0/mkyaF0BthXYPy4WtdsdTM2kgx8Zr3Q2rSt1jBPuV3q8d27z +FZMiA/9cWPkRx0RfAJmBPKmKkbBkEtBbNau3G7MY1OEAkEkRnzmnyyjr5IP84A7K +RdjTCvkbiQrOQH00Ki4sHIg+9Xv1gDg1XLkFDzRARKA1TxjL0OeS4RWF3iia7Swk +MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaurQpSGVucmkgVHJl +bWJsYXkgPGhlbnJpLnRyZW1ibGF5QGdtYWlsLmNvbT7OwU0ES+xnEBAIALYa2xQw +2yBqve3W19WRMDRqYyC3XrpsWc2gnOT4JXRxgPOky9lfYj6TjSbb+/wrK9XP67x9 +CAPwRbvtCnXvVD/s/ScnJnyaSLHdkLcX4Z/UePk3dFbTfTTZKbdfiXE4W88kKuFF +PNrgSsEhv8M7mziOBZ/u8qSLjYA5KitEkyC97nChf0Ve+z7DgXix5AhiiFYVFH2N +Q+dQVmSigdXn2lSuzy3Z7IuuJQIW2nsQON3cFFLVcEDrw8yVbZMnFdiDMF8Mh6J5 +SvuL23MCB9gQFOOiyGcvlRWiPpTTZkffsXlh+PaCWJzFiF4n+Ec7ztWoNiisJRtr +GnLlU7aVlaimsgcAAwUH+wRpeDzirZbgG192vyhp19WMomz09nuKXTsamyk8LkXO +yCyCvy1XHo1bi3fnjhdUJo06CO2N6o5c77WsUnpn5MWyEKXbrNEshxBABh/6ozbk +7PGcBJfbTz6ymiR2yfZEK5Qz8JLnwNDQwF0xO+lIXBz2NA3spAChMNq2rxKiO2NJ +10dlkpkSxQoZkPmjU5v/VBiPyKEXUv3YKNXmiw/+0SxXi+bRg3vtp4/geo/udp2R +JmkQlllOzvY2C9XELuVk7q7Z3gi7SKnoS7I7lc/YoQcrGLlHEzlf+ltACHJUKDBI +hUfSsr9KMA5Oi7V9g4ImybgL7y5Z2o7IhpuZ8lYdxtTCSQQYEQIACQUCS+xnEAIb +DAAKCRB8fYRWKUQjuol1AJ0XC8Ne5QYXv1nChUZMxE0sWiXIyACePz9TTTp/3knC +3cdu7I3u6t7ARDc= +=7csd +-----END PGP PUBLIC KEY BLOCK----- + pub 7EB97D110DFADD60 uid Niall Gallagher (www.npgall.com) diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index a66f6684..2aad3bea 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -47,6 +47,7 @@ + @@ -79,6 +80,8 @@ + + @@ -96,6 +99,7 @@ + @@ -104,6 +108,8 @@ + + @@ -141,6 +147,7 @@ + @@ -215,10 +222,12 @@ + + @@ -241,9 +250,11 @@ + + @@ -254,6 +265,8 @@ + + @@ -352,6 +365,14 @@ + + + + + + + + @@ -413,6 +434,11 @@ + + + + + @@ -557,6 +583,9 @@ + + + @@ -837,6 +866,14 @@ + + + + + + + + @@ -877,6 +914,14 @@ + + + + + + + + @@ -917,6 +962,14 @@ + + + + + + + + @@ -957,6 +1010,14 @@ + + + + + + + + @@ -1005,6 +1066,14 @@ + + + + + + + + @@ -1053,6 +1122,14 @@ + + + + + + + + @@ -1101,6 +1178,14 @@ + + + + + + + + @@ -1149,6 +1234,14 @@ + + + + + + + + @@ -1245,6 +1338,14 @@ + + + + + + + + @@ -1293,6 +1394,14 @@ + + + + + + + + @@ -1373,6 +1482,14 @@ + + + + + + + + @@ -1421,6 +1538,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -1469,6 +1610,14 @@ + + + + + + + + @@ -1517,6 +1666,14 @@ + + + + + + + + @@ -1565,6 +1722,14 @@ + + + + + + + + @@ -1613,6 +1778,14 @@ + + + + + + + + @@ -1661,6 +1834,14 @@ + + + + + + + + @@ -1709,6 +1890,14 @@ + + + + + + + + @@ -1757,6 +1946,14 @@ + + + + + + + + @@ -1805,6 +2002,14 @@ + + + + + + + + @@ -1853,6 +2058,14 @@ + + + + + + + + @@ -1901,6 +2114,14 @@ + + + + + + + + @@ -1949,6 +2170,14 @@ + + + + + + + + @@ -1997,6 +2226,14 @@ + + + + + + + + @@ -2045,6 +2282,14 @@ + + + + + + + + @@ -2093,6 +2338,14 @@ + + + + + + + + @@ -2106,6 +2359,14 @@ + + + + + + + + @@ -2114,6 +2375,14 @@ + + + + + + + + @@ -2323,6 +2592,14 @@ + + + + + + + + @@ -2427,6 +2704,14 @@ + + + + + + + + @@ -2531,6 +2816,14 @@ + + + + + + + + @@ -2648,6 +2941,14 @@ + + + + + + + + @@ -2733,6 +3034,22 @@ + + + + + + + + + + + + + + + + @@ -2822,6 +3139,14 @@ + + + + + + + + @@ -2867,6 +3192,14 @@ + + + + + + + + @@ -2899,6 +3232,14 @@ + + + + + + + + @@ -3001,6 +3342,9 @@ + + + @@ -3060,6 +3404,14 @@ + + + + + + + + @@ -3113,6 +3465,14 @@ + + + + + + + + @@ -3137,6 +3497,14 @@ + + + + + + + + @@ -3190,6 +3558,14 @@ + + + + + + + + @@ -3253,6 +3629,14 @@ + + + + + + + + @@ -3285,6 +3669,14 @@ + + + + + + + + @@ -3302,12 +3694,20 @@ + + + + + + + + @@ -3340,6 +3740,14 @@ + + + + + + + + @@ -3373,12 +3781,20 @@ + + + + + + + + @@ -3411,6 +3827,14 @@ + + + + + + + + @@ -3483,6 +3907,17 @@ + + + + + + + + + + + @@ -3515,6 +3950,14 @@ + + + + + + + + @@ -3568,6 +4011,14 @@ + + + + + + + + @@ -3626,6 +4077,14 @@ + + + + + + + + @@ -3642,6 +4101,14 @@ + + + + + + + + @@ -3756,6 +4223,14 @@ + + + + + + + + @@ -3764,6 +4239,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3785,6 +4297,14 @@ + + + + + + + + @@ -3838,6 +4358,14 @@ + + + + + + + + @@ -3854,6 +4382,14 @@ + + + + + + + + @@ -3870,6 +4406,14 @@ + + + + + + + + @@ -3886,6 +4430,14 @@ + + + + + + + + @@ -3902,6 +4454,14 @@ + + + + + + + + @@ -3918,6 +4478,14 @@ + + + + + + + + @@ -3934,6 +4502,14 @@ + + + + + + + + @@ -4067,6 +4643,14 @@ + + + + + + + + @@ -4091,6 +4675,14 @@ + + + + + + + + @@ -4195,6 +4787,14 @@ + + + + + + + + @@ -4290,6 +4890,11 @@ + + + + + @@ -4364,6 +4969,14 @@ + + + + + + + + @@ -4459,6 +5072,11 @@ + + + + + @@ -4533,6 +5151,14 @@ + + + + + + + + @@ -4645,6 +5271,14 @@ + + + + + + + + @@ -4757,6 +5391,14 @@ + + + + + + + + @@ -4949,8 +5591,16 @@ - - + + + + + + + + + + @@ -5045,6 +5695,14 @@ + + + + + + + + @@ -5141,6 +5799,14 @@ + + + + + + + + @@ -5237,6 +5903,14 @@ + + + + + + + + @@ -5333,6 +6007,14 @@ + + + + + + + + @@ -5429,6 +6111,14 @@ + + + + + + + + @@ -5525,6 +6215,14 @@ + + + + + + + + @@ -5605,6 +6303,14 @@ + + + + + + + + @@ -5685,6 +6391,14 @@ + + + + + + + + @@ -5781,6 +6495,14 @@ + + + + + + + + @@ -5877,6 +6599,14 @@ + + + + + + + + @@ -5973,6 +6703,14 @@ + + + + + + + + @@ -6069,6 +6807,14 @@ + + + + + + + + @@ -6165,6 +6911,14 @@ + + + + + + + + @@ -6261,6 +7015,14 @@ + + + + + + + + @@ -6413,6 +7175,14 @@ + + + + + + + + @@ -6517,6 +7287,14 @@ + + + + + + + + @@ -6597,6 +7375,14 @@ + + + + + + + + @@ -6621,6 +7407,14 @@ + + + + + + + + @@ -6725,6 +7519,14 @@ + + + + + + + + @@ -6861,6 +7663,14 @@ + + + + + + + + @@ -6973,6 +7783,14 @@ + + + + + + + + @@ -7269,6 +8087,14 @@ + + + + + + + + @@ -7653,6 +8479,14 @@ + + + + + + + + @@ -7749,6 +8583,14 @@ + + + + + + + + @@ -7845,6 +8687,14 @@ + + + + + + + + @@ -7925,6 +8775,14 @@ + + + + + + + + @@ -8197,6 +9055,14 @@ + + + + + + + + @@ -8261,6 +9127,14 @@ + + + + + + + + @@ -8325,6 +9199,14 @@ + + + + + + + + @@ -8405,6 +9287,14 @@ + + + + + + + + @@ -8501,6 +9391,14 @@ + + + + + + + + @@ -8581,6 +9479,14 @@ + + + + + + + + @@ -8677,6 +9583,14 @@ + + + + + + + + @@ -8757,6 +9671,14 @@ + + + + + + + + @@ -8853,6 +9775,14 @@ + + + + + + + + @@ -8933,6 +9863,14 @@ + + + + + + + + @@ -9013,6 +9951,14 @@ + + + + + + + + @@ -9093,6 +10039,14 @@ + + + + + + + + @@ -9189,6 +10143,14 @@ + + + + + + + + @@ -9269,6 +10231,14 @@ + + + + + + + + @@ -9493,6 +10463,14 @@ + + + + + + + + @@ -9573,6 +10551,14 @@ + + + + + + + + @@ -9669,6 +10655,14 @@ + + + + + + + + @@ -9850,6 +10844,14 @@ + + + + + + + + @@ -9898,6 +10900,14 @@ + + + + + + + + @@ -9946,6 +10956,14 @@ + + + + + + + + @@ -10149,6 +11167,14 @@ + + + + + + + + @@ -10157,6 +11183,11 @@ + + + + + @@ -10257,6 +11288,14 @@ + + + + + + + + @@ -10281,6 +11320,14 @@ + + + + + + + + @@ -10305,6 +11352,14 @@ + + + + + + + + @@ -10321,6 +11376,22 @@ + + + + + + + + + + + + + + + + @@ -10400,6 +11471,14 @@ + + + + + + + + @@ -10455,6 +11534,16 @@ + + + + + + + + + + @@ -10500,6 +11589,14 @@ + + + + + + + + @@ -10524,6 +11621,17 @@ + + + + + + + + + + + @@ -10534,6 +11642,11 @@ + + + + + @@ -10774,6 +11887,19 @@ + + + + + + + + + + + + + @@ -10798,6 +11924,14 @@ + + + + + + + + @@ -11813,6 +12947,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12100,39 +13314,117 @@ - - - - + + + + + + - - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12304,6 +13596,14 @@ + + + + + + + + @@ -12320,6 +13620,14 @@ + + + + + + + + @@ -12336,6 +13644,22 @@ + + + + + + + + + + + + + + + + @@ -12352,6 +13676,14 @@ + + + + + + + + @@ -12451,6 +13783,14 @@ + + + + + + + + @@ -12521,6 +13861,14 @@ + + + + + + + + @@ -12611,6 +13959,14 @@ + + + + + + + + @@ -12620,6 +13976,9 @@ + + + @@ -12656,6 +14015,14 @@ + + + + + + + + @@ -12672,6 +14039,14 @@ + + + + + + + + @@ -12712,6 +14087,14 @@ + + + + + + + + @@ -12765,6 +14148,14 @@ + + + + + + + + @@ -12838,6 +14229,9 @@ + + + @@ -12874,6 +14268,14 @@ + + + + + + + + @@ -12947,6 +14349,14 @@ + + + + + + + + @@ -13020,6 +14430,9 @@ + + + @@ -13056,6 +14469,14 @@ + + + + + + + + @@ -13129,6 +14550,9 @@ + + + @@ -13206,6 +14630,14 @@ + + + + + + + + @@ -13238,6 +14670,14 @@ + + + + + + + + @@ -13270,6 +14710,14 @@ + + + + + + + + @@ -13314,6 +14762,17 @@ + + + + + + + + + + + @@ -13346,6 +14805,14 @@ + + + + + + + + @@ -13378,6 +14845,14 @@ + + + + + + + + @@ -13410,6 +14885,14 @@ + + + + + + + + @@ -13442,6 +14925,14 @@ + + + + + + + + @@ -13474,6 +14965,14 @@ + + + + + + + + @@ -13506,6 +15005,22 @@ + + + + + + + + + + + + + + + + @@ -13514,6 +15029,14 @@ + + + + + + + + @@ -13546,6 +15069,14 @@ + + + + + + + + @@ -13610,6 +15141,14 @@ + + + + + + + + @@ -13658,6 +15197,14 @@ + + + + + + + + @@ -13690,6 +15237,14 @@ + + + + + + + + @@ -13722,6 +15277,14 @@ + + + + + + + + @@ -13754,6 +15317,14 @@ + + + + + + + + @@ -13786,6 +15357,14 @@ + + + + + + + + @@ -13818,6 +15397,14 @@ + + + + + + + + @@ -13865,6 +15452,9 @@ + + + @@ -13894,6 +15484,17 @@ + + + + + + + + + + + @@ -13928,6 +15529,11 @@ + + + + + @@ -13963,6 +15569,11 @@ + + + + + @@ -14033,6 +15644,9 @@ + + + @@ -14112,6 +15726,9 @@ + + + @@ -14148,6 +15765,14 @@ + + + + + + + + @@ -14180,6 +15805,14 @@ + + + + + + + + @@ -14212,6 +15845,14 @@ + + + + + + + + @@ -14244,6 +15885,22 @@ + + + + + + + + + + + + + + + + @@ -14474,6 +16131,22 @@ + + + + + + + + + + + + + + + + @@ -14482,6 +16155,14 @@ + + + + + + + + @@ -14511,6 +16192,19 @@ + + + + + + + + + + + + + @@ -14526,6 +16220,21 @@ + + + + + + + + + + + + + + + @@ -14556,6 +16265,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -14593,6 +16323,22 @@ + + + + + + + + + + + + + + + + @@ -14714,6 +16460,11 @@ + + + + + @@ -14729,6 +16480,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14737,6 +16536,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14772,6 +16650,14 @@ + + + + + + + + @@ -14796,6 +16682,14 @@ + + + + + + + + @@ -14820,6 +16714,14 @@ + + + + + + + + @@ -14844,6 +16746,14 @@ + + + + + + + + @@ -14868,6 +16778,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14912,6 +16934,11 @@ + + + + + @@ -14959,5 +16986,13 @@ + + + + + + + +