From 7d391194f5c4de338f0ee83ad679cabd5233f28c Mon Sep 17 00:00:00 2001 From: streaper2 Date: Tue, 10 Oct 2023 20:20:27 +0200 Subject: [PATCH] =?UTF-8?q?-=20s=C3=A9paration=20des=20taches=20faite=20et?= =?UTF-8?q?=20non,=20-=20rapettisage=20de=20la=20taille=20des=20taches?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - android/app/build.gradle | 37 ++++++++++++-- android/build.gradle | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 1 + deployment_cert.der | 21 ++++++++ lib/main.dart | 7 +-- lib/pages/home_page.dart | 47 ++++++++++++++---- lib/utils/dialog_box.dart | 37 ++++++++++---- lib/utils/my_button.dart | 6 +-- lib/utils/todo_tile.dart | 20 +++++--- pubspec.yaml | 2 +- upload-keystore.jks | Bin 0 -> 2607 bytes upload-keystore.jks.old | Bin 0 -> 2262 bytes 13 files changed, 141 insertions(+), 42 deletions(-) create mode 100644 deployment_cert.der create mode 100644 upload-keystore.jks create mode 100644 upload-keystore.jks.old diff --git a/.gitignore b/.gitignore index 0fa6b67..a1345d0 100644 --- a/.gitignore +++ b/.gitignore @@ -32,7 +32,6 @@ /build/ # Web related -lib/generated_plugin_registrant.dart # Symbolication related app.*.symbols diff --git a/android/app/build.gradle b/android/app/build.gradle index 02149a4..ec6c878 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -21,6 +21,12 @@ if (flutterVersionName == null) { flutterVersionName = '1.0' } +def keystoreProperties = new Properties() + def keystorePropertiesFile = rootProject.file('key.properties') + if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + } + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" @@ -43,18 +49,41 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.todo" + applicationId "com.kaelstudio.todo" minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName + ndk { + debugSymbolLevel 'FULL' + } } buildTypes { release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug + + ndk { + debugSymbolLevel 'FULL' + } + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile( + 'proguard-android-optimize.txt'), + 'proguard-rules.pro' + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + buildTypes { + release { + signingConfig signingConfigs.release + } + } } } } diff --git a/android/build.gradle b/android/build.gradle index 7af76c2..f4c918d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,12 +1,12 @@ buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.6.0' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' + classpath 'com.android.tools.build:gradle:7.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index cfe88f6..7de5a34 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -4,3 +4,4 @@ distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip +org.gradle.jvmargs=-Xmx1536M --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED diff --git a/deployment_cert.der b/deployment_cert.der new file mode 100644 index 0000000..3919314 --- /dev/null +++ b/deployment_cert.der @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDizCCAnOgAwIBAgIELKNhuDANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJm +cjETMBEGA1UECBMKdmFsIGQnb2lzZTEYMBYGA1UEBxMPdmlsbGllcnMgbGUgYmVs +MRMwEQYDVQQKEwprYWVsc3R1ZGlvMRMwEQYDVQQLEwprYWVsc3R1ZGlvMQ0wCwYD +VQQDEwRrYWVsMCAXDTIzMDkyOTE2MTcwM1oYDzIwNTEwMjE0MTYxNzAzWjB1MQsw +CQYDVQQGEwJmcjETMBEGA1UECBMKdmFsIGQnb2lzZTEYMBYGA1UEBxMPdmlsbGll +cnMgbGUgYmVsMRMwEQYDVQQKEhttps://developer.android.com/studio/publish/app-signing?hl=frwprYWVsc3R1ZGlvMRMwEQYDVQQLEwprYWVsc3R1 +ZGlvMQ0wCwYDVQQDEwRrYWVsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAhdixS6ZRPbsJFZX19VwZVCYZMcNgPHOmCHm1F/08ULTEzHImjCswgZhgfLey +oB5h9vgOFXw8nzlj9/8/RnQMhUNv90rL28aRpG4qOqkpnKztjCA2rrcaYuXA3l82 +3IQFO1FUKIZ2FnAL8h1P31OvBrAOTbgdKeOAClYF0h5NvYfQAeBYayKpQz2cQQ5C +K5nX3HbBeTIw3z6nQHnY85DA2BJPclR3ZBPGPppDbNFos6TSZpQk9Ro5Dk8NbKRY +J8B0aFY6VMTz3danpdZvK9oJQ2KK/EiX9UoRxjIykexxF5C5U2szoEQmHwKkcOMO +hIW91qFhH7ymHvByz/HI/29gDQIDAQABoyEwHzAdBgNVHQ4EFgQUTzO7LFDHBN8a +4YFu/sWgXgvBpdcwDQYJKoZIhvcNAQELBQADggEBAGYargwG85QwN6TWAuiV3gjs +/F2Axoe2rMYkg4mqh53M0qbqOZagY5cCzOShTe7wnd5+VXZ1yYr3M/PliGbzXald +gf8LpJb8LvpR8z3/EcO9FnsJAREncU4DYIzUynzfReAekOPizP4yL0XBPChf6jtk +C5EkFm0u2vAMgHkt6pGsWGynvPi/S8JILb09uyye5xBtBrTB8j0MIJ85/3Qfv8t0 +7x+KDkQ7qx9tu17PM+rF+XO9O0h4/giWsZJmVXIR/DBDNhXy+8RaqWKOjgLgG4vo +Q3tCtivp7ywDmSIQRgk2N8heLgRFJZb/3TB8kHTnUQqG9i8pemeAgXRRmqhyByo= +-----END CERTIFICATE----- diff --git a/lib/main.dart b/lib/main.dart index a2e3dcd..eb96e8d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,7 +6,7 @@ void main() async { //init hive await Hive.initFlutter(); //open the box - var box = await Hive.openBox('todoBox'); + await Hive.openBox('todoBox'); runApp(const MyApp()); } @@ -23,11 +23,12 @@ class _MyAppState extends State { @override Widget build(BuildContext context) { return MaterialApp( - title: 'Todo', + title: 'Tody', + debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.red, ), - home: const MyHomePage(title: 'Ma liste de tache'), + home: const MyHomePage(title: 'Tody'), ); } } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 5e33d33..cbb6ad6 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -23,7 +23,6 @@ class _MyHomePageState extends State { @override void initState() { - // TODO: implement initState // first time if (_myBox.get('todos') == null) { db.createInitialData(); @@ -74,17 +73,43 @@ class _MyHomePageState extends State { return Scaffold( appBar: AppBar( title: Text(widget.title), + centerTitle: true, + ), + body: Column( + children: [ + Expanded( + child: ListView.builder( + itemCount: db.todoList.length, + itemBuilder: (context, index) { + return db.todoList[index][1] == false + ? ToDoTile( + taskName: db.todoList[index][0], + taskCompleted: db.todoList[index][1], + onChanged: (value) => checkBoxChanged(value, index), + deleteFunction: (context) => deleteTask(index), + ) + : SizedBox.shrink(); + }), + ), + Text( + "Tache complété : ${db.todoList.where((element) => element[1] == true).length}"), + //task completed + Expanded( + child: ListView.builder( + itemCount: db.todoList.length, + itemBuilder: (context, index) { + return db.todoList[index][1] == true + ? ToDoTile( + taskName: db.todoList[index][0], + taskCompleted: db.todoList[index][1], + onChanged: (value) => checkBoxChanged(value, index), + deleteFunction: (context) => deleteTask(index), + ) + : Container(); + }), + ), + ], ), - body: ListView.builder( - itemCount: db.todoList.length, - itemBuilder: (context, index) { - return ToDoTile( - taskName: db.todoList[index][0], - taskCompleted: db.todoList[index][1], - onChanged: (value) => checkBoxChanged(value, index), - deleteFunction: (context) => deleteTask(index), - ); - }), floatingActionButton: FloatingActionButton( onPressed: createNewTask, tooltip: 'Increment', diff --git a/lib/utils/dialog_box.dart b/lib/utils/dialog_box.dart index 6a38042..7114f12 100644 --- a/lib/utils/dialog_box.dart +++ b/lib/utils/dialog_box.dart @@ -2,39 +2,54 @@ import 'package:flutter/material.dart'; import 'package:todo/utils/my_button.dart'; class DialogBox extends StatelessWidget { - DialogBox( + const DialogBox( {Key? key, required this.controller, required this.onSave, required this.onCancel}) : super(key: key); - final controller; - VoidCallback onSave; - VoidCallback onCancel; + final TextEditingController controller; + final VoidCallback onSave; + final VoidCallback onCancel; @override Widget build(BuildContext context) { return AlertDialog( backgroundColor: Theme.of(context).primaryColor, - title: Text("New Task"), - content: Container( + title: const Text( + "Nouvelle tache", + style: TextStyle(color: Colors.white), + ), + content: SizedBox( height: 120, child: Column( children: [ TextField( controller: controller, - decoration: InputDecoration( - border: OutlineInputBorder(), hintText: "Add new task"), + autofocus: true, + style: const TextStyle(color: Colors.white), + decoration: const InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + border: OutlineInputBorder( + gapPadding: 4, borderSide: BorderSide(color: Colors.white)), + hintText: "Ajouter une tache", + hintStyle: TextStyle(color: Colors.white), + ), ), - SizedBox( + const SizedBox( height: 40, ), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - MyButton(text: "Cancel", onPressed: onCancel), - MyButton(text: "Save", onPressed: onSave), + MyButton(text: "Annuler", onPressed: onCancel), + MyButton(text: "Sauvegarder", onPressed: onSave), ], ) ], diff --git a/lib/utils/my_button.dart b/lib/utils/my_button.dart index 01221e7..ff81903 100644 --- a/lib/utils/my_button.dart +++ b/lib/utils/my_button.dart @@ -1,18 +1,18 @@ import 'package:flutter/material.dart'; class MyButton extends StatelessWidget { - MyButton({Key? key, required this.text, required this.onPressed}) + const MyButton({Key? key, required this.text, required this.onPressed}) : super(key: key); final String text; - VoidCallback onPressed; + final VoidCallback onPressed; @override Widget build(BuildContext context) { return MaterialButton( onPressed: onPressed, color: Theme.of(context).primaryColor, - child: Text(text), + child: Text(text, style: const TextStyle(color: Colors.white)), ); } } diff --git a/lib/utils/todo_tile.dart b/lib/utils/todo_tile.dart index 283374e..4ac4751 100644 --- a/lib/utils/todo_tile.dart +++ b/lib/utils/todo_tile.dart @@ -18,27 +18,28 @@ class ToDoTile extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.fromLTRB(25.0, 25, 25, 0), + padding: const EdgeInsets.fromLTRB(15.0, 15, 15, 0), child: Slidable( endActionPane: ActionPane( - motion: StretchMotion(), + motion: const StretchMotion(), children: [ SlidableAction( onPressed: deleteFunction, icon: Icons.delete, - backgroundColor: const Color.fromARGB(255, 249, 137, 135), + backgroundColor: Color.fromARGB(255, 249, 137, 135), borderRadius: BorderRadius.circular(12), ) ], ), child: Container( - padding: EdgeInsets.all(24.0), + padding: const EdgeInsets.all(10.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( taskName, style: TextStyle( + color: Colors.white, decoration: taskCompleted ? TextDecoration.lineThrough : TextDecoration.none), @@ -46,12 +47,19 @@ class ToDoTile extends StatelessWidget { Checkbox( value: taskCompleted, onChanged: onChanged, - activeColor: Colors.redAccent, + side: + MaterialStateBorderSide.resolveWith((states) => BorderSide( + width: 2, + color: Colors.white, + )), + focusColor: Colors.white, + checkColor: Colors.white, + activeColor: taskCompleted ? Colors.grey : Colors.redAccent, ) ], ), decoration: BoxDecoration( - color: Theme.of(context).primaryColor, + color: taskCompleted ? Colors.grey : Theme.of(context).primaryColor, borderRadius: BorderRadius.circular(10.0), ), ), diff --git a/pubspec.yaml b/pubspec.yaml index 6fa7b76..6b7384a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.0+1 +version: 1.0.1+11 environment: sdk: ">=2.15.1 <3.0.0" diff --git a/upload-keystore.jks b/upload-keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..8150560a0c6e5a066a039d5d8df572039cc7aa9a GIT binary patch literal 2607 zcmY+EX*d*$8pnqj%-9k$${=KIFvilT?0YK4l8m)->{||#OxYUZSh9@W*v3A}60(FW zGxlVQNLj+jPO?OF-TT~o&T~J!&-*;T|NnhI{!j!~X+{PhiU3()h9DxYN9=PjurTBi zAY&i`WcU;hpa@KE{}(Y?g9uD_PO;hP7&Ei|_lljBfiaH&IzkaZ`>0FItpCHO&-p=6 zz2EtVwT0GyDnla9?w}|y`ht{a7=Zw)35WpdL7U`$OxSU+dqWTZWBFA_R^FH;0Fq-D z#U9BlDptHAXX>o{d8SA+IIGl`=Y~F(al243%RR;%_km0OQRg(rU@rEhw)fpHxwW4O6M2JlCMikP=eQDa2fl-rDLKkK5%@n{~ur#s%k>^d2k!Y0^H z>_|8y-DZho8e5qP^~cIv9qMFTP$~k0qbF4jSr$3ZnHozyj~nqumWXF-cKHb6QZS+E z!7_`w@KXItKrbFw=hCOxU^7~wS0uk-eH!37!}PPH0{t&mmPJ3J)_>L09HtSufV zGlL5qyg3jVKkAGt^s{7B!o@HnS%Xp79ONpx&W_0t63p{_wmW)WvrLK2r0)p#Ymb%m zdLHehSL9_?P26&>W_4%SK6cg9o{UEiPc9k+EEiBoS1mqer%o4fp1(e1AnnyzT%?98 zX+#AksntdMevj#DclXvE&-6z@WHXm!ZrPl>;%qNtrK*7X;UQF2TOb#k`=EyBHu$cO zyn9}|=Rnx@#OMNh0>;)82z{3+bmkj+Gg02-kHdg1CJRYOuuoAcdX9(Pv_>) zY%PPc4)=_jbf2ceBb4jk-<5I{H&E$b){jXX9I}43O}`v7V4yw!E~P4g@4K~8)?FQ> z?)7i@+%q?vKE{CU5|`$0oRo;mgl~JtV94aUbRpaGuT3jaVkGblr$6hWk`azV^61WY5WvQ{p>$#%3#1 zxeck7Op|fFFGVz$FvRuCBJv78e69@74vsD?%S^@7uS$pvm^)faSvndYbRHe^ZY6W_ zeq>-t`9G&kGb!CPNzR=>)~$(X=1Bv7?p*SD8;1T;YLL``{2`IFn*i*l#-W-H3x zrSLR`ziiObl#7XLVFd(HkHO7(lHYf23gL#Sz9B6G1G&7%?Zr*7t#_AE@Mje-ZW>qH z9p3T9vH8r#k4S}FYMY87ST#uBT&j+J7N&e2VK+bi*Za=hkYf@wildayFE==9cWuox zrvc4zcy1T|3K{B=1MoT+dg}Pr%Mzl5(=S!KMJFY$IK5H*RO+qEGrj0n+7N~D^ub&l z zNQjfyMDhQvN(fY*^8!2IA;1UV33vdw4{$_@{1d|Dp&;(tZeC8p^60B*6iP_}t*oqw zK9#5K-z662Q=b~0B11+7!0FQdCt>(M!!rNdu+F%E#c+DTxcLRl;GJ33GzAUkOaC!! zC;;Bp2lU|=8LzD9{^XGgv z$Qo3jTI36gfLKy&L+8B1vtq)nzt^0%Rb(9^NEX)QVedoPLS!%eo2?Q*8W8~76KdQI zUeVBk&2#KOeF;ViDw!?1S{|upg!%7P#*YG;v^4kxwx;VvSl}i7tlWoGU2A|05G%g- zBlG0-@Wp~f%#&ppa%yNMvyXRt5MPb(mA62Ib=L1T$rN)Vt6|E>*Fgm9};z zq*uJFQ<8&jm~urC_n{`C(tK5X3w~KDIVy|7&LI>0ylvu*-`0Lnm3w(>u{tM6If+#- zejnf7IMwxJZwjaaSl2a3@D0VCaoFH_{5neaV10R}wd!VE?gT2wzL}~P${BxOOZWl$ zY-l?Pajf$cYy$G7v&gxL^f}b7H13{!4izy}mK4z5G-tHXk-Hm|w^ZUaUOz)TYrS4Y z7LHc%acM*ROlzm^)rRS0KFEnz<^z3vk@{5Ps_muWg=Rba9;K~ImRh5o{8u~dP^rRU zaH8Q(7sHM)BWXt8)^z(kIl&->zrY- zgIYRG!x~Agdz|G33*Fc=uB$YAuE1(BlZksTvKnhfV-9)ezhK#K9_{W8R|pNyh*ZMX z$^>3&HX+g_0xx=O{#n&;+F7jwyySd9yOqU-g^m5*@VGE8q4mN;oX-XDS6Ew6oV01d zb`9Wiqp$+{&Dz5W0!?wq!iCG6yIgP~CDbXjn6gaAR0sc<-U1cOlLkANFbC>JG@zKM z==1PpsQGnZ!L=KFZ^Bg)Vry)}qT1P8-1(SHNy7?-3E3W$A8Ua5fZ5d(8es-XCH9|t z|8{_=2=S@n?4hTAe5`$IFrL#$dhqKft)QP1df2z)cfYD19NpH?5fa#0A_`W4pKY}& zAj?*NAX+H<%S7&=q9O3wzOh-Bh%B-YZ*<8seKUHYaK&|j zShqBXAoyc`-<@u%fL~;juZ?7_h0B~hCZfeU1G6bg>3_^>&V%^Unh}2f?a|2`pm?^O zPP5DaBew#vmyPz%wwf ziYJ@8OX3%)VLpN|-zx!rT|Fzw4IOzzLP1ft%%(c=D!h`9h)Oi`-=(ALU3Ny$w!pF5 zj5|{-wZHHe%fsLkmP;cYfSrVwNj*cHdMiUo;Z38scvhnmS})DH8jDg#iJ&0NOwyb{ zMmQ4y1PurhNHR{;2~n;6kRQ;k^tHNaq!$Fe*72*OUz>aHBU~f@cMtfjpHr_CBak5? F?_YI=%#i>9 literal 0 HcmV?d00001 diff --git a/upload-keystore.jks.old b/upload-keystore.jks.old new file mode 100644 index 0000000000000000000000000000000000000000..e741cb5230c81b96962c306f19072c0a954226d6 GIT binary patch literal 2262 zcmc(g`8(8$7sqF}%ornEh*3f@_{>bW(-?(F3Au=?>_cP*jU}Wow(LuGGGt#;Bq_w$ zx>8A3D9czgduMTH5d;E3b_4u(AOd`8 zKF-wLG=BQ=z%GM>048h;KqCZI5nvct1tJ0l!$B}6Y#y&z7Cn{(f^d3VM|vgj>Fepk zPdmO|8$FEAC+Qo5rSn7k^9^-{!TYst3g=QsNWe~n$#H!#EZ@pO@aqhU<$Nblev^c3$of@_t2)c#Y#g zNTV@%e=&RN2a7SVWnIkvUAq(_-!*%p^Lj5Jkf#@YQaMd2!!}p#M+1~6Qy%M^Bw3Eq zS4B;n8%Lcl{Osy=X^6Bj*yt_m&Rymo=-YNo9^7nR>PyYe+U%Z2j@FXdPgT#&``nx} zFpDT`{L7X4M1eKvC8EM2QzTCYXbEoQ7Vda0Q>(M$D#F%$=jw9AH0NkB)tQie+UmHQ zzQf!OFDJdLxNOVqumz_P-H9CJUD@|{AGFX+ds$LWP0qd`8OBCmfZD^>XTKks+ZQpY zx03f3oDgJ}Lj8kWc{;PX!-Y6o@s5bphi{K%hN|7OGZG^x>18+d^OA7Z$kr|NX9qG5 zj!mu-?TJ1`1fo}7$p%)38!b`hQ&QWCgqTwTOCA?deAU5p<$y?afti?lO6ER3KF8H_ zO87Lg0I_f}J(F0Fh}8I@R95Gjca@Z_pPNV6ic2f~$>_L~Tooka18s;WelX&UcToYI zS}1$@sKTB+#XxC}eRl(Qa~ZGsnNmI?;V@ah&Cw8$Nwc=K^E4;4hFK1SB=04L80)y2 z=QUBu%u7O_3XI04%7)s<6)r3{#X_}HJPy+RpZc2(5Hw_ihz{Q${|LoLH5`{ulK9$% z8<7pv^o~E3`}x?(>b*Ts*P~r37OHL0hCzLVI1Id#zvbS=9hZeL8eLbzAUEK<>)6%o z(l>G6nicQ9(zbDnE4jd`KaenUD){9Kt4G%=`oC#bkUI;#9x$Kty&XF1^<}8V70BwFXcw3_?azQ zP${ayF$;V@kb)|4;)`lX;d-25!l)an(&*humoFnNe8f|a33 z2A)>F;gd#gbL?e@MamcGKKAy)NQU$`U<{20Qc31X*>cF)+a2smbDk6Xk)7qV6|H-< z61-$(aK+}8Ok=lchoLY!oq#& z{MLJ$izoU}iQ7{*@&hN4riD_QG`#)|+)TP#&YAXxYlte(dd+j=bYpZqPGS+xF=J=N zZ!08(oDVwkVMZ!hciyixTK9^X;9|w1L~dB{)t}qVe#N=C`;^!$T&%OBe3Ym5`w}}3 z(bRS%U?1f^XU~(0iYpfMR^?j|dT~TDKftZedaaOmCn4uyFpgvP4mAT7P`Hh7J78<3 zbwca#a_teFI}2fcv-6(IR9WDeDCg5j?8oEHeGK#0stv+Am|LZ*fB!|et-2;a0)e0@ z027)3Fd=?LPzV?Tf#FJ=n*kw&fJ%&U3|9yYM(#e$06Y>9KtQcw2vLYT11}1Q{7U#m z1p}RF@>FFXPd_*OUO?g(bB^U*#67fWv+Uv7aKUr%*K($9v9G{Wwq6IS3@8P9Xnob(k?}xw zFahA`RvZr=T}|y6-DA$MxLW`pV$lgDETq(T79ADcHeBqCZ7rAk${6_e zC(p-82m%Fzz$N