From 3dceec8ec08b9d7ada9b1eb40db6d187379b83c7 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 29 Jun 2021 22:40:02 +0200 Subject: [PATCH 01/10] Support for password-protected zip files --- app/build.gradle | 1 + .../card_locker/ImportExportActivity.java | 40 +++-- .../protect/card_locker/ImportExportTask.java | 33 ++-- .../card_locker/importexport/CsvImporter.java | 2 +- .../{ => importexport}/DataFormat.java | 3 +- .../importexport/FidmeImporter.java | 15 +- .../importexport/ImportExportResult.java | 9 + .../card_locker/importexport/Importer.java | 2 +- .../importexport/MultiFormatExporter.java | 13 +- .../importexport/MultiFormatImporter.java | 23 ++- .../importexport/StocardImporter.java | 149 ++++++++++++++++ .../importexport/VoucherVaultImporter.java | 2 +- .../protect/card_locker/ImportExportTest.java | 162 +++++++++++------- ...33e49-cfa0-49ad-a297-c1d655f72b01-sync.zip | Bin 0 -> 168243 bytes 14 files changed, 339 insertions(+), 115 deletions(-) rename app/src/main/java/protect/card_locker/{ => importexport}/DataFormat.java (57%) create mode 100644 app/src/main/java/protect/card_locker/importexport/ImportExportResult.java create mode 100644 app/src/main/java/protect/card_locker/importexport/StocardImporter.java create mode 100644 app/src/test/res/protect/card_locker/50e33e49-cfa0-49ad-a297-c1d655f72b01-sync.zip diff --git a/app/build.gradle b/app/build.gradle index b6b1fc1a1..28bcb3456 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,6 +84,7 @@ dependencies { implementation 'com.jaredrummler:colorpicker:1.1.0' implementation 'com.google.guava:guava:30.1.1-jre' implementation 'com.github.invissvenska:NumberPickerPreference:1.0.2' + implementation 'net.lingala.zip4j:zip4j:2.8.0' // SpotBugs implementation 'io.wcm.tooling.spotbugs:io.wcm.tooling.spotbugs.annotations:1.0.0' diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java index 2445605a9..27fa2baa3 100644 --- a/app/src/main/java/protect/card_locker/ImportExportActivity.java +++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java @@ -27,6 +27,8 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import protect.card_locker.importexport.DataFormat; +import protect.card_locker.importexport.ImportExportResult; public class ImportExportActivity extends AppCompatActivity { @@ -162,19 +164,19 @@ public class ImportExportActivity extends AppCompatActivity builder.show(); } - private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat) + private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password) { ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() { @Override - public void onTaskComplete(boolean success) + public void onTaskComplete(ImportExportResult result) { - onImportComplete(success, targetUri); + onImportComplete(result, targetUri); } }; importExporter = new ImportExportTask(ImportExportActivity.this, - dataFormat, target, listener); + dataFormat, target, password, listener); importExporter.execute(); } @@ -183,9 +185,9 @@ public class ImportExportActivity extends AppCompatActivity ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() { @Override - public void onTaskComplete(boolean success) + public void onTaskComplete(ImportExportResult result) { - onExportComplete(success, targetUri); + onExportComplete(result, targetUri); } }; @@ -245,20 +247,23 @@ public class ImportExportActivity extends AppCompatActivity return super.onOptionsItemSelected(item); } - private void onImportComplete(boolean success, Uri path) + private void onImportComplete(ImportExportResult result, Uri path) { AlertDialog.Builder builder = new AlertDialog.Builder(this); - if(success) + int messageId; + + if(result == ImportExportResult.Success) { builder.setTitle(R.string.importSuccessfulTitle); + messageId = R.string.importSuccessful; } else { builder.setTitle(R.string.importFailedTitle); + messageId = R.string.importFailed; } - int messageId = success ? R.string.importSuccessful : R.string.importFailed; final String message = getResources().getString(messageId); builder.setMessage(message); @@ -274,20 +279,23 @@ public class ImportExportActivity extends AppCompatActivity builder.create().show(); } - private void onExportComplete(boolean success, final Uri path) + private void onExportComplete(ImportExportResult result, final Uri path) { AlertDialog.Builder builder = new AlertDialog.Builder(this); - if(success) + int messageId; + + if(result == ImportExportResult.Success) { builder.setTitle(R.string.exportSuccessfulTitle); + messageId = R.string.exportSuccessful; } else { builder.setTitle(R.string.exportFailedTitle); + messageId = R.string.exportFailed; } - int messageId = success ? R.string.exportSuccessful : R.string.exportFailed; final String message = getResources().getString(messageId); builder.setMessage(message); @@ -300,7 +308,7 @@ public class ImportExportActivity extends AppCompatActivity } }); - if(success) + if(result == ImportExportResult.Success) { final CharSequence sendLabel = ImportExportActivity.this.getResources().getText(R.string.sendLabel); @@ -389,7 +397,7 @@ public class ImportExportActivity extends AppCompatActivity Log.e(TAG, "Starting file import with: " + uri.toString()); - startImport(reader, uri, importDataFormat); + startImport(reader, uri, importDataFormat, null); } } catch(FileNotFoundException e) @@ -397,11 +405,11 @@ public class ImportExportActivity extends AppCompatActivity Log.e(TAG, "Failed to import/export file: " + uri.toString(), e); if (requestCode == CHOOSE_EXPORT_LOCATION) { - onExportComplete(false, uri); + onExportComplete(ImportExportResult.GenericFailure, uri); } else { - onImportComplete(false, uri); + onImportComplete(ImportExportResult.GenericFailure, uri); } } } diff --git a/app/src/main/java/protect/card_locker/ImportExportTask.java b/app/src/main/java/protect/card_locker/ImportExportTask.java index 96ad7bf39..a86057353 100644 --- a/app/src/main/java/protect/card_locker/ImportExportTask.java +++ b/app/src/main/java/protect/card_locker/ImportExportTask.java @@ -13,10 +13,12 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; +import protect.card_locker.importexport.DataFormat; +import protect.card_locker.importexport.ImportExportResult; import protect.card_locker.importexport.MultiFormatExporter; import protect.card_locker.importexport.MultiFormatImporter; -class ImportExportTask extends AsyncTask +class ImportExportTask extends AsyncTask { private static final String TAG = "Catima"; @@ -25,6 +27,7 @@ class ImportExportTask extends AsyncTask private DataFormat format; private OutputStream outputStream; private InputStream inputStream; + private char[] password; private TaskCompleteListener listener; private ProgressDialog progress; @@ -46,7 +49,7 @@ class ImportExportTask extends AsyncTask /** * Constructor which will setup a task for importing from the given InputStream. */ - ImportExportTask(Activity activity, DataFormat format, InputStream input, + ImportExportTask(Activity activity, DataFormat format, InputStream input, char[] password, TaskCompleteListener listener) { super(); @@ -54,24 +57,22 @@ class ImportExportTask extends AsyncTask this.doImport = true; this.format = format; this.inputStream = input; + this.password = password; this.listener = listener; } - private boolean performImport(Context context, InputStream stream, DBHelper db) + private ImportExportResult performImport(Context context, InputStream stream, DBHelper db, char[] password) { - boolean result = false; + ImportExportResult importResult = MultiFormatImporter.importData(context, db, stream, format, password); + Log.i(TAG, "Import result: " + importResult.name()); - result = MultiFormatImporter.importData(context, db, stream, format); - - Log.i(TAG, "Import result: " + result); - - return result; + return importResult; } - private boolean performExport(Context context, OutputStream stream, DBHelper db) + private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db) { - boolean result = false; + ImportExportResult result = ImportExportResult.GenericFailure; try { @@ -106,14 +107,14 @@ class ImportExportTask extends AsyncTask progress.show(); } - protected Boolean doInBackground(Void... nothing) + protected ImportExportResult doInBackground(Void... nothing) { final DBHelper db = new DBHelper(activity); - boolean result; + ImportExportResult result; if(doImport) { - result = performImport(activity.getApplicationContext(), inputStream, db); + result = performImport(activity.getApplicationContext(), inputStream, db, password); } else { @@ -123,7 +124,7 @@ class ImportExportTask extends AsyncTask return result; } - protected void onPostExecute(Boolean result) + protected void onPostExecute(ImportExportResult result) { listener.onTaskComplete(result); @@ -138,7 +139,7 @@ class ImportExportTask extends AsyncTask } interface TaskCompleteListener { - void onTaskComplete(boolean success); + void onTaskComplete(ImportExportResult result); } } diff --git a/app/src/main/java/protect/card_locker/importexport/CsvImporter.java b/app/src/main/java/protect/card_locker/importexport/CsvImporter.java index a7c5876f7..292a21fec 100644 --- a/app/src/main/java/protect/card_locker/importexport/CsvImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CsvImporter.java @@ -37,7 +37,7 @@ import protect.card_locker.Utils; */ public class CsvImporter implements Importer { - public void importData(Context context, DBHelper db, InputStream input) throws IOException, FormatException, InterruptedException + public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)); diff --git a/app/src/main/java/protect/card_locker/DataFormat.java b/app/src/main/java/protect/card_locker/importexport/DataFormat.java similarity index 57% rename from app/src/main/java/protect/card_locker/DataFormat.java rename to app/src/main/java/protect/card_locker/importexport/DataFormat.java index c030653a7..26e97e745 100644 --- a/app/src/main/java/protect/card_locker/DataFormat.java +++ b/app/src/main/java/protect/card_locker/importexport/DataFormat.java @@ -1,9 +1,10 @@ -package protect.card_locker; +package protect.card_locker.importexport; public enum DataFormat { Catima, Fidme, + Stocard, VoucherVault ; } diff --git a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java index 943f44d49..770ee1108 100644 --- a/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/FidmeImporter.java @@ -5,6 +5,9 @@ import android.database.sqlite.SQLiteDatabase; import com.google.zxing.BarcodeFormat; +import net.lingala.zip4j.io.inputstream.ZipInputStream; +import net.lingala.zip4j.model.LocalFileHeader; + import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; @@ -16,8 +19,6 @@ import java.io.StringReader; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.text.ParseException; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; import protect.card_locker.DBHelper; import protect.card_locker.FormatException; @@ -31,18 +32,18 @@ import protect.card_locker.FormatException; */ public class FidmeImporter implements Importer { - public void importData(Context context, DBHelper db, InputStream input) throws IOException, FormatException, JSONException, ParseException { + public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { // We actually retrieve a .zip file - ZipInputStream zipInputStream = new ZipInputStream(input); + ZipInputStream zipInputStream = new ZipInputStream(input, password); StringBuilder loyaltyCards = new StringBuilder(); byte[] buffer = new byte[1024]; int read = 0; - ZipEntry zipEntry; + LocalFileHeader localFileHeader; - while ((zipEntry = zipInputStream.getNextEntry()) != null) { - if (zipEntry.getName().equals("loyalty_programs.csv")) { + while ((localFileHeader = zipInputStream.getNextEntry()) != null) { + if (localFileHeader.getFileName().equals("loyalty_programs.csv")) { while ((read = zipInputStream.read(buffer, 0, 1024)) >= 0) { loyaltyCards.append(new String(buffer, 0, read, StandardCharsets.UTF_8)); } diff --git a/app/src/main/java/protect/card_locker/importexport/ImportExportResult.java b/app/src/main/java/protect/card_locker/importexport/ImportExportResult.java new file mode 100644 index 000000000..9a8d71c08 --- /dev/null +++ b/app/src/main/java/protect/card_locker/importexport/ImportExportResult.java @@ -0,0 +1,9 @@ +package protect.card_locker.importexport; + +public enum ImportExportResult +{ + Success, + GenericFailure, + BadPassword + ; +} diff --git a/app/src/main/java/protect/card_locker/importexport/Importer.java b/app/src/main/java/protect/card_locker/importexport/Importer.java index 9dec306e4..fe47d05fe 100644 --- a/app/src/main/java/protect/card_locker/importexport/Importer.java +++ b/app/src/main/java/protect/card_locker/importexport/Importer.java @@ -23,5 +23,5 @@ public interface Importer * @throws IOException * @throws FormatException */ - void importData(Context context, DBHelper db, InputStream input) throws IOException, FormatException, InterruptedException, JSONException, ParseException; + void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, InterruptedException, JSONException, ParseException; } diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java index f61636cc6..f020370d2 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.io.OutputStreamWriter; import protect.card_locker.DBHelper; -import protect.card_locker.DataFormat; public class MultiFormatExporter { @@ -19,11 +18,11 @@ public class MultiFormatExporter * * The output stream is closed on success. * - * @return true if the database was successfully exported, - * false otherwise. If false, partial data may have been + * @return ImportExportResult.Success if the database was successfully exported, + * another ImportExportResult otherwise. If not Success, partial data may have been * written to the output stream, and it should be discarded. */ - public static boolean exportData(Context context, DBHelper db, OutputStreamWriter output, DataFormat format) + public static ImportExportResult exportData(Context context, DBHelper db, OutputStreamWriter output, DataFormat format) { Exporter exporter = null; @@ -42,7 +41,7 @@ public class MultiFormatExporter try { exporter.exportData(context, db, output); - return true; + return ImportExportResult.Success; } catch(IOException e) { @@ -53,12 +52,12 @@ public class MultiFormatExporter Log.e(TAG, "Failed to export data", e); } - return false; + return ImportExportResult.GenericFailure; } else { Log.e(TAG, "Unsupported data format exported: " + format.name()); - return false; + return ImportExportResult.GenericFailure; } } } diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java index 34c620c74..835bb26df 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java @@ -3,6 +3,8 @@ package protect.card_locker.importexport; import android.content.Context; import android.util.Log; +import net.lingala.zip4j.exception.ZipException; + import org.json.JSONException; import java.io.IOException; @@ -10,7 +12,6 @@ import java.io.InputStream; import java.text.ParseException; import protect.card_locker.DBHelper; -import protect.card_locker.DataFormat; import protect.card_locker.FormatException; public class MultiFormatImporter @@ -24,11 +25,11 @@ public class MultiFormatImporter * The input stream is not closed, and doing so is the * responsibility of the caller. * - * @return true if the database was successfully imported, - * false otherwise. If false, no data was written to + * @return ImportExportResult.Success if the database was successfully imported, + * or another result otherwise. If no Success, no data was written to * the database. */ - public static boolean importData(Context context, DBHelper db, InputStream input, DataFormat format) + public static ImportExportResult importData(Context context, DBHelper db, InputStream input, DataFormat format, char[] password) { Importer importer = null; @@ -40,6 +41,9 @@ public class MultiFormatImporter case Fidme: importer = new FidmeImporter(); break; + case Stocard: + importer = new StocardImporter(); + break; case VoucherVault: importer = new VoucherVaultImporter(); break; @@ -49,8 +53,12 @@ public class MultiFormatImporter { try { - importer.importData(context, db, input); - return true; + importer.importData(context, db, input, password); + return ImportExportResult.Success; + } + catch(ZipException e) + { + return ImportExportResult.BadPassword; } catch(IOException | FormatException | InterruptedException | JSONException | ParseException e) { @@ -62,6 +70,7 @@ public class MultiFormatImporter { Log.e(TAG, "Unsupported data format imported: " + format.name()); } - return false; + + return ImportExportResult.GenericFailure; } } diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java new file mode 100644 index 000000000..a25c3fa03 --- /dev/null +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -0,0 +1,149 @@ +package protect.card_locker.importexport; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.util.Log; + +import com.google.zxing.BarcodeFormat; + +import net.lingala.zip4j.io.inputstream.ZipInputStream; +import net.lingala.zip4j.model.LocalFileHeader; + +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; +import org.json.JSONException; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StringReader; +import java.math.BigDecimal; +import java.text.ParseException; + +import protect.card_locker.DBHelper; +import protect.card_locker.FormatException; + +/** + * Class for importing a database from CSV (Comma Separate Values) + * formatted data. + * + * The database's loyalty cards are expected to appear in the CSV data. + * A header is expected for the each table showing the names of the columns. + */ +public class StocardImporter implements Importer +{ + public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { + LocalFileHeader localFileHeader; + + // We actually retrieve a .zip file + ZipInputStream zipInputStream = new ZipInputStream(input, password); + + StringBuilder loyaltyCards = new StringBuilder(); + byte[] buffer = new byte[1024]; + int read = 0; + + while ((localFileHeader = zipInputStream.getNextEntry()) != null) { + Log.w("STO", localFileHeader.getFileName()); + //File extractedFile = new File(localFileHeader.getFileName()); + //if (localFileHeader.isDirectory()) { + // localFileHeader = zipInputStream.getNextEntry(localFileHeader); + //} + //if (!localFileHeader.isDirectory()) { + // File extractedFile = new File(localFileHeader.getFileName()); + // OutputStream outputStream = new FileOutputStream(extractedFile); + // while ((read = zipInputStream.read(buffer)) != -1) { + // outputStream.write(buffer, 0, read); + // } + //} + } + + if (loyaltyCards.length() == 0) { + throw new FormatException("Couldn't find loyalty_programs.csv in zip file or it is empty"); + } + + SQLiteDatabase database = db.getWritableDatabase(); + database.beginTransaction(); + + final CSVParser fidmeParser = new CSVParser(new StringReader(loyaltyCards.toString()), CSVFormat.RFC4180.withDelimiter(';').withHeader()); + + try { + for (CSVRecord record : fidmeParser) { + importLoyaltyCard(database, db, record); + + if (Thread.currentThread().isInterrupted()) { + throw new InterruptedException(); + } + } + } catch (IllegalArgumentException | IllegalStateException | InterruptedException e) { + throw new FormatException("Issue parsing CSV data", e); + } finally { + fidmeParser.close(); + } + + database.setTransactionSuccessful(); + database.endTransaction(); + database.close(); + + zipInputStream.close(); + } + + /** + * Import a single loyalty card into the database using the given + * session. + */ + private void importLoyaltyCard(SQLiteDatabase database, DBHelper helper, CSVRecord record) + throws IOException, FormatException + { + // A loyalty card export from Fidme contains the following fields: + // Retailer (store name) + // Program (program name) + // Added at (YYYY-MM-DD HH:MM:SS UTC) + // Reference (card ID) + // Firstname (card holder first name) + // Lastname (card holder last name) + + // The store is called Retailer + String store = CSVHelpers.extractString("Retailer", record, ""); + + if (store.isEmpty()) + { + throw new FormatException("No store listed, but is required"); + } + + // There seems to be no note field in the CSV? So let's combine other fields instead... + String program = CSVHelpers.extractString("Program", record, "").trim(); + String addedAt = CSVHelpers.extractString("Added At", record, "").trim(); + String firstName = CSVHelpers.extractString("Firstname", record, "").trim(); + String lastName = CSVHelpers.extractString("Lastname", record, "").trim(); + + String combinedName = String.format("%s %s", firstName, lastName).trim(); + + StringBuilder noteBuilder = new StringBuilder(); + if (!program.isEmpty()) noteBuilder.append(program).append('\n'); + if (!addedAt.isEmpty()) noteBuilder.append(addedAt).append('\n'); + if (!combinedName.isEmpty()) noteBuilder.append(combinedName).append('\n'); + String note = noteBuilder.toString().trim(); + + // The ID is called reference + String cardId = CSVHelpers.extractString("Reference", record, ""); + if(cardId.isEmpty()) + { + throw new FormatException("No card ID listed, but is required"); + } + + // Sadly, Fidme exports don't contain the card type + // I guess they have an online DB of all the different companies and what type they use + // TODO: Hook this into our own loyalty card DB if we ever get one + BarcodeFormat barcodeType = null; + + // No favourite data in the export either + int starStatus = 0; + + // TODO: Front and back image + + helper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus); + } +} \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java index 950ec0bc3..42c99d5ff 100644 --- a/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/VoucherVaultImporter.java @@ -35,7 +35,7 @@ import protect.card_locker.FormatException; */ public class VoucherVaultImporter implements Importer { - public void importData(Context context, DBHelper db, InputStream input) throws IOException, FormatException, JSONException, ParseException { + public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 9c4f35a41..9bf598339 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -1,17 +1,12 @@ package protect.card_locker; import android.app.Activity; -import android.content.res.Resources; import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; import android.os.Environment; import android.util.DisplayMetrics; -import android.util.Log; import com.google.zxing.BarcodeFormat; @@ -24,7 +19,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import org.robolectric.annotation.LooperMode; import org.robolectric.shadows.ShadowLog; -import org.robolectric.util.Util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -45,9 +39,9 @@ import java.util.Currency; import java.util.Date; import java.util.List; -import javax.annotation.Resource; - import androidx.core.content.res.ResourcesCompat; +import protect.card_locker.importexport.DataFormat; +import protect.card_locker.importexport.ImportExportResult; import protect.card_locker.importexport.MultiFormatExporter; import protect.card_locker.importexport.MultiFormatImporter; @@ -338,8 +332,8 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - boolean result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); - assertTrue(result); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); + assertEquals(ImportExportResult.Success, result); outStream.close(); TestHelpers.getEmptyDb(activity); @@ -347,8 +341,8 @@ public class ImportExportTest ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima); - assertTrue(result); + result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); @@ -369,8 +363,8 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - boolean result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); - assertTrue(result); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); + assertEquals(ImportExportResult.Success, result); outStream.close(); TestHelpers.getEmptyDb(activity); @@ -378,8 +372,8 @@ public class ImportExportTest ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima); - assertTrue(result); + result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); @@ -442,8 +436,8 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - boolean result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); - assertTrue(result); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); + assertEquals(ImportExportResult.Success, result); outStream.close(); TestHelpers.getEmptyDb(activity); @@ -451,8 +445,8 @@ public class ImportExportTest ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima); - assertTrue(result); + result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); assertEquals(NUM_GROUPS, db.getGroupCount()); @@ -486,15 +480,15 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export into CSV data - boolean result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); - assertTrue(result); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); + assertEquals(ImportExportResult.Success, result); outStream.close(); ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data on top of the existing database - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima); - assertTrue(result); + result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); @@ -517,8 +511,8 @@ public class ImportExportTest OutputStreamWriter outStream = new OutputStreamWriter(outData); // Export data to CSV format - boolean result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); - assertTrue(result); + ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outStream, DataFormat.Catima); + assertEquals(ImportExportResult.Success, result); TestHelpers.getEmptyDb(activity); @@ -531,8 +525,8 @@ public class ImportExportTest ByteArrayInputStream inData = new ByteArrayInputStream((outData.toString() + corruptEntry).getBytes()); // Attempt to import the data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, format); - assertEquals(false, result); + result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, format, null); + assertEquals(ImportExportResult.GenericFailure, result); assertEquals(0, db.getLoyaltyCardCount()); @@ -542,11 +536,11 @@ public class ImportExportTest class TestTaskCompleteListener implements ImportExportTask.TaskCompleteListener { - Boolean success; + ImportExportResult result; - public void onTaskComplete(boolean success) + public void onTaskComplete(ImportExportResult result) { - this.success = success; + this.result = result; } } @@ -572,8 +566,8 @@ public class ImportExportTest Robolectric.flushBackgroundThreadScheduler(); // Check that the listener was executed - assertNotNull(listener.success); - assertEquals(true, listener.success); + assertNotNull(listener.result); + assertEquals(ImportExportResult.Success, listener.result); TestHelpers.getEmptyDb(activity); @@ -583,15 +577,15 @@ public class ImportExportTest FileInputStream fileStream = new FileInputStream(exportFile); - task = new ImportExportTask(activity, DataFormat.Catima, fileStream, listener); + task = new ImportExportTask(activity, DataFormat.Catima, fileStream, null, listener); task.execute(); // Actually run the task to completion Robolectric.flushBackgroundThreadScheduler(); // Check that the listener was executed - assertNotNull(listener.success); - assertEquals(true, listener.success); + assertNotNull(listener.result); + assertEquals(ImportExportResult.Success, listener.result); assertEquals(NUM_CARDS, db.getLoyaltyCardCount()); @@ -617,8 +611,8 @@ public class ImportExportTest ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima); - assertTrue(result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(1, db.getLoyaltyCardCount()); LoyaltyCard card = db.getLoyaltyCard(1); @@ -655,8 +649,8 @@ public class ImportExportTest ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima); - assertTrue(result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(1, db.getLoyaltyCardCount()); LoyaltyCard card = db.getLoyaltyCard(1); @@ -693,8 +687,8 @@ public class ImportExportTest ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima); - assertEquals(false, result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + assertEquals(ImportExportResult.GenericFailure, result); assertEquals(0, db.getLoyaltyCardCount()); TestHelpers.getEmptyDb(activity); @@ -718,8 +712,8 @@ public class ImportExportTest ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima); - assertEquals(true, result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(1, db.getLoyaltyCardCount()); LoyaltyCard card = db.getLoyaltyCard(1); @@ -756,8 +750,8 @@ public class ImportExportTest ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima); - assertEquals(true, result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(1, db.getLoyaltyCardCount()); LoyaltyCard card = db.getLoyaltyCard(1); @@ -794,8 +788,8 @@ public class ImportExportTest ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima); - assertEquals(true, result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(1, db.getLoyaltyCardCount()); LoyaltyCard card = db.getLoyaltyCard(1); @@ -832,8 +826,8 @@ public class ImportExportTest ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima); - assertTrue(result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(1, db.getLoyaltyCardCount()); csvText = ""; @@ -851,8 +845,8 @@ public class ImportExportTest inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima); - assertTrue(result); + result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(1, db.getLoyaltyCardCount()); LoyaltyCard card = db.getLoyaltyCard(1); @@ -941,8 +935,8 @@ public class ImportExportTest ByteArrayInputStream inputStream = new ByteArrayInputStream(csvText.getBytes(StandardCharsets.UTF_8)); // Import the CSV data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima); - assertEquals(true, result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Catima, null); + assertEquals(ImportExportResult.Success, result); assertEquals(7, db.getLoyaltyCardCount()); assertEquals(3, db.getGroupCount()); @@ -1082,8 +1076,8 @@ public class ImportExportTest InputStream inputStream = getClass().getResourceAsStream("fidme-export-request-2021-06-29-17-28-20.zip"); // Import the Fidme data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Fidme); - assertTrue(result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Fidme, null); + assertEquals(ImportExportResult.Success, result); assertEquals(3, db.getLoyaltyCardCount()); LoyaltyCard card = db.getLoyaltyCard(1); @@ -1125,6 +1119,58 @@ public class ImportExportTest TestHelpers.getEmptyDb(activity); } + @Test + public void importStocard() throws IOException { + InputStream inputStream = getClass().getResourceAsStream("50e33e49-cfa0-49ad-a297-c1d655f72b01-sync.zip"); + + // Import the Stocard data + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Stocard, null); + assertEquals(ImportExportResult.BadPassword, result); + assertEquals(0, db.getLoyaltyCardCount()); + + result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Stocard, "da811b40a4dac56f0cbb2d99b21bbb9a".toCharArray()); + assertEquals(ImportExportResult.Success, result); + assertEquals(3, db.getLoyaltyCardCount()); + + LoyaltyCard card = db.getLoyaltyCard(1); + + assertEquals("Air Miles", card.store); + assertEquals("", card.note); + assertEquals(null, card.expiry); + assertEquals(new BigDecimal("0"), card.balance); + assertEquals(null, card.balanceType); + assertEquals("7649484", card.cardId); + assertEquals(null, card.barcodeId); + assertEquals(null, card.barcodeType); + assertEquals(0, card.starStatus); + + card = db.getLoyaltyCard(2); + + assertEquals("Gamma", card.store); + assertEquals("", card.note); + assertEquals(null, card.expiry); + assertEquals(new BigDecimal("0"), card.balance); + assertEquals(null, card.balanceType); + assertEquals("55555", card.cardId); + assertEquals(null, card.barcodeId); + assertEquals(null, card.barcodeType); + assertEquals(0, card.starStatus); + + card = db.getLoyaltyCard(3); + + assertEquals("Jö", card.store); + assertEquals("", card.note); + assertEquals(null, card.expiry); + assertEquals(new BigDecimal("0"), card.balance); + assertEquals(null, card.balanceType); + assertEquals("20975646", card.cardId); + assertEquals("(01)09010374000019(21)02097564604859211217(10)01231287693", card.barcodeId); + assertEquals(null, card.barcodeType); + assertEquals(0, card.starStatus); + + TestHelpers.getEmptyDb(activity); + } + @Test public void importVoucherVault() throws IOException, FormatException, JSONException, ParseException { String jsonText = "[\n" + @@ -1153,8 +1199,8 @@ public class ImportExportTest ByteArrayInputStream inputStream = new ByteArrayInputStream(jsonText.getBytes(StandardCharsets.UTF_8)); // Import the Voucher Vault data - boolean result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.VoucherVault); - assertTrue(result); + ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.VoucherVault, null); + assertEquals(ImportExportResult.Success, result); assertEquals(2, db.getLoyaltyCardCount()); LoyaltyCard card = db.getLoyaltyCard(1); diff --git a/app/src/test/res/protect/card_locker/50e33e49-cfa0-49ad-a297-c1d655f72b01-sync.zip b/app/src/test/res/protect/card_locker/50e33e49-cfa0-49ad-a297-c1d655f72b01-sync.zip new file mode 100644 index 0000000000000000000000000000000000000000..763d6f81694539ae2c34c9f9daa14ffcb0a71fca GIT binary patch literal 168243 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
4ZI)q}C=$ap>(+*Jj3A6JV*LalY8k4e4+dG!a$M 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

Bu*zdG>@ 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 literal 0 HcmV?d00001 From 97c508c920a17764df803969028662c4924f32d0 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 6 Jul 2021 00:20:35 +0200 Subject: [PATCH 02/10] Stocard import skeleton --- .../java/protect/card_locker/DBHelper.java | 8 +- .../importexport/StocardImporter.java | 251 ++++++++++++------ .../protect/card_locker/ImportExportTest.java | 6 + 3 files changed, 182 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 788f3c593..6ae5c8432 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -275,7 +275,7 @@ public class DBHelper extends SQLiteOpenHelper return newId; } - public boolean insertLoyaltyCard(final SQLiteDatabase db, final String store, + public long insertLoyaltyCard(final SQLiteDatabase db, final String store, final String note, final Date expiry, final BigDecimal balance, final Currency balanceType, final String cardId, final String barcodeId, final BarcodeFormat barcodeType, @@ -293,10 +293,10 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus); final long newId = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); - return (newId != -1); + return newId; } - public boolean insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store, + public long insertLoyaltyCard(final SQLiteDatabase db, final int id, final String store, final String note, final Date expiry, final BigDecimal balance, final Currency balanceType, final String cardId, final String barcodeId, final BarcodeFormat barcodeType, @@ -315,7 +315,7 @@ public class DBHelper extends SQLiteOpenHelper contentValues.put(LoyaltyCardDbIds.HEADER_COLOR, headerColor); contentValues.put(LoyaltyCardDbIds.STAR_STATUS,starStatus); final long newId = db.insert(LoyaltyCardDbIds.TABLE, null, contentValues); - return (newId != -1); + return newId; } public boolean updateLoyaltyCard(final int id, final String store, final String note, diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index a25c3fa03..5dc16dd3c 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -2,6 +2,9 @@ package protect.card_locker.importexport; import android.content.Context; import android.database.sqlite.SQLiteDatabase; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Picture; import android.util.Log; import com.google.zxing.BarcodeFormat; @@ -12,7 +15,9 @@ import net.lingala.zip4j.model.LocalFileHeader; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; +import org.json.JSONArray; import org.json.JSONException; +import org.json.JSONObject; import java.io.File; import java.io.FileOutputStream; @@ -21,10 +26,18 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.StringReader; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.text.ParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import protect.card_locker.DBHelper; import protect.card_locker.FormatException; +import protect.card_locker.LoyaltyCard; +import protect.card_locker.Utils; /** * Class for importing a database from CSV (Comma Separate Values) @@ -36,51 +49,136 @@ import protect.card_locker.FormatException; public class StocardImporter implements Importer { public void importData(Context context, DBHelper db, InputStream input, char[] password) throws IOException, FormatException, JSONException, ParseException { - LocalFileHeader localFileHeader; + HashMap> loyaltyCardHashMap = new HashMap<>(); + HashMap providers = new HashMap<>(); - // We actually retrieve a .zip file ZipInputStream zipInputStream = new ZipInputStream(input, password); - StringBuilder loyaltyCards = new StringBuilder(); - byte[] buffer = new byte[1024]; - int read = 0; - + String[] providersFileName = null; + String[] cardBaseName = null; + String cardName = ""; + LocalFileHeader localFileHeader; while ((localFileHeader = zipInputStream.getNextEntry()) != null) { - Log.w("STO", localFileHeader.getFileName()); - //File extractedFile = new File(localFileHeader.getFileName()); - //if (localFileHeader.isDirectory()) { - // localFileHeader = zipInputStream.getNextEntry(localFileHeader); - //} - //if (!localFileHeader.isDirectory()) { - // File extractedFile = new File(localFileHeader.getFileName()); - // OutputStream outputStream = new FileOutputStream(extractedFile); - // while ((read = zipInputStream.read(buffer)) != -1) { - // outputStream.write(buffer, 0, read); - // } - //} + String fileName = localFileHeader.getFileName(); + String[] nameParts = fileName.split("/"); + + if (providersFileName == null) { + providersFileName = new String[] { + nameParts[0], + "sync", + "data", + "users", + nameParts[0], + "analytics-properties.json" + }; + cardBaseName = new String[] { + nameParts[0], + "sync", + "data", + "users", + nameParts[0], + "loyalty-cards" + }; + } + + if (startsWith(nameParts, providersFileName, 0) && !localFileHeader.isDirectory()) { + providers = parseProviders(zipInputStream); + } else if (startsWith(nameParts, cardBaseName, 1)) { + // Extract cardName + if (localFileHeader.isDirectory()) { + cardName = nameParts[cardBaseName.length]; + } + + // This is the card itself + if (nameParts.length == cardBaseName.length + 1) { + // Ignore the .txt file + if (fileName.endsWith(".json")) { + JSONObject jsonObject = readJSON(zipInputStream); + + appendToLoyaltyCardHashMap( + loyaltyCardHashMap, + cardName, + "cardId", + jsonObject.getString("input_id") + ); + appendToLoyaltyCardHashMap( + loyaltyCardHashMap, + cardName, + "_providerId", + jsonObject + .getJSONObject("input_provider_reference") + .getString("identifier") + .substring("/loyalty-card-providers/".length()) + ); + + try { + appendToLoyaltyCardHashMap( + loyaltyCardHashMap, + cardName, + "barcodeType", + jsonObject.getString("input_barcode_format") + ); + } catch (JSONException ignored) {} + } + } else if (fileName.endsWith("notes/default.json")) { + appendToLoyaltyCardHashMap( + loyaltyCardHashMap, + cardName, + "note", + readJSON(zipInputStream) + .getString("content") + ); + } else if (fileName.endsWith("/images/front.png")) { + appendToLoyaltyCardHashMap( + loyaltyCardHashMap, + cardName, + "frontImage", + read(zipInputStream) + ); + } else if (fileName.endsWith("/images/back.png")) { + appendToLoyaltyCardHashMap( + loyaltyCardHashMap, + cardName, + "backImage", + read(zipInputStream) + ); + } + } } - if (loyaltyCards.length() == 0) { - throw new FormatException("Couldn't find loyalty_programs.csv in zip file or it is empty"); + if (loyaltyCardHashMap.keySet().size() == 0) { + throw new FormatException("Couldn't find any loyalty cards in this Stocard export."); } SQLiteDatabase database = db.getWritableDatabase(); database.beginTransaction(); - final CSVParser fidmeParser = new CSVParser(new StringReader(loyaltyCards.toString()), CSVFormat.RFC4180.withDelimiter(';').withHeader()); + for(Map.Entry> entry : loyaltyCardHashMap.entrySet()) { + HashMap loyaltyCardData = entry.getValue(); - try { - for (CSVRecord record : fidmeParser) { - importLoyaltyCard(database, db, record); - - if (Thread.currentThread().isInterrupted()) { - throw new InterruptedException(); + String store = providers.get(loyaltyCardData.get("_providerId")); + String note = (String) loyaltyCardData.getOrDefault("note", ""); + String cardId = (String) loyaltyCardData.get("cardId"); + String barcodeTypeString = (String) loyaltyCardData.getOrDefault("barcodeType", null); + BarcodeFormat barcodeType = null; + if (barcodeTypeString != null) { + if (barcodeTypeString.equals("RSS_DATABAR_EXPANDED")) { + barcodeType = BarcodeFormat.RSS_EXPANDED; + } else { + barcodeType = BarcodeFormat.valueOf(barcodeTypeString); } } - } catch (IllegalArgumentException | IllegalStateException | InterruptedException e) { - throw new FormatException("Issue parsing CSV data", e); - } finally { - fidmeParser.close(); + + long loyaltyCardInternalId = db.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0); + + if (loyaltyCardData.containsKey("frontImage")) { + byte[] byteArray = ((String) loyaltyCardData.get("frontImage")).getBytes(); + Utils.saveCardImage(context, BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length), (int) loyaltyCardInternalId, true); + } + if (loyaltyCardData.containsKey("backImage")) { + byte[] byteArray = ((String) loyaltyCardData.get("backImage")).getBytes(); + Utils.saveCardImage(context, BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length), (int) loyaltyCardInternalId, false); + } } database.setTransactionSuccessful(); @@ -90,60 +188,55 @@ public class StocardImporter implements Importer zipInputStream.close(); } - /** - * Import a single loyalty card into the database using the given - * session. - */ - private void importLoyaltyCard(SQLiteDatabase database, DBHelper helper, CSVRecord record) - throws IOException, FormatException - { - // A loyalty card export from Fidme contains the following fields: - // Retailer (store name) - // Program (program name) - // Added at (YYYY-MM-DD HH:MM:SS UTC) - // Reference (card ID) - // Firstname (card holder first name) - // Lastname (card holder last name) - - // The store is called Retailer - String store = CSVHelpers.extractString("Retailer", record, ""); - - if (store.isEmpty()) - { - throw new FormatException("No store listed, but is required"); + private boolean startsWith(String[] full, String[] start, int minExtraLength) { + if (full.length - minExtraLength < start.length) { + return false; } - // There seems to be no note field in the CSV? So let's combine other fields instead... - String program = CSVHelpers.extractString("Program", record, "").trim(); - String addedAt = CSVHelpers.extractString("Added At", record, "").trim(); - String firstName = CSVHelpers.extractString("Firstname", record, "").trim(); - String lastName = CSVHelpers.extractString("Lastname", record, "").trim(); - - String combinedName = String.format("%s %s", firstName, lastName).trim(); - - StringBuilder noteBuilder = new StringBuilder(); - if (!program.isEmpty()) noteBuilder.append(program).append('\n'); - if (!addedAt.isEmpty()) noteBuilder.append(addedAt).append('\n'); - if (!combinedName.isEmpty()) noteBuilder.append(combinedName).append('\n'); - String note = noteBuilder.toString().trim(); - - // The ID is called reference - String cardId = CSVHelpers.extractString("Reference", record, ""); - if(cardId.isEmpty()) - { - throw new FormatException("No card ID listed, but is required"); + for (int i = 0; i < start.length; i++) { + if (!start[i].contentEquals(full[i])) { + return false; + } } - // Sadly, Fidme exports don't contain the card type - // I guess they have an online DB of all the different companies and what type they use - // TODO: Hook this into our own loyalty card DB if we ever get one - BarcodeFormat barcodeType = null; + return true; + } - // No favourite data in the export either - int starStatus = 0; + private String read(ZipInputStream zipInputStream) throws IOException { + int read; + byte[] buffer = new byte[4096]; - // TODO: Front and back image + StringBuilder stringBuilder = new StringBuilder(); + while ((read = zipInputStream.read(buffer, 0, 4096)) >= 0) { + stringBuilder.append(new String(buffer, 0, read, StandardCharsets.UTF_8)); + } - helper.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, starStatus); + return stringBuilder.toString(); + } + + private JSONObject readJSON(ZipInputStream zipInputStream) throws IOException, JSONException { + return new JSONObject(read(zipInputStream)); + } + + private HashMap> appendToLoyaltyCardHashMap(HashMap> loyaltyCardHashMap, String cardID, String key, Object value) { + HashMap loyaltyCardData = loyaltyCardHashMap.getOrDefault(cardID, new HashMap<>()); + + loyaltyCardData.put(key, value); + loyaltyCardHashMap.put(cardID, loyaltyCardData); + + return loyaltyCardHashMap; + } + + private HashMap parseProviders(ZipInputStream zipInputStream) throws IOException, JSONException { + JSONObject jsonObject = readJSON(zipInputStream); + + HashMap providers = new HashMap<>(); + JSONArray providerIdList = jsonObject.getJSONArray("provider_id_list"); + JSONArray providerList = jsonObject.getJSONArray("provider_list"); + for (int i = 0; i < jsonObject.getInt("number_of_cards"); i++) { + providers.put(providerIdList.get(i).toString(), providerList.get(i).toString()); + } + + return providers; } } \ No newline at end of file diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 9bf598339..421efc836 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -7,9 +7,13 @@ import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.os.Environment; import android.util.DisplayMetrics; +import android.util.Log; import com.google.zxing.BarcodeFormat; +import net.lingala.zip4j.io.inputstream.ZipInputStream; +import net.lingala.zip4j.model.LocalFileHeader; + import org.json.JSONException; import org.junit.Before; import org.junit.Test; @@ -1128,6 +1132,8 @@ public class ImportExportTest assertEquals(ImportExportResult.BadPassword, result); assertEquals(0, db.getLoyaltyCardCount()); + inputStream = getClass().getResourceAsStream("50e33e49-cfa0-49ad-a297-c1d655f72b01-sync.zip"); + result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inputStream, DataFormat.Stocard, "da811b40a4dac56f0cbb2d99b21bbb9a".toCharArray()); assertEquals(ImportExportResult.Success, result); assertEquals(3, db.getLoyaltyCardCount()); From e76bd9363c7a9d94172bf4713a99627e1bef6f5f Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 6 Jul 2021 21:32:48 +0200 Subject: [PATCH 03/10] Make Stocard import work --- .../importexport/StocardImporter.java | 42 ++++++++++++------- .../protect/card_locker/ImportExportTest.java | 34 +++++++-------- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index 5dc16dd3c..105b9d5fc 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -85,9 +85,7 @@ public class StocardImporter implements Importer providers = parseProviders(zipInputStream); } else if (startsWith(nameParts, cardBaseName, 1)) { // Extract cardName - if (localFileHeader.isDirectory()) { - cardName = nameParts[cardBaseName.length]; - } + cardName = nameParts[cardBaseName.length].split("\\.", 2)[0]; // This is the card itself if (nameParts.length == cardBaseName.length + 1) { @@ -95,13 +93,13 @@ public class StocardImporter implements Importer if (fileName.endsWith(".json")) { JSONObject jsonObject = readJSON(zipInputStream); - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "cardId", jsonObject.getString("input_id") ); - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "_providerId", @@ -112,7 +110,7 @@ public class StocardImporter implements Importer ); try { - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "barcodeType", @@ -121,7 +119,7 @@ public class StocardImporter implements Importer } catch (JSONException ignored) {} } } else if (fileName.endsWith("notes/default.json")) { - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "note", @@ -129,14 +127,14 @@ public class StocardImporter implements Importer .getString("content") ); } else if (fileName.endsWith("/images/front.png")) { - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "frontImage", read(zipInputStream) ); } else if (fileName.endsWith("/images/back.png")) { - appendToLoyaltyCardHashMap( + loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "backImage", @@ -153,10 +151,8 @@ public class StocardImporter implements Importer SQLiteDatabase database = db.getWritableDatabase(); database.beginTransaction(); - for(Map.Entry> entry : loyaltyCardHashMap.entrySet()) { - HashMap loyaltyCardData = entry.getValue(); - - String store = providers.get(loyaltyCardData.get("_providerId")); + for (HashMap loyaltyCardData : loyaltyCardHashMap.values()) { + String store = providers.get(loyaltyCardData.get("_providerId").toString()); String note = (String) loyaltyCardData.getOrDefault("note", ""); String cardId = (String) loyaltyCardData.get("cardId"); String barcodeTypeString = (String) loyaltyCardData.getOrDefault("barcodeType", null); @@ -228,13 +224,29 @@ public class StocardImporter implements Importer } private HashMap parseProviders(ZipInputStream zipInputStream) throws IOException, JSONException { + // FIXME: This is probably completely wrong, but it works for the one and only test file I have JSONObject jsonObject = readJSON(zipInputStream); - HashMap providers = new HashMap<>(); JSONArray providerIdList = jsonObject.getJSONArray("provider_id_list"); JSONArray providerList = jsonObject.getJSONArray("provider_list"); + + // Resort, put IDs with - in them after IDs without any - + List providerIds = new ArrayList<>(); + List customProviderIds = new ArrayList<>(); + + for (int i = 0; i < providerIdList.length(); i++) { + String providerId = providerIdList.get(i).toString(); + if (providerId.contains("-")) { + customProviderIds.add(providerId); + } else { + providerIds.add(providerId); + } + } + providerIds.addAll(customProviderIds); + + HashMap providers = new HashMap<>(); for (int i = 0; i < jsonObject.getInt("number_of_cards"); i++) { - providers.put(providerIdList.get(i).toString(), providerList.get(i).toString()); + providers.put(providerIds.get(i), providerList.get(i).toString()); } return providers; diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 421efc836..e1e6d919f 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -1140,19 +1140,7 @@ public class ImportExportTest LoyaltyCard card = db.getLoyaltyCard(1); - assertEquals("Air Miles", card.store); - assertEquals("", card.note); - assertEquals(null, card.expiry); - assertEquals(new BigDecimal("0"), card.balance); - assertEquals(null, card.balanceType); - assertEquals("7649484", card.cardId); - assertEquals(null, card.barcodeId); - assertEquals(null, card.barcodeType); - assertEquals(0, card.starStatus); - - card = db.getLoyaltyCard(2); - - assertEquals("Gamma", card.store); + assertEquals("GAMMA", card.store); assertEquals("", card.note); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); @@ -1162,16 +1150,28 @@ public class ImportExportTest assertEquals(null, card.barcodeType); assertEquals(0, card.starStatus); + card = db.getLoyaltyCard(2); + + assertEquals("Air Miles", card.store); + assertEquals("szjsbs", card.note); + assertEquals(null, card.expiry); + assertEquals(new BigDecimal("0"), card.balance); + assertEquals(null, card.balanceType); + assertEquals("7649484", card.cardId); + assertEquals(null, card.barcodeId); + assertEquals(null, card.barcodeType); + assertEquals(0, card.starStatus); + card = db.getLoyaltyCard(3); - assertEquals("Jö", card.store); + assertEquals("jö", card.store); assertEquals("", card.note); assertEquals(null, card.expiry); assertEquals(new BigDecimal("0"), card.balance); assertEquals(null, card.balanceType); - assertEquals("20975646", card.cardId); - assertEquals("(01)09010374000019(21)02097564604859211217(10)01231287693", card.barcodeId); - assertEquals(null, card.barcodeType); + assertEquals("(01)09010374000019(21)02097564604859211217(10)01231287693", card.cardId); + assertEquals(null, card.barcodeId); + assertEquals(BarcodeFormat.RSS_EXPANDED, card.barcodeType); assertEquals(0, card.starStatus); TestHelpers.getEmptyDb(activity); From 614e5bac2da00c8ce024c32a887a57f2cc0ee086 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 6 Jul 2021 22:44:02 +0200 Subject: [PATCH 04/10] Mark Fidme and Stocard as beta --- .../card_locker/ImportExportActivity.java | 25 +++++++++++++++++-- app/src/main/res/values/arrays.xml | 1 + app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java index 27fa2baa3..f9d6116c0 100644 --- a/app/src/main/java/protect/card_locker/ImportExportActivity.java +++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java @@ -20,6 +20,8 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; @@ -117,9 +119,22 @@ public class ImportExportActivity extends AppCompatActivity } private void chooseImportType(Intent baseIntent) { + List betaImportOptions = new ArrayList<>(); + betaImportOptions.add("Fidme"); + betaImportOptions.add("Stocard"); + List importOptions = new ArrayList<>(); + + for (String importOption : getResources().getStringArray(R.array.import_types_array)) { + if (betaImportOptions.contains(importOption)) { + importOption = importOption + " (BETA)"; + } + + importOptions.add(importOption); + } + AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.chooseImportType) - .setItems(R.array.import_types_array, (dialog, which) -> { + .setItems(importOptions.toArray(new CharSequence[importOptions.size()]), (dialog, which) -> { switch (which) { // Catima case 0: @@ -139,8 +154,14 @@ public class ImportExportActivity extends AppCompatActivity importAlertMessage = getString(R.string.importLoyaltyCardKeychainMessage); importDataFormat = DataFormat.Catima; break; - // Voucher Vault + // Stocard case 3: + importAlertTitle = getString(R.string.importStocard); + importAlertMessage = getString(R.string.importStocardMessage); + importDataFormat = DataFormat.Stocard; + break; + // Voucher Vault + case 4: importAlertTitle = getString(R.string.importVoucherVault); importAlertMessage = getString(R.string.importVoucherVaultMessage); importDataFormat = DataFormat.VoucherVault; diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 504bd052d..725535f19 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -4,6 +4,7 @@ Catima Fidme @string/app_loyalty_card_keychain + Stocard Voucher Vault \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b53da67b..4d5588a33 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -168,6 +168,8 @@ Find a file likely named fidme-export-request-xxxxxx.zip to import, and then select the barcode types manually afterwards.\nOr create it from your FidMe profile by choosing "Data Protection" and then pressing "Extract my data" first. Import from Loyalty Card Keychain Find a file most likely named LoyaltyCardKeychain.csv to import.\nOr create it from the Import/Export menu in Loyalty Card Keychain by pressing "Export" first. + Import from Stocard + Find your Stocard .zip file to import, and then select the barcode types manually afterwards.\nOr get it by emailing support@stocardapp.com and asking for an export of your data first. Import from Voucher Vault Find a file likely named vouchervault.json to import.\nOr create it by pressing "Export" in Voucher Vault first. Barcode value From 0de8cd93add20ca6abc57ea2310755049d3fb04e Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 6 Jul 2021 23:25:05 +0200 Subject: [PATCH 05/10] Ask password when import fails with BadPassword --- .../card_locker/ImportExportActivity.java | 87 +++++++++++-------- .../protect/card_locker/ImportExportTask.java | 4 +- app/src/main/res/values/strings.xml | 1 + .../protect/card_locker/ImportExportTest.java | 2 +- 4 files changed, 54 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java index f9d6116c0..b1db1bb40 100644 --- a/app/src/main/java/protect/card_locker/ImportExportActivity.java +++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java @@ -8,10 +8,12 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; +import android.text.InputType; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.Button; +import android.widget.EditText; import android.widget.Toast; import java.io.File; @@ -190,9 +192,9 @@ public class ImportExportActivity extends AppCompatActivity ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() { @Override - public void onTaskComplete(ImportExportResult result) + public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) { - onImportComplete(result, targetUri); + onImportComplete(result, targetUri, dataFormat); } }; @@ -206,7 +208,7 @@ public class ImportExportActivity extends AppCompatActivity ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() { @Override - public void onTaskComplete(ImportExportResult result) + public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) { onExportComplete(result, targetUri); } @@ -233,7 +235,7 @@ public class ImportExportActivity extends AppCompatActivity } } - if(success == false) + if(!success) { // External storage permission rejected, inform user that // import/export is prevented @@ -268,13 +270,33 @@ public class ImportExportActivity extends AppCompatActivity return super.onOptionsItemSelected(item); } - private void onImportComplete(ImportExportResult result, Uri path) - { + private void retryWithPassword(DataFormat dataFormat, Uri uri) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.passwordRequired); + + final EditText input = new EditText(this); + input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + builder.setView(input); + + builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> { + activityResultParser(IMPORT, RESULT_OK, uri, input.getText().toString().toCharArray()); + }); + builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel()); + + builder.show(); + } + + private void onImportComplete(ImportExportResult result, Uri path, DataFormat dataFormat) { + if (result == ImportExportResult.BadPassword) { + retryWithPassword(dataFormat, path); + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(this); int messageId; - if(result == ImportExportResult.Success) + if (result == ImportExportResult.Success) { builder.setTitle(R.string.importSuccessfulTitle); messageId = R.string.importSuccessful; @@ -320,36 +342,24 @@ public class ImportExportActivity extends AppCompatActivity final String message = getResources().getString(messageId); builder.setMessage(message); - builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - dialog.dismiss(); - } - }); + builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss()); if(result == ImportExportResult.Success) { final CharSequence sendLabel = ImportExportActivity.this.getResources().getText(R.string.sendLabel); - builder.setPositiveButton(sendLabel, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - Intent sendIntent = new Intent(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_STREAM, path); - sendIntent.setType("text/csv"); + builder.setPositiveButton(sendLabel, (dialog, which) -> { + Intent sendIntent = new Intent(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_STREAM, path); + sendIntent.setType("text/csv"); - // set flag to give temporary permission to external app to use the FileProvider - sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + // set flag to give temporary permission to external app to use the FileProvider + sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - ImportExportActivity.this.startActivity(Intent.createChooser(sendIntent, - sendLabel)); + ImportExportActivity.this.startActivity(Intent.createChooser(sendIntent, + sendLabel)); - dialog.dismiss(); - } + dialog.dismiss(); }); } @@ -369,18 +379,13 @@ public class ImportExportActivity extends AppCompatActivity } } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) - { - super.onActivityResult(requestCode, resultCode, data); - + private void activityResultParser(int requestCode, int resultCode, Uri uri, char[] password) { if (resultCode != RESULT_OK) { Log.w(TAG, "Failed onActivityResult(), result=" + resultCode); return; } - Uri uri = data.getData(); if(uri == null) { Log.e(TAG, "Activity returned a NULL URI"); @@ -418,7 +423,7 @@ public class ImportExportActivity extends AppCompatActivity Log.e(TAG, "Starting file import with: " + uri.toString()); - startImport(reader, uri, importDataFormat, null); + startImport(reader, uri, importDataFormat, password); } } catch(FileNotFoundException e) @@ -430,8 +435,16 @@ public class ImportExportActivity extends AppCompatActivity } else { - onImportComplete(ImportExportResult.GenericFailure, uri); + onImportComplete(ImportExportResult.GenericFailure, uri, importDataFormat); } } } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + super.onActivityResult(requestCode, resultCode, data); + + activityResultParser(requestCode, resultCode, data.getData(), null); + } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/ImportExportTask.java b/app/src/main/java/protect/card_locker/ImportExportTask.java index a86057353..a7acf8068 100644 --- a/app/src/main/java/protect/card_locker/ImportExportTask.java +++ b/app/src/main/java/protect/card_locker/ImportExportTask.java @@ -126,7 +126,7 @@ class ImportExportTask extends AsyncTask protected void onPostExecute(ImportExportResult result) { - listener.onTaskComplete(result); + listener.onTaskComplete(result, format); progress.dismiss(); Log.i(TAG, (doImport ? "Import" : "Export") + " Complete"); @@ -139,7 +139,7 @@ class ImportExportTask extends AsyncTask } interface TaskCompleteListener { - void onTaskComplete(ImportExportResult result); + void onTaskComplete(ImportExportResult result, DataFormat format); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4d5588a33..2822560ab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -191,4 +191,5 @@ You changed the card ID. Do you want to also update the barcode to use the same value? Yes No + Please enter the password diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index e1e6d919f..06ed9a865 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -542,7 +542,7 @@ public class ImportExportTest { ImportExportResult result; - public void onTaskComplete(ImportExportResult result) + public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) { this.result = result; } From c7ddf957fa4fb4c28bc27a10a9f2d091d609971d Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 6 Jul 2021 23:25:55 +0200 Subject: [PATCH 06/10] Clean up unused imports --- app/src/main/java/protect/card_locker/DBHelper.java | 1 - .../java/protect/card_locker/ImportURIHelper.java | 1 - .../main/java/protect/card_locker/LoyaltyCard.java | 4 ---- .../card_locker/importexport/CsvImporter.java | 3 --- .../card_locker/importexport/StocardImporter.java | 13 ------------- .../java/protect/card_locker/ImportExportTest.java | 4 ---- .../card_locker/LoyaltyCardCursorAdapterTest.java | 3 --- .../card_locker/LoyaltyCardViewActivityTest.java | 3 --- .../java/protect/card_locker/MainActivityTest.java | 3 --- 9 files changed, 35 deletions(-) diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 6ae5c8432..237e882bd 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -6,7 +6,6 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; -import android.graphics.Bitmap; import com.google.zxing.BarcodeFormat; diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index 49bf0d39f..02a6328df 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -2,7 +2,6 @@ package protect.card_locker; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; import android.net.Uri; import com.google.zxing.BarcodeFormat; diff --git a/app/src/main/java/protect/card_locker/LoyaltyCard.java b/app/src/main/java/protect/card_locker/LoyaltyCard.java index 91445355d..e2fc98473 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCard.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCard.java @@ -1,10 +1,6 @@ package protect.card_locker; import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; - -import java.sql.Blob; import com.google.zxing.BarcodeFormat; diff --git a/app/src/main/java/protect/card_locker/importexport/CsvImporter.java b/app/src/main/java/protect/card_locker/importexport/CsvImporter.java index 292a21fec..e233ee192 100644 --- a/app/src/main/java/protect/card_locker/importexport/CsvImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/CsvImporter.java @@ -2,9 +2,6 @@ package protect.card_locker.importexport; import android.content.Context; import android.database.sqlite.SQLiteDatabase; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.util.Base64; import com.google.zxing.BarcodeFormat; diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index 105b9d5fc..469725357 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -2,41 +2,28 @@ package protect.card_locker.importexport; import android.content.Context; import android.database.sqlite.SQLiteDatabase; -import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Picture; -import android.util.Log; import com.google.zxing.BarcodeFormat; import net.lingala.zip4j.io.inputstream.ZipInputStream; import net.lingala.zip4j.model.LocalFileHeader; -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVParser; -import org.apache.commons.csv.CSVRecord; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.io.StringReader; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Map; import protect.card_locker.DBHelper; import protect.card_locker.FormatException; -import protect.card_locker.LoyaltyCard; import protect.card_locker.Utils; /** diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 06ed9a865..cb3ba9089 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -7,13 +7,9 @@ import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.os.Environment; import android.util.DisplayMetrics; -import android.util.Log; import com.google.zxing.BarcodeFormat; -import net.lingala.zip4j.io.inputstream.ZipInputStream; -import net.lingala.zip4j.model.LocalFileHeader; - import org.json.JSONException; import org.junit.Before; import org.junit.Test; diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java index 9923335b6..7cacb459b 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardCursorAdapterTest.java @@ -4,7 +4,6 @@ import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.view.View; import android.widget.ImageView; @@ -29,11 +28,9 @@ import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.RecyclerView; import protect.card_locker.preferences.Settings; -import static android.os.Looper.getMainLooper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; -import static org.robolectric.Shadows.shadowOf; @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) diff --git a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java index d267e429e..c356d32e1 100644 --- a/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java +++ b/app/src/test/java/protect/card_locker/LoyaltyCardViewActivityTest.java @@ -9,9 +9,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.graphics.Bitmap; import android.graphics.Color; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Bundle; @@ -57,7 +55,6 @@ import static android.os.Looper.getMainLooper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.robolectric.Shadows.shadowOf; diff --git a/app/src/test/java/protect/card_locker/MainActivityTest.java b/app/src/test/java/protect/card_locker/MainActivityTest.java index 09f9b4a87..5af125eb4 100644 --- a/app/src/test/java/protect/card_locker/MainActivityTest.java +++ b/app/src/test/java/protect/card_locker/MainActivityTest.java @@ -3,11 +3,9 @@ package protect.card_locker; import android.app.Activity; import android.content.ComponentName; import android.content.SharedPreferences; -import android.database.Cursor; import android.graphics.Color; import android.view.Menu; import android.view.View; -import android.widget.ListView; import android.widget.TextView; import com.google.android.material.tabs.TabLayout; @@ -20,7 +18,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.android.controller.ActivityController; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; -import org.w3c.dom.Text; import java.math.BigDecimal; import java.util.ArrayList; From 3cb16ae3e9cca6e51bd66ee709b9ddeb6853b347 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 6 Jul 2021 23:26:50 +0200 Subject: [PATCH 07/10] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77de4e7c4..d3e57fa7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ Changes: - Support adding a front and back photo to each card +- Support importing password-protected zip files +- Support importing from Stocard (Beta) ## v1.14.1 (2021-06-14) From 476a219becf41de6ddc1beef7742826eb53c17e4 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 6 Jul 2021 23:36:21 +0200 Subject: [PATCH 08/10] getOrDefault requires API level 24 --- app/src/main/java/protect/card_locker/Utils.java | 9 +++++++++ .../card_locker/importexport/StocardImporter.java | 9 ++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 35b00cd73..5446c9648 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -32,6 +32,7 @@ import java.util.Calendar; import java.util.Currency; import java.util.Date; import java.util.GregorianCalendar; +import java.util.HashMap; import androidx.core.graphics.ColorUtils; @@ -345,4 +346,12 @@ public class Utils { return BitmapFactory.decodeStream(in); } + + static public Object hashmapGetOrDefault(HashMap hashMap, String key, Object defaultValue) { + Object value = hashMap.get(key); + if (value == null) { + return defaultValue; + } + return value; + } } diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index 469725357..e88041182 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -140,9 +140,9 @@ public class StocardImporter implements Importer for (HashMap loyaltyCardData : loyaltyCardHashMap.values()) { String store = providers.get(loyaltyCardData.get("_providerId").toString()); - String note = (String) loyaltyCardData.getOrDefault("note", ""); + String note = (String) Utils.hashmapGetOrDefault(loyaltyCardData, "note", ""); String cardId = (String) loyaltyCardData.get("cardId"); - String barcodeTypeString = (String) loyaltyCardData.getOrDefault("barcodeType", null); + String barcodeTypeString = (String) Utils.hashmapGetOrDefault(loyaltyCardData, "barcodeType", null); BarcodeFormat barcodeType = null; if (barcodeTypeString != null) { if (barcodeTypeString.equals("RSS_DATABAR_EXPANDED")) { @@ -202,7 +202,10 @@ public class StocardImporter implements Importer } private HashMap> appendToLoyaltyCardHashMap(HashMap> loyaltyCardHashMap, String cardID, String key, Object value) { - HashMap loyaltyCardData = loyaltyCardHashMap.getOrDefault(cardID, new HashMap<>()); + HashMap loyaltyCardData = loyaltyCardHashMap.get(cardID); + if (loyaltyCardData == null) { + loyaltyCardData = new HashMap<>(); + } loyaltyCardData.put(key, value); loyaltyCardHashMap.put(cardID, loyaltyCardData); From 2efbf664c912e4262b0b05be0ae0a2bc3b4af9d9 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Thu, 8 Jul 2021 19:29:52 +0200 Subject: [PATCH 09/10] Finish Stocard importing --- .../card_locker/LoyaltyCardEditActivity.java | 3 -- .../card_locker/LoyaltyCardViewActivity.java | 22 ++++++++----- .../importexport/StocardImporter.java | 29 ++++++++++-------- .../protect/card_locker/ImportExportTest.java | 10 ++++++ .../res/protect/card_locker/stocard-back.jpg | Bin 0 -> 20345 bytes .../res/protect/card_locker/stocard-front.jpg | Bin 0 -> 49596 bytes build.gradle | 2 +- 7 files changed, 42 insertions(+), 24 deletions(-) create mode 100644 app/src/test/res/protect/card_locker/stocard-back.jpg create mode 100644 app/src/test/res/protect/card_locker/stocard-front.jpg diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index f24119ddb..bbf6b0fd2 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -104,9 +104,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity ImageView cardImageFront; ImageView cardImageBack; - Bitmap frontImageBitmap; - Bitmap backImageBitmap; - Button enterButton; int loyaltyCardId; diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index 779e36d08..51b002cda 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -89,6 +89,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity boolean starred; boolean backgroundNeedsDarkIcons; FullscreenType fullscreenType = FullscreenType.NONE; + boolean isBarcodeSupported = true; enum FullscreenType { NONE, @@ -406,7 +407,7 @@ public class LoyaltyCardViewActivity extends AppCompatActivity } expiryView.setTag(loyaltyCard.expiry); - if (fullscreenType != FullscreenType.NONE) { + if (fullscreenType == FullscreenType.NONE) { makeBottomSheetVisibleIfUseful(); } @@ -459,8 +460,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity // Set shadow colour of store text so even same color on same color would be readable storeName.setShadowLayer(1, 1, 1, backgroundNeedsDarkIcons ? Color.BLACK : Color.WHITE); - Boolean isBarcodeSupported = true; - if (format != null && !BarcodeSelectorActivity.SUPPORTED_BARCODE_TYPES.contains(format.name())) { isBarcodeSupported = false; @@ -682,14 +681,15 @@ public class LoyaltyCardViewActivity extends AppCompatActivity private void setFullscreen(FullscreenType fullscreenType) { ActionBar actionBar = getSupportActionBar(); - if (fullscreenType != FullscreenType.NONE) - { - Log.d(TAG, "Move into of fullscreen"); + if (fullscreenType != FullscreenType.NONE) { + Log.d(TAG, "Move into fullscreen"); if (fullscreenType == FullscreenType.IMAGE_FRONT) { barcodeImage.setImageBitmap(frontImageBitmap); + barcodeImage.setVisibility(View.VISIBLE); } else if (fullscreenType == FullscreenType.IMAGE_BACK) { barcodeImage.setImageBitmap(backImageBitmap); + barcodeImage.setVisibility(View.VISIBLE); } else { // Prepare redraw after size change redrawBarcodeAfterResize(); @@ -737,10 +737,16 @@ public class LoyaltyCardViewActivity extends AppCompatActivity barcodeScaler.setProgress(100); // Prepare redraw after size change - redrawBarcodeAfterResize(); + if (format != null && isBarcodeSupported) { + redrawBarcodeAfterResize(); + } else { + barcodeImage.setVisibility(View.GONE); + } // Show maximize and hide minimize button and scaler - maximizeButton.setVisibility(View.VISIBLE); + if (format != null && isBarcodeSupported) { + maximizeButton.setVisibility(View.VISIBLE); + } minimizeButton.setVisibility(View.GONE); barcodeScaler.setVisibility(View.GONE); diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index e88041182..7a9a416ed 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -2,6 +2,7 @@ package protect.card_locker.importexport; import android.content.Context; import android.database.sqlite.SQLiteDatabase; +import android.graphics.Bitmap; import android.graphics.BitmapFactory; import com.google.zxing.BarcodeFormat; @@ -13,9 +14,13 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.math.BigDecimal; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.util.ArrayList; @@ -118,14 +123,14 @@ public class StocardImporter implements Importer loyaltyCardHashMap, cardName, "frontImage", - read(zipInputStream) + readImage(zipInputStream) ); } else if (fileName.endsWith("/images/back.png")) { loyaltyCardHashMap = appendToLoyaltyCardHashMap( loyaltyCardHashMap, cardName, "backImage", - read(zipInputStream) + readImage(zipInputStream) ); } } @@ -155,12 +160,10 @@ public class StocardImporter implements Importer long loyaltyCardInternalId = db.insertLoyaltyCard(database, store, note, null, BigDecimal.valueOf(0), null, cardId, null, barcodeType, null, 0); if (loyaltyCardData.containsKey("frontImage")) { - byte[] byteArray = ((String) loyaltyCardData.get("frontImage")).getBytes(); - Utils.saveCardImage(context, BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length), (int) loyaltyCardInternalId, true); + Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("frontImage"), (int) loyaltyCardInternalId, true); } if (loyaltyCardData.containsKey("backImage")) { - byte[] byteArray = ((String) loyaltyCardData.get("backImage")).getBytes(); - Utils.saveCardImage(context, BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length), (int) loyaltyCardInternalId, false); + Utils.saveCardImage(context, (Bitmap) loyaltyCardData.get("backImage"), (int) loyaltyCardInternalId, false); } } @@ -186,17 +189,19 @@ public class StocardImporter implements Importer } private String read(ZipInputStream zipInputStream) throws IOException { - int read; - byte[] buffer = new byte[4096]; - StringBuilder stringBuilder = new StringBuilder(); - while ((read = zipInputStream.read(buffer, 0, 4096)) >= 0) { - stringBuilder.append(new String(buffer, 0, read, StandardCharsets.UTF_8)); + Reader reader = new BufferedReader(new InputStreamReader(zipInputStream, Charset.forName(StandardCharsets.UTF_8.name()))); + int c; + while ((c = reader.read()) != -1) { + stringBuilder.append((char) c); } - return stringBuilder.toString(); } + private Bitmap readImage(ZipInputStream zipInputStream) { + return BitmapFactory.decodeStream(zipInputStream); + } + private JSONObject readJSON(ZipInputStream zipInputStream) throws IOException, JSONException { return new JSONObject(read(zipInputStream)); } diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index cb3ba9089..273455194 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -3,6 +3,7 @@ package protect.card_locker; import android.app.Activity; import android.database.Cursor; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.os.Environment; @@ -1146,6 +1147,9 @@ public class ImportExportTest assertEquals(null, card.barcodeType); assertEquals(0, card.starStatus); + assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, true)); + assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 1, false)); + card = db.getLoyaltyCard(2); assertEquals("Air Miles", card.store); @@ -1158,6 +1162,9 @@ public class ImportExportTest assertEquals(null, card.barcodeType); assertEquals(0, card.starStatus); + assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-front.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 2, true))); + assertTrue(BitmapFactory.decodeStream(getClass().getResourceAsStream("stocard-back.jpg")).sameAs(Utils.retrieveCardImage(activity.getApplicationContext(), 2, false))); + card = db.getLoyaltyCard(3); assertEquals("jö", card.store); @@ -1170,6 +1177,9 @@ public class ImportExportTest assertEquals(BarcodeFormat.RSS_EXPANDED, card.barcodeType); assertEquals(0, card.starStatus); + assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 3, true)); + assertNull(Utils.retrieveCardImage(activity.getApplicationContext(), 3, false)); + TestHelpers.getEmptyDb(activity); } diff --git a/app/src/test/res/protect/card_locker/stocard-back.jpg b/app/src/test/res/protect/card_locker/stocard-back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..523c6aeaa155ff2f07e500f3e90c83642666057c GIT binary patch literal 20345 zcmb5V1yoy0*EfD>ON|=tv_*>-cc|bLC=w{%;sh(fy-IN|?oc!&A*4v~;8MI0f<0q{~xl>Ob$8cxA&esGh1dZhAt+7d&=@k@&Ew=01)8+fQwP!IdJ*X zrC%R>xq|-?UMD2Ha)t2bwQE!?%lpae20kW9>qOkQZjOK@>_Q) zsVK;(NXW>^e!Ya?GX9w>gf|EYZ;;(4x=r@~yIj-(#McR;FTJ}=zzAF-Cb&#YaM1+N zO(#aCz7Xc-bZE> zULz%A6ol0GlJg4)Ju8~pWYW|!{XjwK+!vMEFuip#0^Gv$bcy&fF(3oLzy5>r|JDSB zuRCjM=Ls9f;v`(q;pz>_K~-c*0}H4t$Hze`ao&%HAGbFf1({nMPvaC=#2ItAY{#li zTDMBnyF|*}h&+R;7h4})00RBB##wPKF7bEj8F5WJ>4G{HeyN@=#8@7PF6q2szHeoi z%^DmYUXEidBEzPIbaf1kd%Ljs>8&mW@b59g*d33m{Z-7<(KvJ zf-i!pM#)~N4ip9k4nQ>-Au{HL0oHSA_hV)&oF|UTc^nS^}Qx*ka@uVV_u#Q|fZV}>^xd-1zP8{~qswm)4Vbb-SviFC* z;`qxmw^-flHQ>YW?!S}!pLf04m*x;@q7Q<0RGA|4!-WwkbH<8+Dg7H_RzAg7+{d78BO}lBRm)BHi%f%X>TAi0!5ic=WS{yjE zN=c{U6#M}vC**4$l4bfncy7Zud(HT|l4SAl?fh4W!c_U4NLLjjrbGX2#dIxSEC2dK zlIC~F^O?fY%#0wHpWa%!-(h_Ryp+72=`4~0vTJKaFpne1_@QnOO7|(DnU}A-cPgEf zXP)D!`V<4wm#xvV$Y67?hJ)6EPEgQ^H8kKVlYUx38g?C6pCKp9B9D^QWmkqklDlf& z0@4xxALR0njIQ^h=k-r=qmrq9G$EL;$KV$G50eg~cp(ML2W5G|&50BCWbr4eMx~X^ zY2k3T=Uld1NwCb=(F9R`6z`UAOY5s(RBrSJ#6^i_%j}F>d)-Lu>zCcK+dJgAIickq zN7-5sUiT!^XN=>)np1+cyM)_U;W6+e~N|IqQ@>+zxmwk=jG?M!``Bt4N) z6}PWE@^h+>AOAipV$8cYLuVcwOI4w?!$dK^{5h3Pe;UkZVBkrkG*E=K>{O4460gh~ zXtaSaMdczxYB_a}%MUp=XW)ye%GqHZQYnwSO%6FK6Z#H39Phh=_{c*|IwPXo3lJl& z;j+;I)&cDaA1?s%Eq|Uq%9hiNwX9FAr?a(Oe!SoM_;*-0TlAlWfHOB^+mobg5DMMv zb69z(na1tOOG;VKVoS)y`80y(W%-<4jkggH+)I%VU1$Ha)HEm|Lr0e5%aN3G}@^GcHq zje}X~u5GicPXqY`n4v}Rtfj@Xm1QilqbvW+wl~vB&)Km|bHq9$D-#+V6-AN76hOiB zss+j{tEPYnwWSFIGwBCqGD2i!WOoAI=o}jH$g!lP4R&7us^8%W^HT2NgRZvKnKk)3 zO*OpU3sZT(?Y6FW|2s2)3td#Z^4NIGPKu{VVT%qq2Ox0U0v;UY<}==?d{oik==oD z&6&<~`cE6PJ2Z0*uRvBvuOCx~@jAG{@`VSN1X%0-J1qckYk;T$?eUXr)Xqg;II~nc zi~$Dcs~($E%La2C6OlHGx_!Cv%G#b{(cm^cvl1yyP;R9&WDi~dNA$t7orXpU8P5`$ z1<>SLN4JGx&0^wmXH9!ipAubE?&|EP#j>nupCT5@z7^2;hqSMsy?S~aQ@Y!>wyIzC z1X%x`|GyE1zfXNj>dVR&XgwTj3w1T}H4Gxt5J-ZbDW>4Oh{;-`qb;~XPvncr$c$kJ zj)PRubQ%!xQhpCbr!??H#DGh_4ZO*CE5wByNMsbd}U+T{u z@Fow{D5dhUL5e=IzqJ?2jHTr^+l?zl(q{H>K*^8T+ekAcK#GJZ=ekbmX&e|th%hIc zSapG!x+LgCmyRcJ0OsUvjMPoZE_Te1ss1|JSJG&2zo-y>y@R+Y5Gz(QNp!b@zh^&zhIYU`nkAmjWvdDpNxL+SZc9A(Vc z9TT3rW*is5U*h|HN8oZwdL<(zl2WX@uC{Dm8YlC4WEvVLK|cf`shrU7FG5LpC7W)a zdF{uO-l@q6($}iW+OsU4!Z@jG0hezLz58#(UAE{j|fFlhGiZqNxBYJ zd8_N8e9I}*C9NulIceFAIwI$RYZbx&jh5f{Cbn%k z5XFwv*b$q9%!~*nTX>}Ca}wVB+0~KaC&cPE_h6&gSTO2Qvt=j37F-sa;rL9fTb(&P zvB*#Uta2hTcth}HfYYb8Z90)BuHXp{w1U?AQ<+w4q)>-DI+ z=A3Cfr%@y2#gHO_`1X0hoi3A7C!DoO$-sebQ2mkezJ$N$A%xZj6c+}1t{BO2k3A?TIS4#W_$JXDmmD#vIR$~ zxV4C;hqlPcR4ppk5mWk2y-azsxRKM6t*YK8$DBjQ6e#Vnt)Z*R7lCE3%Htc!ZRFE>+3-CC0i7+0N4m^&|$>lHla_D5bn zRUMCgiyAox)$3mXjpI;X{mto6b>g69yhSSBMTOo?QNFzz09hTL=&f67KFD~DW=uzF z&uW->Gb149Rcv9gab-4 zq)jC{JBz%#vqMGs02fPSEvCAva!?F?)73S2W41=5rI+7Up0*$_*B=9mOuNbEE_KX! zOqM)sTkLSFBXBY`=62QijH=F*aldz2Dj8@!p zw_~=(SGF<0Q#5578aOa}0ob|iwJooz2VKukzBfa&n9S0$1TJ-S4q`Y;n>eEh+Y?hw zihsRCPC72y6}qB`Y~Lu*W~mcPO415eorgc#3_i?t>n|a_lv@GQX>g{WQjRt@9p*c3FdGXb=QEBT{^|;|--f4t>67jn( z^E`_N&BIci0sil|Jl|)<*@oZGiwoy=hcA|-F{`(L9N_(HkcU0w)93@UqfTSFg9_KNuBQF%Ifp7l5)YRGD5bJkhe>(Pj>NKl*5oPMU3YDz9P+?R-9b z%3Q;lU+~h^Zfv-f%t9p_;p1KsS39PW0j@>cmD={y@+HCpu&QjWBm^zo|+|c z#`Nnw|M&*oTp`qAp@di-Mg7ddW*JK$XM-lHacXahEaiRkM)X29Tu#d1hZjI(BNK>T z$xNaB~WIL`s^@7BmffRvbk6>@2sevRcu-UAJ)bq^AyBccoN! z5&$lbs;CILzHr(7(WW6;AYb$-slXZM$;jvgVqVu+wbFC8qm*6`P`)|vBkZC;!!;KGTS?-@F2g|!mgsg5IV1k_dOOGOH?1gPVAD4hUEaMof^hv_sGbKUrnBC3An)mx#8 z5@A}9P*JK_HrG}f#=%{L7Yt8q5Us{?>^KO=^y?fT_w9^kJHB{|qH|+V%M~3it~}$Y z^1#xwj|&hX+rm#yC>5JU@}Ed^^}H_D1~=7i(OittKujkV2YW=&)1l;~CwY3{;-_G6 zo2c$}(XP*7yZW?j<=MwWc&`}){jI#R3t*1<0;tb6wGS!8C9$d4Cyo1<`YT-NAgh69 ziu6yreq@Y`HI12oB*l}}P*cUz+;~5r`Yie5ME1E@!8DRjp0G)jBjZ8MFoN6B#0z~7 zfuBU8*41`75*UX#*LKVF_1JA~GV*gHMNDpOWev?PYa8EG$nP5(sSnJGE4!f>M-(2s z0g(dX7dc(!)Q`OIIi00g|wfOKPQd{T6l2pFX}O? z_ozgFuc$%4vW}-Z-R!l^Q6gIjvy-!HYU`HQ|9U8j3r=CMS+x!V_rc^HQeTy~fo+zp zfxE@uf9W#5*iy%SVBfiW)iB?ch7a4CPXf1{%u(ZVN2Qy>U6Ms5;eDUMkQ@!mq_#~f z%*{P+cng{>CKIckLmuf|+CRK5q%9OFeiLp(f2*(pA0t3yLXme9B1etp;G^p$hYbPb z2U4clDxNV&c zbRD`w69AegwI8KtHl`qQzHhi|te8L9yerjd@>IOd_BppF8OK;{)3zby z@=4(3cDaL;$}9^?_>H!$xSXMQ4}gU4_Pf9F$G4ri;Ke5N8p97k!Lib3dN0#^pW#&J zHjFf2BeRmWI-fCOpuFu+9lN&DGK9N6#jXw{T8Ssl(Li){OW0;GXMVeleG?93Wn z=451tF$PdTY_%=`&)sxSg6TuFolaE>`l&CdYHvdSjG_0$=jyQ5hwiN7zKH{#&z+U~ z?+7x)zx@{9-Ok9;S7WVchE_&&7X%y}(nWr~BF&poYm8dMyY5?29Fo+}fZwA~X`qm| z*`#Y0Lj%!Mz8xFDB)by@)P@jbWpfQ@;8x zcNl$fKnstiGM5PL_H071o#TUi{s-ZhN0re5q@gdHVUP^Ct)08ipwcUsj|vXoZk`6G zp+)vAI*%C^dWU?TT=s#y+Zg4XwK{!Llgo(Fa(pxDlI|TYzdTYAJ-v^vCifzDQNxJ3 zhQBW}7_SLh*Wu626g8aRk#&wF*Ba25$LrWB)0@oV5!k58QzaS&GJ91~HX&m)2nX^4 zfz&va`SgYi;DWAdxn2h>WhgyXYw64CzpHv=X~*~WTXr42&Xrq>5ET}H+^mO>1|0s#lr8Z z?X}mVHBzdfxQy~zolakgLq@)-It5geI9{re{mFuqQ$|p|RSFL77+p;tzxUIh|6*7G+srFOe z#j;e!AeL7r)UTw52-;XEDXqA=W8SX(XnEGoT~cxXY=3h9oJhM@kAxTFC@nb%{c>gH z$-U2AINSCDv?nCHL(0O;@yp9FOg`D`iujO;<5vJx?%Ut$b+tHw+S#SP8!f>Pni+k z>-r$ZHV1BS%+g!2;|A5491&pSEzmOyL2!u(uP}3B$QF}?J>n<6Pc$ztYHKeFL0ob) z$-lz2JeyZuAY$|S%MctwW-*!DHamjAwT#K%><|RBi0X&XOeKGg!vr3KzsCkwI+<0V zmqu{1+UuMMlBwlRHh)y{7**teMth-Rn2`oZjKeiEH#jx;b3Adp?P{r#&5~0rnPPZ| zTM~w5f&*v76zLt`3^Fd=qhpABQxk1hu!Pc2n@BiM_OMj0yd365KJyKJrd%b?(scpE zb&C<31J5nOe^c`xSFv|0+@YHtu(xO1XUtyQhHE)N?J1yqRYTYid{;edNO4BBZIx%0 zJ}$v;kkO&L-8{~GIr3a0`bUBGE^VagV{en^-*V*ER79Frd{?0(&wY2pIh`PBHf=fe zV59HA?fUL_ztGqw+J>z=@5cQwT&6x<@|DMZhmVs-+8pG1#d~AUJ_)z2-dk zSg@%pC2r5GdCgaaWuWK5rAKUkW~sk9rL(oRdzaOf{Jel-UqL09ovP-NFELEB|2$ak z47X_9tX1@pXJ8o_Yd!dNJL+uq__pua=NcAAPJ@K)EZzxQXTxUoF?*a&@NqE55OWR! z>eb4{U*_5g;Rz1@(ygYNSL$ymS*jAWD!7;s93^EHASioarn>6YPq zg}2_)hG#=E{CW+>jhQ9pIEU8G7AC>hu=b@mV;-_y!Iw%PJq;$)V5($9+ME$F@!fGH{pJyb5fLFwEQ%e9!{6XO7aX3q?HwNZyb~azNMom zmGGnm>t~g!LymS>YO@5s+TraJvc%^Bk+|F8K63g^uJ+1K@-EpgOq$iw&@=r(xVi_l z$w_6dImX4^FG_WEv>%^%=#MHqk~6RIF_8c+lXd^yRlhHHIMF?G{HTK58LogliIgl|zOmYKRQhbIH)M80LBpl#Rn#k-kvi=oo3ZLh zlNqI@-uzvTy=Y*jigjv!2%?E)`#6>~!;CKCNjn0KB29jnsWs`I`pu1-f^s_3R1mu1 zMI(!;QHAx$skjOrtr>2=+dN+Zv7G{Za_lh4dMVST==)F>7`%YdASOj?FNn>h?CObp z9@RM<)pbYcDm<4*WJ-NcFJ9LdT+naoKf3sJSD1_r%Nt^)$EOk zHuH_3)fN7NwA-B16N3oVnb&5cOf>Tqbc3vUvql;(VbRWY)Quth0|jDS@itjd$C`}P z4i*V4REPJZfyL5soXI zFE%R!WpNEf$f`SizW_)wTyQ#Uywb{5h-L|w{?$*Ot~SQ)h%6_D7x5c9+a`szrA>L9 zAxbd0^-bHv-N(S+mg04Lbc>wt=lo>4SCf4oa#bC)SJms4=T14;rYk)6#JoLTM9-Ix z!V30}lW4x{X(?&YX2wyI>R{kW9K2sgr#xa`@XYB3bcH#ZV7^F&Pxd=?i0R|{_nX&! zdIHWrAUE9`R_^zF-4ElIMZIWhS5C?7R#CmgG+WX?_*|$a<0pg6&2fFiVb`GCF0axX zE4>`t(l{r$Kg}u1-kt7l^ojle&;CedyHkvok^25SAmWD4uUW~8GB*Futfai$BuX-u zNGoe^dmTthPtKKmMqq3MV7`1S+@ItBd_rJDPzSqY&}7!eyK>? ztsfu#+;Ar>bldsIzICG89)a}6PEcU+#$u>SW@bb9Nf*ar5*IuL_EFD-n!3Q{#g5m+D)anu6wIQZu`IZz?97-RC z)aqAJ5@7wH(8x*YStLJan}o53eg6w)t(_{lJkV}LBs5*T&d71DIgPM*HY(}}X{*Uj zGRiM~`IIhgr1jn;ywdBIlH}mY&4QIw{tfNAkiJ0_C8HlFdR3c^JZ(!ZklUq<)AfaG zjF3k5w;qz^L9{0aodf&Fu_-N${Nj+If!1x`D-rLPZl_5pwU5s|S_>Jev4xf~tpYRx zQ2d~#-k)x;HTk%j5b)?A-4U+unG)2@6f4Ss(i96!e-V96Y=pIU-;ssSjs{$)fmHV2 z5@SA2$X&Qr?l$z9Cgdn;*(=>ytc$5cw_L7^@)TLXw-@il=>oihr2jh?G9+%MLr|x5Y{`T3OXXTyj|-(ttxgB}!d?$#7++UonX^%$G6{PHwWf zJe&Ufly~x&!KaBGxaVnA_h(A}U6Dpu&&wH1{y``%hD?PVe0*#f-*|0tAgWs z&2>~l&L}aK4OE8Djt)K~l!xsZR1deTOP7aiP=i|OcX+^I~yk|h6%Ft*34be4ijCARw*gIMQssr=M51HT(CDr`z03I zYsy-i*BSmK9~+&LGKY@0Okq+chSCRF3<1~b7XhKr?k1wokR9UjWVR1caUZN&&Y|mY z5w-ET=Y6RnI!;h}WX_1k0D^`rN5`8n*;oJj-4dSHN(qTM?)ge0i|ow$9KvWTx-`Z?2doCs4Q zvx80rJSCP~j9swQe#D0F19r*>B%$XcJCW+@QC2(qnFb5Q6yO*?eZbqvUfS?LeJ5Tz|jx&B$$m zJMYUKE&y>>mYj%Jx$bw}no?!BVO`={5ynwh-aFbMUg^eST%(OvycW4Fse=rr2MVi7 zJ)8HT-Ra6_%fRI;BLHwUIf>d)A(28~-!n45AOjv=6rSOq6&Wt4y$)eSd+#kihX8xA zdhIDTWpJ^%-n5^W8OYch@>k?6*e#NO#(8?YBbYVE_v;V-Q4X8OQU~NF=3{9az7^`) zM`iwmL^;lhw7M0p#%SXvkxlOgjPl!9QOTI19w@gZw*eRg$09Yw+NtM$jC4qMJpnwZ zpWt5=POH8~xgURJNcXlj+whV>j*+451u#|Uhfe`FtM{tmRD~&og$i#jeuP0IIqw52`C+m5WY83p6*4wRL8`qHhqueUQ9~*5U3BffR%!92X;HeQQUiMxatR8yhiQ)wJ0?Hx%nO`|F!URPOb2$& z#pE_d&MrQm~%V!zf?Wrim*ir3PH->#OnqFuhV%#XnLV409D z)n;R^!5v-g6|CHn*sw%tV28=!mv>NCE^goHQKTxzZUwQV$9c5Y2iGh`#wV4}1J3BZ z`YB=DPKO21@km=i1)5{4+aY;7Fm+sf{a(Ro9Wbx<$0GZi2=R%IA%nFDp+zu55_V+9 z*LF`098}qK#>RL?0*M?ov*Q_&^O*_;=g-()+BWl!-pl9= zA1++08m}0A%9C^w6_x34AR-frGcDe6BcD4f+O#|&fG#-MzVi3+=VzM)3O+aE=cndU zOeM04nddFqMSmpN%a7ien4z}ZElPZ?QEw8`g1y8`U64OD6scHi9I$caOG;B7@49-i zUgwgKuFBQQsB`%$S0BY^02lkqcfSZbUK0U#kax#TIp+DY*b4@63CLH9g{vul4lRY%DxF)um7^OYApIfsv!jq~ToJ#0K>j#=wZRFSrqu+iHS~WcsPqKHh z+eFovo>^mV20{hGr-+;F&rC`paQ@eRoFtAe7W~z72_O1$v4X3(AMnIZpdGkosj7K{ z><=67{+O_LW|1Q_SK?Av^K!}DOvO*69w71VhZdey)fBls6IjSvrqJl^0*%MP_oPSSC) za56Sbkh2`lvwxUQY@zzuexO2+^-)2X&t(tZ3cZeo3K>_*q^;TDC(3Xb0&JO=7rWCV zFrdT|>FPX&AATrhc;YRMpaRjBGXu{mZE<)_fn1aleMcd&I5Fu5wr3AR*s5u7KtCI7 zQ&iOEAG^Ob9M940lk_WWccB9W>tiyPrrQ3UI!M;2(KYm|l0X(aE;&AizpX<8!Cx zw87tUW+Y-nA((Gny2a=IdmZ3X7ujEbdjCi|F^SZC+46%?l^N}59D8QUwB~(AmO@<~`ae>=ey4ZaT4N3^ z9{U*%ajV?_5J#g^se_WaegV)QpRuu*zSC0{%zBn$^W0ohB`>Fpe8E}Yb=lWO_$S2< zaCxZpZ)C-;FYHk-x~jWjsE;L5u%Ut^-fgBtwo=kB-sICkE(awVBF0BT=cH+U)R4E8 z8(GugwX$X%t=#b{>#EU@fG30{_)$mUwt>*mdmJWQ&77APtsXVNwiT5Sc;eZXf5
WTM$fj%V)yj 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­AU9~C(G3q7No`&0ktY3-3n&5QG#pH%+4z!g)~Iso_&=Y#_MA1fHM z5z&6q#PZg|4R+&Z#|@dwF94EZlPCWOg`ij1b1K#2`2y?&?p&O)x;KZo?sHVDnLzcW zaNxjVva6KzAgs3bZf6J!Kwe()6##@z8xIMBs)zBbmfclMLYn%PNYXMUI>Ot(^b7g4 z>A1I)y6YkNTY#%g>D|95fb#)a8Kos=AI<`TLgUArz?GXpBIH_yhT$ekqJ=F?4)^L0 zLa>o^CEBP&q&u4wX|uZWVp>#LZsH!Pv>qKQa$Q%fqYLB#kIYRnvQUeKdmBVA_gCu) zc?uWKfl$6Ig^%#3zv|u6-w}|L{-fQg$&bGe&ZfSn?Fxt4R-N@So+*DKWtDGrx5)1Z zKBkn=)fl^9nX2kd13Nwl|0&Dy$dre7ORiw|{EEfgooLuccHTzOn)w|_>3Vj>3E+8qARDIH9{{mde z{hai}i~hAG*;!2R7c&m%9aD)o5{%|JQphp0T(j1XJ!?LsAJ(R!^&xXpo6S$bp3SmL z{FVLSwPu^9E-=%Q@vP!9#ki@uKPp#oj1t_Pp5pKP#+r}I*kQUAP$I2l8Z~07@H8z1*_6UH`Szv zc0B-1L*3#;IIusS!T+iY=}+Yxn48(7dCEJPB%;>H8IrCK6<$33scyMlZ6lqCYmP1{ z>L&C2DOtX5M0a}f4p_fleQfW)Bd)%dc=BEUNSmVPD3)zM|M&-bn;YwhbUZgXjYdVw zAl%RIp8*6^(Qg6Z=KsW@nv-Jx$EpAKbe1>%be6%d(^&xibk>i5yV^x6ts4F2Zo0^_ zRvJB#RW0|c=L=oOF?F^3;uEXY)aVAk&9Z};qe%0*OJ$UzzgECs148E4fC&3ESWMZr z&$eTvTjaFixc>w1#~ajI!PaXp6##hO=kY%v1P!ItP3t8VI3f7|Dc#z`q2AW;sAJo^ zsNF_|p&plLkP-?pdzVWH$7M{0k&w%fk-I_EmTTD5jEE8AHlt+5EyIwQib>-#W(Xw= zGee^yBiHjgXIG~`&hwn-oc-5Yf2?PH-&*T?zV&?X_rB@`AL@{bN0Fw?Rpa)+jz9W@ z3ht9=%4e)BITw8fRUU+5dHnPZ1>Iei=YdUgX86RzhML-Shj_^BdlU6xh}pt7p8-lS z=OD;1?9mr1ii_UsZp-Rm_<3%Qf)u+rCKEQRg=yAX1q8p2V9B-j8^TJd*Sz5R;4u;* zzs{nX;Zj4@@%m_RGGdh6QW?^|lhf%f)Ej=PL_TNQaCbcru1H)ib4@)uY%J41uVeke(Dfs9GPFFhfEU{w-U++Y!pS1wQOP4fS3&z-eAXDbSujl{Q zD1kHSr#W}^gIC|(uKFLC!^8y7cxlJKK0M03q_Wjxs)BNk@mKyB95Bq2a!#{9CfcsaTB@|0xdF@tX6BBf}?X{sJJML z>QzYcD4KcmNkggX{x)7!k+dD9@|_?Q8xEl)Jh@*i!%6mwJ<|iLvtf=}nI;!!nd7!m zfu6mda&TIDne)29C@TI+vG_Cp!spcEk#R_mE}+RVb|XFrwV!cDr;g(&7qNbGB<5`A zFQ5Eb%%p^Q2B48oPM2Uh=!Kl_8XB;k4n!28s-JVCM^Tbu*I&)V<7|2n39IaStGs~? zhqO6XVpO4hbeFv)GPt2hU0HyitBNa#LPL1oQoS|F4jC_Js`E~}M$N5&$3?d@($k*y zT+cp-N0WV8?H2PDJiW#|M-B(2-tl@(YSTY1B6$>1{O`7#OVjN3Xg$QkyH&p!75hPZKdJNjmYXr)Q zfP@A=_KjNEy9Ra1@(t|?Ewm=g0non$(8^DqgRBIJ!~0t3t6pV(9?Rk zh6v9ck~43s$PfIr#-4iNI8+mo(44ZdU6}WR+0#=jytoDWO?nGN&}k>`;(SzpBT|vv z%(MfF!eMePTzy<8zZi>!j&*Kc6WPr8aWC1606g$s!k6U-gcfoe@d;n*}GIXKUnupD7b={chyoyi{HyswK)%b69LZ zTsw84=ZJ#K?R!LfgMtyIhz0O8$fi8@%PlBT(^L6}xp=>_D`rEnuUiXPwlMpPFAb9D z2T;wnvH2P0=I#OJ`{MosCeQwFm^`EuBW-qcLbfIhYh}m?WFzIBr!4kVisxFXb%4a) zW4=9vVyEv-Zm@XkgX9Gx-De@UT&zEtUDjiC#=uKzCNhRPFx~j{EHh_kXAg}k7crI4 z-2r;Fo%Simd=?^TRNdU^ckVo=>nf^qUg0{HYHxea_TRs1z;{Kq5?0)1c<~CwC$`BA z+DaFV;ngmJXICbh0qs@zg8N$JJDlgIL6$lEZ($vphmtJ_0D;p||9LAw;4GO}OIl>7 zN>$*`0o4C*j{b#7MvLEM)WX|!6NM$;?3#R9-~tfw^J;rQfI9FOW9b?8!6LQye>m9+ zPlh8M9%P^xt%KedFrH16Qe ziYNR4S>h{4Q=@paBn1hZlmKxd__oRs=MyIJg>#+vCdrw5I*+9p)nzLa)*V=HWXUT_ zxF{Q#c!aTfMS)SOs;#S*ouz&^JH1e58C&i{-*;1AC#eCcsm= z;h~tUMve@nb!`WcHZr}YM1j&Cf6y|9T9;@%`0U%_64*MN_(NZR;@2zt|Hl2N(5c=} zqD>d0vAixqd9KUcz%)u&iD@xg!afpFEt?lYn}q<)luCN&svAk8OEz2@*DtDB+xQE> z>35!PXDIRT+1}VJJB^u|^h8kj{ifdeOMXxC8rzY1}aLq_{*wwBTd?s zERd?#*XHzhw*QA|>Zl*!EJFmmvVDLW%$yvNt7rmo@iEUSE$Ny-@E=p683^8vq%iGTK; zXjVMH|0w={n(+w$cz2RXNbh#V==)+~ zanrFuBrtOdmmT~=pJ(`OiiZ*DX~p00)|6MII#4uI+~gcX$IE@o1iB6F)k#maTCt|8 zcs}paIo3T232~Jt-Xr6pyU!Cby-ue*D<)o;;Qiur^^W7ZV7jAPt@{xEh@Ik@&)^0F zr~Fzc`fUcm`Z#S@{}k6)(AP3Vkx?5{~-&7Pqu8e49CSY-@u72 zyzBux(&$=!7mrW0cx7BDE4HBsQI8oG-EgvH2<<7J;Z}PD*@oi$9`(Vb0tDz`q}d>K z2xYCqB~MC`h7&}B;yBMhhY67DAP|KligVCxssU43AR)EaPU7XS!7SH3NgRk`Lxe2g zmUy!n43d~Bd=xzPGzZiRv#J7^FNFKIhD(uj1~DOKZEf(R|Z3eq_200z{KfjzFrUe%AK?JrkR&^5#DrWc_N4%3+fItZLl z5|5XHJ8q5!vRV9OKEUw>3ig1|4=5?-V_>y0WJOp|_gaU|DWE_=Pq%9e2M zmp<0{=i5BBX5EGNpK}6Yg>`+mfzM;U4VIEYokE5l=D8f`fK`!k^taDVz~BzN}Wd^Gia7Bll*9a2UtT=p|W&E<#z z72s3Aj^8G5qWQRpEF8X?RnB@4v(b`N{?g%dErdCknf8NgsXCp7_(pTB8}Pe8QZ#qT zeWCMI+KU^%SjF4O><0@PSL(n%_8S4Cf?Tkel8s(S3vf~uoRD=cCuZofHMUu z;|ISwmX>9)c_N|HZpi?QdF7_wPKC4+Q|+KYmKJ%=TqQp5&HmYlvNwNQ`9Oo{is^}p zh%8-oY_XL35}$;Wcf9EKI7&NQivu#x#HFWk9(eqS%-gRxKsd#zRLvrK+u$`4W~gj> zu$XB^+DfA4#^=R^W+87`p=!&Yjj14AZ&*{MXCZ~1)da%AXvmO*UYeH?jxGs>a4df? z$ch*otY~S~T~V$aE%6}P^S)0BQAT(zJ>A|Bmw+DnXI&Ven%z^~eM@<3)Xcf4C7F4S zWrms(>d9yA8bAT|PaR~J3bH#>je{79h*uH)LG}Fu%zRe*W$zU}6sc%-#Ic+-)q1q` z_8;Kd_^p_2dTtN2R%oO)h}ZcJUSjtxEG!J-jl)W%DHct+))uO-+|=|rTF;4AX@Cgm zJut^c#r7|%p~3h_rhXNCo~hUO$<$ZdGGsEf>%x%zi7#}7vc8-6eZW;sOqk1im3ugZjLlSApu8%f1~t_0i05s`1g%7G zAv%urlYqv7)11f;%oRQDM(ym@5KIi|T1Ulcw8_IVJpNSLP3dg_av0^s%sHv9?L>sp z&vobVd4#B}hHebE2R!Xf6qEw~NUhtMZ!3GWkQL1vgy8y$XG=zwI8+_p0}y*j>zB{=7>)heaizT;L=WU-O4XjM3J|ac7c%sp4cge?-|Gmt-||Dm3gG1m z$v68(J!$S5x|n}8D{c zh~R>4Wv0}Y04A2XY6-iDcKrO*ojh4|d~Rbaty>x+pD6KJ6fm$>{&m3p7oC#MiI!xh zSP8#R5JV8pZR3ZyL|KxS%8Nm>bxa7(TJ*j8Pd_w7PLRKSbZvNGSFu(XJ?(j)^`Hx0 z4C-o_PAb0|TXU`pVsn_v-U5Nid1FF?Oae*-eBpJ3f^UrT#Qa>FF@HVTS>~^(cM+!y zhe!mY7jK`!!R9AJzibxraJz>-W-bE(F)*Wq2+OA4hOff%IZ1RT(g3t|5V!mKit}kz zOo3Fv`SEa`$#r>>WRm9afQs&oTgS8x48@ohsG>Np_vcGx6ui?E z+gpJFD3CCd(7jR~S+?0VTbffUd-?~rJ7M-sH?sauStCUe-qS(Q{Xa~*vmd~9dPPPq z3Mb3rEiEnW_h0_cp-Qmq??m8(??R4ne1~J6ThLT4?t`O((B^%4G1?+a?+m5WA;E`( zUJo;TuVp*>G=R>Mt`SYalNL61e57U$JZ})5kTuhVQ5d23n)PoH>YOJMrQ(STc41pSU@9U1d&oZpvGwv|&Tig)^YnMggq>{g?A7L!H8%+ig)(<<`NQoJ%=UC}u<-u~N!Qnujic znr+sqYBYWDDO!Y+j?>$qg-i1?T7Ci%+s+euIq$O)r)kM^`E0B=7N3yqK-t?1v@aYL zY%=4L%5HK|9zV~I%E=8E^a$L5F=J{*6BC_kjz1Q8xh2UD&r7z^E|Q(B_cr0m0&7L~ zUd36Jt3@Rm$}<-PxmH{1P>lq*x7!^Pqz5oKABpK(gUOk*WG9(5xTAacI=q~GeU!^J z>nSj)H4k6}xn9o+aM#Mp(FFGDIB9@13%H1<`!$f@8{wc&0N?CaD3qI%e9k!@MMz)t z`z^VhQhX&=#6Vi%a0o*wS=8kR@>i#jafl+*39A!6%`oeH>kMjs0iwr;49q<&vOyK5 zk}zQ?S2pnU@aPq4mp|i)&`KUpB_E3~`BX8CrO0%hK`1N*O!1nX2) z)QhbQd+Bm3KN%}iTN%c)MV02@D<`XEI|e7-i+7sE3RI|+y=Lvqqc4gAMWzHU>-Cv- zoEVIeLCBJc>(g|w^W}kG)pf%=yS0^3TJg88&*>&6S30#U#MV@nQse=o3r*V!wK(a; zj!e#R+6k(D!0B0u!pFiV#s|obHl74#vOzhu88m0HKSkv>*V5MOLeD@5_q(J{DMI-6&>Y8g@=>U4{2IUtiS^mp!w zUv<4tUd&)Umvcf80h8BTbvw&C8CX^?s9)mJ%pXs-AFn5&x6_$6_3a~CYfXmcs+41r zELFA*eJPYTp=pNN36#X&Uu2)#JTdk#FmjsE5IDPK;u|_8RtLM40Is1AaBAE=5YZ(DOfI5?4eu|h%b&yFwXCLBgIn{amt0^LAJqP zSl_0G6srIa(?R8JVf`$g!vH`6yh+ zm4WTT#0%tZsgnqla5~di?r!CSMakFxsgS)&)tUzslF%PDhx7rmC5%0dOUv+ztix*K zw)2W+_2t@I`Rr6njK0OZOlnZ5({!TtwMCwhu))>^PavbZ(R@Zu2tgAz?%>(wuK_V% zT;quRNs9gfDzBwJoo(3WNnNL2#UU=JiaP!Q%HRA>zU?X>L`gihnYeSC)k*)k&{E2V zjT^wm&N;VByBo0>+3M;}lvya`2x2j{-Kd+I~B5$JE$DTNv9thZWzkY=KtT8aA&H;I{sdJB^B6VWY6FTV?=fd3w z$LZ3nwn=3Jktvq0ma)3j)|Sz=5xFQqu}?FqTO>X1QGc2ZxdoyRZ6yp@+gJP6lk1sH@Z@ zV+=$|*bb5fughc}A6(7{6&CC{r5?Jrt=G4Wl6kZfgf71hX4|QzfV}{<_c)YE*9vD4 z5Od;z-uHyukyOcLh%_^dL8^OwHBNJIK2uy!y2w2d3^2Xe=&!_=S1Ym*b44^F5>dyC z9*g1bSSv2#*$DyO=%Zw@vA}(`DG$AGK?rLZGHlL1gL<$FYmc)#8E2ssGZ`aB8gD{_ zz9=z+JF(se6&@Ak{tp1z#@bq7u3z8uPs|`OfE72}H7~*!tRCt{j9<7@=myO8r=ldu zR*@h9U_x|$<|lH#Rv+_#n$Jrd?z*XRzagCfoa?gh%RG3z36 zeQsHkDYk5D-)Ysr;sZDP`)ul@o}bEAd3g8C>OL?f>r`Zx(J=-~YY7_hHBoWc6)Tvb#G60B%3Ne_*= z5t`-yFsy4M!NfFAY$C_DKj|l(mQp&(5`x&9yp@Beo*EDNwP;1Sr7=s43)*W+717#Q zwrf0Wo|x(w%f%IJtL0CLSKDww#HMN*ys@a&kyItS*S+I{@0@BLey9E$fT)}8%pR^Q z?&P!bma3^2(EIvpUXtFqn^kocW>k{gJCGAPxQ}=-6=SrS)l6Py{lVX;RKBmWGu4Q> zEAnf39b|jpO$ZNzsNq zW}hy;bJ#Yzt=cS=Z3X|(>Z~4ZFnGi^T+b2`cNyiDth!qdBEz-uZ#>~jwn&LjCS6Q6 z-nFJvq2}dv!}ri*6y(7)wmJKpg`d z|2|ay>>OokQk?e>U}$qW07>m1@h7;WfqBG%3iKUgAa(FD+!K zjXv5u-lao&3ICCaVUUwwrWj~@5DwQ8Gcv^@Z9<#HwB|&9F|2V~>_=Dy8@2q70jki# zqV*|n9AJI4wGe4VGN_tKuQkx~r;0Yq^MSXi6kG%U0jOu8 zU~WNc!=x*+&b}Ai5N7lR*;$!<3Vjg1R$`5pg`3#gSX#85o-{6#SGnW}zT)6kl<&!a z<)!N?sXJuD=BNHDWK34pm~1OdtO~P1aVN7k6B}3QYRdW;=}qHpskJo)TOC-?s+^$L zQ~0qyS9kQec+#w$#cGDs>VZ{9LB=-(ik!)QnpqKP>-YejHyV$>#ayr zKv}IYl`Bi%&$$4mvQYDXG0U^?1)JwkA8={3Fy%5ae6jRuW<+MU^pyk-bSqkI9IYgg z0n!3~Z2qny?@>l#E|ij7ocMT&KIal|7SuP+8Ky7fM5^WwAiPE9TobxX@eLg-#Zepfgc#-R?x%yweST=gc=sh&SA(aOeu- ze-)q{#sE(ni6c>Wj#h)h(k<(K!kTiZI+>}TGs9tchP%e1^(GLVxKl~W&R)$ay6~+y zJjkp(swmfs+!9a=QvmZsIe8LyhMlUU_{2!s>4F7>w0y{4^VlvvV0>30yQacSq;gneqt0k&v`G$bL6?soTPPeq}rAf`bXtU2q z9ID6WLX7EDnc`ZKCsI+3sT&)72FXN2_hU-Sebu*ID~KKsLet67AvqWj!Bo--@?xS2 zl8JLF0KTHjGd=*D4q)2I=cjbN4vgh-xYuwXDN8bWnZ+XksJ5EkhWvan^X8JR>lN9C z32uyLz+d`>p*j)Bd1j$pne}M6YbI|V&=#ODo^-S&^ z?EY`6)9mS=STW;-ZH3VcN0V#He}JnY-?)IMi#uDWai(ASud(b(SfIFRP21k_trEu} zJvI8KI+bbTQ9_+75iQOA(+ajUaZIORbU6#Fw}F=Hi+0Bx0Z*q997~dnU-UA)`|r3H zv@Y4Q)N*>WAv8!y@#9aSt3m~m)y$Hd1)cJU*p3=ccTh_Ok? z^>K-amW_+ij>Y4p`8-x5MseTQjci%Rn0lAYst-)I>~yO{Uip3i3gJ?q%<`}{DhIAK zNBG)<=gNIe^q2N+KIOV|&f$Nj;NtD$FEU)WZ@pbiT-nw!Bp&)}-wv^(&jx}LMLCb( zOZnEzzE*WaFcS|7DI#lSGez$oh8SkjO|?B(jXlk9O47e#NIJU(gs1G zCaWkr9``P$5J7xSE#{ncW*$5JR1^9!>C@8^>ioiHM@qUT2{U2)*LZZGr%&U?pvmp@ z7HZyc1#E?#tpo5_R|)m}NPJT~PW=FejRHfs5q0AHhK?cMB3HcgHu}@7dg6vwKC!XY zl#Iacnua;MF2o4IBI>{!qAT`e$H0J8PIK7Rsw4|TVgE?h1iti1IuqWrSc0l=Caq+Q$E?D{Mx8<3BLW0fwG%tj%K(PCBz zohh@${+{7K0t7V-YX%Lze4Nx+0#&6-vx9@E=jLV$zEC9Ga)%h}5n~}k+iM8nEUfJ6 zJxu2g!3s|J3ZJ0+#qi_BR==(@O$!52+hn8)@AmjI)mL8VD@>Kd+#}5KZyCRCs3z(n<`t0kK{-p2guKD;!S!(b>ZG&{ zt0V08AqojGG+aa~U(zwZXF)8yc<6me#0y(Zt<7C9;}6AjH-*i42_Gxv$qvYk$CapB z{%tHmD8Mw!WEAIpN2@v?-EY#T#C&dHNfz|U?yRF!oFoncA*z8KbF@@C9gx_>#bQbA zOhuBA=d{KY@!2ad!6+yZWMB^AS{BGs%h;Qn^FHEQ5YUhI1uJE8Non(*g z2@M!H=7AeYZZq|Oj6&y}vB;*1Mmuk@WPw(6(r@-f=YhPO{B2XOb{tQnnCj9q1{%>K z8-(TZ3smNWsWd8GukYPLT;)vwbRB%ZP&5J(NblfL<*QA5<199u^ZUa?*F!FR53l>d z63$u@JFE{i%UN_q#5~mbM&u=LCi2O17~v$$rdx~TAJb?FO|RQrx*Z0NWA{>}U;#)x z1Tx7!u1tkkgZjye8-(@ur0_`JI5Ar*9k-yqVO8L+Iz=nKQwTx}9maWD;>+zE@EU%R z6Ps>6^IG^)w?qK0LA4|-z2Iu0SC*}QWL>u1bdp7QS_>6KAdz@Oxp)-}44R898m3Sj zuf80;^IO*ic2UUqPlET6TfT70*xx^Ax$dpK%?NLJu~%du>~*DLpF& zqE`_QpxQ73TwMuE>$8*Mwp=g4&76eM=ytc~ZMg!>@$8li1aSnW>U*#J_niSRn#C-S zad^ZL?W~6(qUf#AL4is;yp8~hMA(e}Tw&CnzRdR#8r#_qvVs@3)g)5>g0Eu-%^!LP zMEaY$`Hb+pn3|dzF#cEOQoaA=;gz9($1AZ>v0F4pv-QlA`&TwWb>qK2`*!OenTWG7 z4t=9_N%mQV*6`+6t_1n0GiK^T5?S>#KADb&<9JDEP*pfE%j`BDBhBz~OFQG=xQ>1ocORSXFP5_MCgM%)ny;+KCl5ACgo8PC z9jw+nWcu`}rP`zezjKgFcHxh)M$VW?k9bKE1iXqB2KZjj`R>pkNRBYqclWE#x2Ok= zM7X9j5H%YZ`#mgS9`R)VC%_Md*j^7ojD32<(h17iLYnS3uEPL?$u|u1trkjR& zL2p087*DM82OCx_D1I=ClASj^(tm%*hc+IIkGJ($tn=C+jVsF4P_I}%Lwf7OhGn^+ zM4O|fe#3tGY*2aN-liHBO6j;{cS zAWxk^!?1k!_Uj(Ayrww0iZPgkTALK7{Yw#hOP%D_w*GcrHd^_bvIPJ$1_n{QP>bJQ zLzXvp_tau$th!26=N<;c@#qgEdbTv0f6XB{DzBFTGXQu;ceP|~H0P>MqIvaO%H1eo zQL+#8m@{&vIg1bE2E^^K0MG9mTUz-x`l|T)2t2k6+c@X1W2$Yb6{jZ^+MM5NX!?Kn z+2N<=$oK4xQ;v^1Rnc{%(k?A>B|-pNbGN8~Iez_+r)4Z8EZxs%n`8Luh-Hj0yK68% zPbXvV==dsOpJCvikEukVH(d%g-VX6JdC^P@DE_ki2u6E(iGJ5Oif)JEr#mS!1>(aSMf zkh9`|Ro!fGE7{i`z(@EGpzr>|BcUf$wVjwr?;s$IhU<%^gjs3JA?0#C*fR@0*JZ%t z;}MuX=Zq?R!jpu?InE9ZE42KPUCU!N^0Gc$LvZxqDN}E#o8G^n5duTCQTn7a?*$OC zhuC`^OpV>sWb`I$pyTFH=9u5?f+9Vu*+^=Y;v*Voun))&4C3p}s7GfQRdgw?L`r6f zC~tZk@|bgy5e&Ee{rnG*kv{*hbY}q;h}>6HtIj(!Z0^nWTtNb)x7>aDU_38_jkd`9 zDJZXz8+?_Xb9e^TCfjRUmd!(L)fuMv4S-c@vQtoeDAV_=&EvxItlwq0tw-yPbaEzW z+gj>R8fHq*A_A}1o~anU%mpP$DW7XcY;NWb9@}KQq6i`KllP8Z_Zms>|8cO4G;8ZI-a`Pk2ao7j1r7cx#+|qJylB zL}K~(hGq(%Id#w2L)OP8gO_ZKRE#nLJx|qWPzRUNg%xszpQye~rHQ$)!c8I%sf95(A~4y`r%{-bPs__hdZ|=CwXTQ4bMk9@Q%-EMXkQ{7E38zWH%2{; z?ZPoShnxSIB|^h|d~8TtRheZ@{~`XWKEz~OzM>KaobC6fEg`)NHoh$PTs@p$XT+v% z=9?qOOf%s+%qdKyGL^|dxxA}ZYKFYqejC8k3qBd>j(%1W<5l|9w0}^V4EIwsmr1;W7?$z zYT?cg0iFu_AQZ$t5GeJaG?e_bCK_)5tS4$}}TJ*a3(D+-$YGjVxnY>{n z;o&P8zDj^Jmb8{OPGM174U_%7j1un^b2sjNpB6;8V(n|wU_*|n6)PY)K9}gxikMBK z33~D+zQ=}L-Yj00$#A7PS+TblwxSPYEdqpY+ccX^qGt;W00dI(YttK1ikH%{MR`Q) zs8qF757+vWV4Q-QZUx(+n%7khY$caKV@YGqFa3sP^2OhhUiPuuv&Lz!*Z1m5R~J6q z4%xzQf7geA#HIuPD`8er{%>y1!~4XP{Qi)Gj=~S}L6z=8J0Ws86m{kM1)}C+gio)a>@ZJR2;; z&BF9<7TQJ;KHsa!r294n>5HDaN?oe8*!}i4LE5r}#c|B%r*r)^am}+pMU{)S(L#jR z*s^%k&#T-)`xiSAFw!hB@Di*in!2L@Z z4+=gC^pnqKHG*%?>fR~wxrXp)u_gXA#Po2dIQ$sr2jzTxvN99Tkktp~sv+3oWOlF* z5o5D7GVEGO-+gBokY=V0^8|O1(f$633;D)cs%%4(RRA|cl`39XA@gQujY2!Wl1wEb zMRPD2_NQzVAr`@4j)>?Z~XgVb#^X&fz%W<_w zYt?h(N`j?lbG9qgOQ!ca1C6ZK+(%3ww(ZX-z{5S#e2+r6L^mIPaWMNS^D6E7vjQ5f zxPq%Lf_T1ouk6cN>yZ86i&oXg@}ace(JAq)r;Qe;$=G%-GC=2U6M05i(eIH|P2YsK z){?235m+f6{~WR574AnA)D_HHIpLj%75N;iwG;)hx3jX% zg!gF9J&y-xOs)Ht`qe%w?Dq_^uI=W2k9tH_`I&nVUF>bv2s<7gv(o8F+C)yyCAA~% zfTEdl469lZo{CK3ParZByu|==aNvgAgs1))Y66%Ox)qyxdk9o~YLRq2ywCoO$HK}F z4>VKGHKdl-$J+ND{m?%GD@z}r*Q9=cB@$IbgH)~MkHWeZ*1H;JW1^wJU)NW?e^uYt zKUdwDO0%90w2UZsPY8>%a>jzIS&TdE*&OK0TRPSq2U4CDhqjGNd)=qDuBVNyIab`s zHHV7{jVCLH1y<88Coo`2wD30G2m1f5ZhZTQukVQ2e7AVC?96I9H8{*U z$sEz#XXfxxQyFOANS{~Q7av9E;y{!|8MxBl{YRxoks_D_@<_j7Y zzK+|jym$SHdo2?^f5&bS^^cd#WCT=$vOh$XS>;qShkg;UOQDWK5ua=T?kml_B}**% zGl%%K>OAinA+Mi027BPz*JSnbGOb~fP$GU~qVf-KA0UZ;aE?ZD=!Lm_4HU2E5Xngz zU1NGnASjjPTkk=mI$l`MO!PDjCH~l?QIf2qja=fMC$0X~ke`(0n}TvanXhO<-*Lif z>Ubq+2Zd}P4~i4zY=2j=%0~|;AjlRO+Wi}0L14GwRysbBPLig=-5e`Ul=?*Wn)PRG zGuQK3_oYgFlg?~YA#VR)>29wlx;=e_xAmR@7tjfM+A=55T2D7fy758v6t^uX^51L^}mqhsV!}N{PD@4s# zuwvoq0OQ6SgZ?Uf&RCt?{3#`8F67ZEI-k$_eoF&&@W^QvIacH0nWqA8gXYEVglU9j zPF4Z1d)Q|hB^PF6GHab*Z*H@g+Rrkn+Bp!ph0qGPw;60xz)PR?Kr6!dU2Hr)8Rv`7 z-L)ybDy*2^M>l z^-j3XzY=Ts2Y}y^y@vi*Y6-qZ^)_4^Af_a`A84HG>}K$ddsPxKhn-+-LJ?DQa_WMTR89~ zL@6jbI4(xwr}`WoBP+R7gLP(*t}IPaf$0Fj?@dOI{*f1i^V<`Tt@ z;5*IVa}um0eEg!u8_1Eg-S+y$q8x0C{kai1cEzsfkgXLt;H;pObZyM@AnucSha;G< z2L&ZWVv56`llQibqo6t!`obTSGS%1PV>($#Pi}vjy?TPoa7vrnOnK(ao5}V@xXRI< z=k6sP-^5y_Ei$Yf*S^%|IFRbcS5ku03_f#6ekI6`nGILEUmh>R$(PC53YrAB!>>D! zlD6PeIiYu7atj9R^RZT~w6xM~GsBMIXua<2%~Yl0vN=2F&*w!V=U&{tl-z&UytJ%m zR|-xu&(X~TWlnjfLt7C94i?R3W{z}jr`D#g-teOO`Ja7=Q}4VH-`pn$Kj|sKci?=R zDiz8*QF@C%Qt>wMpmVg>z3ZJu{du93*G-qWT-YBakiv4&|O zE3nQNEH7m%`QC}O)5`FsbBLMYWH^N~WFEkNA+Aa!zMr5JT+im_hW=z=`ZnAsOm>GNg@n1;KF0!$Td`c#V&d_A{LHrc*A91GJvwpm zo(ghD9-6c<{6YHfG$W;zi;GQ%cb#4}9bFTkN-6Zk1Kx69O%wF^BhNSWOSw&No>Dtg zEpmxqzETTol37o%12ufauIQhV6H5ycCT;wh`MI=%b?7pq32~*M5)f}Zs4@*woCA)2 zXeJNAZE#Ul2qf;1S6^xP`8oKd&TJ~G;r!grJ6YHEJ7-x5zuw^0;pG2Dws%>i({}g{ z7xjNKUuikQ`}mI8f0M}*?ZUtb#wSTaJdZUI;fa$zC<>%)8|6t5cigs6Yv}w%ehhXu=OSrqtxfm6A+GlcATcWPU@QKU`{8JM zxe3QQ{;R|Xe*>No6NV+_fG8NgC`9=C_oA~UvohZFA9=U_brdcE|BUUl;`bwAm&A>C zg2n^C^Nka+ftSF(63P*jU3+YNmV*;$+DAu$)m6lUn=~a5y*M)Bp2ah;`p;kO3J^(WXQ?U| z;KQlvFx_#?-McZ$p>r&*@n(4{TA9_J*&WU(^{`mc~^32 z`~=WU+&acnHk?P{XMUG{e5Rv7{#ABXMZWN^HH#xKvo2J&?_n|mPeIn({DGE z0`2xCxa8$rf=&imd5W3ZvG;qkEygF$v|4#*?XH@3(5&YLq6LSP905Yjb@XFcySJnb zF_TRCre>Jo-1`YM8G+v$Ffy(?D(?Ct z%tkP1Ba?wPUZdxBsZCsPm}XY7I`*m1Kvp~TCxtl6O|Xie5xG7A;wM~{Rk0HET+<G-$oLw*B(eaMaG8@;*zsA??}VQFq*mFH>^yT$U%uP5?_!fY17EVDmYM@bMD!L`bxKB zAMP9rUv(~ppULjq{Oxjy%ub$>Qbo1W{H}XK4f_{Pq>H|3d$)H9-vMQ22LT!0t_7=n zLc;HV)@>iAGFw&2z9omLuSCS+z4tOCw)6g-eCAc4SS-akcqFsV{gOhmZ+nn!l4=K& zRrT^b`eUCig9?nB#DD(5Qw&8%(l&#_q%=ha|8#q2m(U}QdMK|x58#ik?S|}<@B_+P z#oZr~K;abGJXTx@%rKhggLmx01p9fNLa<*ksL{D#r6K+qQ*A(nFX6~X@1iFgolSD; zqm}6P>lMO)*x^sb;=H$IjZN0%J?U!Kx{5inWS2-pl=xyU^ z>8bc)Txxiu5JY+7<*@T?IX&&_zN~JKr?BQFRcpPlDF3E4VLw=d?^k?xLlN~ z%*Ix`R_~x0x!jFvLgUG$bV>1J$>owT@@wuM^7g>d`drZ#DSd7|EY6{SK^kYr_TllE z#)VnX-tV}Z06~?Yj$PnBrrRGtkX*o_KRCOpP zBsXUt*`8-m2FztL_=~%1*Xg~;Op;aw(&rP>tp_T}8KjJ5lAHqbcRT-PIv^X{I z`r9^?+O8Odyb6@zFM%~^Yr+GPO~H2}Ip>Y2c6x(iK(PLnHR@`*FWWg`*%q^&m$&uO zZ4(chOK@Xz?esxF(s>zsobh-#xXnI){xymm$wke}{>Sh~L&`*fMJpPL2Z_)FK);n_ zDS0k1MHHO<^zjTiy+>-v<(8UA?9lU?Xs~bsQ;s%=(~djo(;DggW>Rjz_y7Gk;L!ZL z!B8rWDVH~p)X>0!B(Ib-T(-FTLau+0>{2*0=lvG_J45C^_MR z9Z@Kr^74u1-Q-7&oU%SsIZdY(QJ_#3&YvKa-wSHaZ-jL>ML_j61F@R7heZpu;}tyt zQO0Fw?Jw3kr532{piE_7R1@8>C^s^8G9}9kxq#)zZM(lTq4n);UMJ`9X;t~Hk<@$k zSFR3gU{!k__mqUTIcisPidnQ=&lSjPatmy!YP=ME@fM9-j(wNs-Er5svWQoyBv%|i zUU5fg3zB0eml@l5xp_7JnuyOU=crcDX79FBXrTOzFOt)>_Ws!Mi z$*sPRD_B#fFW>$L*fx95X%VWYibU4pd#`MLnQw?Y13ka?pahG@7(Ma@d;XOgorgfr zdojOLDc&6?r@R>+&WV9Da{95lQ**eA-9wPYPd_@ZDafVJ^s^&^69^I+H}MLP{WMJx za_->|E!&iOmbBj5Z>80Ak*Yeh|LLBLtQ322iB#C8fX}c9(6Dr)p-!bD1^IS zmD%DoSa+FO6OP~tL%hy0cnEUc4H=l*nidlEB4!Kf&htz~zy~^(f81{an_J%2WV~0} zVMt79^o($#yp=w%TtS9S1jxWD2rO|kYMzVwLUg1v`9yXxggCF0_%Uq-^|Rr0(eXQ4 zh96Wfo`!RM*%)OjXQvT-A z8`P9fxVtR#ZlvkQauTack@*Q@fMDzJt4HZH0^}UyGs0ZrVYCn$wo1-j~ z_rELyQ3kT7rH3~RmFkH#^O;a~iHgLn;j%mx@5skeE?c2S>R3>@>pZNMxhQj-oALzK z2y=~tA;?ePJ88+KwRft+O3TKb9uYroKPoyvm6a{>S^dNg(<6!|e$U@?enALJe&t@{ z^Buo#np*}X-FGNS#W==Za8Hqb=k6}=4*c4Tcp>Own5Qg!=ELnLTlfa~#~Q>;HI3$7 ztmFfOmvmXy39F8rs1Nf@-ByEej6VcD|43qbVEI=6-FP#`E%Yyy5FR%Wb9|U#NFK& zn&<)+tb$?7cH!@RV#2eNs*g=i&m25NrRCx(!Y3Tjo11P<%GEq+cCx?xMT3y_rE2ERh#) zo9>4s@7mZ~a~u?U*_C>w1bO$7ohbAd-p3m?Z!|+XpxTjxp!=AhR#{B*%8b;vqJQ<* z-?05>G2P?_P6f*XQ$y3L{`u?#A8+eew?0*g3!N|@vdDG7G1qVND|g%mMvX4M^Bg$X$vvidRZZ7%By!8 z5@|QrBe|G!j}#C)nhrtiP%2@d;>89^kEIsU1$JR=L-WfS%Wnj285AJ#mlqkz*{nBv z)%V(%+xl{SN)=S{c~2!hD?W!X?_-{!YjdEuINqShpz74heV?4WA2%WO*;;~?WAgHo zf$lbtUNN^8M=)^wW9y&TN;lsYdc8IjmWW{7Z6!gjBF1aDoF;GDv}iOJPr>f^0!6(; z?6X5okACR!l?HD(Fa6?GJgSXRL{(lz9D4dT*VxMCo1%Z+D|YyFO)f**%|Rs#89aZd zY4AN4#P?&R5y?BF^yAd%_Yu=;X`D4?53{+O?f69ZW)omxxB95Hrw3c11cvhyb25-VJPOkfgaQ({2($GZPW#QkrO6p(M{`G42skkgFjH4<$-F{79+G zv}WO;guH;EAcM{i3Q%Yt=^5dM^lxPTqoK@E2tFbR`p{MV@~RTsXMHH8ct?>QM)V_#VlMTTs(TT0k}xgK{d+NG?F1Ss(L)k6&25bE7j?v)iNZUIzP-Xn%MRJY2K>XcfF!@bZ;}tk&^eed>>bqPa}8bmHjH_ zR`V`xYV|20wcE6v#`{R22Hg9@r)196XPYcKyjijrKXxE_5;MScGD{Bdr2^=eGjh)6=+r6QDWL2HL$qMzhszibejjDa3w-P9*u%5~D zBY7S4QH9==sV7$o47FJRMG#@n07j!$kwY5?#Gy&w*+*C|AXlfg8`7%_xPp)m3N*rR zG=%n|lQ@SKHgIeBQdO&+GP2$!Au>-YOyIY05zJEuFXCkiNS<|vEG-%!>5Y-5>4=G- z+{=dQ3zUF2ji{Fdz3Y$xuejZxTG=5yd@CL|wVGzPAqAK$46CsbJJP!`*_Ek4C!Ig@ z790RrDUW3;vHUh1SKWduv5DF_b4@Whh~dOZBXL7`jj1Rp(Z-ort%q$!Bf^BS8!aVU zZCV8(eR*J{ObMOpmHU0j;Ara*U;!hR)Hio%3zHG$LqlvIS|Vy9+fsMqHF0#<*S89U zQUM|+lH)@Ztc-+|CMv?+xNnU`QX|HvTa8V{4F-EaP$EY`66N>cCK~Eg7QtEbu*_Y;ldnGq5K*wIumcuMK!6<87ev2AKE-&~&9^Xd45-{$jJw zvt~YrZcVvJQUXMiu|31`J~Z91Lb{{~?GdP%;7;_7$@j@ppbeBXnB+M9Dcy!W)?2bi ztfUF^BD2W^*==q%lk0K(`>I+}5dfJ?^X?T9lfJJJ@u`iZMzwFkJdYohQUKScHZ$BO zzny5k2hp6A$o0PurAa4W7z7FSovTgS{{WMzdqCWXof@rG_t#CfTy2r0Pb)-(6U%M>V=H(Qzx; zKp^o0j{AJ-=EC%?K+ehS9leL=N#}Y&J!6SZfS5c^(&Cf6)S;-`uFd43wb`^*kY&PwCx4#xJxpL%%rwjR zY^az800`Ls01B>V$=ApzZAv4!Q8o*fg~3ag8k=6@OmL}I6KGTPgkQ?|E7q3odN@_u z4ZE$RN}3@-Qm*h~ty9rM*uDpDSBom)P9srm*A)bbuU$A{U!(H-X;M_Qsl}zWAJrlc z)~s+0bym3>4ZJL>;eA*fV2Ie#B&t+Zw;PBDdG>b4knwiNvZqjF0Os{r=1|Z09?Nd+ zxCR1cL0q={^P`)r+nBGe!t(HSr;tG)CsCRq%3Unyt4sHo#xREOQpg2i*7P`#Hzg;W z#Vgy4pC}3Ac|K_|A9I*-%!n#Dw@4MC7xZ;T75(weU*H777Wz5n; z&tPe`>r}9!mtjMnszDqD1oVZFY_NqtcV_W#2)tTZZ72aNWU2|02H<^arK5*peVh_i zC@=jB2YOM=*jofE7jdO2Au2#wJPh~ufmC<>Ic89Wqx6%G`ot9yV5^L8M;SAq$MfL6 zU4U_7-NM&Xa^g^>nSh{48*g882ib2J!L40>?#|}jB1DU2Ej+js$mdaM_~2U7X`?OM z5zn{yqxZ*Ct5T!Y1jrQB%b#dF+#3(Ew06Z8K8}vBQpu7wsw_*P%udyAXjY(}N=ZrK zJP(Caz0t-oYTmPKTt|9HKU%G`gS2&Fv8oye?J5nyd-PHU^Q0^Up9mbPTR&+A9dRzZ zg%1jho!a15tjJJA(sGCQ0r*fj66+aHin2si))Y`3Wq!kwkfFs1!%Pf~;Ruw*n zou}F>2wDI}67ruQBn0r|=SBDzPnL}-D1QNY=abt|2{Ym*X-AOq3K04f^{{x2yK?~3 zcMZzcc8;v5BrMu3LI&~-R%fd;M?{}AZ0T>OB<7s4Z)5(ixoVK6o|S?CBY&*|Vwh5{ zRF{|uNJ2`RY!X0{Onhj^JKD6~PHx@pGNoo%5}8*H=q)s4GXR<7y< zX*_H0Xmq=R-6bP^37-ztD;oT%9WPa1^0GrS7Q@BPFtFM}Ss|bR906qn{7riO5gH1> zEs&Wp!(l|Wc1TgQeb^mq3^^0)OAPNrnZrKe*iE^$wNr1sq$g51CL`lamM(1krnQfHRxKUxxE3O!-$saS?CyN_3KPD#f?!7d^hL#$7gh;bGGeNn zu_@F-hSh6zatw}qDyj0IARUhyTj+FAA5syq<6GK!GXsTHEv1#8TBS1DiB9oKXeYs7 zmw{IZ6)l%ytE3>u5nj`E1ollzB4sa3u1`gIpT@~wO5r-~zL)P*zKnAsK zkZ#gs{{Uc9ar}j4_?-)gUL^)e9u-i#gt%m?DysJqMd2wgbxGr^zO}P+V{AV9^pwW{ zDemmfmjMlv$!tkj+rEr&jK^tc(nnjVKx~xrpqw`23%E!^71kt}g>a+16?konBTf{T z)|gU4TamyT8AkdW38=al*%LPP?k7t{Xb_$|#dKy+#Cr@bN#E;8oEX_oBZZQ!0LN>L3ZCAiC$+Gi z1G|Cvid$IpyO-_`rQfjF)Fdfjet1-;`d-Uctje)VWe5kd;4?gav@0CGg}jjt)Cf={ zfJD}tkQUPSfe=XWV}z`6JAM^Gn7V$pwzhE%S-QQWvAl>A@~1}( zo9JA#MJ8*{I9?lS^UHKP^1#$dS8?CqDLsy6D*&%YV%6s(WcFvj@v6M<(*`Mw1)|># zaexo5LWw_^rM2#Q%q{8xD?&JeTCS91wQ^#;!B!^Ai)m`Mv2Rfy@_+&b2|a~o3!AtC z*^~ppwE^*}>rBC!ad(PQbQ?tWihxL>tRBwn1uF9WrRv;8V2yca9r@T-)#rEWnB zpDMXWfa5cuvbJQv{TZU0lIegTB>s8RKP}?6*X)sQ7E-PRq^Hig&o1VC8ML&EYd2B| z04c+&61uoJaC+Uetj6f_-k13P9eao}nJqF@BZqZ61e)QQb1rP_)wNd*C9>d!s09-|N#Z^PRI67Ik|4&T8}JY&tXq>}XQ!K0TxG{vDFrRK9GKlO zVud<1y-q2Va2!4T2yfEX9B}s`Blf!GaRBnf;URpqjQj8@SNk#vN-N#$L0vQL=8+?pCHd8rC40iVeKE%$Z*K zS2nlqVpfU;CB>v2k1F|wHik2`{j2zyw6Mgjy(yOjY_%g!$Ii6iX?q2+X3^WX7Z0fp zTRaA!B~YQ~6YZ-?!&Dw&nbe@Mj<8aNHd2erbt8312~-aWCTP2)u*2OOTix0yEwx^@ zv@Iq<1rtg8=TOdPTWvel`bq#P0y{}hXK!Gl+_j7wo`tbncS4rDI}<{}Rknnv6vve- zds3!W)mws|jvY%_hA4)H`XMRh>jFLknYP%a-WY@yZro;EQT50G7(P_6==HY|i8kv9 z3SHH^ZwcU$p-K9RCcb{@+myEQ$N(ThM~Rwr9f`{xLTpE*B)ZXR>dwy*Xq1oT424M` z1HBH|;aM^KSXy6Y#2_f9U9@>k5MXMJ{6$u&u&pTrc$ppw2EN=dy9x}-c3>Qt@B1zdZneRa{hmN?_sW&7-@>tyOI zwgBvq2$A0gjjiyDmhVw1C_Q3#j{*4C%Rm@Rri+OlnCQh@KpO3aP}e7j1EY~g_0 z+U0aQ(bS^2BfEN!7qfJUN{ zr=;`aT`h}QG=&${a_MEXp$&&sBo8V>D==UeR_|N3l=a+-G ze;T*7!?D~Qu$z=zi841Q>rNTCyLQ(3ly+PZ%&8J+aqQc7Z*=QDL049-KB=ogcZsa* zE=Qi!TVa^8>a3Y=?Q9ExKJgACdGV?x&7cs)`Z*@B*>CYH84DH5yNfS7h%*mK#&B3OOoJZS{T;2<@O#Dve{Yz z;}m&0L71+_IVP;;%eoi2 zy9dND#{g%mag~#$K{LON0ADeQB(6|{{myj6#BfZ^g%SeS8;z<1&*FA=Zm$q+Oz7gU z4QNzFz?a8yOZx``S7@{15Nd(k$n&a54Xh#=ZQBXdePF&d6A{3(1|Hg$ z04N+Ib5%h3Df(rz#H_kM$AgYG<0jQoQ5+;!8dp>FkNR-r9Ba}TP-oGVtx?LkV!2ws znmQVPi!!pZvap(rtgNi4Lo1_x%h+Q#xo;bB>!EHDbdd+2V!6t?hwPDp*kYMm9$n&; zl_K#0BpCflZail$W%*yYHo-1Fzp{Tjw074SqGvB{0=+qHS*=1>uBfYf9A+czo$;jN4|+UCm`4j*yTvC18DMzYysu4ycAKE*x6SoyQo1@ssVS%;Q)1 zfG#j2gX&{XO-=8-J79Tn6SBbXwtKw8f@V? zgDf@>pG>to%qloX`BDzsql?QX3-@<6?VximZStcGnP-48rC0ZAT7tbs#-RePnK(LI zD`VJ2+v#fAHt%-?fJ~qArnVc5xLHbV>{J2>^;5MY@{V@P7-L9o)zmbtiAotD#}4lb zapkQ0gFKdixEhG{beXJqQ%rOicY{9mAz>bW%eJhcZ(QD+_catGEpr?X4{4%&+mmsU=_+Ny6hx^fga|z8UyJ0tX=q!4 zyMUC*0W&^70xPc`dO6RI$oYpYU~Lfn%P4HDPTLt);(@Ldiz~IcVt^9{HE$c$tC?~4 z?pEEy?b~T2p1p8KvaIYdj0+3v3T|0(eT>}4A$J=jNw>ifzjyByr~HY(tAqZmz^iEEX{bkhaI$9Eyc`?nbSF%;Z5Q=;8vBy&3vORR%~F?Wh)3?{s9+L~O6fT0K7Lfy0)jad^h;Z5Tqye$O{<5q=T zO4NG~G&k&?{{RZxg67*BJRyuf7PMK!+mf5N5)@V3C&CZDu5qkS2gG`}5b7;2n}FNs zJ8jMneSE^0v|Y%$%p%_rvP>u`pa~>=wxiqh2I}I7Sz|80n6rv*7->%0w(xm(3NtW? zk7+b@g<)vA$r;`5p?2ZK+n~1`R+V;$9@>?NXS^QQ3UR!-Y#VXFK+v5j2Uy@a?KN|d z^1br%CN1fWtu8-o>Vgjts0tE0$*cC&@>9vf@ImNx^eMYEB&k}h-E5U{1uhTcO>9R4 zW!4LbfTR}*o-iZvG@0mqrL%E|w(-!k-?+$aTu4$BesND1b#QZ$WyGBS0BQIbN}*Ra%1S4JJCXCQ7FamN(dqQr zqdD?v#PSXE+KU&dNeYf00+e~;#}dIYb{TfzP^NYu>_G$Zu9j9KYQsmabqIqbllktX z{{Tt&g@!MPHkL|V0RSmOz{b_V#|J4httq6E71yaN$+r$VRSmq8x#Pd_sF?3bcph2H zxO>h#tBaz^NNIsEbrZjJ19a7#?J%q@%p$_!OSsmOpgmCsed#A}j$b`-r7G4{`ic`> z{CFP3*^XYJEHY{bP2im(F`DdLMY}KE;&*?^m@cGgZ7SI59EhGY#KiCiFq}IH!>vf_ zZAP`JKdj;6Pr8;}0%hB)i`y4eq%=D9C@hI7Qd(M!a^)V;O{`xqCA$?{rJ@vC)wt$C zF+SSmYw9skM=vI)CTZ@MMHYO)F$?$JERxVpl;|D%!;UYm)>A15a(xinTelpkhKSklLh zeX;2-%MWe4by_%EXla(nAfEnJY{n#S?uDqgfWFSHQxzceC1Z9};Jt9EN|h&0$@tfO zE9lI~cD*cN>Rcwx>GL0rZ@SO6SinF_PBf(R5Nmom5wU1?Zq^T#c)jSXVQmMPy4-(B zG7S|n;?gv+i`qJ_(wvU{H3@weU1L`+UNd%p+sf3Gs2KviFD+cM5Av4GouLGMYuV{F z%mpIJ7NJFhqC&PbG%?8^Q_#*Jt~V|1-?duU^m~b54Jq!mms2oO40~!Vk4-LXNOHzR z$thi0o|qZBM^>v9p|zM%ku_9WZS;G!u*5YN5YuXp>w!jCcS&}*Q!LxxTR5A9r+6|C zwyA7!Tqfa=;!V*?xM>2sxs`3Rb=n21t}x;OlIaFVvaO)*`xtmnOSnpw0Yj196h_BL zcrGRz23b*51*~wTwj0pfi6D!_&yk{hJEAL;6#oD(NduG`2gymr4qO1*Eu^@Mz_51* zNun!k4Bg&`8hj{`G`hm@JVP$w%_Wx`eF;0IQYgR+m0~N2{WW9)=ZIO;L{no zdoSIz;!j&lwrw7F4@y*fU~H;YVVU`xXF^=QfN-vp)z^5tBtv6bB$amjR0 z=DP>mN`bdhmEIzjmv`#2d3|-df>eABKC=srdK|coZK!Oa%9eP}1!sJfEIv>_vsy6E zie`MVr(&NO%{YCtfht0hc?p4V;c+%4u=x*ip zl9$NyAI7>duFTJnGZj_`h+Io=w8p+lh?=LxGK+7L8osvDp&gpL#JVE9w{*+o1n|;7 zjc86!#c;+~+cyYEm?LpbDM?td#5y{~67u@H;NoXsnW~Gfjq#ThC2CLxH=1BMnXW7@ z6*zl=#2w{d!mNMVJ5IEHCe6!rAZ}z3Xf}nrk#C3PTz3spSJtSZKdNRbULlNJVe1XM zX>hf7q-{m+bdh7YLTAlY7Vo4SG1gRtTBUlpokD~(>{WE7om#r+&oS7!V5Z!1(Md~$ z4Y*esS7~&=b%tMbcbOM%pvr}!id#{VcyO*Qu12$oBcZ1FvnwkrD*>#^%F4=wGP=9$ zafUH}l`{c+ohiLYfJmRa70NZ%e`5;=uClgaS|94$7l=-d^Pp3({KVz>4_k}}0$~MC zp$Hu0njN_R09GwhvDKH>PQfQ?DSsljdZJ!+)uf%rSx{W)+Q|+_ShNK0brHh46k^6XX0)4T8f*?hA6mb>%b9x(NH-ViQT~Dy37x2YSC$rUo}sey zDLs(yKXpy4JF@=IJ7U+4gfnQD6h_1Yw)Ah7)0r^^2V6re@BG@QRBmVAK-hOkD#P1S z7_qiSp|;0rB*FSjxYnhn)>c7{DkFY0aZF6m!o)I-#wOA_%hy{-fJ0lE3!Xe^D0o+NGaH1rLkh1}tTVN9dZ@RFs01;V(Uyu0eY9Myiy?bw@2?0lb6G0XT!PpMFh`O?MLR)DYM}0z4VKt_BUNGry-o^Eq zGDLInsW^iet-=zkBqgPt$#n1I!^~7`4DFZj>tKchjfC+DM(1vIGT)?}3?@{!5_asC z&%TK;cE6&E<09kus?VfcrQyjXMm>VAFrJFBaM(&!Zjr_m zMuR)l>`xiT-C-)QvseU5l(>+08xLu#t0Qd|7+y!a!JG7phZsNr?p+dKa;Hy5cUUV8 zw&msG7W4oT1cAJdg>%h@5t%Qvy?1W=t1}vp1H}C4hm~+#QrQ5TH)cl-={X>zhGU&R zPP@zbj}KE|v2c)q%00hIA@r+zyHz-cQdW;GMbmQu`UTZ3$3GNmUy9?_!Nyx)sR=46Q|U^!F&(JiYS(elZeq5O?iBK%Y+CBv zjvREVpjqBsJhG)ay>9Ha9j18It)@ADY_ybJJO{11&p-07J)hL2izA9hrNQa(ls7lY zOMlTV=nxsdX=IoO4_te~kAHOuWBnXv7SiGvLudkfZigEl^(03MbJ%CBX4S<8uH8wH zNobH_An+ostU5@=5P+M9pLoEOsb&d)H<_&e0J=%|G=AL#arP(CzGSsoUWV@Da+V(p zKJC6011e#+7@i>GEh*G!KYZSzCwlAL_nHnll<^mZt5(-7G#1+1N_7LO37DP+x!);a ztHN=UcA)^th3*z6yWX8QtZ5_9>v8^>(;;CwgCEOxtA5uFQ*1Kf065;Xr(z;~qL~?M z?JVhkt*w)KmmE^KBYn+vC7y7>aZ5*T zZ7~~rkO@c)xC!i;;r;K0bNj5?JkOyU+lASwW*B`Wq{4LxPXaa-rrR!9HnQ!t+g8P3 z7)wPyuqHMTInX~w%$?bPxMG?fIF==PkmkiLc89PXTz$0$@Qa46(j__^ciu=pN(8XR z@f;JYLh;6~EkFP;0dO5jjluD)Sbs@)mELJ@FI`!(xOBs)`?VEmQ61tp70lIXa%sMO z55tlfIZSP^ga92|g(5-!00{glCrEkD+Xu|~I_(aZUq@?k%Sr+HRXbRV_cq|J+1B(X zN< zLRJpm_%*&$QH?}QH4w_(O4wnQaE9CZR^Fk z(QZ^b_C-U!!~*gB6%DzhHngOao@Plu8ky1_Vs8hsyHew-Wu)py^yDM~?V9r%r1IrS z8>XC62YO7(7J26W+UZZYlqIBTC?XXtpqZLoU1ZiUtCicZx(7y9qNaW9U`(W-VboNnso2H0#sFZ}QHNMNH zTjtiHyEYvk(FBSmcO#=d*t2k}rCK2*!a^jUjYR(dVePZCcjbNMXpgOGN%#>ayp`YW zn&C?S0M*Tj;R`jro|F}dEi7DFfR%De_o;)SI7m`&f$s%1={*m*XcYT*Xi}T)0C|q; zI+01m9}X>Q=ukGx8|-!0#q>*Sj)8b?)Q-2c0TrcKE$)C)83(|h!mRE3M7PWK=&-o9 zaNISrwC*ZX@>^;2MsJ}jMuE|MvSV#X+NL9+w4MDbeU-T#ELjBwDYsId;F+lj>3+m0 z4GzbZP792rh;QWkoVwd>w&EOU^Hl9p@O%5*2Itb2mfdM1bS7lfrF4md<6*mZ3ykVN z&P2sq8$2oGXhqtb1VEPJYMnj;PEWE$pG)j%gs?%PJUgZvMQ8@uNj&5o>2q(F zY*`2j(vYZ{VPxzd7Qow4TYY13IuesRQs*0741|B!aF9!r+@BY*`YZ$?-STYB9| z`{D_SrG{P2Ww!$Qhrt^VQB2$yI$6A=^@VM#V+#>n+^SS+gI8l6tUXs4Xt#Lk+htI8 zGn3z83N1OP9w{_Wh30EF(v&61JO>J&h`iEmij}%gF<4_K2Tat|WUS{L&M^xMg|@35 zL~a$UjSe}RQpyT$tvaPA^@_HqHg9gu@eZeCEDe-A>0gXw#a^^Twy?efR`u6}lU$tn zDqsdLo@^AdLK`EQ*FzYNe6UYsAp{=f)U46bjwr>-!zn>;h=qy)#c~EN(K3Xe?^dNk z>+IW^@vI*cWE8fRmJDk_6YZ*-T&HJ=va*}@6cxzws5e&Zh3 z?48n1#;Q-~zB~}|j*2cAe3oySb+s895_YQ9bYFfIvh@IWAqw7)-o_1)NV`{3f33h( z&KsRDyNGSulm(6v&VitmnmOO4u8*$p?vAqs+SS==(Mlsp8*N-`U!?s%V_0p^LYcuV zzJ)le1%!@d?O&S}$JQ#EI(lbuW>!{KRs&&`m6eqUWpz*3?-zFu%UJVmTPozL@dgqm zI~B^+*Z%-wJIi}arDYc~PH%%BExn1}$wjYH45}!6eZ(C7)Mp!D8CkZaOyBQ?Q`h>_Zg4Qj3l_kX1TBA}Hvs z&7U8@S+QAd#~WJbeI)Hg`BLjIVMq$OwtDIE4=?~eR0x}ANYvuiwVou+O|fm=U6DKU z<5raiR=FPdW^=+45)h!uNDz{U)3p8~tdpN`prX=V8dJFJnLA2H#yym{%lStC02E=j z11CuU6)R!P{V4AQ$hM3Y+`9Ywf$Gla?@!K(gfij0(9P2hIcSwWnAilF+i}Of4F={6 zS2A3^qRS6)nKB$)5_L%&Pl+DNW;bPTYLuZZr$8E0qyfNB$|3I>v9jm@K=vd#rzgEW*kp-SMTk|fb(o9)OY zY17Fu!@J{Lu*M^FRkN!eMA1G6`bzoc+huOJzT}fM#Kg)s$<$bV<83J@QB1%AKyyF9 z3cPPN+2OrkUguW1*|d()96q$B$+->0=zkNrc~0@_Qt6HM6TgKuuzbB@Tx^SUC~N|X zWR4$N871Ude}HF)?yeA!H=nXeP~ZFW%~yTOP1})9E2Vp zjWTdtBG5FMX(|9retfH$m8&=6x*_K_l>MVGp;DNG9v_V+v79#LZmC+&Y zs*Oi|CvSyA#8Osy4jV?5I2~taAx(TKBJJLob+7!JF zYjO_l@F!w8`BzRUnEZ>}$zq#KXAog20c^ao034OtPr!<+ZJ?7RNa0o)gBp7q#20w9 zrKcAOSwQu)jX%3p33X{810p88cc|lV%+GJ4nw}KP29mbi)R`L{z^$lJTdPt}WE1V$ zMMg!+*E&jZ6`;VcMV%h@?sOZwYG6#wd=A~OQg<7=ZfeKTILXMy!OoQ^Mcp4Vw8p$%Fpr08E zOnd^W-QcE{<4t<4l>iEVqX+9>ZjUJ+D9Gw<6VrL?qz zr5t4UEY_BnZq{tIR)sd{330`%h#-MAJ2T=PbKZ{B1SHJ(l!G4mq1(%ZoWp4H77^C4 znKQtZPvKr?*JHO7S=iA@yi@z3w{MEH+jot1$tw-%5&fWhzpYop7hzU!byq1$)?JjP za89D70UJ`+3UMmL78ZLQaY@^NfIoEB>yg$a2n3nXsRlPF{7rnDFXJ!uJbr1lIVSlU zEnOvQNl}!cODK)@)5rWZro{}Qlqtj^X0?=z#5qWoqWQ=F4JN}ST_aCaH5I$6S zG9?N}u>PFODQC9+zuYTcQ$>O;mi##4R@5wT{P3t9H)Z!TCA&75a$75ut<{xA!5awk zt=Cz$;ohN;(iTD)R;d1{CZ+YN#1tJaBpm=qJ_qou`aC}NZQn=KwX)e1#DiTB<0)(v zbp(z5ea&rq1iaRi3wcrmCGek%0=;xvqT=O4WP+o&asCzSqm3oO zzgL|l*o;zUwf@h0x&*HV9+QCG&ap_L^h zaXr&lb-=c_ay?ql_yWlW^$AyvZdP-_9Bpl)`2eUunnt04tjb6+#=R-9+!49+qOxrp zsIWrQs9iI-?8?OiWBDT%#4&4|n|o5WRC_8_MEVn;4l1$6?f^|nsLch`Ytl#SEwp-C0E=1Y8|j3H@o zSUa(qiafBrZrzr}(dsS|H$sItP{LFCpm;@5W{fo?BIPUzJ1CTjx(Q95@;+#>y|FE> z;VD~W>I#w1ZZu_Yi&%gNylh8}A~R*HiM0>3N(xLuJ2UR8J9i%mLF*lnzUnj%BT}=h zY;ijkBolPe@zqzBSf#06*Jvr`0)=vIrZs$%9ebd1m6|5PvFoIr?p6u@wF{2{RUIaP zgLA6c#JUdTB+Xg9Wpwg`t+t^a6pzc9s`AzL)|-VuJBj5_%(a*ocWlzbrO-emRvfn$ zX~)VgGW*Z6w)G`*-4xZq9#$iUs@>EXjwXh%UZUx=sHAEXWrd{;q-g*X-CV4)S_%#%ZwHMiv3wy`2z5zy-DxwV zovWh?lC)%e7ME5mtAbDf+-+2^VQqDW5R*J)QvU!L%s7Kil)*|y!*fuZ%$I61Ne9f+ zD772pVPZLE#`f5u>vr8q9MjI1c*a2(Qi|JQC8NHyjuqtQOVYiiK1wwuIg;gVr78+P z-ZeT!sJj#WIpGi4^ktab4wBKdQPVzE!gcyx(`GSYh;$L1lI@#K-HbJQT+$?+xL4+l zakY}UqpPQlMVVPySzPl`m6es12xWCY*!Kmw#j@@>)HYU;cz{oLV!2|v>+DyVoxpO2 zV{N8eaJhVfb&?4Cu};JD6PMz2O@~J4by}}pItLV|ZwR8BY^P^n$!^UFOhDBelRf_G z8fT_Vx<*O@LM@b@;FZqx(pF$-DrW|5DTAcW-co;seR{=~k`&^5 zVhBi29u-GnnXd2D16D2}vNl@GZ&7huB0Fc@@ZrsT1iSHGv8`+V7mG|=j<910tba~wXE7YFF~6nzSdWi2uXWRCv;!{t`Z z<4r#qt?LPF4%76g($B{K`F}n#0^tK32`g*~@aQG4Kt3WyjuJU{M zrK;GwyIsR^FqLQYyJReEh2V@Tsb)fzkxiw>9UkO%TbPkyg; z7Uk}ju=O|)rd)1D&_R>NxyHm5tsu#rqK`7B4y*g7(u9>dOeGP-(N_R8j-0?cO|Wrk zQd@kJ>Ww3QW1odJ^8PV%cv~!?KrjCQYBYh*>q%^fliI@8+m|C#=@X>-sM19HV4rn5 zum{5kN)j~?1oGg23g>1?4~JoOi#NjQYjEp91dTJXJCBtM=KP^^bX{?li~6P|Kt{lU z^P_w<%`R?sA5ZhCmo0UTs7~>>oneMY2WFXLQ;#PtW=w^Noog10h01^g5;YA`^rfaX zkTEBe>XmBhTM9c7!(yTFO?BR3NM%X{NKb2F$tUonUrBk17U+7;)Twt65~mZk;P3EN zcCcl65y{CNjOQH3g1Ls>mK51SibrJe+)oc__th$yjf5B^?d3(eo6^eHaPx)dk_v*q zvUd7Va<8ujvZcsK;G_f3%et`Zv{KYbN+)AOt&SLMkv783cS{YourLYl-kMoQFSlo4 zmz0oHuuPG}5J>t`e$zJG;lX-XWeYsu?k28nI$y-?6pMdGZQuw2D3Bl-;lC>6KTgXN zulm?Ya5yd!UQ4aa6{km+Wc@{Qj&>`w%(#eXDH@iS08jP6KU#TUJtX2d!|pK78dTyD zs$g%qo%w8NVOa|67|c#$ch;z3fdNb@TJ@AGZUb-OU2O&#;F^<1FIkcjgH~wDt_N_o ziliv%N_O6K5PmgzWP0QW-4LgAs(-d1{HnD!3&5_NY}!1#U<#0?kVr`jNRA!TQtz>g z8&Fw8#3i*90Hi4=uz!txj|QV0;GLf?)M>JBdsk-0(ACq(b>sk)5U_mHp!`h_<{WGE zdr1gv%G+oN9Aprw_*LWB#g(m^f^Jz-^bIN1zw?1Z;3xwyyzS%tcBLthr2zo&Nlk5r zNIxbugC*3FMD^pO_K1VqpCW5jyFtq#a6(k$Y1p1xV!agw80z8y-16u3sH|M6Pjw&; zsX<(PYtMS*)=W`~JDNN$3Q746mf~5&?^XZ^K`JB7Yy4_Oz1v0oYLJxi1WyHl^r%iC z19k}2t&|-^Zm9`W{{V>B*3;EArT((@CL_$ve5*85n@sS!m9s04(J<(ErKGG$NJ*YD zH2yUv;lw!ng(Ro%WKSLBeCnuM^{(nCNiHf>2Ot6c+TDa<{*`c$OsMHdOmUQ?QX|=l zP*LTRUa)fI<@G=-s|zA~sM5ZdnY#w~1X$(l?oG&0gWQDP;*v9ZEuGMEc24 zuUSo|RdI`{03|3|3`Zn|C-A1u3QXMj;ZO6q8|%MxvQKBueH zMs**cM-0EkE-zaimf%k0{o$j$v145Z77QkK*|A=K)VvksX;vQ3m`qegx=O%S zBwVQP{R3O=x8+>w%1{I6MMd%iV!1BP+WFKpUTFaAl&rw2D~#KTWyc(`wt87> zvI4h0(@cxD(~Q2i?3SB`r%754(@U(ylyMjFC){q;#}K7#q=^QKxFl}*G~4u}i?(}f zLdL=(BBiIK%uuWl5T7$tU+QKkks{5|IrdF^{{U5SCbm_pg!pe%IV2N*w2V?g>`hCy z=@#bk=Gwk(D`1||M${y%ClF--xoqN3cACUt*Q+4I;ic7v~AiFYQ?pn=`s(ECE0s{8xD;S(F#dWJUwbM z!SGAG64osUQ5;aC#;h!oUNV>UXsuE~>;h4%XE)W&Yt8wepu(c&gm=rIT zu{9-0SXVJ3im|(7-dP8bH9+3E+Z1I+hbuq^GmbKYx>Lu6FY%jeJZkZ0vcNn@6Esno z80wr@DV}t>#aGp>Wjd3;E_Kq!7hD;eP4ZJ_Zi`#QKJwn_u^f9eFghfCKC8iAXf%I= z<6+>YSE()z3Owkl#_20aO2E`P(>KX*60ZV5&WK;uNO>TCWY^SmM)~!w6CLnr{1Spa zK^|3}h?fL}k97yRB7P|2-?T?Z58(X==UbxU3L3-Kt_DvE{KBu=FSWIZA7;Lh77{x+ zQ-_C$uf^Kt>Rrhj@N*VrWo2b!G?`ghSx|;oQvHyv9J$LF@Iq(#Vh8vIa@BSJ0N9Td zIBr$UMF>KcZ;*Rwow~74!}ArF;yv)(hktnUN_i!gm%gQUcu}?)lJM&gm8~JyK#5TJ z)f@Td>?^h!SR6Kp{EE^3ybLC?N_K*;OfRGa$2j{xH!d!AxMycD+ z^YfsF^Ye%VF56cr3gNevPO;6)#9q?Pn}tOFsE`kJ8Whz9y+Ty50z?xUB+bKFT1aBtn(mo*o~@wV42t0*Kq){$h#Kk#R*Qw`j6>apGnxW*?RtcI8c9 zTsLSF8p_lr2F5q=6i5aKF>QBv=xx19)M5bQb{{IUYok})i;O|#j%sPO5NF5VO&lWE z1;WsjTfV~9AeEISPcHi1e*LjvtFL6MiPErk{KXRFTNm!&46>BAqypannA@M>QInSK z2`U!s#Peuv6h(4U>?JT$&JQwTeia>3Tu?|L0GW?*_|ftYMG?w)d&MbTqbnrwEsFN6 zfrEsQ<)aA#3ZQB5jx}oLBGV0a%8;YX@E!CKn0iQ8r8>=t4jumbHcrvq-$g`Cvc~rd z%2){{>wQlEA+$KDo&0>NK3mSJ!)_Agm8)!_D++}sObHxL{xrQppS!zL&Zw-YlBFJe zKMEqkZFHtglM&@cm5iz#SSL#tt?5dwJ)LD-lVKb7N5hZ~X$Fkg2muMDn~i3`=n{}l z2?0U6lpZb3=xz{^mJ(soohl7V38?R$_j%s;c+HX3!p3K{u6Ifow~N-k`D>jP(UJYY;)SphU!Cdg6^6yi+Ct#GDYz> z@W=OMa`5Q=u~PP48geI$0r2x=$vV-gKUaT?@x?RU^emCkIB(Jp%7`7fax|YP{Ddeg z1lLZM`Wf*&MsIc>m{R|^W2(D>$w9F7TR1-if#G$QZKwloOF$exStTmKuy$5KP9=5-R*n*4L0chK8dId|L$vzv6!euUAS^yCKDHlcc0=67Jjdw;wGr zMdH|rTwTFx^WTNUd}M8LE0=F(rG{Zw(E zbp3Kv;bLfkaAB6AW<}(Uo_xID_(wysE+KP82de~>j(Y5dx!)aRieR$}Y%<^E+6q#( ziH|Ei+wY0Xd3L5N;w9aJwi6d+$uH^0sqJYi0-gTA&?B!po12<6>Dx!O2X{;i^neI; z)}ERv{l1OidOZHX0kP=1;FQ!#?C8Ck7b(xO=Ciphy=6p%g&Wkjz(>AL%e1Uh%V4DB z_}z#3UIlIqKoX4^GK-S7>Lh!oZ$XbAy4AtILD8X+`iCBaPmpu-s^)lJqhH~{BQjgP zDo{mI2F@jV9Fbc-a+2^ZDX{r-R{LaY^h)u1gR_aK0RX>{th#@7H#S!xXc9f-QMBAH zn=eE5bmPZ{(51(t3s;9AUKkixDH(F!z*}9UKV3UM#wm*U`+0&Y~I)JeUGyP=+B1Tz_Yv~yW{5s ztv|39F{R+4IoS>6hmsz38(OZ2F+*pW`{#MCW1#k*L$}O^{yK9U#ImzrWP#S;l)M;2 z*|t5|2iq|HXt643|7x#K94=-u(uar01g~S-(SYK6Gc{DJ(KwyHx@zZTX`{PR55na} z#hvn}UtWB>w^Z?CVdpOyg7T}MVQFAb&7Q|NL!v(|Br`P+78(&M{iUm2Id1M=Q+3~i zD#U}{P(I7z?0hs_Ld>ObZ9IQ=^$%c*dc8)+*fSA}`cl>|`OP(?*QW8MzX!DwB+3m* zKQN11w_==25X|T^W6!SY76?Z6zga@Vxp%|Y6%*dgi`d%`t)$D4k-AgTerD8JTk+@= z=BDB5K@18@`bEkuwsN<}2@{djM+VP$GI*!m`Lt$l1X+G#LB9xgI>_xnTu>u?(>dee zfsb4tO1wM~*vZvwerfcTVVy55CkU|ptYc|!C3Eujaqg!eG7Ti{&rC|Jq7p?#2j0FV zPt3OR8>-8Ux$QIH2^NuO;%ob2yblBQ7pP1pc<~}OWzE9b2y1f&3*4oPl7b`QC zqCl9 zvyLvOf;u2?(roWYGk5oRm@}?(Z%GERxN7|3p)^U&r!>tm-bA@5OfxftItG!xPWQoh zn}LTnrdBYT;PG}2XWnqUfhO0tAdC)@@0AhlS7AQ>HbcztO#-cEdRDfkpB#T2}J^q&E@QJ4Q&Y8&sEC5$p2lK?)I7s37k zTIj|ump|GZeY~{>KX=rOcPAdwOEdZhu;*8!$i)g);vRytRbg64Q=1OsQ|<@tXkD*T zW8q+aqIn_9L%^lxGxhd50q=JYDHIMct$butNk(70g_kTNE_`s!B_|-fJ}A%AQfUj( z<>4}kLB-AjyySc(9q&QIMMS++D_&38*=i`=*|$kSjIUJ@wSS7LWxHUBmyJLzpPN4$ zoz(n>4H5^(thHdju(G=FE7Db;EpwKJnLlgS@XpPD)UY zg4!;YvCvx_ddk=|;Ewt^V9WCioWkS(9czLac~SZq+~)GY>r&_YeIgl==c5hf4)WSE z1&Bo-Ai0Qkn97ak(~G*bU)3IqdH(hhuT2e_ZuM3gsxTHBadS;)yP*ZQ7p8iqq_T|< ze$PWlOfYdIhQw?;KP!gR`RY4+{P^)J52Zbx=xj)_4WB>s?d)QT+vSW~w^dZAJw0Uq z@@`Iu-=0-zcE!QsBhUxVX~I;ivBmx}y7EyEjqIguWLxr%C$0IK1-Yt&3*LrGPH<_~ zX-eLkkDac!MDvdaziW}YNvr_dADD}wIB?ZgayEi$NP2-XH2n09CpENzCU2s`G|Nz@ z1F|LME4wlr3%e%f_*9(KD#Qi1Z7xQlSkU_hi`?__)-&ZW-moR!ou70BmeTyGGk=M< zec#Y>E8l{XL|E?0%$F|$BhhJLBhl41=z%~2EO>e%-riL@y=x_9HFTzi-(ln+j0VVN z@DGs5=U!498|&+7lb810;x-pYAIegcoLa(DEBua%91=htF@r%xR#VimZx>I#mNwhF zx~*>%+%SO2z=T8br@4Mt?@)X1b#KWG*oAHE8@G-5s4V~Z@vaGj&Lq#oFwBQ(BvklN ztGMrKvzz<2xs<C((h#(s)Bz6+8Py+*&MP2z_Ep{rb1i5{DK+dGPm+>(BD0qKqH_L*I%?)TZ@#`k)WMaj}6s~ zhP>#b5|*7SwtI`;@jiuF%64%I;sgD(`7D7GwL4nKH!e1IbSk z=FGR(dTZa9eKP=p`EckeEmaqLqMz%A?{e6h0_*i|k$T_k^CL#@xz1K_F^@tx7_D+& zeNBkg+M}~=pmxZ>lL4J4Y(#CItjkd#+rYGaN#L{k^pEWw8l!@e=++EM1Q=Dzb*L$G zm(4mzImK>Yj=A90rFFx>KjO?mnvHox^fZN4;50j+DSF=*w7?R%)Eed3fqY&`B_wM> zV^q&AwasG0Cq7Fkt~sX^!EMhTEjkP4_FLKx31f zS&~yM_$Kw2_})-n#hRYZrU1pMfA~KD88`DjmoU1BCQeYnox62xuPf=Gv14DJtwTf6 zK!^mEA=!(OYoj$I*eP!DSY z?eo~&?OzAX&}ICZ2sHk3nG~`euOK~EdE(15kOCATC|0R(=oq)l%Ft8rbcW+V-e+0vHXRx3a~YWR{qHuvKu$hl7q_w?^eLJke>CG|WsFt^OFb zf$UGktLDbGZhR_ZhA-+|eqfEa8ZpZzT1WIeiEsj^m6XN~AvTeoGzkVzVURF{9R3i z1ri2oF;zQAI)uu`qLDyj0`N5=KvKB)O{L-{_$yY;lFWY5jm!`@gNbTGTG*Iw&od&% zukaGIr6|G_!L3y++L|5ipFsqbflOVVgubcQ4stfLF~Vrx1meUSeJO^7`Nd$pyWz<1 z*oYNN5Uz)%@pU2$o8r^2_LsB5yj_tgEWsjsH1~KeXt|=nYihtqL`$YLZgt)CQgx0x zvMlRVZAzRIm!Ka5sU}O&5X&_8N;|rf95!(e(1It(CIz{@pAy~ z8F$)sDB2uY+~h)ynvI!?hL!x>MJp*~szeJe#~B&;T0%+>v7cP=S6zT4A6&GvGG>zo zbgVBlYEmGErpn8T@cv+zi;>OP+*rZ8|MnNR3Pr=5%_dGa+#Y#IR*4cI5{|q`Y))pB z<7_cE2B4;wn|RFgHF4WYMViO^fncL2Qkw}*mLY99U#}4RPq2R~Wohi;LeTpChTA*S zn$zaj@aVS5&8fJngnN$KpRKZ_Y43wjnP0^SG<9J5c(JU18@0IB@nD9z#WH`5SL#W% zkyvZxfd8JQeUe|HW`dbb3c|l~8A%INmueksG=F~?)rfibctoO{(CWw4`W!sy+Mq%G zm)$HaGF5=Qzqyy=O$wfBdj@MWNIgVYSgXo8y43eFi3*D7%#Ji3Bg4P6;l@$cK_yxA zs(omlo+lB-XQ*Dqxtbb-;BY`>0IA|HY-7#2iAK!JGaiHxE8u6mxU!1PzOEbJ?%19-Mk$w1TyNovp zy2b%dk&(h#O1eHkg|Z^2iUze^HHtIV_sMf`u$>_`RGszpS;}(C7x1WCAAiLh5+f9wOqn$zOH)r0np^jSDb$f4)RJp1On+G*L)fWqMT@lREri=Jm=sm!~=@5&tH=`htSOR$>Ck z3p;$z9Mtl&h&;JlQWEHKO|1xH=IABVikCZZ6G2CDw70Vr0lZfJ0fegtXvDIV27d9| zHS|_^=&=Q=T(ymY3#=BakV^&(+&~E({|+#v|JFtM8$OMN1wlX>5c5nSm1{fI80qfU z0LBj^vSF1e;y7&yPZFo$VB}rQSnhwiW_H+ycdHD0YHxhO)^fPA;!0|QUjj) zQR?eMC#AjV>G3DHqHQ0oe!#oeRFdZa2kdyp(cf8KJ;c#KP^W+NDgD^FAj2iIqe%wZ z_%L_0#1y|WcZ>Xrk$94cN)7E?O;gxb--fnJjI{Or4LXM)6!JUAPPlpZ^)QGSb9Y4! zXAMOCG!G0Dh~TbIJD=~*8z?DyrtqC;-(Y$F#Y0mK6r)L63+S}B{#Gy%cgL=-JaHgz zRxFw}0>I*%5(+|o8oltz965wvIZ>r$XLR*^eu$7M058ey&hG-d$JN1zL z;bdRW;A|nv!|XI_1kS;rJzBV^;PH;p=>leqI3@6@*0`p>5yC-h$bOefxXcEiPVz`tAuFFPGVvLz7rl5%&!OIlC{sY zN#`>>#;ohNZ73C}cs&e%4O%w04d%3aoUFNMIx|1XA5*!$p3^O9h;)rVr29x)fOn^G z9l*4_ZB!Lx(`T~v$7OXT5!ZO0#}F=DMN{_j#<(4u!H6I)DdGw}BXhJVM5Gou!w6y5 zRCM1JG#!%(sJ??|Q&t-gDitr;Y}nE6md#PbAZHdCg?ksuq!m?#YEG;+B6v|;vCvZv zOXe`v7VWKn;-SkXZ4@d-Dxp(*EX_{#F`6Y95?6cf^?nlGu4E&YZ@}WGzNP&4?ZUlG@6slb{a3$1|XuK>(;r*Tf-tLX8o{=Euh> zX9-0)^b2(kFQ9;HrY4t@J>XGq)8J(dMzG%kKiSViwHi@{7gWucYL{U3h^qbW@(TH+ zkjckkRhA*YrG5=0vu|=-AOn$f_XyfmDT@@l7(1R~t@fXlQ)+p>Q=DoAcYI{ZCJ<>h zV$vx86Yz3w*`UX#;e!R$K=V@(lmSbfT{)h@&9Ggd(3r}fjbt3-tq<*W$Gm}J9Xuv7 zKJGb51NJY07or*O^~^9Cc%n1|@nQ=l>xELRr=tpv`*)MAhn3#LPu7d@!TzpaL%5|f z)Y_ zARKKVD5Q{BZ7xyGWyeO_ksu(R22YF$(sG8+vN>A=8{76-Ny9Xs2Sy{}Yw((q6HO$a z7niAWnt(>s1=3jr9KU6%L}hOQcg)R4R)z}nH3qb_5bYz=MPdI55~s!v61ScpULxVP znx$Gkl8djR>+Brdtqr3`4(Vtf^k`4m>9YCR7*ryWl|j2z-Oh96xV;(3y|z!Wy>XVF z1Fe|`R7kW!=OWLa=rMdMo*K569(Y8)@<38zsS69gX`_>SMdCqlSU5ybs#@>JF_M#+y?k2b;$P5(0t^A7XBbHLW$ zqQU1+PjKa1cDTt=kC`2U&u&qr(KWhbRNAR>~3nw z`}*Mc*Bb^qVr7OPM3Rff+X5LE{e9e70^ETC)RSn$?`sxiVR{8RORtJ>BGXlE5v75q z+Npqn4JN~b6&X(1Ht1LBEg#fn&FYwx?yEn}5*b}J`pEAtsqQ`ptaGAIhVC(6S&%jjtVqr+1(Y6i+O@&=zh}XjOPUX1F*iNkI*ZSefEv>-3_^A+aQC6 zA6@O0#_wy`HIP1yFroIfq@~PwUX$%eQNK49_j*jr{-Xvl-v&D54A6c2_jz9L+l;Ue z;dsc+!297>Mm1V}98iQ>9p=H*&Y|{O46Z))Lu7(b87hS$bX`8K`mGVPtpk}qj;|ZK zb6y|W)t~zwpSykh>7T_-Y3mlFtU#*?jTHAB6SfXV2b_)(Rk^1EU$`wH4{z(UWJl#IH~Qaf6ihzA~v zx0?)Y_)mQ%1zsB7XM}gi4G;7lv9BqX zs)(J*d{$Fb0&f2S3^Z#(v+5Wz5A93TzH1EO$0f=6dB*tWM+*)?zOli9DKtG1b{{*Z zzfvx6k&o4P`4}vcrf%XK-Sfm9PiNv9G!MSA%bC?3GbFIZ2$64354w1HDIT46*x&!i zqxjruiZFa1M%%j_4hQ7Vv~SE2X7Du+h_yc8Mi6uGhVE4Cx)l68Y(}>IP%_|Fx19_j zz<$xD0zwF>_d}53a%#Zi%E(JvG7Q}}4)6P<<)uCI&N{Q{bRYqQYY8Imh5U`H6DF7X zLg_p}^~3uF)kY?k;-;V(h{AG` zWO_@oQ{BP>s3rOKj{k}~dJIqw(Vm0czq9L`FifKkbg6!QKWh+(*jHqZNK;`8@}tNw z6`J7?K&$o+jRB6o$phVXExO-I4D0TbhU}_*B2jrYOm^X(nI1251^S8iwuyr;lE5Bs zuQk_W#q1J@NDEtWGQ`;^_6a3ShnNUrO0?fV4lMrISD6K{{+Rov?co=SqW_^YaY&y- z30qR$5wFXLDkhmPd@qGo(XA`ptzM3q9XC-*=Y}g84T$3+LQzEm>t!W#?-TJNZ1Dd9 zJgvuFciabNo7%G;u;W*%_bp8D(D}E==X02iM&i?t%h?-#QlQ^g$k+4?V;=u1uR-}b zO4Xa#1lt_~M^K~}hF5WO&M*b@wu<9yYP=3=6a2srPVEbqzp}YMpu0PO`~8$uVnyzf zfYH|7E(A-J z#<=7iqxs4xL6svOqL+lPfvcsk&a<~l>q;t8%^He{=0myZ&Vg~}>2nq`I>nSN6CStc zKZbvJ1HYExOrY3PYnbsNMVn^6QI%m@p39Y%Si|P(v$bYfi9Jx5R%aq*>W)&)t*}EVHYO5b6)wVsC(Hko)w+*_q?X;9?zDUapR%>(K-X=a{?=yr;#+1 zlFz1g{oYo|wp5^oaTnX>r2JBO&&waF`PX!Ib$XG(G?d^c-{E67HRR9SjI1YJ) z!YUh!>%cAB;DEy;sdyPJ1DYBQ1sL;WaC|MOO4wDh3$(1X>#OcsiQ}`G6zpjt#o^xE zTekyU_b-=rhwX@%r$sj6hLluvPv~!AVKRL)*&9%-rl$e*AQkMZ1q>|t8x1wC5u)vQ_7o|N#)9G zO!NBB-JmHts&!Qpk99Kd*KJZpJ zs4tmmxMemhxN?7z3Ke;6&6MyBe=tp|nJB#Ix}oty^$+I$M-vYLtkb2mZY#FV%( zTI=SvZ44S|G6$crp@!Tb7X=n=$9JegJWx%`O6J{sy1P}@%V!#Pqx0c$ZuU$jj_akc zE%9^rFh^~dCvn?)u3JMhln9p}nNig*daH;$^!yNcm*h2 zC)`77e@lzo{x|J7`G1{;`8&ceA2p}t*XzXp05SXtuJ7e%_9NxvcLf&Pm0&vHMbUu2 zP6lV)xm0gcgaL6dg*_dH|Rx7il(!Et2+64xuXGE7C0W&_A^YfBdE{K9D`*q z*UV2J;HZ?RIvW}>tf*8Xz2)F8WZw^iv?i%=n!y)M=(Pyzm9!mj ze720P5Z5-psan*S=!b<N239P;G`M+q~p?q+!U6ByqVD#C#md@GDx3mEsoGHrQ ziW1OQl)vhqwe`6TUW+12e8tkce=lE6>MiN%n>UPIZco7EvVJHfjSzQD3I&Y6bCrX!L<5*>Mi;svjeZZ6PN4 zN?b$dHMLKRXwU$_hj^mblQYxQ+$$^i9hz3SU;Hmx^uXl+~KYxkgsWa{$M) zkgz$-qQ<-hpMrr4Ud;A``z(X6ZY$ixTnMZsV>eClhAGx-6Ok6BpoLrf&9HEduHZDS zY_z_4CO|E!(uD*|E+)agr{XnkGel#(^|^+9T8dVRy2yk}58nY5$i-~PT}DIlCQ?s` z#d5G(?+C4eI-YP)pGsK9?c}TXsb_qJE}b?p49lKQlZHn!2b8y2?8-bC(_tDnEbYR3 z8CEu*f5%q*ZAb&$BYkOY7<#bbWoURxo1O5TAT%z~Ez#;liznyA$yfZy?`> z#t;F7Nq0!ko5_z>9lJ5;a^1{J+E8zqVd$1qJ3xM~5+$GUoHp(kWC~yrO3!co{NZpS zAMyKPI4gAPVSQz-rFi!|ZCT_Pl;%{dSGyYFuYkj=pSoHn&yAd~MTGYd2!L5T8TI5j z49`m}IqG74QzL~lQaXYmM|6@z3q&8gT}Hl2+nn?o?T^AVBES*&+$y1ec+6d~MXkS4 z*P<7nyh)Wq^NKKP9|*Mm0J7ec?Rh`ZIVjPm7=`jqE$f~`4#DhM@<{VVUGS$YiC z+XSpLLr^;U@?IL1-48$BptzxA(2!~ssMDiG)BFSYhSKeSCa)sJr`^X(eo6c11@7RQ zEr&nyfbxl$^eq2gyH@|#vcJhT1TVjW%VG;2>L6@>DkMp=#fN9l6dI zmd_XmJuFDV4#HNCV7O)cB}d|dF7BS(7Qc@PiS)D~d(S%isnF+xN3kg@s8Qrsyz!t9zK3cNQ#6#(*H;q-Tth+vS zTlJ1XY#mdJL1Fl5+M0~j{X@DYfcqQFD#Pr8YO|hrByLA5VG(Dw*{37pvdc4>YV#+b zOETr|skXWH6}HD5QXB)fG}lv)fv1beX}wV2pm~T>qe6(>E&G&2<&d$6(iY|g5PTe)o#qs`l5hQ^7-yWTUh4rvR1CTgv58O;XymsdzWs~4d`y4n7uet9}l zYc>ccSytuVg}FpJXtyQhKmM4(>_F%2)zq8eAp>pScmPQ(GU{boYVCAa?rq#F*mWMJ zFXVXRf6to;_gJLx3$`t3<+j{*(Np2|wwQ2K1Ur!da2l#X)XzSoa<&Ooc9$wgXuERq zJJXExs8m;$;yvr>?(@TES}_#^^Re0&J4hevBUfpRvmQiWl_nZ@e~A|H#m`EkFyd^> zw3$oD32$s5hzO{1Vl8=ejG7I}lG2dB&)>*y7=->=zI)zOdenq*2D4v3ZaSsA(S(g2 z=XpW@FH{lrKZth2^gqCbL)*M>z`KgreXK)v3wVFlFe86q#}gzq<(T!KOPdK#uJ|8` zNL~6@VM<9S891LF)G!;>P*_Y?c$z2Ch1ND3_g^#WC21*GwxE8&W9v%n zR17421q<&%ocyBqIoZ<9VmW-;pZLCJxZgb56_Jpsm8Laovs#;E)Gk85miG@Z&zw0g zwk8wLJSHyEvliD_Ca~UJJc&0_#p3cnHRRy3(w)gUFA!g>cJfn(%xc!aSH!F5sxhpsjYgE&SV%s(H!gdM zteX-oT!O6ues1FjQfWTmr7)OYv9qeuPzofMPkih%uP^aB*vBzPag*p#IIXC@g1?E? z`kJ&o9*L$<~yNw;Iz!IzdS zKVRj##)%LYGeYTjY}w95E1%S|@1j;zRzxueCVMZ>B{x3vAR_3g^F8$2+8Vj=j=c{8 zwvivw(IIP#ACN|YGFGv$J@Q~-nv?Rad0Q}f50(Fc6lxO?4R44SL`hJFGb++Mip$QThu(sMv~*?jYN&vD0|m#`FFZP~R1uks60(CA*_*gpwQq&~F*| z{bx{o_BcAGEspj(QFP^Ky0n74a5Y))zLvRWTpN6`_G&u-$kKBFmC|hoKn??lkp9P! zt)qLZEe7`C9)ps&?_Sh`obhWJnB!*)!|TWkRUvSxi!#nrKrq{=SA zWe3n%txsauv^P3N(@1hn4Kge78n`sWYFP275!Vrpc;Vsvi6cQtppt@;xt`%b_}-?r zrM?x8%s;@}`uXVcH4~+_ImWw;O{t5PT0rJc<#Xv}gPm@X zcfNunvx`7zV%RB&|A)&9iBWRDXzO~TAqE_?Pkl2cf@y51B4uf|gv*DnVz+xJS|SQ<;|fs_mBhzBn)FR%a~s>0 zOilIE3IK(FLAOjdzo347I83_8#jRFqioS&Ns_#f#YF#s8I8BF5>N%Z#3UyQ}6RJ(X za|5lM++HO6(`@%uy9kSZUUa$M7*Q5AP<{Lzy_Vn=a(j;h&U{MU3Qu-%3gFxvYidE1 z7&g-ebKTmiZ)!84Tg{!6R9F>oXmG$~f2Zq1;pS|G_|j>XnniFZ>Kw#2po=LZRJPR! zb2MFlno@mj=Vm-dKn4g4JOfwkn_Foh6AARt+$4bP?Fczk4GCp;QjCRynkzfKkP^J3_g3KV*nMp4K(K2XX=6xFZ ztD!buC;I0?&kaLW78xHdHL<=~T==Tut#PK{05dr9_7MN3I<(E-lFAz5jGw~6376># zK)BNKT>ajQTT?mvRY5P;TmE@*5tYiegf=_IXc!WHgD3r#Pjnrgdy}>s_PKe$*JTwT zQ;lGNCeGnUcAbd}mM4{hA~|`d%37z&JY<{NBt{if-yN6n#|CU!eRV`bR+idK#733k zfazQrp3d9bnK_Rdw3}l^WuoTtb1jv<=lOzlcdX4@^}#*`JkYT>;`m;L4Cr>c zRJ{sJUA}eWOp=<-s=OB)i75#GVDGG&@MxAeYV>>C!`+(D>a*k4U(E9sn0xgdi>SKI zNxm+Je=f&ZzMTCE6 zO#e1C8WJn%=DM7$ebA0pT-El_G(Sr)82vjU;8d(;)RA*w{&)&%GT}yiS9V@AvYdOB z`CwY+t;Mb<7Ali(__93q-%)^N+L zM3GCJaF&v4mhbw~+-XT*nqeOPPy6_6Du&{oX0wtt+?niUdQT>ir1N*5k(I~R2IAVL z@JzYPrDa#~sm)_Oy^J)lyZOlKzHMnBa;~_Kg36kHpRflqR!OyG1H^Q2$k8?FH89O@ zOPp1bK9fH#^`}^JEh|gnCGvfx8cJ(?@^M8LmE61lPY9PUUfWpaKP$<2tR|F$)x}YG zlmBHKUp)H5Wby{d%KTll%|D56iRARI*t#HN-TKFoyXNTAb{wvY^j9Bml=2cSy0G2^ zzvnh1mP4!%AjHETFpa+BR)WuJTU#|#Z$2uu*fz2qC=Lb zIrQi1c^U#e~4mZ)SF6vbHe& zxYMoQVrHui%@V0tTBp5xM>8~cY_=?oaHx-_qp;g$uEOvj3{(tVDI{l)#)^>|smDVE zd~`I@+2@7fUmpXLI$HS%(-(16X!;UMH%m`y zlyVq9F*@oQ*MMLr-~ZAWW*KV+DiVm`vp?ULr-q&*$IO&inGnHHUXLKS+-PM@yR(Lr z;w*xOH|y~^tYSEU$WYNlKcWu&C4TFiXu~{3*F=njrj_hB|DJgBc?@RLzy%d=y3EO; z;Q8l(eKIh$hl)Fs_)(ck*aMRA<4Ch-wc2?i_uf5xgnD%z+3v%a<6^EmLsV8sMA@9@fmM&djp7pCK#ZDSsd$E znR_zVCnD};2Lz583ixn))MNfE?RDw6jh|R z_wliglK%N>CUh&@VsJu#Qouo~pN6xj_?yWla{#DEqOS$TVTsq3KSsXSOd7O*ef=m$67@ywNc_|cJ{ zhJemi(z4G}5SC2TfWMX2n1~k+XXaB?{H#`OQ7OTw^e-OIlOCgb-t5nKM?Ih9$V3!0 zXdMue({Y$~06POUFH!(XU!3uShM{|#>6(&X+&Hnm>(f8=g{gIK7puzC=oL+f z6{K~m%W_Jtwk`6>nv%CZUq(OFrj9z|k-&$_@sycbHU1fuOIaQ;Y842r-r23zEiT!I z>@na7s7^)SO06VY48qmhAR{sE8A>?QRK63JL#FLv!ZFmc@vNo<#g@!uC zkJJm=Jom#WL6^h)oihI~0HxT;xvUDy;#vIO4-ow@y3t2Bb29Ry=KEw%GRpQJGj)2Q z3J2PI^T{f~3^CrD~<4Pa6)u>T9zl?W~Zr|Q&Rq+XZapr{OZ}YM7L?9aT z#41^y>Qx%MI-liQkour&Q4w}$}TJ0?)N(n{Sxwub3j~ID2$w7DgE~1HpPF(Q?gwJBv-~6N=={Gbb`6YWP zwf?D@gOk9TmwzqsqQd=3ockSc(|zvv8^jYzy6gaS$F*0NGgL?A9C&c~*n66r_Z2Yv zsr**8uvvVz7^>+4OBLmpu!tX;Ng@+YEKdr*tm`kTVo}`YY;VWF{)%@IGyi$sm6(s8 zy4POhm2*bdDk@!bK*c-IKGFa+XL#kFg1^vO!sB{`mezhHgrn>hySORamVnItiN3OD znyv7AQO$8VjGF;03Hd^i8S7 z`~W08?c5O9X`M$e%9|6)+_C8;{!|FVld&&eWsLiB?!`i=IO9a;=Ce9GHzKia!7ShO zzWG>>B5k7}C-z!bgM|+{*fL(g<}P~hVgFjvNXL^-7AN(Kh+Hq$o4Kzq6RaGdM45MU zn#@|AQ^S%gvNKpt$^zWx^&jbvBG%D#cZpYHUBEkG-?W^asQ*l(y)bQtK3^63`X7b) z|JS!Oo)@;wtUq?7+~rS^|EXo~_Zu)27v_nU%-?OexnRakL_GjA+2AZ8n8WF_0Qwr=KU>InD4F(d5N89-CUdQk&tjt&@d}oQP(Y z0_?S^`{5|;Qxh>QFg8&uov+5%s-ts~oU30c3yR0cp}PDZ_MSy4&6|Ecj&(TA^Jdypa&GjYX3nE}S+2SDq^KT@n4Rm^bbH(mcA4<<0bqF+touU3A%q>gr;YbsC<{|$s~ z?UVHbiT9eSI=YG{rKDnYU7NwDtNvH7oMdYpJd~ZrGtq+TF_lCszX;n>U`NDwHY9uC zR~hh;U*A9v7obP2X#t8{cNV-OXfE_a_guBS`pz;yaS>H3#X!z6oOHD(F*e7H8b;&{ zCko}{T_@_TvI&s!G{T$X&UO6ZOH0gN}1niY68oqT5T3dYU`pDvxg zP>m;dwn@Ax>00s-@PG*iTqVRzDSz}9)pSK{tE3WAP&n0zIFs^WJ@_1r*?Jj?U8(1n zE|`82r8qEUYAuCNugYBMQD@S#+HL}TvZrJmO@8$)lHDw{Z|QVecd`Fx1m)D;~p;AV(wYoG_sveL~{_ zd01~=?6h8A2JI(0)_(vjI#ZKKgx6ft3EYq9*et>Q8F?FYv_zP8^Xv_Q5;dy)^U1lvqyq#sMGE0z=5c(Kz$SY0jPj~024!`yLe*;U(n}BkxvM_ zYbT2Y{qJeb2didF#hNMG0ogK+)rH<@f1$RXQ$vIyF0Nsk|7=-GD5Ug$?JfNvHnvy) z(`zDm-|1&&hqGt~!}owmw~W`nkw>q%STLRu#qX`=OK_w|cH&^hlZLVHJyFG?;)3?) zxU^|1UOH}TJH1021+g193Cprg;=YQ*DMUyi#tDUv400@Ot`33p7 z>)EIxzcCfQq&~SlJOq6o<|wGI!2C?3#;>hmgU&h1MgRIq_6?0{_k_6UXjC>3nn9_v zjWt{BSS5&8sU(8SQaiulR4HcjdH9A=L6ch;x#)PXVKf}qT+>-6F+`%A``q%u8h)lf4nHIwl>F2=Em>C7)f<}TDR}$ znISmo63!~1^>Q}TeIz^lW3;;xu43wVM>}dXK9_7mu`-wHc|?GAkY7PXYZ&;(u!t)^ z1QFE#u{ZWb6N=(8>9R&Ahi23;W;I~Q6H#xX!Kx2n`dVh_z~y3LK|aH_ydL`w@9nIO zI)JC6?6|YYVX0NBS<(;*u_qVb zTf{5Zoj0&=PC*W9CFqkbb>HgZo(|?eO3&*v5xRByt4eSpXBM)jQfJ&H(Gyv`5g+Cl zjWsML&ubPGkaH|(KDkPK_M}HDleP3et1kIZinS&c@9>d76G?D^we*UDOH8 zvGM8RnNJ$@K7g}%$jmIZG7sS-ifqd@0S`Jf#XJF= zrqPjGZKhI&z3LfXppHrh{7T4oeV;lC93Ky4;&^$*BHcr=$l$6X#fFygu zO+R^>nZ14C0Cx-(#P9NT88lXS5c!KPBcqVlj%()G))~hiOTRY00p2$8D}JwkeNOGl59Q=kc4kW9ve{(c)@$hCM+nBl zBNz%jjZIB8iN>nVNIj@|h)zNGheiiVN_~{Llj>JH35kj6%er*(J>Nf(4Rbn zSyoD0O~M*)V_aS;Xp)4pCa=M3Ys-O_1;o*nH_5p!W4!}ugo75?%r~P9)C1oj39+au z8%hu;^wNCUUkJeLPjru6OOVv(ps!c=FVTtHi Date: Thu, 8 Jul 2021 19:37:04 +0200 Subject: [PATCH 10/10] Make spotBugs happy --- .../main/java/protect/card_locker/ImportExportActivity.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java index b1db1bb40..46335a113 100644 --- a/app/src/main/java/protect/card_locker/ImportExportActivity.java +++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java @@ -445,6 +445,12 @@ public class ImportExportActivity extends AppCompatActivity { super.onActivityResult(requestCode, resultCode, data); + if(data == null) + { + Log.e(TAG, "Activity returned NULL data"); + return; + } + activityResultParser(requestCode, resultCode, data.getData(), null); } } \ No newline at end of file