Commit c52cc2b8 authored by stopcovid@lunabee.com's avatar stopcovid@lunabee.com
Browse files

Update to 3.2.0

- European certificate
parent 1c503db0
[submodule "dgca-app-core-android"]
path = dgca-app-core-android
url = git@github.com:LunabeeStudio/dgca-app-core-android.git
......@@ -25,6 +25,10 @@ Component: PhotoView
License Text URL: http://www.apache.org/licenses/LICENSE-2.0
Source Code: https://github.com/Baseflow/PhotoView
Component: EU Digital COVID Certificate App Core - Android
License Text URL: http://www.apache.org/licenses/LICENSE-2.0
Source Code: https://github.com/eu-digital-green-certificates/dgca-app-core-android
================================================================================
BSD 3-Clause
================================================================================
......
......@@ -54,6 +54,7 @@ detekt {
tasks.withType(io.gitlab.arturbosch.detekt.Detekt) {
exclude("**/build/**")
exclude("**/dgca-app-core-android/**")
}
allprojects {
......
......@@ -12,7 +12,7 @@ package com.lunabeestudio.stopcovid.coreui
object ConfigConstant {
private const val BASE_URL: String = "https://app.tousanticovid.gouv.fr/"
private const val VERSION_PATH: String = "json/version-32/"
private const val VERSION_PATH: String = "json/version-33/"
private const val VERSIONED_SERVER_URL: String = BASE_URL + VERSION_PATH
const val SERVER_CERTIFICATE_SHA256: String = "sha256/ckVocY6+T4RvpXWtbqOF45qEvNls4oFWi83BryOQgOk="
......@@ -101,6 +101,35 @@ object ConfigConstant {
const val VACCIN_CERTIFICATE_FULL_FILE: String = "vaccin-certificate-full.png"
private const val VACCIN_CERTIFICATE_FULL_TEMPLATE_FILE: String = "vaccin-certificate-full-%s.png"
const val VACCIN_CERTIFICATE_FULL_TEMPLATE_URL: String = URL + VACCIN_CERTIFICATE_FULL_TEMPLATE_FILE
const val VACCIN_EUROPE_CERTIFICATE_FULL_FILE: String = "vaccin-europe-certificate-full.png"
private const val VACCIN_EUROPE_CERTIFICATE_FULL_TEMPLATE_FILE: String = "vaccin-europe-certificate-full-%s.png"
val VACCIN_EUROPE_CERTIFICATE_FULL_TEMPLATE_URL: String = URL + VACCIN_EUROPE_CERTIFICATE_FULL_TEMPLATE_FILE
const val VACCIN_EUROPE_CERTIFICATE_THUMBNAIL_FILE: String = "vaccin-europe-certificate.png"
private const val VACCIN_EUROPE_CERTIFICATE_THUMBNAIL_TEMPLATE_FILE: String = "vaccin-europe-certificate-%s.png"
val VACCIN_EUROPE_CERTIFICATE_THUMBNAIL_TEMPLATE_URL: String = URL + VACCIN_EUROPE_CERTIFICATE_THUMBNAIL_TEMPLATE_FILE
const val TEST_EUROPE_CERTIFICATE_THUMBNAIL_FILE: String = "test-europe-certificate.png"
private const val TEST_EUROPE_CERTIFICATE_THUMBNAIL_TEMPLATE_FILE: String = "test-europe-certificate-%s.png"
val TEST_EUROPE_CERTIFICATE_THUMBNAIL_TEMPLATE_URL: String = URL + TEST_EUROPE_CERTIFICATE_THUMBNAIL_TEMPLATE_FILE
const val TEST_EUROPE_CERTIFICATE_FULL_FILE: String = "test-europe-certificate-full.png"
private const val TEST_EUROPE_CERTIFICATE_FULL_TEMPLATE_FILE: String = "test-europe-certificate-full-%s.png"
val TEST_EUROPE_CERTIFICATE_FULL_TEMPLATE_URL: String = URL + TEST_EUROPE_CERTIFICATE_FULL_TEMPLATE_FILE
const val RECOVERY_EUROPE_CERTIFICATE_THUMBNAIL_FILE: String = "recovery-europe-certificate.png"
private const val RECOVERY_EUROPE_CERTIFICATE_THUMBNAIL_TEMPLATE_FILE: String = "recovery-europe-certificate-%s.png"
val RECOVERY_EUROPE_CERTIFICATE_THUMBNAIL_TEMPLATE_URL: String = URL + RECOVERY_EUROPE_CERTIFICATE_THUMBNAIL_TEMPLATE_FILE
const val RECOVERY_EUROPE_CERTIFICATE_FULL_FILE: String = "recovery-europe-certificate-full.png"
private const val RECOVERY_EUROPE_CERTIFICATE_FULL_TEMPLATE_FILE: String = "recovery-europe-certificate-full-%s.png"
val RECOVERY_EUROPE_CERTIFICATE_FULL_TEMPLATE_URL: String = URL + RECOVERY_EUROPE_CERTIFICATE_FULL_TEMPLATE_FILE
}
object DccCertificates {
const val FOLDER: String = "Certs/"
const val URL: String = VERSIONED_SERVER_URL + FOLDER
}
object Config {
......
......@@ -24,6 +24,7 @@ enum class EnvConstant {
override val calibrationFilename: String = "calibrationBle.json"
override val serverPublicKey: String =
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAc9IDt6qJq453SwyWPB94JaLB2VfTAcL43YVtMr3HhDCd22gKaQXIbX1d+tNhfvaKM51sxeaXziPjntUzbTNiw=="
override val dccCertificatesFilename: String = "dcc-certs.json"
};
abstract val captchaApiKey: String
......@@ -37,4 +38,5 @@ enum class EnvConstant {
abstract val configFilename: String
abstract val calibrationFilename: String
abstract val serverPublicKey: String
abstract val dccCertificatesFilename: String
}
package com.lunabeestudio.domain.model
enum class WalletCertificateType {
SANITARY {
override val code: String = "B2"
enum class WalletCertificateType(val code: String, val format: Format) {
SANITARY("B2", Format.WALLET_2D),
VACCINATION("L1", Format.WALLET_2D),
SANITARY_EUROPE("test", Format.WALLET_DCC),
VACCINATION_EUROPE("vaccine", Format.WALLET_DCC),
RECOVERY_EUROPE("recovery", Format.WALLET_DCC);
override val validationRegexp: Regex = "^[A-Z\\d]{4}" // Characters 0 to 3 are ignored. They represent the document format version.
.plus("([A-Z\\d]{4})") // 1 - Characters 4 to 7 represent the document signing authority.
.plus("([A-Z\\d]{4})") // 2 - Characters 8 to 11 represent the id of the certificate used to sign the document.
.plus("[A-Z\\d]{8}") // Characters 12 to 19 are ignored.
.plus("B2") // Characters 20 and 21 represent the wallet certificate type (sanitary, ...)
.plus("[A-Z\\d]{4}") // Characters 22 to 25 are ignored.
.plus("F0([^\\x1D\\x1E]+)[\\x1D\\x1E]") // 3 - We capture the field F0. It must have at least one character.
.plus("F1([^\\x1D\\x1E]+)[\\x1D\\x1E]") // 4 - We capture the field F1. It must have at least one character.
.plus("F2(\\d{8})") // 5 - We capture the field F2. It can only contain digits.
.plus("F3([FMU]{1})") // 6 - We capture the field F3. It can only contain "F", "M" or "U".
.plus("F4([A-Z\\d]{3,7})\\x1D?") // 7 - We capture the field F4. It can contain 3 to 7 uppercase letters and/or digits. It can also be ended by the GS ASCII char (29) if the field reaches its max length.
.plus("F5([PNIX]{1})") // 8 - We capture the field F5. It can only contain "P", "N", "I" or "X".
.plus("F6(\\d{12})") // 9 - We capture the field F6. It can only contain digits.
.plus("\\x1F{1}") // This character is separating the message from its signature.
.plus("([A-Z\\d\\=]+)$").toRegex() // 10 - This is the message signature.
enum class Format(val values: List<String>) {
WALLET_2D(listOf("wallet2d", "wallet")), WALLET_DCC(listOf("walletdcc"));
override val headerDetectionRegex: Regex = "^[A-Z\\d]{4}" // Characters 0 to 3 are ignored. They represent the document format version.
.plus("([A-Z\\d]{4})") // 1 - Characters 4 to 7 represent the document signing authority.
.plus("([A-Z\\d]{4})") // 2 - Characters 8 to 11 represent the id of the certificate used to sign the document.
.plus("[A-Z\\d]{8}") // Characters 12 to 19 are ignored.
.plus("B2") // Characters 20 and 21 represent the wallet certificate type (sanitary, ...)
.toRegex()
override val stringKey: String = "sanitaryCertificate"
},
VACCINATION {
override val code: String = "L1"
override val validationRegexp: Regex = "^[A-Z\\d]{4}" // Characters 0 to 3 are ignored. They represent the document format version.
.plus("([A-Z\\d]{4})") // 1 - Characters 4 to 7 represent the document signing authority.
.plus("([A-Z\\d]{4})") // 2 - Characters 8 to 11 represent the id of the certificate used to sign the document.
.plus("[A-Z\\d]{8}") // Characters 12 to 19 are ignored.
.plus("L1") // Characters 20 and 21 represent the wallet certificate type (sanitary, ...)
.plus("[A-Z\\d]{4}") // Characters 22 to 25 are ignored.
.plus("L0([^\\x1D\\x1E]+)[\\x1D\\x1E]") // 3 - We capture the field L0. It can contain uppercased letters and spaces. It can also be ended by the GS ASCII char (29) if the field reaches its max length.
.plus("L1([^\\x1D\\x1E]+)[\\x1D\\x1E]") // 4 - We capture the field L1. It must have at least one character.
.plus("L2(\\d{8})\\x1D?") // 5 - We capture the field L2. It can only contain 8 digits.
.plus("L3([^\\x1D\\x1E]*)[\\x1D\\x1E]") // // 6 - We capture the field L3. It can contain any characters.
.plus("L4([^\\x1D\\x1E]+)[\\x1D\\x1E]") // 7 - We capture the field L4. It must have at least one character
.plus("L5([^\\x1D\\x1E]+)[\\x1D\\x1E]") // 8 - We capture the field L5. It must have at least one character
.plus("L6([^\\x1D\\x1E]+)[\\x1D\\x1E]") // 9 - We capture the field L6. It must have at least one character
.plus("L7(\\d{1})") // 10 - We capture the field L7. It can contain only one digit.
.plus("L8(\\d{1})") // 11 - We capture the field L8. It can contain only one digit.
.plus("L9(\\d{8})") // 12 - We capture the field L9. It can only contain 8 digits.
.plus("LA([A-Z\\d]{2})") // 13 - We capture the field LA. 2 characters letters or digits
.plus("\\x1F{1}") // This character is separating the message from its signature.
.plus("([A-Z\\d\\=]+)$").toRegex() // 14 - This is the message signature.
override val headerDetectionRegex: Regex = "^[A-Z\\d]{4}" // Characters 0 to 3 are ignored. They represent the document format version.
.plus("([A-Z\\d]{4})") // 1 - Characters 4 to 7 represent the document signing authority.
.plus("([A-Z\\d]{4})") // 2 - Characters 8 to 11 represent the id of the certificate used to sign the document.
.plus("[A-Z\\d]{8}") // Characters 12 to 19 are ignored.
.plus("L1") // Characters 20 and 21 represent the wallet certificate type (sanitary, ...)
.toRegex()
override val stringKey: String = "vaccinationCertificate"
};
abstract val code: String
abstract val stringKey: String
abstract val validationRegexp: Regex
abstract val headerDetectionRegex: Regex
}
\ No newline at end of file
companion object {
fun fromValue(value: String): Format? = values().firstOrNull { it.values.contains(value) }
}
}
}
......@@ -76,7 +76,8 @@ dependencies {
implementation 'com.google.code.gson:gson:_'
implementation 'com.google.protobuf:protobuf-javalite:_'
implementation 'org.bouncycastle:bcprov-jdk15on:_'
implementation 'org.bouncycastle:bcprov-jdk15to18:_'
implementation 'commons-codec:commons-codec:_'
implementation project(path: ':analytics')
implementation project(path: ':domain')
......
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- Generated by `./gradlew refreshVersions` to avoid errors when using _ as a version. -->
<issue id="GradlePluginVersion" severity="ignore" />
<issue id="GradleDependency" severity="ignore" />
</lint>
\ No newline at end of file
......@@ -9,7 +9,7 @@
*/
plugins {
id("de.fayard.refreshVersions") version "0.10.0"
id("de.fayard.refreshVersions") version "0.10.1"
}
rootProject.name = 'TousAntiCovid'
......@@ -20,3 +20,5 @@ include ':robert'
include ':framework'
include ':domain'
include ':ble'
include ':dgca-decoder'
project(':dgca-decoder').projectDir = new File('./dgca-app-core-android/decoder')
\ No newline at end of file
......@@ -26,20 +26,27 @@ android {
packagingOptions {
exclude 'DebugProbesKt.bin'
exclude 'META-INF/AL2.0'
exclude 'META-INF/LGPL2.1'
pickFirst 'META-INF/AL2.0'
pickFirst 'META-INF/LGPL2.1'
pickFirst 'META-INF/ASL-2.0.txt'
pickFirst 'META-INF/LGPL-3.0.txt'
pickFirst 'draftv3/schema'
pickFirst 'draftv4/schema'
}
}
}
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
compileOptions {
coreLibraryDesugaringEnabled = true
}
defaultConfig {
applicationId "fr.gouv.android.stopcovid"
minSdkVersion 21
targetSdkVersion 30
versionCode 262
versionName "3.1.8"
versionCode 274
versionName "3.2.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
......@@ -63,6 +70,7 @@ android {
}
dependencies {
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:_"
implementation "com.github.PhilJay:MPAndroidChart:_"
......@@ -85,6 +93,7 @@ dependencies {
implementation project(path: ':framework')
implementation project(path: ':robert')
implementation project(path: ':domain')
implementation project(path: ':dgca-decoder')
androidTestImplementation "androidx.test.ext:junit:_"
androidTestImplementation "androidx.test:runner:_"
......
......@@ -22,6 +22,7 @@
-dontobfuscate
-keep public class com.lunabeestudio.** { *; }
-keep public class dgca.verifier.app.decoder.model.** { *; }
# Bouncy Castle -- Keep ECDH
-keep class org.bouncycastle.jcajce.provider.asymmetric.EC$* { *; }
......@@ -29,4 +30,6 @@
-keep class org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi$ECDH { *; }
-keep class org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi$ECDSA { *; }
# json-schema-validator
-keep class com.github.fge.jsonschema.** { *; }
-keep class org.mozilla.javascript.** { *; }
\ No newline at end of file
{
"fGLuvg6n5wk=": [
"MIIEGzCCAgOgAwIBAgIUNWO7+/2lmGQGT1cep5petfsOFocwDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDYxNDIyMDAwMFoXDTIzMDYxNDIyMDAwMFowRTELMAkGA1UEBhMCRlIxDTALBgNVBAoMBENOQU0xEjAQBgNVBAsMCTE4MDAzNTAyNDETMBEGA1UEAwwKRFNDX0ZSXzAxOTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCJiBWroM8AeX/1cn0Nyk300qLpMAD1UoB2Vq7a3No+BbgFKcPzm0ZwPaQYzfx3VHNc3JfUjv77AhJx5F4cY8+GjgeAwgd0wHQYDVR0OBBYEFF6mKwOiAheaIxTCkdVKd8zgd7urMB8GA1UdIwQYMBaAFL6KLtbJ+SBOOicDCJdN7P3ZfcXmMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9hbnRzLmdvdXYuZnIvY3NjYV9jcmwwGAYDVR0gBBEwDzANBgsqgXoBgUgfAwkBATA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKGGGh0dHBzOi8vYW50LmdvdXYuZnIvY3NjYTANBgkqhkiG9w0BAQsFAAOCAgEAu8BaLZXFj9/e2/a59mBrOhY2m5SpcAoayxF3zOkIOt7LNX0QqHuomOyGLHMnAhNALgS2vhDXD0hhs96ZcKaystlMePpYsVRyaYa53GwMrGHiLwFxH5qQNClCcktAP++wCcdQXzTyZOn9/GNdmquW1PNMLPCEfqlnzWawdpITr+CYMXa9R5BEMmdX19F41HcoPRn9/X2uHW/ONmBywTwJ3s0U8F5HF21buZtxVDvX4ey+qINBru4MiGwgRCsklS9kDbl3ODUox0lwhs2VgQzqjALF4xYgsdN2LJezrwAiL8GMRAenmX9eDdgzMGnjKFT6yW8BCrPsyUnM15RAou3BrwIp6oxXHnR8wbeKG7pzZZY1J4zk4yYyihwxguWbUZGksJsNAQoNdNHBZtc8a7Oj5onLyUIetd7ELXxdk8uy7WVFeye5V8qJRhWrFyhWWFscQeY8GktefXiGEh6fxGfRU5R5b0PznxfMiA3olad3s17dr+jzqCM/hcY2FmUTjYrSrAyrhHdmCYIJ3US71If74UeMs6NZnQRRiu3tbAX+TiDOHsEHEIOHldbyQqFfclyiC26fHTqcNfIAxXPmPDQ1jpEmhRjFDlOWHoSnzsGZi/wa1kmSb6+2uHgUP/C/O2oi+yAk8GpwpEi8Sgv+HH/p7z0ympQK8IUOG/4K3/urdto="
],
"IMgNr10pfPQ=": [
"MIIEGzCCAgOgAwIBAgIUY7ZCHR/KM3Pu7zkxGX7a6r2xWT8wDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDcxNDIyMDAwMFoXDTIzMDcxNDIyMDAwMFowRTELMAkGA1UEBhMCRlIxDTALBgNVBAoMBENOQU0xEjAQBgNVBAsMCTE4MDAzNTAyNDETMBEGA1UEAwwKRFNDX0ZSXzAyMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABApr3fW+erB7nBxIuxgY6mqWcuiAGeDBSBYOwHK/OY16f6AUjcxQT/Qp5LMC0eb8Jq/N+rkvSS+bHXcy0+CuPuSjgeAwgd0wHQYDVR0OBBYEFGaKMaCARFztgSv4jjRlAu75x3ILMB8GA1UdIwQYMBaAFL6KLtbJ+SBOOicDCJdN7P3ZfcXmMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9hbnRzLmdvdXYuZnIvY3NjYV9jcmwwGAYDVR0gBBEwDzANBgsqgXoBgUgfAwkBATA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKGGGh0dHBzOi8vYW50LmdvdXYuZnIvY3NjYTANBgkqhkiG9w0BAQsFAAOCAgEADKs8pzrmE48ZExyNbGa8kV7CjJjCfWGTOEfzxaA6X7gL0kaHVnvPeNq4yQh6CZl0mwrEmdxvuXKRefU+nCg/prbn6CAwC2irDHU5hS48Qvya7JwqNTMOU66phFs3FDuXOpUvm/fe+w6Vy9M0IqbKu7kEWizZ923G5YjrcUgnTuF9xZ0pOd2HjYh9efNOmbeda0JmJEQKxi5+WAGjOTqidDXfh/G+2jB/Ja67kyoZSeMHBEz7IyJ8hBrUWRWV5oEzIRQdMlZ2xPD9S9nS00T09gkl2nhx+U7nTqRPQa+qKMiejQA27+EwDgszkl5hUMTeqB5xA21l2SqBqz4W+v3WBy0ziDNS9Qa5HC1+lZp/7R+33pfGZMOC9iw2+yyC+SC8cFwUB/iuwZ+0096LV0wZshB74ZjU//sUNJIL5/ZWaNGohnIorJ8nbzMFm2rPfU66dOanfQ03IkrtIlbxH2IOAuBsC7Fk1OH6DDMoOJRia7OSAOv1UT696M7R4MtKyWhCiiNajxT2jSJbvpVj5YmS83G7cfbsYHu8x7VGxrwMXyyeyhKPh8D9xXCYdRrkAo5hhd9ETLRI4QeJHPQvw7UOL3Upog+fZmaXBeEetGl1Y8PQG2JHjY0BUGclNvvBApH6jEMWiOMUMjnR+mE8FC2LB5GJScjq1MLjaDqYpj5f2jI="
],
"mo/w8S8rZ0Q=" : [
"MIIEGzCCAgOgAwIBAgIUPUAmrN9wBn+eVuHqMp8b/blfPPMwDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDgxNDIyMDAwMFoXDTIzMDgxNDIyMDAwMFowRTELMAkGA1UEBhMCRlIxDTALBgNVBAoMBENOQU0xEjAQBgNVBAsMCTE4MDAzNTAyNDETMBEGA1UEAwwKRFNDX0ZSXzAyMTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNTwKU0P5xQOiXGFLqOxoD/oD0in/fAUIfPCChzrf8jUvGa48Yy/pVWOhB+MskHW0GRqkvXdknuXcTcMeQt48ZCjgeAwgd0wHQYDVR0OBBYEFIRbucEIacei+qS6DFsuclGQo2o7MB8GA1UdIwQYMBaAFL6KLtbJ+SBOOicDCJdN7P3ZfcXmMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9hbnRzLmdvdXYuZnIvY3NjYV9jcmwwGAYDVR0gBBEwDzANBgsqgXoBgUgfAwkBATA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKGGGh0dHBzOi8vYW50LmdvdXYuZnIvY3NjYTANBgkqhkiG9w0BAQsFAAOCAgEAhYhTafMjVKmyAFJhTx703KE211fPRx3YlWid6JeUNDIuYTQfIC0yPlvtaFM4Z9TVioHcTwweEfqNi10sGVNbWmWAk1RZhay01VCzzsCVscNmi2/7n+qAIHZWgLyAOjJZ2jVDidC8MWGQjb/qdpu1zh46AIiVmfUfhyvBfXP7dQKgx+nPrV+HhxwuaVGci/KccFIHoOu0rttjuUfg2HCQCr4CjLKZ+RHXny6zjfD3R9T1scndEkJot2L/f0lIIZez+oTx/Wo8ivNoy9C9T3py6as2AChlz1rXSNPsdJZ9M2pcCk8z1I8fAspOu+uEevXPig20cxBz1kJzHrAmvYPTB9JTwZHqek2wriAQ/7Oy92hWxr/6tnkdPC5aKUz0nEYBvJWWq3qO4O1GBXCBt8VdXklgPHvZCym2Yc1XKMdhtMVNpOOOZV6SoSTjoi6R3Eu2VSMQCd8RKYc7DjLss0FF6y5qYjBqmizjV5MKTxtxKFA62QUF0jI/9DypU1Pk3Vias9RpFkLiHE3UcVdGMbTvAc4hwH/bkOtg0W7lqnGsJTWdc8MbnZ3blVtrXylveHA/IXgERhyI3J0YCg3pWjJbEwnEqltUa0n93o0S6sDv78lt1uKAMre1+JUQ0lNNHldtljV6dvcQ7R+ebs3GEZUyDI20fmhIcNZCtmOehZm5fyM="
],
"eUVY16rD2Kc=" : [
"MIIEGzCCAgOgAwIBAgIUHHuaV60Jmxj0/Safb44HGezp2U8wDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDkxNDIyMDAwMFoXDTIzMDkxNDIyMDAwMFowRTELMAkGA1UEBhMCRlIxDTALBgNVBAoMBENOQU0xEjAQBgNVBAsMCTE4MDAzNTAyNDETMBEGA1UEAwwKRFNDX0ZSXzAyMjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMdh7SlGJ0sScP24BA/tiyUDACI8gPiNqZZ1UudCQl2iACyrLWnN+8AdZVL2rH3b2xPpzWwrzJBj3TIy5bjH096jgeAwgd0wHQYDVR0OBBYEFG+4PXS0sdtKNozOKQXcYVDA1Hn1MB8GA1UdIwQYMBaAFL6KLtbJ+SBOOicDCJdN7P3ZfcXmMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9hbnRzLmdvdXYuZnIvY3NjYV9jcmwwGAYDVR0gBBEwDzANBgsqgXoBgUgfAwkBATA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKGGGh0dHBzOi8vYW50LmdvdXYuZnIvY3NjYTANBgkqhkiG9w0BAQsFAAOCAgEAkjEVtzPSxFVMTUece3w7PeM4Q2fOn+MnaN60g6AusxnUUZGHErNnmjxVeU6isLYPB9gCHB3b2yZYXHh8IjMsf570yiDhsWBzwRjQc8a6uQoZSrCXFyVuvAGZ/hXWDf9AIKQrbrg/YlsN0qnhs7x3VsGZ62XHCQCBup2wMdW4VOa76YFgskKITmVB8RNE/r7sQn9tRmGW7RFC2f78v7vm8rshqB/6LFtwRe8kcBmRSw5l9pVMKHYLPW81NaEYN1BB3BNH+BH39rg89FPuuLMcO70Ow+1g7ebD+UH4VbgfhSrx9XKP5+FtQWTsatHdVg6vYYNPa9TR9/9e4Q3j3BAfnIdmhsT4DuRy9P+En9WZmg4NNFUVr8adlSKkiZOoJKSQh9TOavF4Ikvd/BD0S1UdjprApN3XauDRqvjKn4itsLc0m0ctUE5e234CLMbdNJM6ExPG+ukAdtK5V9FXwdyvl0+xVIBY9nI43z50KO5ZeyOWnqwRWCPqZ11FLuqFvoEpQPpx3d2Nc/IlQoalLWXtZYPOiEklhqAC7p1Qa+AG2RgsTxyIaMzCANjCDIFMBzcO6EbnHDPR9L5Xy4wqiLeQ06zeU0YR2WF+9DVMDR5j5lUR5QWFCDTK/B8ObjdsZl/Y9Qd7RoQT9wbtAa1+MpCXk7TnoRGG1HSdhi/yee661P0="
],
"53FOjX/4aJs=" : [
"MIIEGzCCAgOgAwIBAgIUbjokPqcsK9BPa9UdWexJeyEqilowDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMTAxNDIyMDAwMFoXDTIzMTAxNDIyMDAwMFowRTELMAkGA1UEBhMCRlIxDTALBgNVBAoMBENOQU0xEjAQBgNVBAsMCTE4MDAzNTAyNDETMBEGA1UEAwwKRFNDX0ZSXzAyMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABILv1iQZ9UPkQjn0MdzS0+aCBlAh7KkkV7ruxGbKn6mTeT7x5OvxPvvPML49nzK35gKbZObVZXdsQR+D+LUbPCWjgeAwgd0wHQYDVR0OBBYEFFmAYyEK7sVvsDvIY+w6fmNz2BT4MB8GA1UdIwQYMBaAFL6KLtbJ+SBOOicDCJdN7P3ZfcXmMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9hbnRzLmdvdXYuZnIvY3NjYV9jcmwwGAYDVR0gBBEwDzANBgsqgXoBgUgfAwkBATA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKGGGh0dHBzOi8vYW50LmdvdXYuZnIvY3NjYTANBgkqhkiG9w0BAQsFAAOCAgEApMhsApIqDdjtJiC6mOsvI8L9Uwf+gw/dv06vVIwTQ7y+4AgtfZ2HTWeqW7IlXvNYs0m44U4VyL43pnoV167rwBOAMGTrYqT+83Hl5adOtl5ui0RxVHzNdUPiVPL2dV/OgZQKq/TFjm8wuJOxhjGIx2CFVKX2PpcbHAZ/IawdJjhOsisBZpfYuBpKFV8hBj9/SF/EwCrbswB81IrOjNEl9MkG6JrYarO/uztKHv9OIFy5SC6BaKkO4OItM2xx4H1w2cl7Cqt32n94WLxP0HLeAKqUA8/7Ttoa98x04iLElhkg8Fd+aL6Foi1mWlWBRlgHz7iHxZ7zYDmi8NksxnKECSwBm4FpP2Guz7CWY/tsREyGvrzZ2DjYFtNtIOHW15xr7aTPRJ0yD0DYtmZ6l9aYlFVGUgNWypUuNOe3BJh25X2re7nIwSvUWZeAnUFbJ+2YYt9xQfjgSll/DByUG/SfT6EqstPWlbVFVLljs6azzxQyozRB8JYPVG1Kny8WSl3YokIDLVofulJqYpi+ac2DDFCA1L6Mtnfw/go7Rq7uiorduqZi3FL8vKwy0M6S3ckP06pWjpJdOyKaLk1cbHJR4fuzY+PrhvDkKmSSlEzsWCIKe6B//ErN64MJ5xJxc6HnP2KvXV4hf7XbFsNat5ETxb3VdQhVDyHzgbqSpVo9BIM="
],
"Qe8D6lfZ5/Y=" : [
"MIIEGzCCAgOgAwIBAgIUQGT66i1j72Yd+CXVZxgaJFhLGKcwDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMTExNDIzMDAwMFoXDTIzMTExNDIzMDAwMFowRTELMAkGA1UEBhMCRlIxDTALBgNVBAoMBENOQU0xEjAQBgNVBAsMCTE4MDAzNTAyNDETMBEGA1UEAwwKRFNDX0ZSXzAyNDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOweCJfmmAWZPIbNTCNvB+GeBhdh2Ql4F/w0k8b1KAjFc3uMaeOPViS25Ugil63hnYk9DMnIHr6OK1mFRm8LVMajgeAwgd0wHQYDVR0OBBYEFOkihiD6srcZ+6gH9LiQNVc6QwQ8MB8GA1UdIwQYMBaAFL6KLtbJ+SBOOicDCJdN7P3ZfcXmMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9hbnRzLmdvdXYuZnIvY3NjYV9jcmwwGAYDVR0gBBEwDzANBgsqgXoBgUgfAwkBATA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKGGGh0dHBzOi8vYW50LmdvdXYuZnIvY3NjYTANBgkqhkiG9w0BAQsFAAOCAgEAg1Vrsxtjk49QaxQ/LWFLC1WmRTNO/8XeLyASVHjPZXWfvrl9ft+SlKqlhIom7sYbxiYF5+g0qRjwBWMVqfFkYPpJkeuri2awLQo9Hr8oiPNVSHpFi3zjr4gMLEv2buQ6LUbvAT2U6eOW17AiNhT/3XzND8tILs++7JKU675p46YtKNguJhJVPEO+9cMdBdeJUM8d0RRV40AlkY/ThVI6BzqxmiD6jAka4bWJFztR8xkBs3RBxcumGXPIJIpC8cJ9dqnnsBdLJfDlWLfvpn9k03QIU9/XObnw3wLGwFWnxdr6sQMNxJCMpk3U2tT6og6DGylD4OQbGQvqFzm1x+5X11DQIdhQhBbbz+ymVBhVjVTm6D5JsEHYOcXi00aIs5zuDs0AYJhWZW/eimBgkRy2WE/6eH49pBSl80OmNAcxboqZHQS1jmLqZ9yptJ3pbSOXZS1ABgsGOYXCyHTPy5OQA5zHIt+zakgyvcFJm4YcIOD9gKzrpyiB7qJLbzliTHcimuIoMfKfzMi82K2rsFZ18glgRnm0/G1I8Cgnol2qXjkJTJq3BgI46+aA2ad8sMWB+3L7J9dj/nQJrNaZcYZ5IMhyHxeZRxpo9brURgzt9J/Qj2hF5gv2ovJXo+FgjMiLusVpsi3HKcYyUS36dKj+f4ty0kPdUklcdx52ogQ7K44="
],
"G3jDFQ1oK0Q=" : [
"MIIEGzCCAgOgAwIBAgIUEE5lEugsksKBZO8ZFddktB2zEZgwDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDYxNDIyMDAwMFoXDTIzMDYxNDIyMDAwMFowRTELMAkGA1UEBhMCRlIxDTALBgNVBAoMBENOQU0xEjAQBgNVBAsMCTE4MDAzNTAyNDETMBEGA1UEAwwKRFNDX0ZSXzAyNTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBBkknbST2XmFlN0K0dnEeDNgr+rGCrmPO9KpASikRLZUnpeAsaX5vBJz2fjj1VQ18QK1nWEdDKCyujsfWhCJJujgeAwgd0wHQYDVR0OBBYEFHo8gi1E3sTHBnZB1uyUzxdv5GyzMB8GA1UdIwQYMBaAFL6KLtbJ+SBOOicDCJdN7P3ZfcXmMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9hbnRzLmdvdXYuZnIvY3NjYV9jcmwwGAYDVR0gBBEwDzANBgsqgXoBgUgfAwkBATA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKGGGh0dHBzOi8vYW50LmdvdXYuZnIvY3NjYTANBgkqhkiG9w0BAQsFAAOCAgEAM2QCIIa2/qraMLp/+N3JR3gBVI+zSFird5rWdWPWptnVq+E2MEPwJhz3a288axhZPetnm2vxRHtrzI8OS0tcl0qoDhHmMQAPzYHth6xGoGx9+jfLFMoynA1hcRmILtiitPoOT8SYe9K+ln3sia2xn52Rysy1xLTQZquBmczVAdxAS3B+h2nNw7V0b9ukamul6w9Fp7ifg25pT6mTt5sXD89hTSqTf/fhiTCjRTrBTJuVA9VgKrWUiZHI/vIwKRHoqUvMDDW3RK/QoAqfQWzztKV9yRCpBhv5focv50owbyu1VYpnT0gnl20UZsLwEXt6TusJFvGoiySFCLLanU6gyoHcXudNem8YEosOzxFSR1wvKJws8JJjuaQweQBtu/XRlwti73KZjwltHsehHC3nFsl3VwMf97A2cmre2ueEUcjRFvElh2PfpIIL17Srpu/mvu3hSVHndsUoFVZnZUWz8rVQL0M394Ik9ZBaZXVrIZud1FfuDQzbVKjRTO9mOIv9WZ784MAON+g0p0xKvJ2MZmwe+ZF4FvxRP2fCC9vlMk3As4bccS3IUKsrupIFXar1THfGPL8obpn6ktjVJ4dCT+y2w5JHGtxclhIjdqG5w/PrMPjeGrq8wlALwGjKMTF6gOZ+BtfjNCaG8h8lpt+oKeML7GP/Fe5Adjcovc0DBY8="
],
"e+bFdywyJQE=" : ["MIIEIDCCAgigAwIBAgIUbNtFh5SyNNW36Tj3lSGsVZ1yzJkwDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDYxMDIyMDAwMFoXDTIzMDYxMDIyMDAwMFowSjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEFQSFAxFzAVBgNVBAsMDjI2NzUwMDQ1MjAwMDExMRMwEQYDVQQDDApEU0NfRlJfMDAxMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERuPqA8PXwAZlb3MnIn+3UajY2JjRkt4v3rI4nUuQjh23nZZ/3rDqaJ8Jbow+pKFgdWA51sZ6pQIyIX76wYfrCqOB4DCB3TAdBgNVHQ4EFgQUkqfVrNfmsMs1UB/NA0C3KVEx3O4wHwYDVR0jBBgwFoAUvoou1sn5IE46JwMIl03s/dl9xeYwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2FudHMuZ291di5mci9jc2NhX2NybDAYBgNVHSAEETAPMA0GCyqBegGBSB8DCQEBMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAoYYaHR0cHM6Ly9hbnQuZ291di5mci9jc2NhMA0GCSqGSIb3DQEBCwUAA4ICAQAhOMLYhWn1iV43jduVRRivgVT1jYwHmouj7nff+S7gVnxiIlX52jc/VmQDl6xOZjBHUBiRTRqjan1tdH1LvBfg1HoZWv3HaC5HbfkMu0nqItE5zbFwtJGsUpHRTSP/wrjqL83o5akkR8Uw/iIYhkLvuEKH3/ZqwZYRwOJ/NyXJnKgRuHvgsL0zbwf5X2EdbqaTtDDGHHCbg68o8CqkQ/guBP0jKHXBFWgboMQB2bruquGqVO2xKIZIU2E3sc3dhNbDYGD3KfgJbdFtnbISvxaIfnCn3anZtQgonSsHc0LWIpgobY+NxXSNfBKzICdI350hhmnHz2NS2VtrF0Xa59kZd/WMPcOzlfKi6aVI/Y+LcpujeO9ujlFGNU6aMxi2s9RWy31tjWxsOmr/sbEKF25YGuTWwvqe/MgXzpbTF0C1lVcARXaBVT8Q18nNbLLK/VLAtzjLYTblFM4zdXA5ZnfCqXDqZZathkyyf8aY/svDELxROVm72F9GnYC/OqnGeCOed+Iscp8ne8HUTgT0iNFiAR1pRz25v047QFE7G7jwo4YTA+ynwCxnVaoK3pkyfIiXstyPxMpu3Q7t90br/mAPDCWDHFpvxqvPcRlMpd3p5JcjiurGreGbivgPdJYGRPbWb/Kwp/99ACqZFA8FaGL7aP+ivAO6cBv6DNF2XXvoww=="],
"eQOY6BDp+vM=" : ["MIIEIDCCAgigAwIBAgIUQporYv8Mt3ziR1r6G4s54HzRVpcwDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDYxMDIyMDAwMFoXDTIzMDYxMDIyMDAwMFowSjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEFQSFAxFzAVBgNVBAsMDjI2NzUwMDQ1MjAwMDExMRMwEQYDVQQDDApEU0NfRlJfMDAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEx2sQ7slwQ+IQrSLZwgIfafTa2g144vB8OXnI5WU67BHfTazsPcfNbWUj5uq/fFB5EEblaSEpRA5YwhyfAEIt4qOB4DCB3TAdBgNVHQ4EFgQUxhlqVg/2EyJWoDdVGkyJrsY4CXkwHwYDVR0jBBgwFoAUvoou1sn5IE46JwMIl03s/dl9xeYwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2FudHMuZ291di5mci9jc2NhX2NybDAYBgNVHSAEETAPMA0GCyqBegGBSB8DCQEBMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAoYYaHR0cHM6Ly9hbnQuZ291di5mci9jc2NhMA0GCSqGSIb3DQEBCwUAA4ICAQCbA+2eQnPJWMmh2eIH1gMJhggl5GSmOBFKeXyC4jeYQSDRY97/rsDWRXAYtE4DgZQO1cZcwsM4ybbZ+khmb0iCeO/0oiKIux8FU14B7zFksZFxZpbUSAJGD9lE1xRFnfUIyoPL3lza7lWqZ8lSfLuoqoN4mODkGpPYwWu/GC8sR3ynDt2jhrdBcLnos3k47+4ZRypwDnv9FRU4/9fEnl3Y4iK+hUtq83tI5offQETsXIq+VMmcw6zmeUTaMcHRnnMo4WknrSHbe9x1MOwQmADn7ZjYzMooI4TyM/dzo1IOH8iovgMbJP7zxWqp8zgtqZPpDtp500V9yCBjGCQWgRofrBhUojKj4BkGslCZaHHkRqp0A7WOIejCpCYwNRhom3Hu8oClJ0fGcIEIrdybYISYemClnbSlM+tXt9vATf7oMRZgXSGR/9HrY95naG5U7/+eHRgm3qHAJbbbTDHET7ba+Wiq9rnYScChSH/bMN2yLsuBcpVozokcX6k2l69KVzAsVtKCjPS/ISBWHDiEaVx++RyPB5YfbVX7ykJ4SaWX1ED6DLeszCdcLNb57i1Xu35kb1SGh+CUeALUEqBtJUcEheLixnTxJIHG2xq59a560SsZBdMf8r/qYTz9DqEgBXPSlNeHn5aIG/2u0bLrM3Q9GvBk4zBj3C4zWZJVUTZBNA=="],
"pe6raiG2dWE=" : ["MIIEIDCCAgigAwIBAgIUaaZNZoiS7up4kcKvogrzW8iwXbIwDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDkxMDIyMDAwMFoXDTIzMDkxMDIyMDAwMFowSjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEFQSFAxFzAVBgNVBAsMDjI2NzUwMDQ1MjAwMDExMRMwEQYDVQQDDApEU0NfRlJfMDAzMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYhbzpGUwWZsuCEA81oAyfP87n5PwahJ99Q7M7t8AyNn7QVv30mX+GUTN3aWb91903UvjfwRlCJQiC7pLchjkzKOB4DCB3TAdBgNVHQ4EFgQUPQQuG8z6nMfreGSJOz8MdoIMvFYwHwYDVR0jBBgwFoAUvoou1sn5IE46JwMIl03s/dl9xeYwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2FudHMuZ291di5mci9jc2NhX2NybDAYBgNVHSAEETAPMA0GCyqBegGBSB8DCQEBMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAoYYaHR0cHM6Ly9hbnQuZ291di5mci9jc2NhMA0GCSqGSIb3DQEBCwUAA4ICAQCe8I1wV8foZkHBp6MM5QbHFNut+gQ45nTjZEOVF2wzAZz4xa48Knhl9K6JdeBQhedQBzx3jKWEpl9A4ycPbwCwS7+HlpDzC23ZaesAGPhR+VAEyYMUEH8ONbsjKIA+rg/4OIJ5byPYxnZkdrSNH+NQzEn8Pb5ZAW8DQXeJgJ/x3Wg+Ogd0iM8yNd1sMMQiO20C4eBRaOtJZnr8W3xLRYaD5sxVHSWRkkCVELQXAVcugmiL6u9MR4KgxV5qWqi66GqHI4zfbe1H+EQ67bnH17YZ+ye0r+FRi7aacXy7Xtk08zQCqhDFaZDr2H7wTj5NJIuSnZc83gAyV+C4QxrkYIbVqPVJ+bea2RGvXYrcyH9LrZdPDJqylcKOoRpvSJoCoyJ40zu4B1tiludT2HdTwN5wjVLmAvJfPT+ZKnVXOgwabm/95Xs/Y8fOcfaRzH44p4j3e65uZ4U1n/gUnya9iaiNpBqYq0c8czOquRm1CJVf/shRkqmQTw7p8BaMygYs2VrS521LbiEeZALpG+sdoVUQfMRN8Ii2+RrJVu+AWUdz93+u98TRDodTRKfCIJq4/rDo9yepiKSgUjaxvvgDszQLcqHBFzHB9Y/Gv+l8YQzIKK9ZxFVEjEDX++heFPYC7C+LQToZcn9CKZAC6M3D7rRBEZ1ibMpVyEW4YXu9tu8RfA=="],
"rLMiGt6uB3U=" : ["MIIEIDCCAgigAwIBAgIUIxJMjNw3dr88EcIE+hNISSiImkwwDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDkxMDIyMDAwMFoXDTIzMDkxMDIyMDAwMFowSjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEFQSFAxFzAVBgNVBAsMDjI2NzUwMDQ1MjAwMDExMRMwEQYDVQQDDApEU0NfRlJfMDA0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzL6Rlb4x8PsN6Knac1E+85lkIce+1Zn53WIrFVIAAaXOd4P6Zpvd+MLOLzdJbxhMPF4851s9qxXzMBIMevSLMKOB4DCB3TAdBgNVHQ4EFgQUW8d5IrarC3lBI/Bj5O53KmwrwI0wHwYDVR0jBBgwFoAUvoou1sn5IE46JwMIl03s/dl9xeYwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2FudHMuZ291di5mci9jc2NhX2NybDAYBgNVHSAEETAPMA0GCyqBegGBSB8DCQEBMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAoYYaHR0cHM6Ly9hbnQuZ291di5mci9jc2NhMA0GCSqGSIb3DQEBCwUAA4ICAQCalwjJDDOjgInZboNfXmrdZjrxA7i65O84bWW1rnOSGZwBpdMcdKrNDiizyjklB6tSKuLH0fllMPUCMd2Umz9zTTKJG1usxQ5Yaf9BBW+g8Pwgn/mNRprogPK/VXFdLCOCmxr1/y1FEPgnecD3oBFhm4ojZywwWVrcUoPnRvqIfJLEvzvYais7y9PqkaFqW0TNyvaRq9tBYyFkvZUQuizKK10nmIXLzg6JYnSXR6awtRcZJs1eF53UQynv0dQmVZbMl/JM01y+sard38byiKzQc+v/ANI24zLHWw9iJm2/jlFTch8S2eazMEAe8EvpMqzzSOcIrmgrL/r9CQo00cFFkCGCIZWnHhHEKv+uuEPVilSJC7ijM8p5npt1PwqCCB4HWcdZEY1oCu3zjjOIIRIySZmKoailNEV4iZeAw0D++wkR1+OyywIebkaRVWKk/irrToYuvQYiTDlh1yIh7mmrL0/lULdONjsawOh/s0/vxKSyD+gkMVRzxBax7BhT3DLzj2L7E/Tw5DNL87k7zmlxcHGW8Oa6sIJwKRsTg/76frIf21u99FhfqeWkhfhZ5yTzGiJR6FquZ/tTrlq216MqICXO4QN8/p8OrP9foTS2+3FvWRWxk0pBEVZget0CtMP3PpZ+IC7gwp3wALhWtZwwY/64FUl9ZLZqId8RtbQBEQ=="]
}
......@@ -8,6 +8,20 @@
}
]
},
{
"section": "👉 Where to get your certificate",
"description" : "You can get your vaccination certificate on https://attestation-vaccin.ameli.fr/ and your test certificate on https://sidep.gouv.fr",
"links": [
{
"label": "Your vaccination certificate",
"url": "https://attestation-vaccin.ameli.fr/"
},
{
"label": "Your test certificate",
"url": "https://sidep.gouv.fr/"
}
]
},
{
"section": "Where to get tested",
"description" : "To find out where to get tested, go to Santé.fr.",
......@@ -30,7 +44,7 @@
},
{
"section": "l'Assurance Maladie",
"description": "Here is several useful information provided by Ameli.fr, including contact tracing and at-risk contact person",
"description": "Here are several useful links provided by Ameli.fr, including contact tracing and at-risk contact person",
"links": [
{
"label": "Contact tracing",
......
......@@ -8,6 +8,20 @@
}
]
},
{
"section": "👉 Où récupérer son certificat",
"description" : "Vous pouvez récupérer votre certificat de vaccination sur https://attestation-vaccin.ameli.fr/ et votre certificat de test sur https://sidep.gouv.fr",
"links": [
{
"label": "Votre certificat de vaccination",
"url": "https://attestation-vaccin.ameli.fr/"
},
{
"label": "Votre certificat de test",
"url": "https://sidep.gouv.fr/"
}
]
},
{
"section": "Où se faire dépister",
"description" : "Pour trouver où se faire dépister, rendez vous sur Santé.fr.",
......
......@@ -37,6 +37,16 @@
"action": "risk.section.mcc.url",
"type": "web"
}
},
{
"section": "risk0.section.test.title",
"description" : "risk0.section.test.body",
"link" :
{
"label": "risk.section.test.button",
"action": "risk.section.test.url",
"type": "web"
}
}
]
},
......@@ -151,7 +161,7 @@
"notifTitle" : "risk3.notif.title",
"notifBody" : "risk3.notif.sub"
},
"color" : {"from" : "#A47984", "to" : "#7E4F5B"},
"color" : {"from" : "#DD5860", "to" : "#D02E39"},
"contactDateFormat" : "range",
"sections" : [
{
......
......@@ -69,6 +69,7 @@ import com.lunabeestudio.stopcovid.manager.AttestationsManager
import com.lunabeestudio.stopcovid.manager.CalibDataSource
import com.lunabeestudio.stopcovid.manager.CertificatesDocumentsManager
import com.lunabeestudio.stopcovid.manager.ConfigDataSource
import com.lunabeestudio.stopcovid.manager.DccCertificatesManager
import com.lunabeestudio.stopcovid.manager.FormManager
import com.lunabeestudio.stopcovid.manager.InfoCenterManager
import com.lunabeestudio.stopcovid.manager.IsolationManager
......@@ -155,6 +156,7 @@ class StopCovid : Application(), LifecycleObserver, RobertApplication, Isolation
}
private val certificatesDocumentsManager: CertificatesDocumentsManager = CertificatesDocumentsManager(this)
val dccCertificatesManager: DccCertificatesManager by lazy { DccCertificatesManager() }
init {
System.setProperty("kotlinx.coroutines.debug", if (BuildConfig.DEBUG) "on" else "off")
......@@ -278,6 +280,9 @@ class StopCovid : Application(), LifecycleObserver, RobertApplication, Isolation
appCoroutineScope.launch {
certificatesDocumentsManager.onAppForeground(this@StopCovid)
}
appCoroutineScope.launch {
dccCertificatesManager.onAppForeground(this@StopCovid)
}
appCoroutineScope.launch {
robertManager.refreshConfig(this@StopCovid)
}
......
......@@ -120,7 +120,7 @@ class MainActivity : BaseActivity() {
private fun fixIntentData(intent: Intent) {
// since we use '#' to separate the code, we replace it to pass a clean URL to the nav_graph deeplink handle
val uri = intent.data?.let {
DeeplinkManager.transformAnchorParam(it)
DeeplinkManager.transformFragmentToCodeParam(it)
}
val uriBuilder = uri?.buildUpon()
?.path(intent.data?.path?.takeIf { it != "/" })
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment