From 05a0562ee5205d4b15f3aa97ee7af01b8e32ba8d Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Fri, 1 Dec 2023 22:26:41 +0200 Subject: [PATCH 001/457] WIP cleanup and use flutter 3 --- app/lib/screens/authentication_screen.dart | 81 ++++++++++++---------- app/lib/screens/change_pin_screen.dart | 53 +++++++------- app/lib/widgets/pin_field.dart | 2 +- app/pubspec.yaml | 2 +- 4 files changed, 72 insertions(+), 66 deletions(-) diff --git a/app/lib/screens/authentication_screen.dart b/app/lib/screens/authentication_screen.dart index 47c01216..ee7abc97 100644 --- a/app/lib/screens/authentication_screen.dart +++ b/app/lib/screens/authentication_screen.dart @@ -12,17 +12,16 @@ import 'package:threebotlogin/services/shared_preference_service.dart'; import 'package:threebotlogin/widgets/custom_dialog.dart'; class AuthenticationScreen extends StatefulWidget { + const AuthenticationScreen( + {super.key, this.correctPin, required this.userMessage, this.loginData}); + final int pinLength = 4; - final String correctPin; + final String? correctPin; final String userMessage; final Login? loginData; @override - AuthenticationScreen( - {required this.correctPin, required this.userMessage, this.loginData}); - - @override - AuthenticationScreenState createState() => AuthenticationScreenState(); + State createState() => AuthenticationScreenState(); } class AuthenticationScreenState extends State { @@ -30,7 +29,8 @@ class AuthenticationScreenState extends State { Globals globals = Globals(); late Timer timer; - void initState() { + @override + initState() { super.initState(); Events().onEvent(CloseAuthEvent().runtimeType, (CloseAuthEvent event) { @@ -40,10 +40,9 @@ class AuthenticationScreenState extends State { }); if (widget.loginData != null && widget.loginData!.isMobile == false) { - const oneSec = const Duration(seconds: 1); + const oneSec = Duration(seconds: 1); - print('Starting timer ... '); - timer = new Timer.periodic(oneSec, (Timer t) async { + timer = Timer.periodic(oneSec, (Timer t) async { timeoutTimer(); }); } @@ -58,7 +57,7 @@ class AuthenticationScreenState extends State { } int? created = widget.loginData!.created; - int currentTimestamp = new DateTime.now().millisecondsSinceEpoch; + int currentTimestamp = DateTime.now().millisecondsSinceEpoch; if (created != null && ((currentTimestamp - created) / 1000) > Globals().loginTimeout) { @@ -73,7 +72,7 @@ class AuthenticationScreenState extends State { 'Your login attempt has expired, please request a new one in your browser.', actions: [ TextButton( - child: Text('Ok'), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -114,34 +113,37 @@ class AuthenticationScreenState extends State { margin: EdgeInsets.all(height / 120), height: height / 50, width: size, - decoration: BoxDecoration(color: Colors.black, shape: BoxShape.circle), - duration: Duration(milliseconds: 100), + decoration: + const BoxDecoration(color: Colors.black, shape: BoxShape.circle), + duration: const Duration(milliseconds: 100), curve: Curves.bounceInOut, ); } Widget buildNumberPin(String buttonText, BuildContext context, - {Color backgroundColor: Colors.blueGrey}) { + {Color backgroundColor = Colors.blueGrey}) { var onPressedMethod = () => handleInput(buttonText); double height = MediaQuery.of(context).size.height; - if (buttonText == 'OK') + if (buttonText == 'OK') { onPressedMethod = (input.length >= widget.pinLength ? () => onOk() : () {}); - if (buttonText == 'C') - onPressedMethod = (input.length >= 1 ? () => onClear() : () {}); + } + if (buttonText == 'C') { + onPressedMethod = (input.isNotEmpty ? () => onClear() : () {}); + } return Container( padding: EdgeInsets.only(top: height / 136, bottom: height / 136), child: Center( child: RawMaterialButton( - padding: EdgeInsets.all(12), + padding: const EdgeInsets.all(12), + onPressed: onPressedMethod, + fillColor: backgroundColor, + shape: const CircleBorder(), child: Text( buttonText, - style: TextStyle(color: Colors.white, fontSize: 20), + style: const TextStyle(color: Colors.white, fontSize: 20), ), - onPressed: onPressedMethod, - fillColor: backgroundColor, - shape: CircleBorder(), ))); } @@ -162,19 +164,20 @@ class AuthenticationScreenState extends State { ]; List pins = List.generate(possibleInput.length, (int i) { String buttonText = possibleInput[i]; - if (buttonText == 'C') + if (buttonText == 'C') { return buildNumberPin(possibleInput[i], context, - backgroundColor: input.length >= 1 + backgroundColor: input.isNotEmpty ? Colors.yellow.shade700 : Colors.yellow.shade200); - else if (buttonText == 'OK') + } else if (buttonText == 'OK') { return buildNumberPin(possibleInput[i], context, backgroundColor: input.length >= widget.pinLength ? Colors.green.shade600 : Colors.green.shade100); - else + } else { return buildNumberPin(possibleInput[i], context, backgroundColor: HexColor('#0a73b8')); + } }); return Container( width: double.infinity, @@ -217,10 +220,10 @@ class AuthenticationScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: new AppBar( + appBar: AppBar( automaticallyImplyLeading: true, - backgroundColor: HexColor("#0a73b8"), - title: Text("Authentication"), + backgroundColor: HexColor('#0a73b8'), + title: const Text('Authentication'), ), body: Container( color: Colors.white, @@ -229,8 +232,8 @@ class AuthenticationScreenState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( - child: Text(widget.userMessage), padding: const EdgeInsets.only(bottom: 50), + child: Text(widget.userMessage), ), Container( alignment: Alignment.center, @@ -238,7 +241,7 @@ class AuthenticationScreenState extends State { child: Column( children: [ generateTextFields(context), - SizedBox(height: 25), + const SizedBox(height: 25), generateNumbers(context), ], ), @@ -252,8 +255,10 @@ class AuthenticationScreenState extends State { Future onOk() async { HapticFeedback.mediumImpact(); - String pin = ""; - input.forEach((char) => pin += char); + String pin = ''; + for (var char in input) { + pin += char; + } int currentTime = new DateTime.now().millisecondsSinceEpoch; @@ -286,14 +291,14 @@ class AuthenticationScreenState extends State { } dialog = CustomDialog( - title: "Too many attempts", + title: 'Too many attempts', description: - "Too many incorrect attempts, please wait ${((globals.lockedUntill - currentTime) / 1000).toStringAsFixed(0)} seconds", + 'Too many incorrect attempts, please wait ${((globals.lockedUntill - currentTime) / 1000).toStringAsFixed(0)} seconds', ); } else { dialog = CustomDialog( - title: "Incorrect pin", - description: "Your pin code is incorrect.", + title: 'Incorrect pin', + description: 'Your pin code is incorrect.', ); } diff --git a/app/lib/screens/change_pin_screen.dart b/app/lib/screens/change_pin_screen.dart index 73d56e23..dc8bece9 100644 --- a/app/lib/screens/change_pin_screen.dart +++ b/app/lib/screens/change_pin_screen.dart @@ -4,47 +4,48 @@ import 'package:threebotlogin/services/shared_preference_service.dart'; import 'package:threebotlogin/widgets/pin_field.dart'; class ChangePinScreen extends StatefulWidget { - final currentPin; - final bool? hideBackButton; + const ChangePinScreen({super.key, this.currentPin, this.hideBackButton}); - ChangePinScreen({this.currentPin, this.hideBackButton}); + final String? currentPin; + final bool? hideBackButton; - _ChangePinScreenState createState() => _ChangePinScreenState(); + @override + State createState() => _ChangePinScreenState(); } -enum _State { CurrentPin, CurrentPinWrong, NewPinWrong, NewPin, Confirm, Done } +enum _State { newPinWrong, newPin, confirm, done } class _ChangePinScreenState extends State { String newPin = ''; _State? state; _ChangePinScreenState() { - state = _State.NewPin; + state = _State.newPin; } getText() { switch (state) { - case _State.NewPinWrong: - return "Confirmation incorrect, please enter your new PIN"; - case _State.NewPin: - return "Please enter your new PIN"; - case _State.Confirm: - return "Please confirm your new PIN"; + case _State.newPinWrong: + return 'Confirmation incorrect, please enter your new PIN'; + case _State.newPin: + return 'Please enter your new PIN'; + case _State.confirm: + return 'Please confirm your new PIN'; default: break; } - return ""; + return ''; } @override Widget build(BuildContext context) { return WillPopScope( child: Scaffold( - appBar: new AppBar( - backgroundColor: HexColor("#0a73b8"), + appBar: AppBar( + backgroundColor: HexColor('#0a73b8'), title: widget.currentPin == null - ? Text("Choose your pincode") - : Text("Change pincode"), + ? const Text('Choose your pincode') + : const Text('Change pincode'), elevation: 0.0, automaticallyImplyLeading: widget.hideBackButton == false), body: Column( @@ -52,7 +53,7 @@ class _ChangePinScreenState extends State { mainAxisSize: MainAxisSize.max, children: [ Container( - padding: EdgeInsets.only(top: 0.0, bottom: 32.0), + padding: const EdgeInsets.only(top: 0.0, bottom: 32.0), child: Center( child: Text( getText(), @@ -65,7 +66,7 @@ class _ChangePinScreenState extends State { ), ), onWillPop: () { - if (state != _State.Done && widget.hideBackButton == true) { + if (state != _State.done && widget.hideBackButton == true) { return Future(() => false); } return Future(() => true); @@ -76,16 +77,16 @@ class _ChangePinScreenState extends State { Future changePin(String enteredPinCode) async { setState(() { switch (state) { - case _State.NewPinWrong: - case _State.NewPin: + case _State.newPinWrong: + case _State.newPin: newPin = enteredPinCode; - state = _State.Confirm; + state = _State.confirm; break; - case _State.Confirm: + case _State.confirm: if (newPin == enteredPinCode) { - state = _State.Done; + state = _State.done; } else { - state = _State.NewPinWrong; + state = _State.newPinWrong; } break; default: @@ -93,7 +94,7 @@ class _ChangePinScreenState extends State { } }); - if (state == _State.Done) { + if (state == _State.done) { await savePin(enteredPinCode); Navigator.pop(context, true); } diff --git a/app/lib/widgets/pin_field.dart b/app/lib/widgets/pin_field.dart index a3a41fb9..69751c07 100644 --- a/app/lib/widgets/pin_field.dart +++ b/app/lib/widgets/pin_field.dart @@ -43,7 +43,7 @@ class _PinFieldState extends State { } Widget buildNumberPin(String buttonText, BuildContext context, - {Color backgroundColor: Colors.blueGrey}) { + {Color backgroundColor= Colors.blueGrey}) { var onPressedMethod = () => handleInput(buttonText); double height = MediaQuery.of(context).size.height; diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 0d16cdbf..088a6b96 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: "none" version: 3.9.0+176 environment: - sdk: ">=2.12.0<3.0.0" + sdk: ">=3.0.0<3.13.7" dependencies: flutter: From 335a3901fe65078717bbc42e1ea9593cfa3ff62d Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 3 Dec 2023 12:24:49 +0200 Subject: [PATCH 002/457] Update to flutter 3.16.2 --- app/assets/bg.svg | 2 +- app/ios/Runner/Info.plist | 6 +----- app/lib/main.dart | 1 + app/pubspec.lock | 2 +- app/pubspec.yaml | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/app/assets/bg.svg b/app/assets/bg.svg index a5f35581..368e75c7 100644 --- a/app/assets/bg.svg +++ b/app/assets/bg.svg @@ -1,3 +1,3 @@ - + diff --git a/app/ios/Runner/Info.plist b/app/ios/Runner/Info.plist index ae010cdc..e5188351 100644 --- a/app/ios/Runner/Info.plist +++ b/app/ios/Runner/Info.plist @@ -84,9 +84,5 @@ io.flutter.embedded_views_preview - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - - + \ No newline at end of file diff --git a/app/lib/main.dart b/app/lib/main.dart index e8170317..e3e6ced8 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -54,6 +54,7 @@ class MyApp extends StatelessWidget { colorScheme: ColorScheme.fromSwatch().copyWith( secondary: HexColor('#57BE8E'), brightness: Brightness.light, + background: Colors.white, ), brightness: Brightness.light, textTheme: textTheme, diff --git a/app/pubspec.lock b/app/pubspec.lock index e120bb0c..e77cd108 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -951,5 +951,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" + dart: ">=3.2.0-194.0.dev <3.16.2" flutter: ">=3.7.0" diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 088a6b96..d86194ad 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: "none" version: 3.9.0+176 environment: - sdk: ">=3.0.0<3.13.7" + sdk: ">=3.0.0<3.16.2" dependencies: flutter: From 3aeaa901d201a289e5bd0dfce97924216d8982ee Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 3 Dec 2023 15:15:47 +0200 Subject: [PATCH 003/457] Cleanup the main and config files --- app/lib/app_config.dart | 52 ++++++++++++++++++++++--------- app/lib/app_config_local.template | 29 ++++++++++------- app/lib/browser.dart | 8 ++--- app/lib/jrouter.dart | 9 +++--- app/lib/main.dart | 7 ++++- 5 files changed, 70 insertions(+), 35 deletions(-) diff --git a/app/lib/app_config.dart b/app/lib/app_config.dart index c80a099a..0704872c 100644 --- a/app/lib/app_config.dart +++ b/app/lib/app_config.dart @@ -71,34 +71,42 @@ abstract class AppConfigImpl { } class AppConfigProduction extends AppConfigImpl { + @override String baseUrl() { - return "login.threefold.me"; + return 'login.threefold.me'; } + @override String openKycApiUrl() { - return "https://openkyc.live"; + return 'https://openkyc.live'; } + @override String threeBotApiUrl() { - return "https://login.threefold.me/api"; + return 'https://login.threefold.me/api'; } + @override String threeBotFrontEndUrl() { - return "https://login.threefold.me/"; + return 'https://login.threefold.me/'; } + @override String threeBotSocketUrl() { - return "wss://login.threefold.me"; + return 'wss://login.threefold.me'; } + @override String wizardUrl() { return 'https://wizard.jimber.org/'; } + @override String pKidUrl() { return 'https://pkid.jimber.org/v1'; } + @override Map flagSmithConfig() { return { 'url': 'https://flagsmith.jimber.io/api/v1/', @@ -108,34 +116,42 @@ class AppConfigProduction extends AppConfigImpl { } class AppConfigStaging extends AppConfigImpl { + @override String baseUrl() { - return "login.staging.jimber.io"; + return 'login.staging.jimber.io'; } + @override String openKycApiUrl() { return 'https://openkyc.staging.jimber.io'; } + @override String threeBotApiUrl() { - return "https://login.staging.jimber.io/api"; + return 'https://login.staging.jimber.io/api'; } + @override String threeBotFrontEndUrl() { - return "https://login.staging.jimber.io/"; + return 'https://login.staging.jimber.io/'; } + @override String threeBotSocketUrl() { - return "wss://login.staging.jimber.io"; + return 'wss://login.staging.jimber.io'; } + @override String wizardUrl() { return 'https://wizard.staging.jimber.io/'; } + @override String pKidUrl() { return 'https://pkid.staging.jimber.io/v1'; } + @override Map flagSmithConfig() { return { 'url': 'https://flagsmith.jimber.io/api/v1/', @@ -145,34 +161,42 @@ class AppConfigStaging extends AppConfigImpl { } class AppConfigTesting extends AppConfigImpl { + @override String baseUrl() { - return "login.testing.jimber.org"; + return 'login.testing.jimber.org'; } + @override String openKycApiUrl() { - return "https://openkyc.testing.jimber.org"; + return 'https://openkyc.testing.jimber.org'; } + @override String threeBotApiUrl() { - return "https://login.testing.jimber.org/api"; + return 'https://login.testing.jimber.org/api'; } + @override String threeBotFrontEndUrl() { - return "https://login.testing.jimber.org/"; + return 'https://login.testing.jimber.org/'; } + @override String threeBotSocketUrl() { - return "wss://login.testing.jimber.org"; + return 'wss://login.testing.jimber.org'; } + @override String wizardUrl() { return 'https://wizard.staging.jimber.org/'; } + @override String pKidUrl() { return 'https://pkid.staging.jimber.io/v1'; } + @override Map flagSmithConfig() { return { 'url': 'https://flagsmith.jimber.io/api/v1/', diff --git a/app/lib/app_config_local.template b/app/lib/app_config_local.template index 83fc4ab8..a31e7996 100644 --- a/app/lib/app_config_local.template +++ b/app/lib/app_config_local.template @@ -1,39 +1,46 @@ import 'package:threebotlogin/app_config.dart'; class AppConfigLocal extends AppConfigImpl { - + @override String baseUrl() { - return "192.168.0.0:5000"; + return '192.168.0.0:5000'; } + @override String openKycApiUrl() { - return "http://192.168.0.0:5005"; + return 'http://192.168.0.0:5005'; } + @override String threeBotApiUrl() { - return "http://192.168.0.0:5000/api"; + return 'http://192.168.0.0:5000/api'; } + @override String threeBotFrontEndUrl() { - return "http://192.168.0.0:8080/"; + return 'http://192.168.0.0:8080/'; } + @override String threeBotSocketUrl() { - return "ws://192.168.0.0:5000"; + return 'ws://192.168.0.0:5000'; } + @override String wizardUrl() { return 'https://wizard.jimber.org/'; } + @override String pKidUrl() { - return 'http://192.168.2.174:8080/v1'; + return 'http://192.168.2.174:8080/v1'; } + @override Map flagSmithConfig() { - return { - 'url': 'https://flagsmith.jimber.io/api/v1/', - 'apiKey': 'm3L3gTcQYcFwCzSGxFJJWd' - }; + return { + 'url': 'https://flagsmith.jimber.io/api/v1/', + 'apiKey': 'm3L3gTcQYcFwCzSGxFJJWd' + }; } } diff --git a/app/lib/browser.dart b/app/lib/browser.dart index 356a5ac5..7a604d32 100644 --- a/app/lib/browser.dart +++ b/app/lib/browser.dart @@ -4,13 +4,13 @@ class MyInAppBrowser extends InAppBrowser { @override void onLoadStart(Uri? url) { super.onLoadStart(url); - print("\n\nStarted $url\n\n"); + print('\n\nStarted $url\n\n'); } @override void onLoadStop(Uri? url) { super.onLoadStop(url); - print("\n\nStopped $url\n\n"); + print('\n\nStopped $url\n\n'); } // @override @@ -22,8 +22,8 @@ class MyInAppBrowser extends InAppBrowser { @override void onExit() { super.onExit(); - print("\n\nBrowser closed!\n\n"); + print('\n\nBrowser closed!\n\n'); } } -MyInAppBrowser inAppBrowser = new MyInAppBrowser(); +MyInAppBrowser inAppBrowser = MyInAppBrowser(); diff --git a/app/lib/jrouter.dart b/app/lib/jrouter.dart index 2f836451..6bb77f1d 100644 --- a/app/lib/jrouter.dart +++ b/app/lib/jrouter.dart @@ -106,17 +106,16 @@ class JRouter { return containers; } - List getAppButtons() { - List iconButtons = []; + List getAppButtons() { + List iconButtons = []; routes.forEach((r) { - iconButtons.add(Container( - child: Tab( + iconButtons.add(Tab( icon: Icon( r.route.icon, size: 40, ), text: r.route.name, - ))); + )); }); return iconButtons; } diff --git a/app/lib/main.dart b/app/lib/main.dart index e3e6ced8..f3afb435 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -31,7 +31,12 @@ Future setGlobalValues() async { } class MyApp extends StatelessWidget { - MyApp({required this.initDone, this.doubleName, required this.registered}); + const MyApp({ + super.key, + required this.initDone, + this.doubleName, + required this.registered, + }); final bool initDone; final String? doubleName; From bdd1e9963e9228539bac67170a6b4a45a03cf7d8 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 3 Dec 2023 15:16:26 +0200 Subject: [PATCH 004/457] Cleanup widgets --- app/lib/screens/preference_screen.dart | 2 +- app/lib/widgets/custom_dialog.dart | 64 +++--- .../widgets/email_verification_needed.dart | 14 +- app/lib/widgets/error_widget.dart | 9 +- app/lib/widgets/image_button.dart | 14 +- app/lib/widgets/layout_drawer.dart | 55 ++--- app/lib/widgets/login_dialogs.dart | 8 +- app/lib/widgets/pin_field.dart | 51 ++--- app/lib/widgets/preference_dialog.dart | 188 +++++++++--------- app/lib/widgets/reusable_text_field_step.dart | 17 +- app/lib/widgets/reusable_text_step.dart | 35 ++-- 11 files changed, 228 insertions(+), 229 deletions(-) diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index 65fc9e74..08e1239e 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -361,7 +361,7 @@ class _PreferenceScreenState extends State { showDialog( context: context, builder: (BuildContext context) => CustomDialog( - hiddenaction: copySeedPhrase, + hiddenAction: copySeedPhrase, image: Icons.create, title: "Please write this down on a piece of paper", description: phrase.toString(), diff --git a/app/lib/widgets/custom_dialog.dart b/app/lib/widgets/custom_dialog.dart index 308b3e4e..576514da 100644 --- a/app/lib/widgets/custom_dialog.dart +++ b/app/lib/widgets/custom_dialog.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class CustomDialog extends StatefulWidget { final String? description; @@ -7,15 +6,16 @@ class CustomDialog extends StatefulWidget { final List? actions; final String title; final IconData image; - final dynamic hiddenaction; + final dynamic hiddenAction; - CustomDialog({ + const CustomDialog({ + super.key, required this.title, this.description, this.widgetDescription, this.actions, this.image = Icons.person, - this.hiddenaction, + this.hiddenAction, }); show(context) { @@ -24,13 +24,13 @@ class CustomDialog extends StatefulWidget { barrierDismissible: false, builder: (BuildContext context) => CustomDialog( image: Icons.error, - title: this.title, - description: this.description, - widgetDescription: this.widgetDescription, + title: title, + description: description, + widgetDescription: widgetDescription, actions: [ //@todo make this configurable, ok;okcancel TextButton( - child: new Text("Ok"), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -41,7 +41,7 @@ class CustomDialog extends StatefulWidget { } @override - _CustomDialogState createState() => _CustomDialogState(); + State createState() => _CustomDialogState(); } class _CustomDialogState extends State { @@ -51,13 +51,13 @@ class _CustomDialogState extends State { barrierDismissible: false, builder: (BuildContext context) => CustomDialog( image: Icons.error, - title: this.widget.title, - description: this.widget.description, - widgetDescription: this.widget.widgetDescription, + title: widget.title, + description: widget.description, + widgetDescription: widget.widgetDescription, actions: [ //@todo make this configurable, ok;okcancel TextButton( - child: new Text("Ok"), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -96,12 +96,12 @@ class _CustomDialogState extends State { overlayColor: MaterialStateProperty.all(Colors.transparent), ), onPressed: () { - if (widget.hiddenaction != null) { + if (widget.hiddenAction != null) { timesPressed++; // logger.log('= ' + hiddenaction.toString()); // logger.log('--------------+++++++++ ' + timesPressed.toString()); if (timesPressed >= timesPressedToReveal) { - widget.hiddenaction(); + widget.hiddenAction(); timesPressed = 0; } } @@ -121,20 +121,20 @@ class _CustomDialogState extends State { card(context) { return ConstrainedBox( - constraints: - BoxConstraints(maxHeight: double.infinity, maxWidth: double.infinity), + constraints: const BoxConstraints( + maxHeight: double.infinity, maxWidth: double.infinity), child: Container( - padding: EdgeInsets.only(top: 30.0 + 20.0), - margin: EdgeInsets.only(top: 30.0), - decoration: new BoxDecoration( + padding: const EdgeInsets.only(top: 30.0 + 20.0), + margin: const EdgeInsets.only(top: 30.0), + decoration: BoxDecoration( color: Colors.white, shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(20.0), - boxShadow: [ + boxShadow: const [ BoxShadow( color: Colors.black26, blurRadius: 10.0, - offset: const Offset(0.0, 10.0), + offset: Offset(0.0, 10.0), ), ], ), @@ -143,21 +143,21 @@ class _CustomDialogState extends State { // mainAxisSize: MainAxisSize.min, // To make the card compact children: [ Container( - padding: EdgeInsets.symmetric(horizontal: 20.0), + padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Text( widget.title, - style: TextStyle( + style: const TextStyle( fontSize: 20.0, fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), ), - SizedBox(height: 16.0), + const SizedBox(height: 16.0), ConstrainedBox( constraints: const BoxConstraints(maxHeight: 300, maxWidth: 310), child: Container( - padding: EdgeInsets.symmetric(horizontal: 5.0), + padding: const EdgeInsets.symmetric(horizontal: 5.0), child: (widget.widgetDescription == null) ? Text( widget.description!, @@ -166,20 +166,20 @@ class _CustomDialogState extends State { : widget.widgetDescription, ), ), - SizedBox(height: 24.0), - widget.actions != null && widget.actions!.length > 0 + const SizedBox(height: 24.0), + widget.actions != null && widget.actions!.isNotEmpty ? Container( - decoration: new BoxDecoration( + decoration: BoxDecoration( color: Theme.of(context).scaffoldBackgroundColor, shape: BoxShape.rectangle, - borderRadius: BorderRadius.vertical( + borderRadius: const BorderRadius.vertical( bottom: Radius.circular(20), ), - boxShadow: [ + boxShadow: const [ BoxShadow( color: Colors.black26, blurRadius: 10.0, - offset: const Offset(0.0, 10.0), + offset: Offset(0.0, 10.0), ), ], ), diff --git a/app/lib/widgets/email_verification_needed.dart b/app/lib/widgets/email_verification_needed.dart index 3c026c4f..426f62cb 100644 --- a/app/lib/widgets/email_verification_needed.dart +++ b/app/lib/widgets/email_verification_needed.dart @@ -8,17 +8,17 @@ emailVerificationDialog(context) { barrierDismissible: false, builder: (BuildContext context) => CustomDialog( image: Icons.error, - title: "Please verify email", - description: "Please verify email before using this app", + title: 'Please verify email', + description: 'Please verify email before using this app', actions: [ TextButton( - child: new Text("Ok"), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, ), TextButton( - child: new Text("Resend email"), + child: const Text('Resend email'), onPressed: () async { sendVerificationEmail(); Navigator.pop(context); @@ -36,11 +36,11 @@ emailResentDialog(context) { barrierDismissible: false, builder: (BuildContext context) => CustomDialog( image: Icons.check, - title: "Email has been resent.", - description: "A new verification email has been sent.", + title: 'Email has been resent.', + description: 'A new verification email has been sent.', actions: [ TextButton( - child: new Text("Ok"), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, diff --git a/app/lib/widgets/error_widget.dart b/app/lib/widgets/error_widget.dart index 549b8da6..af15a2ee 100644 --- a/app/lib/widgets/error_widget.dart +++ b/app/lib/widgets/error_widget.dart @@ -5,14 +5,14 @@ Widget getErrorWidget(BuildContext context, FlutterErrorDetails error) { return SafeArea( child: Scaffold( backgroundColor: HexColor('#0f296a'), - body: Column( + body: const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Center( child: Padding( - padding: const EdgeInsets.all(16.0), + padding: EdgeInsets.all(16.0), child: Text( - "Oops something went wrong.", + 'Oops something went wrong.', ), ), ), @@ -21,8 +21,7 @@ Widget getErrorWidget(BuildContext context, FlutterErrorDetails error) { ), Center( child: Padding( - padding: - const EdgeInsets.symmetric(horizontal: 16.0, vertical: 16.0), + padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 16.0), child: Text( 'Please restart the application. If this error persists, please contact support.', textAlign: TextAlign.center, diff --git a/app/lib/widgets/image_button.dart b/app/lib/widgets/image_button.dart index d33e4819..65a2407a 100644 --- a/app/lib/widgets/image_button.dart +++ b/app/lib/widgets/image_button.dart @@ -5,17 +5,17 @@ class ImageButton extends StatefulWidget { final selectedImageId; final callback; - ImageButton(this.imageId, this.selectedImageId, this.callback, {Key? key}) - : super(key: key); + const ImageButton(this.imageId, this.selectedImageId, this.callback, + {super.key}); - _ImageButtonState createState() => _ImageButtonState(); + State createState() => _ImageButtonState(); } class _ImageButtonState extends State { @override Widget build(BuildContext context) { return Container( - decoration: new BoxDecoration( + decoration: BoxDecoration( border: (widget.selectedImageId == widget.imageId) ? Border.all(width: 2, color: Theme.of(context).primaryColor) : Border.all(width: 2, color: Colors.transparent), @@ -25,14 +25,14 @@ class _ImageButtonState extends State { height: 50, child: OutlinedButton( style: OutlinedButton.styleFrom( - padding: EdgeInsets.all(10), - shape: CircleBorder(), + padding: const EdgeInsets.all(10), + shape: const CircleBorder(), ), onPressed: () { widget.callback(widget.imageId); }, child: Image.asset( - 'assets/icons/' + widget.imageId.toString() + '.png', + 'assets/icons/${widget.imageId.toString()}.png', ), ), ); diff --git a/app/lib/widgets/layout_drawer.dart b/app/lib/widgets/layout_drawer.dart index d85d7f51..cf14a024 100644 --- a/app/lib/widgets/layout_drawer.dart +++ b/app/lib/widgets/layout_drawer.dart @@ -2,13 +2,14 @@ import 'package:flutter/material.dart'; import 'package:threebotlogin/helpers/globals.dart'; class LayoutDrawer extends StatefulWidget { - LayoutDrawer({required this.titleText, required this.content}); + const LayoutDrawer( + {super.key, required this.titleText, required this.content}); final String titleText; final Widget content; @override - _LayoutDrawerState createState() => _LayoutDrawerState(); + State createState() => _LayoutDrawerState(); } class _LayoutDrawerState extends State { @@ -22,7 +23,7 @@ class _LayoutDrawerState extends State { // the App.build method, and use it to set our appbar title. title: Text(widget.titleText), backgroundColor: Theme.of(context).primaryColor, - iconTheme: IconThemeData(color: Colors.white), + iconTheme: const IconThemeData(color: Colors.white), toolbarHeight: 60, ), body: widget.content, @@ -33,16 +34,16 @@ class _LayoutDrawerState extends State { // Important: Remove any padding from the ListView. padding: EdgeInsets.zero, children: [ - Container( + const SizedBox( width: 200, height: 100, child: Padding( - padding: const EdgeInsets.all(20), + padding: EdgeInsets.all(20), child: DrawerHeader( decoration: BoxDecoration( - image: new DecorationImage( + image: DecorationImage( alignment: Alignment.center, - image: AssetImage("assets/logo.png"), + image: AssetImage('assets/logo.png'), fit: BoxFit.contain, ), ), @@ -51,14 +52,14 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: Column( + leading: const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(left: 30)), + Padding(padding: EdgeInsets.only(left: 30)), Icon(Icons.home, color: Colors.black, size: 18) ], ), - title: Text('Home'), + title: const Text('Home'), onTap: () { Navigator.pop(context); globals.tabController.animateTo(0); @@ -66,14 +67,14 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: Column( + leading: const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(left: 30)), + Padding(padding: EdgeInsets.only(left: 30)), Icon(Icons.article, color: Colors.black, size: 18) ], ), - title: Text('News'), + title: const Text('News'), onTap: () { Navigator.pop(context); globals.tabController.animateTo(1); @@ -81,15 +82,15 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: Column( + leading: const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(left: 30)), + Padding(padding: EdgeInsets.only(left: 30)), Icon(Icons.account_balance_wallet, color: Colors.black, size: 18) ], ), - title: Text('Wallet'), + title: const Text('Wallet'), onTap: () { Navigator.pop(context); globals.tabController.animateTo(2); @@ -101,7 +102,7 @@ class _LayoutDrawerState extends State { leading: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(left: 30)), + const Padding(padding: EdgeInsets.only(left: 30)), Image.asset( 'assets/server.png', scale: 1.0, @@ -110,7 +111,7 @@ class _LayoutDrawerState extends State { ), ], ), - title: Text('Farming'), + title: const Text('Farming'), onTap: () { Navigator.pop(context); globals.tabController.animateTo(3); @@ -120,14 +121,14 @@ class _LayoutDrawerState extends State { Container(), ListTile( minLeadingWidth: 10, - leading: Column( + leading: const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(left: 30)), + Padding(padding: EdgeInsets.only(left: 30)), Icon(Icons.chat, color: Colors.black, size: 18) ], ), - title: Text('Support'), + title: const Text('Support'), onTap: () { Navigator.pop(context); globals.tabController.animateTo(4); @@ -135,14 +136,14 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: Column( + leading: const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(left: 30)), + Padding(padding: EdgeInsets.only(left: 30)), Icon(Icons.person_outlined, color: Colors.black, size: 18) ], ), - title: Text('Identity'), + title: const Text('Identity'), onTap: () { Navigator.pop(context); globals.tabController.animateTo(5); @@ -150,14 +151,14 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: Column( + leading: const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.only(left: 30)), + Padding(padding: EdgeInsets.only(left: 30)), Icon(Icons.settings, color: Colors.black, size: 18) ], ), - title: Text('Settings'), + title: const Text('Settings'), onTap: () { Navigator.pop(context); globals.tabController.animateTo(6); diff --git a/app/lib/widgets/login_dialogs.dart b/app/lib/widgets/login_dialogs.dart index d1074db9..9c585897 100644 --- a/app/lib/widgets/login_dialogs.dart +++ b/app/lib/widgets/login_dialogs.dart @@ -12,7 +12,7 @@ Future showExpiredDialog(BuildContext ctx) async { 'Your login attempt has expired, please request a new one in your browser.', actions: [ TextButton( - child: Text('Ok'), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -32,7 +32,7 @@ Future showWrongEmojiDialog(BuildContext ctx) async { 'You selected the wrong emoji, please check your browser for the new one.', actions: [ TextButton( - child: Text('Retry'), + child: const Text('Retry'), onPressed: () { Navigator.pop(context); }, @@ -51,7 +51,7 @@ Future showLoggedInDialog(BuildContext ctx) async { description: 'You are now logged in. Please return to your browser.', actions: [ TextButton( - child: Text('Ok'), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -71,7 +71,7 @@ Future showSignedInDialog(BuildContext ctx) async { 'The data has been successfully signed. Please return to your browser.', actions: [ TextButton( - child: Text('Ok'), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, diff --git a/app/lib/widgets/pin_field.dart b/app/lib/widgets/pin_field.dart index 69751c07..778617b2 100644 --- a/app/lib/widgets/pin_field.dart +++ b/app/lib/widgets/pin_field.dart @@ -8,17 +8,18 @@ class PinField extends StatefulWidget { final callbackParam; final Function? callbackFunction; - PinField( - {Key? key, - @required this.callback, + const PinField( + {super.key, + required this.callback, this.callbackParam, - this.callbackFunction}) - : super(key: key); + this.callbackFunction}); - _PinFieldState createState() => _PinFieldState(); + @override + State createState() => _PinFieldState(); } class _PinFieldState extends State { + @override void initState() { super.initState(); if (widget.callbackFunction != null) { @@ -36,34 +37,37 @@ class _PinFieldState extends State { margin: EdgeInsets.all(height / 120), height: height / 50, width: size, - decoration: BoxDecoration(color: Colors.black, shape: BoxShape.circle), - duration: Duration(milliseconds: 100), + decoration: + const BoxDecoration(color: Colors.black, shape: BoxShape.circle), + duration: const Duration(milliseconds: 100), curve: Curves.bounceInOut, ); } Widget buildNumberPin(String buttonText, BuildContext context, - {Color backgroundColor= Colors.blueGrey}) { + {Color backgroundColor = Colors.blueGrey}) { var onPressedMethod = () => handleInput(buttonText); double height = MediaQuery.of(context).size.height; - if (buttonText == 'OK') + if (buttonText == 'OK') { onPressedMethod = (input.length >= widget.pinLength ? () => onOk() : () {}); - if (buttonText == 'C') - onPressedMethod = (input.length >= 1 ? () => onClear() : () {}); + } + if (buttonText == 'C') { + onPressedMethod = (input.isNotEmpty ? () => onClear() : () {}); + } return Container( padding: EdgeInsets.only(top: height / 136, bottom: height / 136), child: Center( child: RawMaterialButton( - padding: EdgeInsets.all(12), + padding: const EdgeInsets.all(12), + onPressed: onPressedMethod, + fillColor: backgroundColor, + shape: const CircleBorder(), child: Text( buttonText, - style: TextStyle(color: Colors.white, fontSize: 20), + style: const TextStyle(color: Colors.white, fontSize: 20), ), - onPressed: onPressedMethod, - fillColor: backgroundColor, - shape: CircleBorder(), ))); } @@ -84,21 +88,22 @@ class _PinFieldState extends State { ]; List pins = List.generate(possibleInput.length, (int i) { String buttonText = possibleInput[i]; - if (buttonText == 'C') + if (buttonText == 'C') { return buildNumberPin(possibleInput[i], context, - backgroundColor: input.length >= 1 + backgroundColor: input.isNotEmpty ? Colors.yellow.shade700 : Colors.yellow.shade200); - else if (buttonText == 'OK') + } else if (buttonText == 'OK') { return buildNumberPin(possibleInput[i], context, backgroundColor: input.length >= widget.pinLength ? Colors.green.shade600 : Colors.green.shade100); - else + } else { return buildNumberPin(possibleInput[i], context, backgroundColor: HexColor('#0a73b8')); + } }); - return Container( + return SizedBox( width: double.infinity, child: Center( child: Column( @@ -140,7 +145,7 @@ class _PinFieldState extends State { Widget build(BuildContext context) { return Column(children: [ generateTextFields(context), - SizedBox(height: 25), + const SizedBox(height: 25), generateNumbers(context), ]); } diff --git a/app/lib/widgets/preference_dialog.dart b/app/lib/widgets/preference_dialog.dart index e7d0ca47..ea7a3863 100644 --- a/app/lib/widgets/preference_dialog.dart +++ b/app/lib/widgets/preference_dialog.dart @@ -13,9 +13,10 @@ class PreferenceDialog extends StatefulWidget { final Function? callback; final String? type; - PreferenceDialog({this.scope, this.appId, this.callback, this.type}); + const PreferenceDialog( + {super.key, this.scope, this.appId, this.callback, this.type}); - _PreferenceDialogState createState() => _PreferenceDialogState(); + State createState() => _PreferenceDialogState(); } class _PreferenceDialogState extends State { @@ -113,16 +114,16 @@ class _PreferenceDialogState extends State { void initializeDropDown() { getWallets().then((value) { setState(() { - if (value.length != 0) { + if (value.isNotEmpty) { wallets = value; - if (wallets.length != 0) { + if (wallets.isNotEmpty) { _selectedItem = wallets[0].address; toggleScope('walletAddressData', _selectedItem); _menuItems = List.generate( wallets.length, (i) => DropdownMenuItem( value: wallets[i].address, - child: Text("${wallets[i].name}"), + child: Text(wallets[i].name), ), ); } else { @@ -153,14 +154,14 @@ class _PreferenceDialogState extends State { if (scopeAsMap[scopeItem] != null) { bool mandatory = scopeAsMap[scopeItem]; switch (scopeItem) { - case "doubleName": + case 'doubleName': return FutureBuilder( future: getDoubleName(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -178,28 +179,28 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "${scopeItem.toUpperCase()}" + - (mandatory ? " *" : ""), - style: TextStyle( + scopeItem.toUpperCase() + + (mandatory ? ' *' : ''), + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), ); } else { - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); } }, ); - case "email": + case 'email': return FutureBuilder( future: getEmail(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -217,23 +218,23 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "${scopeItem.toUpperCase()}" + - (mandatory ? " *" : ""), - style: TextStyle( + scopeItem.toUpperCase() + + (mandatory ? ' *' : ''), + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), ); } else { - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); } }, ); - case "digitalTwin": + case 'digitalTwin': return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -250,22 +251,28 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "${scopeItem.toUpperCase()}" + - (mandatory ? " *" : ""), - style: TextStyle( + scopeItem.toUpperCase() + (mandatory ? ' *' : ''), + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), ); - case "phone": + case 'phone': return FutureBuilder( future: getPhone(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( + decoration: const BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey, + width: 0.5, + )), + ), child: CheckboxListTile( value: (previousSelectedScope[scopeItem] == null) @@ -277,34 +284,27 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "PHONE NUMBER" + (mandatory ? " *" : ""), - style: TextStyle( + 'PHONE NUMBER${(mandatory ? " *" : "")}', + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey, - width: 0.5, - )), - ), ); } else { - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); } }, ); - case "derivedSeed": + case 'derivedSeed': return FutureBuilder( future: getDerivedSeed(widget.appId!), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -322,28 +322,28 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "${scopeItem.toUpperCase()}" + - (mandatory ? " *" : ""), - style: TextStyle( + scopeItem.toUpperCase() + + (mandatory ? ' *' : ''), + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), ); } else { - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); } }, ); - case "identityName": + case 'identityName': return FutureBuilder( future: getIdentity(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -361,27 +361,27 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "NAME (IDENTITY)" + (mandatory ? " *" : ""), - style: TextStyle( + 'NAME (IDENTITY)${(mandatory ? " *" : "")}', + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), ); } else { - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); } }, ); - case "identityDOB": + case 'identityDOB': return FutureBuilder( future: getIdentity(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -399,28 +399,27 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "DATE OF BIRTH (IDENTITY)" + - (mandatory ? " *" : ""), - style: TextStyle( + 'DATE OF BIRTH (IDENTITY)${(mandatory ? " *" : "")}', + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), ); } else { - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); } }, ); - case "identityGender": + case 'identityGender': return FutureBuilder( future: getIdentity(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -438,28 +437,27 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "GENDER (IDENTITY)" + - (mandatory ? " *" : ""), - style: TextStyle( + 'GENDER (IDENTITY)${(mandatory ? " *" : "")}', + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), ); } else { - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); } }, ); - case "identityDocumentMeta": + case 'identityDocumentMeta': return FutureBuilder( future: getIdentity(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -477,28 +475,27 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "DOCUMENT META DATA (IDENTITY)" + - (mandatory ? " *" : ""), - style: TextStyle( + 'DOCUMENT META DATA (IDENTITY)${(mandatory ? " *" : "")}', + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), ); } else { - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); } }, ); - case "identityCountry": + case 'identityCountry': return FutureBuilder( future: getIdentity(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -516,21 +513,20 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "COUNTRY (IDENTITY)" + - (mandatory ? " *" : ""), - style: TextStyle( + 'COUNTRY (IDENTITY)${(mandatory ? " *" : "")}', + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), ), ); } else { - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); } }, ); - case "walletAddress": + case 'walletAddress': return FutureBuilder( future: getWallets(), builder: @@ -538,14 +534,14 @@ class _PreferenceDialogState extends State { if (!snapshot.hasData || snapshot.data.length == 0) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, width: 0.5, )), ), - padding: EdgeInsets.only( + padding: const EdgeInsets.only( left: 16, right: 25, top: 8), child: Column( children: [ @@ -554,24 +550,24 @@ class _PreferenceDialogState extends State { MainAxisAlignment.spaceBetween, children: [ Text( - "${scopeItem.toUpperCase()}" + - (mandatory ? " *" : ""), - style: TextStyle( + scopeItem.toUpperCase() + + (mandatory ? ' *' : ''), + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black, fontSize: 16), ), - Icon( + const Icon( Icons.warning, size: 24, color: Colors.red, ), ], ), - Padding( + const Padding( padding: EdgeInsets.only(bottom: 6)), - Row(children: [ + const Row(children: [ Flexible( child: Text( 'The wallet inside ThreeFold Connect should have been opened at least once.', @@ -584,7 +580,7 @@ class _PreferenceDialogState extends State { } return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border( bottom: BorderSide( color: Colors.grey, @@ -615,9 +611,9 @@ class _PreferenceDialogState extends State { toggleScope(scopeItem, value); }), title: Text( - "${scopeItem.toUpperCase()}" + - (mandatory ? " *" : ""), - style: TextStyle( + scopeItem.toUpperCase() + + (mandatory ? ' *' : ''), + style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.black), ), @@ -626,10 +622,10 @@ class _PreferenceDialogState extends State { ), Row( children: [ - Padding( + const Padding( padding: EdgeInsets.only(left: 16), ), - Container( + SizedBox( width: MediaQuery.of(context) .size .width * @@ -655,7 +651,7 @@ class _PreferenceDialogState extends State { }); } } - return SizedBox(width: 0, height: 0); + return const SizedBox(width: 0, height: 0); }, )) : const Text('No extra permissions needed.'), @@ -668,20 +664,18 @@ class _PreferenceDialogState extends State { return Container(); } - return Container( - child: Column( - children: [ - Container( - padding: EdgeInsets.all(8), - child: Text( - '${widget.appId} would like to access', - style: TextStyle(fontWeight: FontWeight.bold), - textAlign: TextAlign.center, - ), + return Column( + children: [ + Container( + padding: const EdgeInsets.all(8), + child: Text( + '${widget.appId} would like to access', + style: const TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, ), - Container(child: scopeList(context)) - ], - ), + ), + Container(child: scopeList(context)) + ], ); } } diff --git a/app/lib/widgets/reusable_text_field_step.dart b/app/lib/widgets/reusable_text_field_step.dart index ef5e465d..d96207eb 100644 --- a/app/lib/widgets/reusable_text_field_step.dart +++ b/app/lib/widgets/reusable_text_field_step.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; class ReuseableTextFieldStep extends StatelessWidget { - ReuseableTextFieldStep( - {required this.titleText, + const ReuseableTextFieldStep( + {super.key, + required this.titleText, required this.labelText, required this.focusNode, required this.controller, @@ -25,9 +26,9 @@ class ReuseableTextFieldStep extends StatelessWidget { children: [ Text( titleText, - style: TextStyle(fontWeight: FontWeight.bold), + style: const TextStyle(fontWeight: FontWeight.bold), ), - Divider( + const Divider( height: 50, ), Padding( @@ -40,7 +41,7 @@ class ReuseableTextFieldStep extends StatelessWidget { border: OutlineInputBorder(), labelText: labelText, suffixText: suffixText, - suffixStyle: TextStyle(fontWeight: FontWeight.bold), + suffixStyle: const TextStyle(fontWeight: FontWeight.bold), ), controller: controller, ), @@ -48,16 +49,16 @@ class ReuseableTextFieldStep extends StatelessWidget { Row( children: [ Padding( - padding: EdgeInsets.only(top: 10), + padding: const EdgeInsets.only(top: 10), child: Text( errorStepperText, - style: TextStyle(color: Colors.red), + style: const TextStyle(color: Colors.red), textAlign: TextAlign.left, ), ), ], ), - Divider( + const Divider( height: 50, ), ], diff --git a/app/lib/widgets/reusable_text_step.dart b/app/lib/widgets/reusable_text_step.dart index 86024292..b868052b 100644 --- a/app/lib/widgets/reusable_text_step.dart +++ b/app/lib/widgets/reusable_text_step.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; class ReuseableTextStep extends StatelessWidget { - ReuseableTextStep( - {required this.titleText, + const ReuseableTextStep( + {super.key, + required this.titleText, required this.extraText, required this.errorStepperText}); @@ -17,20 +18,19 @@ class ReuseableTextStep extends StatelessWidget { Text( titleText, ), - Divider( + const Divider( height: 50, ), Padding( padding: const EdgeInsets.only(top: 8.5), - child: Container( - child: Center( - child: Card( - child: Padding( - padding: const EdgeInsets.all(5), - child: Text( - extraText, - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 24), - ), + child: Center( + child: Card( + child: Padding( + padding: const EdgeInsets.all(5), + child: Text( + extraText, + style: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 24), ), ), ), @@ -39,22 +39,21 @@ class ReuseableTextStep extends StatelessWidget { Row( children: [ Padding( - padding: EdgeInsets.only(top: 10), + padding: const EdgeInsets.only(top: 10), child: Text( errorStepperText, - style: TextStyle(color: Colors.red), + style: const TextStyle(color: Colors.red), textAlign: TextAlign.left, ), ), ], ), - Divider( + const Divider( height: 5, ), - Row( + const Row( mainAxisAlignment: MainAxisAlignment.start, - children: const [ - ], + children: [], ) ], ); From 612cf724ac07aba551355ca4e70d103d87533d0c Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 3 Dec 2023 17:05:42 +0200 Subject: [PATCH 005/457] Cleanup services dir --- app/lib/services/3bot_service.dart | 14 ++-- app/lib/services/identity_service.dart | 34 +++++----- app/lib/services/open_kyc_service.dart | 58 ++++++++++------ .../services/shared_preference_service.dart | 8 +-- app/lib/services/socket_service.dart | 68 +++++++++---------- app/lib/services/tools_service.dart | 28 ++++---- app/lib/services/uni_link_service.dart | 6 +- 7 files changed, 114 insertions(+), 102 deletions(-) diff --git a/app/lib/services/3bot_service.dart b/app/lib/services/3bot_service.dart index 65a66511..f652a786 100644 --- a/app/lib/services/3bot_service.dart +++ b/app/lib/services/3bot_service.dart @@ -18,7 +18,7 @@ Future sendSignedData(String state, String socketRoom, Uri url = Uri.parse('$threeBotApiUrl/signedSignDataAttempt'); print('Sending call: ${url.toString()}'); - String timestamp = new DateTime.now().millisecondsSinceEpoch.toString(); + String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); Uint8List sk = await getPrivateKey(); String encodedBody = jsonEncode({ @@ -78,12 +78,12 @@ Future sendPublicKey(Map data) async { Uri url = Uri.parse('$threeBotApiUrl/savederivedpublickey'); print('Sending call: ${url.toString()}'); - String timestamp = new DateTime.now().millisecondsSinceEpoch.toString(); + String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); Uint8List sk = await getPrivateKey(); Map headers = { - "timestamp": timestamp, - "intention": "post-savederivedpublickey" + 'timestamp': timestamp, + 'intention': 'post-savederivedpublickey' }; String signedHeaders = await signData(jsonEncode(headers), sk); @@ -104,7 +104,7 @@ Future sendProductReservation(Map data) async { String signedData = await signData(jsonEncode(data), sk); - var body = json.encode({"doubleName": doubleName, "data": signedData}); + var body = json.encode({'doubleName': doubleName, 'data': signedData}); return await http .put(url, body: body, headers: {'Content-type': 'application/json'}); } @@ -193,7 +193,7 @@ Future finishRegistration( return http.post(url, body: json.encode({ - 'doubleName': doubleName + '.3bot', + 'doubleName': '${doubleName}.3bot', 'sid': sid, 'email': email.toLowerCase().trim(), 'public_key': publicKey @@ -240,7 +240,7 @@ Future activateDigitalTwin( Uint8List privateKey = await getPrivateKey(); String signedData = await signData(jsonEncode(jsonObject), privateKey); - var body = json.encode({"doubleName": doubleName, "data": signedData}); + var body = json.encode({'doubleName': doubleName, 'data': signedData}); return await http .post(url, body: body, headers: {'Content-type': 'application/json'}); } diff --git a/app/lib/services/identity_service.dart b/app/lib/services/identity_service.dart index 5d2a7426..abd0264e 100644 --- a/app/lib/services/identity_service.dart +++ b/app/lib/services/identity_service.dart @@ -1,48 +1,48 @@ String getFullNameOfObject(Map identityName) { + String firstName = identityName['first_name'] ?? ''; + String middleName = identityName['middle_name'] ?? ''; + String lastName = identityName['last_name'] ?? ''; - String firstName = identityName['first_name'] != null ? identityName['first_name'] : ''; - String middleName = identityName['middle_name'] != null ? identityName['middle_name'] : ''; - String lastName = identityName['last_name'] != null ? identityName['last_name'] : ''; - - return firstName + ' ' + middleName + ' ' + lastName; + return '$firstName $middleName $lastName'; } -String getCorrectState(int step, emailVerified, phoneVerified, identityVerified) { - if(step == 1) { - if(!emailVerified) { +String getCorrectState( + int step, emailVerified, phoneVerified, identityVerified) { + if (step == 1) { + if (!emailVerified) { return 'CurrentPhase'; } return 'Verified'; } - if(step == 2) { - if(!emailVerified && !phoneVerified) { + if (step == 2) { + if (!emailVerified && !phoneVerified) { return 'Unverified'; } - if(emailVerified && !phoneVerified) { + if (emailVerified && !phoneVerified) { return 'CurrentPhase'; } return 'Verified'; } - if(step == 3) { - if(identityVerified) { + if (step == 3) { + if (identityVerified) { return 'Verified'; } - if(!emailVerified) { + if (!emailVerified) { return 'Unverified'; } - if(!phoneVerified) { + if (!phoneVerified) { return 'Unverified'; } - if(emailVerified && phoneVerified && !identityVerified) { + if (emailVerified && phoneVerified && !identityVerified) { return 'CurrentPhase'; } } return ''; -} \ No newline at end of file +} diff --git a/app/lib/services/open_kyc_service.dart b/app/lib/services/open_kyc_service.dart index 85aa8d93..1ab4d53f 100644 --- a/app/lib/services/open_kyc_service.dart +++ b/app/lib/services/open_kyc_service.dart @@ -14,10 +14,13 @@ String threeBotFrontEndUrl = AppConfig().threeBotFrontEndUrl(); Map requestHeaders = {'Content-type': 'application/json'}; Future getSignedEmailIdentifierFromOpenKYC(String doubleName) async { - String timestamp = new DateTime.now().millisecondsSinceEpoch.toString(); + String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); Uint8List sk = await getPrivateKey(); - Map payload = {"timestamp": timestamp, "intention": "get-signedemailidentifier"}; + Map payload = { + 'timestamp': timestamp, + 'intention': 'get-signedemailidentifier' + }; String signedPayload = await signData(jsonEncode(payload), sk); Map loginRequestHeaders = { @@ -32,10 +35,13 @@ Future getSignedEmailIdentifierFromOpenKYC(String doubleName) async { } Future getSignedPhoneIdentifierFromOpenKYC(String doubleName) async { - String timestamp = new DateTime.now().millisecondsSinceEpoch.toString(); + String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); Uint8List sk = await getPrivateKey(); - Map payload = {"timestamp": timestamp, "intention": "get-signedphoneidentifier"}; + Map payload = { + 'timestamp': timestamp, + 'intention': 'get-signedphoneidentifier' + }; String signedPayload = await signData(jsonEncode(payload), sk); Map loginRequestHeaders = { @@ -49,13 +55,14 @@ Future getSignedPhoneIdentifierFromOpenKYC(String doubleName) async { return http.get(url, headers: loginRequestHeaders); } -Future getSignedIdentityIdentifierFromOpenKYC(String doubleName) async { - String timestamp = new DateTime.now().millisecondsSinceEpoch.toString(); +Future getSignedIdentityIdentifierFromOpenKYC( + String doubleName) async { + String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); Uint8List sk = await getPrivateKey(); Map payload = { - "timestamp": timestamp, - "intention": "get-identity-kyc-data-identifiers" + 'timestamp': timestamp, + 'intention': 'get-identity-kyc-data-identifiers' }; String signedPayload = await signData(jsonEncode(payload), sk); @@ -71,20 +78,24 @@ Future getSignedIdentityIdentifierFromOpenKYC(String doubleName) async return http.get(url, headers: loginRequestHeaders); } -Future verifySignedEmailIdentifier(String signedEmailIdentifier) async { +Future verifySignedEmailIdentifier( + String signedEmailIdentifier) async { Uri url = Uri.parse('$openKycApiUrl/verification/verify-sei'); print('Sending call: ${url.toString()}'); return http.post(url, - body: json.encode({"signedEmailIdentifier": signedEmailIdentifier}), headers: requestHeaders); + body: json.encode({'signedEmailIdentifier': signedEmailIdentifier}), + headers: requestHeaders); } -Future verifySignedPhoneIdentifier(String signedPhoneIdentifier) async { +Future verifySignedPhoneIdentifier( + String signedPhoneIdentifier) async { Uri url = Uri.parse('$openKycApiUrl/verification/verify-spi'); print('Sending call: ${url.toString()}'); return http.post(url, - body: json.encode({"signedPhoneIdentifier": signedPhoneIdentifier}), headers: requestHeaders); + body: json.encode({'signedPhoneIdentifier': signedPhoneIdentifier}), + headers: requestHeaders); } Future verifySignedIdentityIdentifier( @@ -99,12 +110,13 @@ Future verifySignedIdentityIdentifier( return http.post(url, body: json.encode({ - "signedIdentityNameIdentifier": signedIdentityNameIdentifier, - "signedIdentityCountryIdentifier": signedIdentityCountryIdentifier, - "signedIdentityDOBIdentifier": signedIdentityDOBIdentifier, - "signedIdentityDocumentMetaIdentifier": signedIdentityDocumentMetaIdentifier, - "signedIdentityGenderIdentifier": signedIdentityGenderIdentifier, - "reference": reference + 'signedIdentityNameIdentifier': signedIdentityNameIdentifier, + 'signedIdentityCountryIdentifier': signedIdentityCountryIdentifier, + 'signedIdentityDOBIdentifier': signedIdentityDOBIdentifier, + 'signedIdentityDocumentMetaIdentifier': + signedIdentityDocumentMetaIdentifier, + 'signedIdentityGenderIdentifier': signedIdentityGenderIdentifier, + 'reference': reference }), headers: requestHeaders); } @@ -141,7 +153,7 @@ Future getShuftiAccessToken() async { return; } - String encodedBody = json.encode({"signedPhoneIdentifier": phoneMap['spi']}); + String encodedBody = json.encode({'signedPhoneIdentifier': phoneMap['spi']}); Uri url = Uri.parse('$openKycApiUrl/verification/shufti-access-token'); print('Sending call: ${url.toString()}'); @@ -192,7 +204,10 @@ Future updateEmailAddressOfUser() async { String timestamp = new DateTime.now().millisecondsSinceEpoch.toString(); Uint8List sk = await getPrivateKey(); - Map payload = {"timestamp": timestamp, "intention": "change-email"}; + Map payload = { + 'timestamp': timestamp, + 'intention': 'change-email' + }; String signedPayload = await signData(jsonEncode(payload), sk); Map email = await getEmail(); @@ -202,7 +217,8 @@ Future updateEmailAddressOfUser() async { 'Jimber-Authorization': signedPayload }; - String encodedBody = jsonEncode({'username': await getDoubleName(), "email": email['email']}); + String encodedBody = + jsonEncode({'username': await getDoubleName(), 'email': email['email']}); Uri url = Uri.parse('$threeBotApiUrl/users/change-email'); print('Sending call: ${url.toString()}'); diff --git a/app/lib/services/shared_preference_service.dart b/app/lib/services/shared_preference_service.dart index b7eb4fcc..de8893fd 100644 --- a/app/lib/services/shared_preference_service.dart +++ b/app/lib/services/shared_preference_service.dart @@ -30,11 +30,11 @@ Future getPublicKey() async { var userInfoResponse = await getUserInfo(await getDoubleName()); if (userInfoResponse.statusCode != 200) { - throw new Exception('User not found'); + throw Exception('User not found'); } var userInfo = json.decode(userInfoResponse.body); - var done = await prefs.setString("publickey", userInfo['publicKey']); + var done = await prefs.setString('publickey', userInfo['publicKey']); if (done && prefs.getString('publickey') == userInfo['publicKey']) { setPublicKeyFixed(); @@ -413,12 +413,12 @@ Future getInitDone() async { Future savePreviousState(String state) async { final SharedPreferences prefs = await SharedPreferences.getInstance(); - return await prefs.setString("previousState", state); + return await prefs.setString('previousState', state); } Future getPreviousState() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); - return prefs.getString("previousState"); + return prefs.getString('previousState'); } /// diff --git a/app/lib/services/socket_service.dart b/app/lib/services/socket_service.dart index 8039d393..dfe316da 100644 --- a/app/lib/services/socket_service.dart +++ b/app/lib/services/socket_service.dart @@ -55,7 +55,7 @@ class BackendConnection { socket.on('login', (dynamic data) async { print('[login]'); - int currentTimestamp = new DateTime.now().millisecondsSinceEpoch; + int currentTimestamp = DateTime.now().millisecondsSinceEpoch; if (data['created'] != null && ((currentTimestamp - data['created']) / 1000) > @@ -118,10 +118,10 @@ Future emailVerification(BuildContext context) async { } Map body = jsonDecode(response.body); - String? signedEmailIdentifier = body["signed_email_identifier"]; + String? signedEmailIdentifier = body['signed_email_identifier']; if (signedEmailIdentifier == null || signedEmailIdentifier.isEmpty) { - await saveEmail(email["email"]!, null); + await saveEmail(email['email']!, null); } var vSei = jsonDecode( @@ -133,17 +133,17 @@ Future emailVerification(BuildContext context) async { } await setIsEmailVerified(true); - await saveEmail(vSei["email"], signedEmailIdentifier); + await saveEmail(vSei['email'], signedEmailIdentifier); showDialog( context: context, builder: (BuildContext context) => CustomDialog( image: Icons.email, - title: "Email verified", - description: "Your email has been verified!", + title: 'Email verified', + description: 'Your email has been verified!', actions: [ TextButton( - child: new Text("Ok"), + child: new Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -167,9 +167,9 @@ Future phoneVerification(BuildContext context) async { } Map body = jsonDecode(response.body); - String? signedPhoneIdentifier = body["signed_phone_identifier"]; + String? signedPhoneIdentifier = body['signed_phone_identifier']; if (signedPhoneIdentifier == null || signedPhoneIdentifier.isEmpty) { - await savePhone(phone["phone"]!, null); + await savePhone(phone['phone']!, null); } var vSpi = jsonDecode( @@ -181,17 +181,17 @@ Future phoneVerification(BuildContext context) async { } await setIsPhoneVerified(true); - await savePhone(vSpi["phone"], signedPhoneIdentifier); + await savePhone(vSpi['phone'], signedPhoneIdentifier); showDialog( context: context, builder: (BuildContext context) => CustomDialog( image: Icons.phone_android, - title: "Phone verified", - description: "Your phone has been verified!", + title: 'Phone verified', + description: 'Your phone has been verified!', actions: [ TextButton( - child: new Text("Ok"), + child: new Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -208,12 +208,12 @@ Future showIdentityMessage(BuildContext context, String type) async { context: context, builder: (BuildContext context) => CustomDialog( image: Icons.warning, - title: "Identity verify timed out", + title: 'Identity verify timed out', description: - "Your verification attempt has expired, please retry and finish the flow in under 10 minutes.", + 'Your verification attempt has expired, please retry and finish the flow in under 10 minutes.', actions: [ TextButton( - child: new Text("Ok"), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -227,12 +227,12 @@ Future showIdentityMessage(BuildContext context, String type) async { context: context, builder: (BuildContext context) => CustomDialog( image: Icons.warning, - title: "Identity verify failed", + title: 'Identity verify failed', description: - "Something went wrong.\nIf this issue persist, please contact support", + 'Something went wrong.\nIf this issue persist, please contact support', actions: [ TextButton( - child: new Text("Ok"), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -246,11 +246,11 @@ Future showIdentityMessage(BuildContext context, String type) async { context: context, builder: (BuildContext context) => CustomDialog( image: Icons.check, - title: "Identity verified", - description: "Your identity has been verified successfully", + title: 'Identity verified', + description: 'Your identity has been verified successfully', actions: [ TextButton( - child: new Text("Ok"), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -272,15 +272,15 @@ Future identityVerification(String reference) async { Map identifiersData = json.decode(response.body); String signedIdentityNameIdentifier = - identifiersData["signed_identity_name_identifier"]; + identifiersData['signed_identity_name_identifier']; String signedIdentityCountryIdentifier = - identifiersData["signed_identity_country_identifier"]; + identifiersData['signed_identity_country_identifier']; String signedIdentityDOBIdentifier = - identifiersData["signed_identity_dob_identifier"]; + identifiersData['signed_identity_dob_identifier']; String signedIdentityDocumentMetaIdentifier = - identifiersData["signed_identity_document_meta_identifier"]; + identifiersData['signed_identity_document_meta_identifier']; String signedIdentityGenderIdentifier = - identifiersData["signed_identity_gender_identifier"]; + identifiersData['signed_identity_gender_identifier']; if (signedIdentityNameIdentifier.isEmpty || signedIdentityCountryIdentifier.isEmpty || @@ -301,15 +301,15 @@ Future identityVerification(String reference) async { .body); var verifiedSignedIdentityNameIdentifier = - jsonDecode(identifiers["signedIdentityNameIdentifierVerified"]); + jsonDecode(identifiers['signedIdentityNameIdentifierVerified']); var verifiedSignedIdentityCountryIdentifier = - jsonDecode(identifiers["signedIdentityCountryIdentifierVerified"]); + jsonDecode(identifiers['signedIdentityCountryIdentifierVerified']); var verifiedSignedIdentityDOBIdentifier = - jsonDecode(identifiers["signedIdentityDOBIdentifierVerified"]); + jsonDecode(identifiers['signedIdentityDOBIdentifierVerified']); var verifiedSignedIdentityDocumentMetaIdentifier = - jsonDecode(identifiers["signedIdentityDocumentMetaIdentifierVerified"]); + jsonDecode(identifiers['signedIdentityDocumentMetaIdentifierVerified']); var verifiedSignedIdentityGenderIdentifier = - jsonDecode(identifiers["signedIdentityGenderIdentifierVerified"]); + jsonDecode(identifiers['signedIdentityGenderIdentifierVerified']); if (verifiedSignedIdentityNameIdentifier == null || verifiedSignedIdentityNameIdentifier['identifier'].toString() != @@ -373,7 +373,7 @@ Future openSign(BuildContext ctx, Sign signData, ctx, MaterialPageRoute( builder: (context) => AuthenticationScreen( - correctPin: pin!, userMessage: "Please enter your PIN code"), + correctPin: pin!, userMessage: 'Please enter your PIN code'), ), ); @@ -418,7 +418,7 @@ Future openLogin(BuildContext ctx, Login loginData, MaterialPageRoute( builder: (context) => AuthenticationScreen( correctPin: pin!, - userMessage: "Please enter your PIN code.", + userMessage: 'Please enter your PIN code.', loginData: loginData), ), ); diff --git a/app/lib/services/tools_service.dart b/app/lib/services/tools_service.dart index e479242b..84ad1aa3 100644 --- a/app/lib/services/tools_service.dart +++ b/app/lib/services/tools_service.dart @@ -5,11 +5,11 @@ import 'dart:math'; import 'package:device_info_plus/device_info_plus.dart'; -const chars = "abcdefghijklmnopqrstuvwxyz0123456789"; +const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; String randomString(int len) { - Random rnd = new Random(new DateTime.now().millisecondsSinceEpoch); - String result = ""; + Random rnd = Random(DateTime.now().millisecondsSinceEpoch); + String result = ''; for (int i = 0; i < len; i++) { result += chars[rnd.nextInt(chars.length)]; @@ -19,16 +19,16 @@ String randomString(int len) { } bool validateEmail(String? value) { - RegExp regex = new RegExp( + RegExp regex = RegExp( r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,253}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,253}[a-zA-Z0-9])?)*$"); return regex.hasMatch(value.toString()); } bool validateSeedWords(String seed, String confirmationWords) { - List words = confirmationWords.split(" "); - List seedWords = seed.split(" "); + List words = confirmationWords.split(' '); + List seedWords = seed.split(' '); - // if lenght is not correct return already here + // if length is not correct return already here if (words.length != 3) return false; for (final String word in words) { @@ -42,7 +42,7 @@ bool validateSeedWords(String seed, String confirmationWords) { bool validateDoubleName(String value) { Pattern pattern = r'^[a-zA-Z0-9]+$'; - RegExp regex = new RegExp(pattern.toString()); + RegExp regex = RegExp(pattern.toString()); if (!regex.hasMatch(value)) { return false; @@ -70,15 +70,11 @@ Future getDeviceInfo() async { String info = ''; if (Platform.isIOS) { IosDeviceInfo i = await deviceInfoPlugin.iosInfo; - info = 'IOS_' + i.systemVersion.toString(); + info = 'IOS_${i.systemVersion.toString()}'; } else if (Platform.isAndroid) { AndroidDeviceInfo i = await deviceInfoPlugin.androidInfo; - info = 'ANDROID_' + - i.brand.toString().replaceAll(' ', '').toUpperCase() + - '_' + - i.model.toString().replaceAll(' ', '').toUpperCase() + - '_SDK' + - i.version.sdkInt.toString(); + info = + 'ANDROID_${i.brand.toString().replaceAll(" ", "").toUpperCase()}_${i.model.toString().replaceAll(" ", "").toUpperCase()}_SDK${i.version.sdkInt}'; } return info; @@ -86,6 +82,6 @@ Future getDeviceInfo() async { extension BoolParsing on String { bool parseBool() { - return this.toLowerCase() == 'true'; + return toLowerCase() == 'true'; } } diff --git a/app/lib/services/uni_link_service.dart b/app/lib/services/uni_link_service.dart index 0a97109b..0cf5acc9 100644 --- a/app/lib/services/uni_link_service.dart +++ b/app/lib/services/uni_link_service.dart @@ -35,7 +35,7 @@ void handleLoginUniLink(Uri link, BuildContext context) async { String? jsonScope = link.queryParameters['scope']; String? state = link.queryParameters['state']; - if (jsonScope == null && (state == null || state == "undefined")) { + if (jsonScope == null && (state == null || state == 'undefined')) { return; } @@ -52,7 +52,7 @@ void handleLoginUniLink(Uri link, BuildContext context) async { context, MaterialPageRoute( builder: (context) => AuthenticationScreen( - correctPin: pin!, userMessage: "Please enter your PIN code"), + correctPin: pin!, userMessage: 'Please enter your PIN code'), ), ); @@ -121,7 +121,7 @@ Future handleSignUniLink(Uri link, BuildContext context) async { context, MaterialPageRoute( builder: (context) => AuthenticationScreen( - correctPin: pin!, userMessage: "Please enter your PIN code"), + correctPin: pin!, userMessage: 'Please enter your PIN code'), ), ); From 2be8fd2a11e76533880c00aa2c4c3cf72edec8e2 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 4 Dec 2023 18:20:15 +0200 Subject: [PATCH 006/457] Clean up the screens --- app/lib/screens/authentication_screen.dart | 6 +- app/lib/screens/error_screen.dart | 18 +- app/lib/screens/home_screen.dart | 40 ++-- .../screens/identity_verification_screen.dart | 8 +- app/lib/screens/init_screen.dart | 19 +- app/lib/screens/login_screen.dart | 7 +- app/lib/screens/main_screen.dart | 8 +- .../screens/mobile_registration_screen.dart | 27 +-- app/lib/screens/preference_screen.dart | 82 ++++---- app/lib/screens/recover_screen.dart | 8 +- app/lib/screens/registered_screen.dart | 40 ++-- app/lib/screens/scan_screen.dart | 32 +-- app/lib/screens/sign_screen.dart | 175 ++++++++--------- app/lib/screens/successful_screen.dart | 21 +- app/lib/screens/unregistered_screen.dart | 183 +++++++++--------- app/lib/screens/warning_screen.dart | 38 ++-- 16 files changed, 353 insertions(+), 359 deletions(-) diff --git a/app/lib/screens/authentication_screen.dart b/app/lib/screens/authentication_screen.dart index ee7abc97..63c5833c 100644 --- a/app/lib/screens/authentication_screen.dart +++ b/app/lib/screens/authentication_screen.dart @@ -179,7 +179,7 @@ class AuthenticationScreenState extends State { backgroundColor: HexColor('#0a73b8')); } }); - return Container( + return SizedBox( width: double.infinity, child: Center( child: Column( @@ -260,7 +260,7 @@ class AuthenticationScreenState extends State { pin += char; } - int currentTime = new DateTime.now().millisecondsSinceEpoch; + int currentTime = DateTime.now().millisecondsSinceEpoch; if (globals.incorrectPincodeAttempts >= 3 && (globals.tooManyAuthenticationAttempts && @@ -296,7 +296,7 @@ class AuthenticationScreenState extends State { 'Too many incorrect attempts, please wait ${((globals.lockedUntill - currentTime) / 1000).toStringAsFixed(0)} seconds', ); } else { - dialog = CustomDialog( + dialog = const CustomDialog( title: 'Incorrect pin', description: 'Your pin code is incorrect.', ); diff --git a/app/lib/screens/error_screen.dart b/app/lib/screens/error_screen.dart index 96ec0345..ef3f2218 100644 --- a/app/lib/screens/error_screen.dart +++ b/app/lib/screens/error_screen.dart @@ -3,13 +3,13 @@ import 'package:package_info_plus/package_info_plus.dart'; import 'package:threebotlogin/helpers/globals.dart'; class ErrorScreen extends StatefulWidget { + const ErrorScreen({super.key, this.errorScreen, this.errorMessage = ''}); + final Widget? errorScreen; final String errorMessage; - ErrorScreen({Key? key, this.errorScreen, this.errorMessage = ''}) - : super(key: key); - - _ErrorScreenState createState() => _ErrorScreenState(); + @override + State createState() => _ErrorScreenState(); } class _ErrorScreenState extends State { @@ -29,7 +29,7 @@ class _ErrorScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('Error'), + title: const Text('Error'), elevation: 0.0, ), body: Column( @@ -41,21 +41,21 @@ class _ErrorScreenState extends State { Icon( Icons.warning, size: 42.0, - color: Theme.of(context).errorColor, + color: Theme.of(context).colorScheme.error, ), - SizedBox( + const SizedBox( height: 20.0, ), Text(widget.errorMessage.isEmpty ? 'Please update the app before continuing' : widget.errorMessage), - SizedBox( + const SizedBox( height: 60.0, ), Expanded( child: Container(), ), - Text('v ' + version + (Globals.isInDebugMode ? '-DEBUG' : '')), + Text('v $version${Globals.isInDebugMode ? '-DEBUG' : ''}'), ], ), ); diff --git a/app/lib/screens/home_screen.dart b/app/lib/screens/home_screen.dart index 0cfb11ab..d87a46b7 100644 --- a/app/lib/screens/home_screen.dart +++ b/app/lib/screens/home_screen.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_svg/svg.dart'; //import 'package:threebotlogin/apps/free_flow_pages/ffp.dart'; @@ -31,12 +30,12 @@ import 'package:uni_links/uni_links.dart'; /* Screen shows tab bar and all pages defined in router.dart */ class HomeScreen extends StatefulWidget { + const HomeScreen({super.key, this.initialLink, this.backendConnection}); final String? initialLink; final BackendConnection? backendConnection; - HomeScreen({this.initialLink, this.backendConnection}); - - _HomeScreenState createState() => _HomeScreenState(); + @override + State createState() => _HomeScreenState(); } class _HomeScreenState extends State @@ -60,7 +59,7 @@ class _HomeScreenState extends State MaterialPageRoute( builder: (context) => AuthenticationScreen( correctPin: pin!, - userMessage: "Please enter your PIN code", + userMessage: 'Please enter your PIN code', ), ), ); @@ -68,7 +67,7 @@ class _HomeScreenState extends State pinCheckOpen = false; if (authenticated != null && authenticated) { - lastCheck = new DateTime.now().millisecondsSinceEpoch; + lastCheck = DateTime.now().millisecondsSinceEpoch; timeoutExpiredInBackground = false; globals.tabController.animateTo(indexIfAuthIsSuccess); } @@ -123,11 +122,11 @@ class _HomeScreenState extends State Events().onEvent(GoHomeEvent().runtimeType, close); Events().onEvent(GoHomeEvent().runtimeType, (GoHomeEvent event) { - globals.tabController.animateTo(0, duration: Duration(seconds: 0)); + globals.tabController.animateTo(0, duration: const Duration(seconds: 0)); }); Events().onEvent(GoNewsEvent().runtimeType, (GoNewsEvent event) { - globals.tabController.animateTo(1, duration: Duration(seconds: 0)); + globals.tabController.animateTo(1, duration: const Duration(seconds: 0)); }); // Needed to hardcode this to prevent double tapping and gaining access without knowing the pincode with the current logic that was implemented. @@ -144,16 +143,16 @@ class _HomeScreenState extends State }); Events().onEvent(GoSupportEvent().runtimeType, (GoSupportEvent event) { - globals.tabController.animateTo(3, duration: Duration(seconds: 0)); + globals.tabController.animateTo(3, duration: const Duration(seconds: 0)); }); Events().onEvent(GoSettingsEvent().runtimeType, (GoSettingsEvent event) { - globals.tabController.animateTo(4, duration: Duration(seconds: 0)); + globals.tabController.animateTo(4, duration: const Duration(seconds: 0)); }); Events().onEvent(GoReservationsEvent().runtimeType, (GoReservationsEvent event) { - globals.tabController.animateTo(5, duration: Duration(seconds: 0)); + globals.tabController.animateTo(5, duration: const Duration(seconds: 0)); }); Events().onEvent(NewLoginEvent().runtimeType, (NewLoginEvent event) { @@ -171,7 +170,8 @@ class _HomeScreenState extends State Events().onEvent(IdentityCallbackEvent().runtimeType, (IdentityCallbackEvent event) async { Future(() { - globals.tabController.animateTo(0, duration: Duration(seconds: 0)); + globals.tabController + .animateTo(0, duration: const Duration(seconds: 0)); showIdentityMessage(context, event.type!); }); }); @@ -198,7 +198,7 @@ class _HomeScreenState extends State } int timeSpendWithPausedApp = - new DateTime.now().millisecondsSinceEpoch - lastCheck; + DateTime.now().millisecondsSinceEpoch - lastCheck; if (timeSpendWithPausedApp >= pinCheckTimeout) { timeoutExpiredInBackground = true; @@ -211,7 +211,7 @@ class _HomeScreenState extends State } } else if (state == AppLifecycleState.inactive) { } else if (state == AppLifecycleState.paused) { - lastCheck = new DateTime.now().millisecondsSinceEpoch; + lastCheck = DateTime.now().millisecondsSinceEpoch; } } @@ -234,16 +234,18 @@ class _HomeScreenState extends State @override Widget build(BuildContext context) { return Scaffold( + resizeToAvoidBottomInset: false, appBar: PreferredSize( - child: new AppBar( + preferredSize: const Size.fromHeight(0), + child: AppBar( automaticallyImplyLeading: true, - backgroundColor: HexColor("#2d4052"), + backgroundColor: HexColor('#2d4052'), ), - preferredSize: Size.fromHeight(0), ), body: DefaultTabController( length: Globals().router.routes.length, child: WillPopScope( + onWillPop: onWillPop, child: Scaffold( body: Stack( children: [ @@ -256,16 +258,14 @@ class _HomeScreenState extends State SafeArea( child: TabBarView( controller: globals.tabController, - physics: NeverScrollableScrollPhysics(), + physics: const NeverScrollableScrollPhysics(), children: Globals().router.getContent(), )), ], ), ), - onWillPop: onWillPop, ), ), - resizeToAvoidBottomInset: false, ); } diff --git a/app/lib/screens/identity_verification_screen.dart b/app/lib/screens/identity_verification_screen.dart index 173413bc..e353c352 100644 --- a/app/lib/screens/identity_verification_screen.dart +++ b/app/lib/screens/identity_verification_screen.dart @@ -22,7 +22,10 @@ import 'package:country_picker/country_picker.dart'; import 'package:threebotlogin/widgets/phone_widget.dart'; class IdentityVerificationScreen extends StatefulWidget { - _IdentityVerificationScreenState createState() => + const IdentityVerificationScreen({super.key}); + + @override + State createState() => _IdentityVerificationScreenState(); } @@ -936,8 +939,7 @@ class _IdentityVerificationScreenState try { Response accessTokenResponse = await getShuftiAccessToken(); - if (accessTokenResponse.statusCode == 403 || - accessTokenResponse == null) { + if (accessTokenResponse.statusCode == 403) { setState(() { isLoading = false; }); diff --git a/app/lib/screens/init_screen.dart b/app/lib/screens/init_screen.dart index e6957af0..f94b5281 100644 --- a/app/lib/screens/init_screen.dart +++ b/app/lib/screens/init_screen.dart @@ -4,10 +4,10 @@ import 'package:threebotlogin/app_config.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; class InitScreen extends StatefulWidget { - InitScreen(); + const InitScreen({super.key}); @override - _InitState createState() => _InitState(); + State createState() => _InitState(); } class _InitState extends State { @@ -15,29 +15,30 @@ class _InitState extends State { late InAppWebView iaWebView; finish(List params) async { - print("**** LOAD DONE "); + print('**** LOAD DONE '); saveInitDone(); Navigator.pop(context, true); } addHandler() { - webView.addJavaScriptHandler(handlerName: "FINISH", callback: finish); + webView.addJavaScriptHandler(handlerName: 'FINISH', callback: finish); } _InitState() { iaWebView = InAppWebView( initialUrlRequest: URLRequest( - url: Uri.parse(AppConfig().wizardUrl() + - '?cache_buster=' + - new DateTime.now().millisecondsSinceEpoch.toString())), + url: Uri.parse( + '${AppConfig().wizardUrl()}?cache_buster=${DateTime.now().millisecondsSinceEpoch}')), initialOptions: InAppWebViewGroupOptions( - android: AndroidInAppWebViewOptions(supportMultipleWindows: true, useHybridComposition: true), + android: AndroidInAppWebViewOptions( + supportMultipleWindows: true, useHybridComposition: true), ), onWebViewCreated: (InAppWebViewController controller) { webView = controller; addHandler(); }, - onCreateWindow: (InAppWebViewController controller, CreateWindowAction req) { + onCreateWindow: + (InAppWebViewController controller, CreateWindowAction req) { return Future.value(true); }, onLoadStart: (InAppWebViewController controller, Uri? url) {}, diff --git a/app/lib/screens/login_screen.dart b/app/lib/screens/login_screen.dart index 84a30d65..75df317a 100644 --- a/app/lib/screens/login_screen.dart +++ b/app/lib/screens/login_screen.dart @@ -18,11 +18,12 @@ import 'package:threebotlogin/widgets/login_dialogs.dart'; import 'package:threebotlogin/widgets/preference_dialog.dart'; class LoginScreen extends StatefulWidget { - final Login loginData; + const LoginScreen(this.loginData, {super.key}); - LoginScreen(this.loginData); + final Login loginData; - _LoginScreenState createState() => _LoginScreenState(); + @override + State createState() => _LoginScreenState(); } class _LoginScreenState extends State with BlockAndRunMixin { diff --git a/app/lib/screens/main_screen.dart b/app/lib/screens/main_screen.dart index 1566ed37..57b62f68 100644 --- a/app/lib/screens/main_screen.dart +++ b/app/lib/screens/main_screen.dart @@ -19,13 +19,13 @@ import 'package:threebotlogin/widgets/error_widget.dart'; import 'package:uni_links/uni_links.dart'; class MainScreen extends StatefulWidget { + const MainScreen({super.key, this.initDone, this.registered}); + final bool? initDone; final bool? registered; - const MainScreen({this.initDone, this.registered}); - @override - _AppState createState() => _AppState(); + State createState() => _AppState(); } class _AppState extends State { @@ -239,7 +239,7 @@ class _AppState extends State { try { String baseUrl = AppConfig().baseUrl(); final List result = - await InternetAddress.lookup('$baseUrl') + await InternetAddress.lookup(baseUrl) .timeout(Duration(seconds: Globals().timeOutSeconds)); if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) { diff --git a/app/lib/screens/mobile_registration_screen.dart b/app/lib/screens/mobile_registration_screen.dart index 29cc9390..8cc742b0 100644 --- a/app/lib/screens/mobile_registration_screen.dart +++ b/app/lib/screens/mobile_registration_screen.dart @@ -19,11 +19,12 @@ import 'package:threebotlogin/widgets/reusable_text_field_step.dart'; import 'package:threebotlogin/widgets/reusable_text_step.dart'; class MobileRegistrationScreen extends StatefulWidget { - final String? doubleName; + const MobileRegistrationScreen({super.key, this.doubleName}); - MobileRegistrationScreen({this.doubleName}); + final String? doubleName; - _MobileRegistrationScreenState createState() => + @override + State createState() => _MobileRegistrationScreenState(); } @@ -52,7 +53,7 @@ class _MobileRegistrationScreenState extends State { final FocusNode emailFocus = FocusNode(); final FocusNode seedFocus = FocusNode(); - RegistrationData _registrationData = RegistrationData(); + final RegistrationData _registrationData = RegistrationData(); @override void initState() { @@ -101,8 +102,8 @@ class _MobileRegistrationScreenState extends State { doubleNameController.text = doubleNameValue; }); - if (doubleNameController.text != null || doubleNameController.text != '') { - _registrationData.doubleName = doubleNameController.text + '.3bot'; + if (doubleNameController.text.isNotEmpty) { + _registrationData.doubleName = '${doubleNameController.text}.3bot'; bool doubleNameValidation = validateDoubleName(doubleNameController.text); if (doubleNameValidation) { Response userInfoResult = @@ -200,7 +201,7 @@ class _MobileRegistrationScreenState extends State { } initKeys() async { - if (_registrationData.phrase == null || _registrationData.phrase == '') { + if (_registrationData.phrase == '') { _registrationData.phrase = await generateSeedPhrase(); } } @@ -524,9 +525,9 @@ class _MobileRegistrationScreenState extends State { Padding( padding: const EdgeInsets.only(top: 8.0, bottom: 4.0), child: ListTile( - leading: Icon(Icons.person), + leading: const Icon(Icons.person), title: Text(doubleNameController.text), - trailing: Icon(Icons.edit), + trailing: const Icon(Icons.edit), onTap: () => setState(() { state = _State.DoubleName; FocusScope.of(context).requestFocus(nameFocus); @@ -536,9 +537,9 @@ class _MobileRegistrationScreenState extends State { Padding( padding: const EdgeInsets.only(top: 4.0, bottom: 15.0), child: ListTile( - leading: Icon(Icons.email), + leading: const Icon(Icons.email), title: Text(emailController.text), - trailing: Icon(Icons.edit), + trailing: const Icon(Icons.edit), onTap: () => setState(() { state = _State.Email; FocusScope.of(context).requestFocus(emailFocus); @@ -582,10 +583,10 @@ class _MobileRegistrationScreenState extends State { ? Row( children: [ Padding( - padding: EdgeInsets.only(top: 10), + padding: const EdgeInsets.only(top: 10), child: Text( errorStepperText, - style: TextStyle(color: Colors.red), + style: const TextStyle(color: Colors.red), textAlign: TextAlign.left, ), ), diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index 08e1239e..a801a761 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -19,10 +19,10 @@ import 'package:threebotlogin/widgets/layout_drawer.dart'; import 'package:url_launcher/url_launcher.dart'; class PreferenceScreen extends StatefulWidget { - PreferenceScreen({Key? key}) : super(key: key); + const PreferenceScreen({super.key}); @override - _PreferenceScreenState createState() => _PreferenceScreenState(); + State createState() => _PreferenceScreenState(); } class _PreferenceScreenState extends State { @@ -31,11 +31,7 @@ class _PreferenceScreenState extends State { String doubleName = ''; String phrase = ''; bool showAdvancedOptions = false; - Icon showAdvancedOptionsIcon = Icon(Icons.keyboard_arrow_down); - - String emailAdress = ''; - String phoneAdress = ''; - String identity = ''; + Icon showAdvancedOptionsIcon = const Icon(Icons.keyboard_arrow_down); BuildContext? preferenceContext; bool biometricsCheck = false; @@ -91,11 +87,11 @@ class _PreferenceScreenState extends State { ), ListView( children: [ - ListTile( - title: Text("Global settings"), + const ListTile( + title: Text('Global settings'), ), ListTile( - leading: Icon(Icons.person), + leading: const Icon(Icons.person), title: Text(doubleName), ), FutureBuilder( @@ -103,12 +99,12 @@ class _PreferenceScreenState extends State { builder: (context, snapshot) { if (snapshot.hasData) { return ListTile( - trailing: Padding( - padding: new EdgeInsets.only(right: 7.5), + trailing: const Padding( + padding: EdgeInsets.only(right: 7.5), child: Icon(Icons.visibility), ), - leading: Icon(Icons.vpn_key), - title: Text("Show phrase"), + leading: const Icon(Icons.vpn_key), + title: const Text('Show phrase'), onTap: () async { _showPhrase(); }, @@ -127,7 +123,7 @@ class _PreferenceScreenState extends State { future: getBiometricDeviceName(), builder: (context, snapshot) { if (snapshot.hasData) { - if (snapshot.data == "Not found") { + if (snapshot.data == 'Not found') { return Container(); } biometricDeviceName = snapshot.data; @@ -153,37 +149,37 @@ class _PreferenceScreenState extends State { } }), ListTile( - leading: Icon(Icons.lock), - title: Text("Change pincode"), + leading: const Icon(Icons.lock), + title: const Text('Change pincode'), onTap: () async { _changePincode(); }, ), ListTile( - leading: Icon(Icons.perm_device_information), - title: Text("Version: " + version + " - " + buildNumber), + leading: const Icon(Icons.perm_device_information), + title: Text('Version: $version - $buildNumber'), onTap: () { _showVersionInfo(); }, ), ListTile( - leading: Icon(Icons.info_outline), - title: Text("Terms and conditions"), + leading: const Icon(Icons.info_outline), + title: const Text('Terms and conditions'), onTap: () async => {await _showTermsAndConds()}, ), ExpansionTile( - title: Text( - "Advanced settings", + title: const Text( + 'Advanced settings', style: TextStyle(color: Colors.black), ), children: [ ListTile( - leading: Icon(Icons.person), - title: Text( - "Remove Account From Device", + leading: const Icon(Icons.person), + title: const Text( + 'Remove Account From Device', style: TextStyle(color: Colors.red), ), - trailing: Icon( + trailing: const Icon( Icons.remove_circle, color: Colors.red, ), @@ -207,12 +203,12 @@ class _PreferenceScreenState extends State { context: context, builder: (BuildContext context) => CustomDialog( image: Icons.error, - title: "Disable Fingerprint", + title: 'Disable Fingerprint', description: - "Are you sure you want to deactivate fingerprint as authentication method?", + 'Are you sure you want to deactivate fingerprint as authentication method?', actions: [ TextButton( - child: new Text("Cancel"), + child: const Text('Cancel'), onPressed: () async { Navigator.pop(context); finger = true; @@ -221,7 +217,7 @@ class _PreferenceScreenState extends State { }, ), TextButton( - child: new Text("Yes"), + child: const Text('Yes'), onPressed: () async { Navigator.pop(context); finger = false; @@ -239,18 +235,18 @@ class _PreferenceScreenState extends State { context: context, builder: (BuildContext context) => CustomDialog( image: Icons.error, - title: "Are you sure?", + title: 'Are you sure?', description: - "If you confirm, your account will be removed from this device. You can always recover your account with your username and phrase.", + 'If you confirm, your account will be removed from this device. You can always recover your account with your username and phrase.', actions: [ TextButton( - child: new Text("Cancel"), + child: const Text('Cancel'), onPressed: () { Navigator.pop(context); }, ), TextButton( - child: new Text("Yes"), + child: const Text('Yes'), onPressed: () async { // try { // String deviceID = await _listener.getToken(); @@ -351,7 +347,7 @@ class _PreferenceScreenState extends State { MaterialPageRoute( builder: (context) => AuthenticationScreen( correctPin: pin!, - userMessage: "Please enter your PIN code", + userMessage: 'Please enter your PIN code', ), )); @@ -363,12 +359,12 @@ class _PreferenceScreenState extends State { builder: (BuildContext context) => CustomDialog( hiddenAction: copySeedPhrase, image: Icons.create, - title: "Please write this down on a piece of paper", + title: 'Please write this down on a piece of paper', description: phrase.toString(), actions: [ // usually buttons at the bottom of the dialog TextButton( - child: new Text("Close"), + child: new Text('Close'), onPressed: () { Navigator.pop(context); setState(() {}); @@ -388,7 +384,7 @@ class _PreferenceScreenState extends State { MaterialPageRoute( builder: (context) => AuthenticationScreen( correctPin: pin!, - userMessage: "Please enter your PIN code", + userMessage: 'Please enter your PIN code', ), ), ); @@ -412,7 +408,7 @@ class _PreferenceScreenState extends State { MaterialPageRoute( builder: (context) => AuthenticationScreen( correctPin: pin, - userMessage: "Please enter your PIN code", + userMessage: 'Please enter your PIN code', ), ), ); @@ -434,11 +430,11 @@ class _PreferenceScreenState extends State { context: context, builder: (BuildContext context) => CustomDialog( image: Icons.check, - title: "Success", - description: "Your pincode was successfully changed.", + title: 'Success', + description: 'Your pincode was successfully changed.', actions: [ TextButton( - child: new Text("Ok"), + child: new Text('Ok'), onPressed: () async { Navigator.pop(context); }, diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index ad285780..66f1669b 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -14,11 +14,12 @@ import 'package:threebotlogin/services/pkid_service.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; class RecoverScreen extends StatefulWidget { - final Widget? recoverScreen; + const RecoverScreen({super.key, this.recoverScreen}); - RecoverScreen({Key? key, this.recoverScreen}) : super(key: key); + final Widget? recoverScreen; - _RecoverScreenState createState() => _RecoverScreenState(); + @override + State createState() => _RecoverScreenState(); } class _RecoverScreenState extends State { @@ -91,6 +92,7 @@ class _RecoverScreenState extends State { } } + @override void initState() { super.initState(); } diff --git a/app/lib/screens/registered_screen.dart b/app/lib/screens/registered_screen.dart index 00f28c36..7f2f701d 100644 --- a/app/lib/screens/registered_screen.dart +++ b/app/lib/screens/registered_screen.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:threebotlogin/widgets/layout_drawer.dart'; class RegisteredScreen extends StatefulWidget { - static final RegisteredScreen _singleton = new RegisteredScreen._internal(); + static final RegisteredScreen _singleton = RegisteredScreen._internal(); factory RegisteredScreen() { return _singleton; @@ -13,7 +12,8 @@ class RegisteredScreen extends StatefulWidget { //init } - _RegisteredScreenState createState() => _RegisteredScreenState(); + @override + State createState() => _RegisteredScreenState(); } class _RegisteredScreenState extends State @@ -30,7 +30,7 @@ class _RegisteredScreenState extends State content: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Container( + SizedBox( height: MediaQuery.of(context).size.height * 0.8, width: MediaQuery.of(context).size.width, child: Column( @@ -39,44 +39,42 @@ class _RegisteredScreenState extends State Container( width: 300.0, height: 90.0, - decoration: BoxDecoration( + decoration: const BoxDecoration( image: DecorationImage( fit: BoxFit.fill, image: AssetImage('assets/logo.png')), ), ), - SizedBox(height: 30), + const SizedBox(height: 30), Container( width: 200.0, height: 200.0, - decoration: BoxDecoration( + decoration: const BoxDecoration( image: DecorationImage( fit: BoxFit.fill, image: AssetImage('assets/threefold_registered.png')), ), ), - SizedBox(height: 30), - Container( + const SizedBox(height: 30), + SizedBox( width: MediaQuery.of(context).size.width / 1.75, child: RichText( textAlign: TextAlign.center, - text: new TextSpan( - style: new TextStyle( + text: const TextSpan( + style: TextStyle( fontSize: 18.0, color: Colors.black, ), children: [ - new TextSpan(text: 'Welcome to the\n'), - new TextSpan( + TextSpan(text: 'Welcome to the\n'), + TextSpan( text: 'ThreeFold Connect App! \n', - style: - new TextStyle(fontWeight: FontWeight.bold)), - new TextSpan(text: 'Click on the '), - new TextSpan( + style: TextStyle(fontWeight: FontWeight.bold)), + TextSpan(text: 'Click on the '), + TextSpan( text: 'menu ', - style: - new TextStyle(fontWeight: FontWeight.bold)), - new TextSpan(text: 'icon \n to get started'), + style: TextStyle(fontWeight: FontWeight.bold)), + TextSpan(text: 'icon \n to get started'), ]), ), ), @@ -89,7 +87,7 @@ class _RegisteredScreenState extends State void updatePreference(bool preference) { setState(() { - this.showPreference = preference; + showPreference = preference; }); } } diff --git a/app/lib/screens/scan_screen.dart b/app/lib/screens/scan_screen.dart index 9978b4fd..670aeaec 100644 --- a/app/lib/screens/scan_screen.dart +++ b/app/lib/screens/scan_screen.dart @@ -1,14 +1,15 @@ -import 'dart:ui'; - import 'package:flutter/material.dart'; import 'package:qr_code_scanner/qr_code_scanner.dart'; class ScanScreen extends StatefulWidget { - _ScanScreenState createState() => _ScanScreenState(); + const ScanScreen({super.key}); + + @override + State createState() => _ScanScreenState(); } class _ScanScreenState extends State { - String helperText = "Aim at QR code to scan"; + String helperText = 'Aim at QR code to scan'; bool popped = false; final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); @@ -52,25 +53,26 @@ class _ScanScreenState extends State { child: Container( decoration: BoxDecoration( color: Theme.of(context).primaryColor, - borderRadius: BorderRadius.only( + borderRadius: const BorderRadius.only( topLeft: Radius.circular(20.0), topRight: Radius.circular(20.0))), - padding: EdgeInsets.symmetric(vertical: 18.0, horizontal: 24.0), + padding: + const EdgeInsets.symmetric(vertical: 18.0, horizontal: 24.0), width: double.infinity, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ FloatingActionButton( - tooltip: "Go back", + tooltip: 'Go back', backgroundColor: Colors.transparent, elevation: 0.0, mini: true, onPressed: () { Navigator.pop(context); }, - child: Icon(Icons.arrow_back_ios), + child: const Icon(Icons.arrow_back_ios), ), - Text( + const Text( 'Scan QR', textAlign: TextAlign.center, style: TextStyle( @@ -78,7 +80,7 @@ class _ScanScreenState extends State { fontWeight: FontWeight.bold, fontSize: 21.0), ), - SizedBox( + const SizedBox( width: 60.0, ) ], @@ -92,10 +94,10 @@ class _ScanScreenState extends State { child: Container( decoration: BoxDecoration( color: Theme.of(context).scaffoldBackgroundColor, - borderRadius: BorderRadius.only( + borderRadius: const BorderRadius.only( topLeft: Radius.circular(20.0), topRight: Radius.circular(20.0))), - padding: EdgeInsets.only(top: 12.0, bottom: 12.0), + padding: const EdgeInsets.only(top: 12.0, bottom: 12.0), width: double.infinity, child: Column( children: [ @@ -105,13 +107,13 @@ class _ScanScreenState extends State { child: Center( child: Text( helperText, - style: TextStyle(fontSize: 16.0), + style: const TextStyle(fontSize: 16.0), ), ), ), AnimatedContainer( - duration: Duration(milliseconds: 100), - padding: EdgeInsets.only(bottom: 12), + duration: const Duration(milliseconds: 100), + padding: const EdgeInsets.only(bottom: 12), curve: Curves.bounceInOut, width: double.infinity, child: null, diff --git a/app/lib/screens/sign_screen.dart b/app/lib/screens/sign_screen.dart index bfc1576e..5df38aaf 100644 --- a/app/lib/screens/sign_screen.dart +++ b/app/lib/screens/sign_screen.dart @@ -20,11 +20,12 @@ import 'package:threebotlogin/services/tools_service.dart'; import 'package:threebotlogin/widgets/custom_dialog.dart'; class SignScreen extends StatefulWidget { - final Sign signData; + const SignScreen(this.signData, {super.key}); - SignScreen(this.signData); + final Sign signData; - _SignScreenState createState() => _SignScreenState(); + @override + State createState() => _SignScreenState(); } class _SignScreenState extends State with BlockAndRunMixin { @@ -81,18 +82,16 @@ class _SignScreenState extends State with BlockAndRunMixin { backgroundColor: Theme.of(context).primaryColor, title: const Text('Sign'), ), - body: Container( - child: Column( - children: [ - Container( - constraints: BoxConstraints( - minHeight: MediaQuery.of(context).size.height * 0.85, - minWidth: MediaQuery.of(context).size.width * 0.85), - padding: const EdgeInsets.all(20), - child: isDataLoading == true ? loadContainer() : mainLayout(), - ), - ], - ), + body: Column( + children: [ + Container( + constraints: BoxConstraints( + minHeight: MediaQuery.of(context).size.height * 0.85, + minWidth: MediaQuery.of(context).size.width * 0.85), + padding: const EdgeInsets.all(20), + child: isDataLoading == true ? loadContainer() : mainLayout(), + ), + ], ), ), onWillPop: () { @@ -129,7 +128,7 @@ class _SignScreenState extends State with BlockAndRunMixin { Widget wasNotMeButton() { return TextButton( child: Text( - "It wasn\'t me - cancel", + "It wasn't me - cancel", style: TextStyle(fontSize: 16.0, color: HexColor('#0f296a')), ), onPressed: () { @@ -157,7 +156,7 @@ class _SignScreenState extends State with BlockAndRunMixin { text: ' wants you to sign a data document. The Title of the document is: \n \n'), TextSpan( - text: widget.signData.friendlyName! + '\n', + text: '${widget.signData.friendlyName!}\n', style: const TextStyle( fontSize: 14, fontWeight: FontWeight.bold)), ]), @@ -178,109 +177,101 @@ class _SignScreenState extends State with BlockAndRunMixin { isBusy = false; setState(() {}); errorMessage = 'Cant verify hash'; - return Container( - child: const Text( + return const Text( "Can't verify hash, please cancel this sign attempt", style: TextStyle( fontWeight: FontWeight.bold, color: Colors.red, fontSize: 15), - )); + ); } if (errorMessage == null) { return jsonDataView(); } - return Container( - child: const Text( + return const Text( 'Failed to load the data', style: TextStyle( fontWeight: FontWeight.bold, color: Colors.red, fontSize: 15), - )); + ); } catch (e) { - return Container( - child: const Text( + return const Text( 'Failed to parse the data', style: TextStyle( fontWeight: FontWeight.bold, color: Colors.red, fontSize: 15), - )); + ); } } Widget fileLayout() { - return Container( - child: Column( - children: [ - const SizedBox( - height: 40, - ), - const Text( - 'You can download the document for review here', - style: TextStyle(fontWeight: FontWeight.w600), - ), - const SizedBox( - height: 15, - ), - downloadButton(), - const SizedBox( - height: 15, - ), - isBusy ? const CircularProgressIndicator() : Container(), - isBusy - ? const SizedBox( - height: 10, - ) - : Container(), - Text( - updateMessage, - style: const TextStyle( - color: Colors.orange, fontWeight: FontWeight.bold), - ) - ], - ), + return Column( + children: [ + const SizedBox( + height: 40, + ), + const Text( + 'You can download the document for review here', + style: TextStyle(fontWeight: FontWeight.w600), + ), + const SizedBox( + height: 15, + ), + downloadButton(), + const SizedBox( + height: 15, + ), + isBusy ? const CircularProgressIndicator() : Container(), + isBusy + ? const SizedBox( + height: 10, + ) + : Container(), + Text( + updateMessage, + style: const TextStyle( + color: Colors.orange, fontWeight: FontWeight.bold), + ) + ], ); } Widget signButton() { - return Container( - child: Column( - children: [ - const SizedBox(height: 20), - ElevatedButton( - style: ElevatedButton.styleFrom( - minimumSize: const Size.fromHeight(50), - ), - child: const Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.assignment_turned_in_outlined), - Padding(padding: EdgeInsets.only(left: 20)), - Text( - 'SIGN', - style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold), - ) - ], - ), - onPressed: () async { - if (errorMessage != null) { - return await areYouSure(); - } + return Column( + children: [ + const SizedBox(height: 20), + ElevatedButton( + style: ElevatedButton.styleFrom( + minimumSize: const Size.fromHeight(50), + ), + child: const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.assignment_turned_in_outlined), + Padding(padding: EdgeInsets.only(left: 20)), + Text( + 'SIGN', + style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + ) + ], + ), + onPressed: () async { + if (errorMessage != null) { + return await areYouSure(); + } - String randomRoom = widget.signData.randomRoom!; - String appId = widget.signData.appId!; - String state = widget.signData.state!; + String randomRoom = widget.signData.randomRoom!; + String appId = widget.signData.appId!; + String state = widget.signData.state!; - Uint8List sk = await getPrivateKey(); - String signedData = await signData(widget.signData.dataUrl!, sk); + Uint8List sk = await getPrivateKey(); + String signedData = await signData(widget.signData.dataUrl!, sk); - await sendSignedData( - state, randomRoom, signedData, appId, newHash); + await sendSignedData(state, randomRoom, signedData, appId, newHash); - Navigator.pop(context, true); - Events().emit(PopAllSignEvent(emitCode)); - }, - ) - ], - ), + Navigator.pop(context, true); + Events().emit(PopAllSignEvent(emitCode)); + }, + ) + ], ); } diff --git a/app/lib/screens/successful_screen.dart b/app/lib/screens/successful_screen.dart index 67692f4f..04270612 100644 --- a/app/lib/screens/successful_screen.dart +++ b/app/lib/screens/successful_screen.dart @@ -3,17 +3,18 @@ import 'package:threebotlogin/events/events.dart'; import 'package:threebotlogin/events/pop_all_login_event.dart'; class SuccessfulScreen extends StatefulWidget { + const SuccessfulScreen({super.key, required this.title, required this.text}); + final String title; final String text; - SuccessfulScreen({required this.title, required this.text}); - - _SuccessfulScreenState createState() => _SuccessfulScreenState(); + @override + State createState() => _SuccessfulScreenState(); } class _SuccessfulScreenState extends State { _SuccessfulScreenState() { - Events().onEvent(PopAllLoginEvent("").runtimeType, close); + Events().onEvent(PopAllLoginEvent('').runtimeType, close); } close(PopAllLoginEvent e) { @@ -25,12 +26,12 @@ class _SuccessfulScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: new AppBar( + appBar: AppBar( backgroundColor: Theme.of(context).primaryColor, - title: new Text("Recovered"), + title: const Text('Recovered'), ), body: Container( - padding: EdgeInsets.only(top: 24.0, bottom: 38.0), + padding: const EdgeInsets.only(top: 24.0, bottom: 38.0), child: Center( child: Column( mainAxisSize: MainAxisSize.min, @@ -40,14 +41,14 @@ class _SuccessfulScreenState extends State { size: 42.0, color: Theme.of(context).colorScheme.secondary, ), - SizedBox( + const SizedBox( height: 20.0, ), Text( widget.text, - style: TextStyle(fontSize: 18), + style: const TextStyle(fontSize: 18), ), - SizedBox( + const SizedBox( height: 60.0, ), ], diff --git a/app/lib/screens/unregistered_screen.dart b/app/lib/screens/unregistered_screen.dart index 9dcb979c..9b8a63bd 100644 --- a/app/lib/screens/unregistered_screen.dart +++ b/app/lib/screens/unregistered_screen.dart @@ -1,6 +1,5 @@ //import 'package:community_material_icon/community_material_icon.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_svg/svg.dart'; import 'package:threebotlogin/helpers/flags.dart'; import 'package:threebotlogin/screens/change_pin_screen.dart'; @@ -9,9 +8,10 @@ import 'package:threebotlogin/screens/recover_screen.dart'; import 'package:threebotlogin/screens/successful_screen.dart'; class UnregisteredScreen extends StatefulWidget { - UnregisteredScreen(); + const UnregisteredScreen({super.key}); - _UnregisteredScreenState createState() => _UnregisteredScreenState(); + @override + State createState() => _UnregisteredScreenState(); } class _UnregisteredScreenState extends State @@ -19,14 +19,17 @@ class _UnregisteredScreenState extends State _UnregisteredScreenState(); Future startRegistration() async { - final bool? registered = await Navigator.push(context, - MaterialPageRoute(builder: (context) => MobileRegistrationScreen())); + final bool? registered = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const MobileRegistrationScreen())); if (registered != null && registered) { await Navigator.push( context, MaterialPageRoute( - builder: (context) => ChangePinScreen(hideBackButton: true))); + builder: (context) => + const ChangePinScreen(hideBackButton: true))); /* CustomDialog( title: "Registered", description: Text("You are now registered.")).show(context);*/ Navigator.pop(context, true); @@ -34,18 +37,19 @@ class _UnregisteredScreenState extends State } Future startRecovery() async { - final bool? registered = await Navigator.push( - context, MaterialPageRoute(builder: (context) => RecoverScreen())); + final bool? registered = await Navigator.push(context, + MaterialPageRoute(builder: (context) => const RecoverScreen())); if (registered != null && registered) { await Navigator.push( context, MaterialPageRoute( - builder: (context) => ChangePinScreen(hideBackButton: true))); + builder: (context) => + const ChangePinScreen(hideBackButton: true))); await Navigator.push( context, MaterialPageRoute( - builder: (context) => SuccessfulScreen( + builder: (context) => const SuccessfulScreen( title: "Recovered", text: "Your account has been recovered."))); @@ -68,98 +72,93 @@ class _UnregisteredScreenState extends State width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, ), - Container( - child: WillPopScope( - child: Container( - child: ConstrainedBox( - constraints: const BoxConstraints( - maxHeight: double.infinity, - maxWidth: double.infinity, - minHeight: 250, - minWidth: 250), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + WillPopScope( + child: ConstrainedBox( + constraints: const BoxConstraints( + maxHeight: double.infinity, + maxWidth: double.infinity, + minHeight: 250, + minWidth: 250), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container(), + Column( + mainAxisAlignment: MainAxisAlignment.center, children: [ - Container(), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - width: 360.0, - height: 108.0, - decoration: BoxDecoration( - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage('assets/logo.png')), + Container( + width: 360.0, + height: 108.0, + decoration: const BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage('assets/logo.png')), + ), + ), + const SizedBox(height: 10.0), + ], + ), + SizedBox( + width: 250, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.secondary, + shape: const RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(30)), ), ), - SizedBox(height: 10.0), - ], - ), - SizedBox( - width: 250, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: const RoundedRectangleBorder( - borderRadius: - BorderRadius.all(Radius.circular(30)), - ), + child: const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'SIGN UP', + style: TextStyle( + color: Colors.white, fontSize: 16), ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'SIGN UP', - style: TextStyle( - color: Colors.white, fontSize: 16), - ), - ], - ), - onPressed: () { - startRegistration(); - }, + ], + ), + onPressed: () { + startRegistration(); + }, + ), + const SizedBox(height: 20), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.secondary, + shape: const RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(30)), ), - SizedBox(height: 20), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: const RoundedRectangleBorder( - borderRadius: - BorderRadius.all(Radius.circular(30)), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'RECOVER ACCOUNT', - style: TextStyle( - color: Colors.white, fontSize: 16), - ), - ], + ), + child: const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'RECOVER ACCOUNT', + style: TextStyle( + color: Colors.white, fontSize: 16), ), - onPressed: () { - startRecovery(); - }, - ), - ], + ], + ), + onPressed: () { + startRecovery(); + }, ), - ), - Container(), - ], + ], + ), ), - ), + ], ), - onWillPop: () { - return Future.value(false); - }, ), + onWillPop: () { + return Future.value(false); + }, ), ], ), diff --git a/app/lib/screens/warning_screen.dart b/app/lib/screens/warning_screen.dart index fad9fcc0..1eeef059 100644 --- a/app/lib/screens/warning_screen.dart +++ b/app/lib/screens/warning_screen.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:threebotlogin/helpers/hex_color.dart'; class WarningScreen extends StatefulWidget { - WarningScreen(); + const WarningScreen({super.key}); @override - _WarningScreenState createState() => _WarningScreenState(); + State createState() => _WarningScreenState(); } class _WarningScreenState extends State { @@ -21,13 +21,13 @@ class _WarningScreenState extends State { home: Scaffold( appBar: AppBar( backgroundColor: HexColor('#2d4052'), - title: Text('Login from a new location'), + title: const Text('Login from a new location'), ), body: Padding( padding: const EdgeInsets.fromLTRB(20, 20, 20, 0), child: Column( children: [ - Row( + const Row( children: [ Icon( Icons.warning, @@ -35,7 +35,7 @@ class _WarningScreenState extends State { size: 48, ), Padding( - padding: const EdgeInsets.fromLTRB(10, 0, 0, 0), + padding: EdgeInsets.fromLTRB(10, 0, 0, 0), child: Text( 'Security warning!', style: TextStyle(fontWeight: FontWeight.bold), @@ -43,11 +43,11 @@ class _WarningScreenState extends State { ) ], ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 16, 0, 16), + const Padding( + padding: EdgeInsets.fromLTRB(0, 16, 0, 16), child: Divider(), ), - Wrap( + const Wrap( direction: Axis.horizontal, children: [ Text( @@ -71,11 +71,11 @@ class _WarningScreenState extends State { ) ], ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 16, 0, 0), + const Padding( + padding: EdgeInsets.fromLTRB(0, 16, 0, 0), child: Divider(), ), - Wrap( + const Wrap( direction: Axis.horizontal, children: [ Text( @@ -89,10 +89,6 @@ class _WarningScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TextButton( - child: Text( - 'No, it doesn\'t', - style: TextStyle(color: Colors.white), - ), style: ButtonStyle( backgroundColor: MaterialStateProperty.all(Colors.redAccent), @@ -100,12 +96,12 @@ class _WarningScreenState extends State { onPressed: () { Navigator.pop(context, false); }, - ), - TextButton( - child: Text( - 'Yes, it does', + child: const Text( + "No, it doesn't", style: TextStyle(color: Colors.white), ), + ), + TextButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(HexColor('#2d4052')), @@ -113,6 +109,10 @@ class _WarningScreenState extends State { onPressed: () { Navigator.pop(context, true); }, + child: const Text( + 'Yes, it does', + style: TextStyle(color: Colors.white), + ), ), ], ), From ad8f9b2cc678f370ee054f6712b96706501edb02 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Tue, 5 Dec 2023 16:17:51 +0200 Subject: [PATCH 007/457] Apply some linting fixes --- app/lib/apps/chatbot/chatbot.dart | 6 +++-- app/lib/apps/chatbot/chatbot_config.dart | 4 +++ app/lib/apps/chatbot/chatbot_widget.dart | 13 +++------- app/lib/apps/farmers/farmers.dart | 6 +++-- app/lib/apps/farmers/farmers_user_data.dart | 12 +++------ app/lib/apps/farmers/farmers_widget.dart | 24 ++++++++++-------- app/lib/apps/free_flow_pages/ffp_config.dart | 12 +++++++++ app/lib/apps/news/news.dart | 6 +++-- app/lib/apps/news/news_config.dart | 8 ++++++ app/lib/apps/news/news_widget.dart | 16 ++++++------ app/lib/apps/wallet/wallet.dart | 6 +++-- app/lib/apps/wallet/wallet_config.dart | 8 ++++++ app/lib/apps/wallet/wallet_user_data.dart | 12 +++------ app/lib/apps/wallet/wallet_widget.dart | 25 ++++++++++--------- app/lib/clipboard_hack/clipboard_hack.dart | 10 ++++---- app/lib/events/events.dart | 16 ++++++------ app/lib/helpers/flags.dart | 4 +-- app/lib/helpers/globals.dart | 10 ++++---- app/lib/helpers/hex_color.dart | 4 +-- app/lib/jrouter.dart | 16 +++++------- app/lib/main_testing.dart | 2 +- app/lib/models/login.dart | 9 ++++--- ...ymentRequest.dart => payment_request.dart} | 7 +++--- app/lib/screens/authentication_screen.dart | 2 +- app/lib/screens/home_screen.dart | 2 +- app/lib/screens/main_screen.dart | 4 +-- .../screens/mobile_registration_screen.dart | 3 ++- app/lib/screens/preference_screen.dart | 14 +++++------ app/lib/screens/recover_screen.dart | 3 +-- app/lib/screens/sign_screen.dart | 2 +- app/lib/screens/unregistered_screen.dart | 8 +++--- app/lib/services/3bot_service.dart | 2 +- app/lib/services/open_kyc_service.dart | 2 +- app/lib/services/socket_service.dart | 10 ++++---- app/lib/services/uni_link_service.dart | 4 +-- app/lib/widgets/image_button.dart | 1 + app/lib/widgets/pin_field.dart | 6 +++-- app/lib/widgets/preference_dialog.dart | 1 + app/lib/widgets/reusable_text_field_step.dart | 2 +- 39 files changed, 169 insertions(+), 133 deletions(-) rename app/lib/models/{paymentRequest.dart => payment_request.dart} (75%) diff --git a/app/lib/apps/chatbot/chatbot.dart b/app/lib/apps/chatbot/chatbot.dart index 280283a9..b6f45a09 100644 --- a/app/lib/apps/chatbot/chatbot.dart +++ b/app/lib/apps/chatbot/chatbot.dart @@ -8,13 +8,15 @@ import 'package:threebotlogin/services/shared_preference_service.dart'; class Chatbot implements App { late ChatbotWidget _widget; + @override Future widget() async { Map email = await getEmail(); String emailAddress = email['email'].toString(); - this._widget = ChatbotWidget(email: emailAddress); - return this._widget; + _widget = ChatbotWidget(email: emailAddress); + return _widget; } + @override void clearData() {} @override diff --git a/app/lib/apps/chatbot/chatbot_config.dart b/app/lib/apps/chatbot/chatbot_config.dart index a563075e..7b15e019 100644 --- a/app/lib/apps/chatbot/chatbot_config.dart +++ b/app/lib/apps/chatbot/chatbot_config.dart @@ -26,24 +26,28 @@ abstract class ChatbotConfigImpls { } class ChatbotConfigStaging extends ChatbotConfigImpls { + @override String url() { return 'https://go.crisp.chat/chat/embed/?website_id=1a5a5241-91cb-4a41-8323-5ba5ec574da0&user_email='; } } class ChatbotConfigProduction extends ChatbotConfigImpls { + @override String url() { return 'https://go.crisp.chat/chat/embed/?website_id=1a5a5241-91cb-4a41-8323-5ba5ec574da0&user_email='; } } class ChatbotConfigTesting extends ChatbotConfigImpls { + @override String url() { return 'https://go.crisp.chat/chat/embed/?website_id=1a5a5241-91cb-4a41-8323-5ba5ec574da0&user_email='; } } class ChatbotConfigLocal extends ChatbotConfigImpls { + @override String url() { return 'https://go.crisp.chat/chat/embed/?website_id=1a5a5241-91cb-4a41-8323-5ba5ec574da0'; } diff --git a/app/lib/apps/chatbot/chatbot_widget.dart b/app/lib/apps/chatbot/chatbot_widget.dart index 50351a47..ae65482c 100644 --- a/app/lib/apps/chatbot/chatbot_widget.dart +++ b/app/lib/apps/chatbot/chatbot_widget.dart @@ -7,10 +7,10 @@ import 'package:threebotlogin/widgets/layout_drawer.dart'; class ChatbotWidget extends StatefulWidget { final String email; - ChatbotWidget({required this.email}); + const ChatbotWidget({super.key, required this.email}); @override - _ChatbotState createState() => new _ChatbotState(email: this.email); + _ChatbotState createState() => _ChatbotState(email: email); } class _ChatbotState extends State with AutomaticKeepAliveClientMixin { @@ -23,8 +23,7 @@ class _ChatbotState extends State with AutomaticKeepAliveClientMi _ChatbotState({required this.email}) { iaWebview = InAppWebView( initialUrlRequest: URLRequest( - url: Uri.parse('${config.url()}$email&cache_buster=' + - new DateTime.now().millisecondsSinceEpoch.toString())), + url: Uri.parse('${config.url()}$email&cache_buster=${DateTime.now().millisecondsSinceEpoch}')), initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions(useShouldOverrideUrlLoading: true), android: AndroidInAppWebViewOptions(supportMultipleWindows: true, useHybridComposition: true)), @@ -36,7 +35,7 @@ class _ChatbotState extends State with AutomaticKeepAliveClientMi return Future.value(true); }, onConsoleMessage: (InAppWebViewController controller, ConsoleMessage consoleMessage) { - print("CB console: " + consoleMessage.message); + print('CB console: ${consoleMessage.message}'); }, onLoadStart: (InAppWebViewController controller, _) { webView = controller; @@ -70,10 +69,6 @@ class _ChatbotState extends State with AutomaticKeepAliveClientMi ); } - @override - void initState() { - super.initState(); - } @override void dispose() { diff --git a/app/lib/apps/farmers/farmers.dart b/app/lib/apps/farmers/farmers.dart index 4647d8fc..b8085795 100644 --- a/app/lib/apps/farmers/farmers.dart +++ b/app/lib/apps/farmers/farmers.dart @@ -6,8 +6,8 @@ import 'package:threebotlogin/apps/farmers/farmers_widget.dart'; import 'package:threebotlogin/events/events.dart'; class Farmers implements App { - static final Farmers _singleton = new Farmers._internal(); - static final FarmersWidget _farmersWidget = FarmersWidget(); + static final Farmers _singleton = Farmers._internal(); + static const FarmersWidget _farmersWidget = FarmersWidget(); factory Farmers() { return _singleton; @@ -15,10 +15,12 @@ class Farmers implements App { Farmers._internal(); + @override Future widget() async { return _farmersWidget; } + @override void clearData() { clearAllData(); } diff --git a/app/lib/apps/farmers/farmers_user_data.dart b/app/lib/apps/farmers/farmers_user_data.dart index d4cf9908..61c53e19 100644 --- a/app/lib/apps/farmers/farmers_user_data.dart +++ b/app/lib/apps/farmers/farmers_user_data.dart @@ -5,9 +5,7 @@ void saveImportedWallet(List params) async { final prefs = await SharedPreferences.getInstance(); List? importedWallets = await getImportedWallets(); - if (importedWallets == null) { - importedWallets = []; - } + importedWallets ??= []; if (!importedWallets.contains(importedWallet)) { importedWallets.add(importedWallet); @@ -19,7 +17,7 @@ void saveImportedWallet(List params) async { Future?> getImportedWallets() async { final prefs = await SharedPreferences.getInstance(); - return prefs.getStringList("importedWallets"); + return prefs.getStringList('importedWallets'); } Future saveAppWallet(List params) async { @@ -31,9 +29,7 @@ Future saveAppWallet(List params) async { return false; } - if (appWallets == null) { - appWallets = []; - } + appWallets ??= []; if (!appWallets.contains(appWalletToAdd)) { appWallets.add(appWalletToAdd); @@ -46,7 +42,7 @@ Future saveAppWallet(List params) async { Future?> getAppWallets() async { final prefs = await SharedPreferences.getInstance(); - List? wallets = prefs.getStringList("appWallets"); + List? wallets = prefs.getStringList('appWallets'); return wallets; } diff --git a/app/lib/apps/farmers/farmers_widget.dart b/app/lib/apps/farmers/farmers_widget.dart index 94049ea0..26b73de1 100644 --- a/app/lib/apps/farmers/farmers_widget.dart +++ b/app/lib/apps/farmers/farmers_widget.dart @@ -18,6 +18,8 @@ import 'package:threebotlogin/widgets/layout_drawer.dart'; bool created = false; class FarmersWidget extends StatefulWidget { + const FarmersWidget({super.key}); + @override _FarmersState createState() => _FarmersState(); } @@ -35,12 +37,12 @@ class _FarmersState extends State with AutomaticKeepAliveClientMi _back(FarmersBackEvent event) async { Uri? url = await webView.getUrl(); - String rootUrl = Globals().farmersUrl + 'farmer'; + String rootUrl = '${Globals().farmersUrl}farmer'; if (url.toString() == rootUrl.toString()) { Events().emit(GoHomeEvent()); return; } - this.webView.goBack(); + webView.goBack(); } _FarmersState() { @@ -49,7 +51,7 @@ class _FarmersState extends State with AutomaticKeepAliveClientMi iaWebView = InAppWebView( initialUrlRequest: URLRequest( url: Uri.parse( - farmersUri + '?cache_buster=' + new DateTime.now().millisecondsSinceEpoch.toString())), + '$farmersUri?cache_buster=${DateTime.now().millisecondsSinceEpoch}')), initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions( cacheEnabled: Globals().isCacheClearedFarmer, clearCache: !Globals().isCacheClearedFarmer), @@ -58,7 +60,7 @@ class _FarmersState extends State with AutomaticKeepAliveClientMi ios: IOSInAppWebViewOptions()), onWebViewCreated: (InAppWebViewController controller) { webView = controller; - this.addHandler(); + addHandler(); }, onCreateWindow: (InAppWebViewController controller, CreateWindowAction req) { return Future.value(true); @@ -75,7 +77,7 @@ class _FarmersState extends State with AutomaticKeepAliveClientMi }); }, onConsoleMessage: (InAppWebViewController controller, ConsoleMessage consoleMessage) { - print("Wallet console: " + consoleMessage.message); + print('Wallet console: ${consoleMessage.message}'); }, ); @@ -108,18 +110,18 @@ class _FarmersState extends State with AutomaticKeepAliveClientMi String? result; if (slept) { - result = await Navigator.push(context, MaterialPageRoute(builder: (context) => ScanScreen())); + result = await Navigator.push(context, MaterialPageRoute(builder: (context) => const ScanScreen())); } return result; } addHandler() { - webView.addJavaScriptHandler(handlerName: "ADD_IMPORT_WALLET", callback: saveImportedWallet); - webView.addJavaScriptHandler(handlerName: "ADD_APP_WALLET", callback: saveAppWallet); - webView.addJavaScriptHandler(handlerName: "SCAN_QR", callback: scanQrCode); - webView.addJavaScriptHandler(handlerName: "VUE_INITIALIZED", callback: vueInitialized); - webView.addJavaScriptHandler(handlerName: "SAVE_WALLETS", callback: saveWalletCallback); + webView.addJavaScriptHandler(handlerName: 'ADD_IMPORT_WALLET', callback: saveImportedWallet); + webView.addJavaScriptHandler(handlerName: 'ADD_APP_WALLET', callback: saveAppWallet); + webView.addJavaScriptHandler(handlerName: 'SCAN_QR', callback: scanQrCode); + webView.addJavaScriptHandler(handlerName: 'VUE_INITIALIZED', callback: vueInitialized); + webView.addJavaScriptHandler(handlerName: 'SAVE_WALLETS', callback: saveWalletCallback); } saveWalletCallback(List params) async { diff --git a/app/lib/apps/free_flow_pages/ffp_config.dart b/app/lib/apps/free_flow_pages/ffp_config.dart index c69a73ea..98d9a9a7 100644 --- a/app/lib/apps/free_flow_pages/ffp_config.dart +++ b/app/lib/apps/free_flow_pages/ffp_config.dart @@ -38,56 +38,68 @@ abstract class FfpConfigImpls { } class FfpConfigStaging extends FfpConfigImpls { + @override String appId() { return 'staging.freeflowpages.com'; } + @override String url() { return 'https://staging.freeflowpages.com/'; } + @override String cookieUrl() { return 'https://staging.freeflowpages.com/user/auth/external?authclient=3bot'; } } class FfpConfigProduction extends FfpConfigImpls { + @override String appId() { return 'freeflowpages.com'; } + @override String url() { return 'https://freeflowpages.com/'; } + @override String cookieUrl() { return 'https://freeflowpages.com/user/auth/external?authclient=3bot'; } } class FfpConfigTesting extends FfpConfigImpls { + @override String appId() { return 'testing.freeflowpages.com'; } + @override String url() { return 'https://testing.freeflowpages.com/'; } + @override String cookieUrl() { return 'https://testing.freeflowpages.com/user/auth/external?authclient=3bot'; } } class FfpConfigLocal extends FfpConfigImpls { + @override String appId() { return 'staging.freeflowpages.com'; } + @override String url() { return 'https://staging.freeflowpages.com/'; } + @override String cookieUrl() { return 'https://freeflowpages.com/user/auth/external?authclient=3bot'; } diff --git a/app/lib/apps/news/news.dart b/app/lib/apps/news/news.dart index 743a9acd..33437a6e 100644 --- a/app/lib/apps/news/news.dart +++ b/app/lib/apps/news/news.dart @@ -5,8 +5,8 @@ import 'package:threebotlogin/events/events.dart'; import 'package:threebotlogin/apps/news/news_events.dart'; class News implements App { - static final News _singleton = new News._internal(); - static final NewsWidget _newsWidget = NewsWidget(); + static final News _singleton = News._internal(); + static const NewsWidget _newsWidget = NewsWidget(); factory News() { return _singleton; @@ -14,10 +14,12 @@ class News implements App { News._internal(); + @override Future widget() async { return _newsWidget; } + @override void clearData() {} @override diff --git a/app/lib/apps/news/news_config.dart b/app/lib/apps/news/news_config.dart index 22dd5c2a..40624aef 100644 --- a/app/lib/apps/news/news_config.dart +++ b/app/lib/apps/news/news_config.dart @@ -32,40 +32,48 @@ abstract class NewsConfigImpls { } class NewsConfigStaging extends NewsConfigImpls { + @override String appId() { return 'news.threefoldconnect.jimber.org'; } + @override String redirectUrl() { return 'login'; } } class NewsConfigProduction extends NewsConfigImpls { + @override String appId() { return 'news.threefoldconnect.jimber.org'; } + @override String redirectUrl() { return 'login'; } } class NewsConfigTesting extends NewsConfigImpls { + @override String appId() { return 'news.testing.jimber.org'; } + @override String redirectUrl() { return 'login'; } } class NewsConfigLocal extends NewsConfigImpls { + @override String appId() { return 'localhost:8080'; } + @override String redirectUrl() { return 'login'; } diff --git a/app/lib/apps/news/news_widget.dart b/app/lib/apps/news/news_widget.dart index bbc01eea..d8498b51 100644 --- a/app/lib/apps/news/news_widget.dart +++ b/app/lib/apps/news/news_widget.dart @@ -11,6 +11,8 @@ import 'package:url_launcher/url_launcher.dart'; bool created = false; class NewsWidget extends StatefulWidget { + const NewsWidget({super.key}); + @override _NewsState createState() => _NewsState(); } @@ -20,25 +22,25 @@ class _NewsState extends State late InAppWebViewController webView; late InAppWebView iaWebView; - String url = ""; - String initialEndsWith= ""; + String url = ''; + String initialEndsWith= ''; double progress = 0; var config = NewsConfig(); _back(NewsBackEvent event) async { Uri? url = await webView.getUrl(); - print("URL: " + url.toString()); + print('URL: $url'); if (url.toString().endsWith(initialEndsWith)) { Events().emit(GoHomeEvent()); return; } - this.webView.goBack(); + webView.goBack(); } _NewsState() { - this.initialEndsWith = new DateTime.now().millisecondsSinceEpoch.toString(); + initialEndsWith = DateTime.now().millisecondsSinceEpoch.toString(); iaWebView = InAppWebView( - initialUrlRequest: URLRequest(url:Uri.parse('https://news.threefoldconnect.jimber.org?cache_buster=' + initialEndsWith + initialUrlRequest: URLRequest(url:Uri.parse('https://news.threefoldconnect.jimber.org?cache_buster=$initialEndsWith' )), initialOptions: InAppWebViewGroupOptions( @@ -65,7 +67,7 @@ class _NewsState extends State }, onConsoleMessage: (InAppWebViewController controller, ConsoleMessage consoleMessage) { - print("News console: " + consoleMessage.message); + print('News console: ${consoleMessage.message}'); }, ); Events().onEvent(NewsBackEvent().runtimeType, _back); diff --git a/app/lib/apps/wallet/wallet.dart b/app/lib/apps/wallet/wallet.dart index 46a04798..8ce9c923 100644 --- a/app/lib/apps/wallet/wallet.dart +++ b/app/lib/apps/wallet/wallet.dart @@ -6,8 +6,8 @@ import 'package:threebotlogin/apps/wallet/wallet_widget.dart'; import 'package:threebotlogin/events/events.dart'; class Wallet implements App { - static final Wallet _singleton = new Wallet._internal(); - static final WalletWidget _walletWidget = WalletWidget(); + static final Wallet _singleton = Wallet._internal(); + static const WalletWidget _walletWidget = WalletWidget(); factory Wallet() { return _singleton; @@ -15,10 +15,12 @@ class Wallet implements App { Wallet._internal(); + @override Future widget() async { return _walletWidget; } + @override void clearData() { clearAllData(); } diff --git a/app/lib/apps/wallet/wallet_config.dart b/app/lib/apps/wallet/wallet_config.dart index d0f78559..87e45c98 100644 --- a/app/lib/apps/wallet/wallet_config.dart +++ b/app/lib/apps/wallet/wallet_config.dart @@ -32,41 +32,49 @@ abstract class WalletConfigImpls { } class WalletConfigStaging extends WalletConfigImpls { + @override String appId() { return 'wallet.staging.jimber.io'; } + @override String redirectUrl() { return 'login'; } } class WalletConfigProduction extends WalletConfigImpls { + @override String appId() { return 'wallet.threefold.me'; } + @override String redirectUrl() { return 'login'; } } class WalletConfigTesting extends WalletConfigImpls { + @override String appId() { return 'wallet.testing.jimber.org'; } + @override String redirectUrl() { return 'login'; } } class WalletConfigLocal extends WalletConfigImpls { + @override String appId() { return 'localhost:8080'; // return 'wallet.staging.jimber.org'; } + @override String redirectUrl() { return 'login'; } diff --git a/app/lib/apps/wallet/wallet_user_data.dart b/app/lib/apps/wallet/wallet_user_data.dart index b85956bd..9f0c8340 100644 --- a/app/lib/apps/wallet/wallet_user_data.dart +++ b/app/lib/apps/wallet/wallet_user_data.dart @@ -5,9 +5,7 @@ void saveImportedWallet(List params) async { final prefs = await SharedPreferences.getInstance(); List? importedWallets = await getImportedWallets(); - if (importedWallets == null) { - importedWallets = []; - } + importedWallets ??= []; if (!importedWallets.contains(importedWallet)) { importedWallets.add(importedWallet); @@ -20,7 +18,7 @@ void saveImportedWallet(List params) async { Future?> getImportedWallets() async { final prefs = await SharedPreferences.getInstance(); - return prefs.getStringList("importedWallets"); + return prefs.getStringList('importedWallets'); } Future saveAppWallet(List params) async { @@ -32,9 +30,7 @@ Future saveAppWallet(List params) async { return false; } - if (appWallets == null) { - appWallets = []; - } + appWallets ??= []; if (!appWallets.contains(appWalletToAdd)) { appWallets.add(appWalletToAdd); @@ -47,7 +43,7 @@ Future saveAppWallet(List params) async { Future?> getAppWallets() async { final prefs = await SharedPreferences.getInstance(); - var wallets = prefs.getStringList("appWallets"); + var wallets = prefs.getStringList('appWallets'); return wallets; } diff --git a/app/lib/apps/wallet/wallet_widget.dart b/app/lib/apps/wallet/wallet_widget.dart index f19cf8bf..fd77a020 100644 --- a/app/lib/apps/wallet/wallet_widget.dart +++ b/app/lib/apps/wallet/wallet_widget.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -21,6 +20,8 @@ import 'package:threebotlogin/widgets/layout_drawer.dart'; bool created = false; class WalletWidget extends StatefulWidget { + const WalletWidget({super.key}); + @override _WalletState createState() => _WalletState(); } @@ -40,7 +41,7 @@ class _WalletState extends State with AutomaticKeepAliveClientMixi Events().emit(GoHomeEvent()); return; } - this.webView.goBack(); + webView.goBack(); } _WalletState() { @@ -50,7 +51,7 @@ class _WalletState extends State with AutomaticKeepAliveClientMixi iaWebView = InAppWebView( initialUrlRequest: URLRequest( url: Uri.parse( - walletUri + '?cache_buster=' + new DateTime.now().millisecondsSinceEpoch.toString())), + '$walletUri?cache_buster=${DateTime.now().millisecondsSinceEpoch}')), initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions( cacheEnabled: Globals().isCacheClearedWallet, @@ -60,7 +61,7 @@ class _WalletState extends State with AutomaticKeepAliveClientMixi ios: IOSInAppWebViewOptions()), onWebViewCreated: (InAppWebViewController controller) { webView = controller; - this.addHandler(); + addHandler(); }, onCreateWindow: (InAppWebViewController controller, CreateWindowAction req) { return Future.value(true); @@ -77,7 +78,7 @@ class _WalletState extends State with AutomaticKeepAliveClientMixi }); }, onConsoleMessage: (InAppWebViewController controller, ConsoleMessage consoleMessage) { - print("Wallet console: " + consoleMessage.message); + print('Wallet console: ${consoleMessage.message}'); }, ); @@ -126,18 +127,18 @@ class _WalletState extends State with AutomaticKeepAliveClientMixi bool slept = await Future.delayed(const Duration(milliseconds: 400), () => true); late Barcode result; if (slept) { - result = await Navigator.push(context, MaterialPageRoute(builder: (context) => ScanScreen())); + result = await Navigator.push(context, MaterialPageRoute(builder: (context) => const ScanScreen())); } return result.code; } addHandler() { - webView.addJavaScriptHandler(handlerName: "ADD_IMPORT_WALLET", callback: saveImportedWallet); - webView.addJavaScriptHandler(handlerName: "ADD_APP_WALLET", callback: saveAppWallet); - webView.addJavaScriptHandler(handlerName: "SCAN_QR", callback: scanQrCode); - webView.addJavaScriptHandler(handlerName: "VUE_INITIALIZED", callback: vueInitialized); - webView.addJavaScriptHandler(handlerName: "SAVE_WALLETS", callback: saveWalletCallback); - webView.addJavaScriptHandler(handlerName: "SIGNING", callback: signCallback); + webView.addJavaScriptHandler(handlerName: 'ADD_IMPORT_WALLET', callback: saveImportedWallet); + webView.addJavaScriptHandler(handlerName: 'ADD_APP_WALLET', callback: saveAppWallet); + webView.addJavaScriptHandler(handlerName: 'SCAN_QR', callback: scanQrCode); + webView.addJavaScriptHandler(handlerName: 'VUE_INITIALIZED', callback: vueInitialized); + webView.addJavaScriptHandler(handlerName: 'SAVE_WALLETS', callback: saveWalletCallback); + webView.addJavaScriptHandler(handlerName: 'SIGNING', callback: signCallback); } signCallback(List params) async { diff --git a/app/lib/clipboard_hack/clipboard_hack.dart b/app/lib/clipboard_hack/clipboard_hack.dart index 720c8acd..e51e8d25 100644 --- a/app/lib/clipboard_hack/clipboard_hack.dart +++ b/app/lib/clipboard_hack/clipboard_hack.dart @@ -5,7 +5,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; void copy(List params) { - Clipboard.setData(new ClipboardData(text: params[0])); + Clipboard.setData(ClipboardData(text: params[0])); } Future paste(List params) async { @@ -15,9 +15,9 @@ Future paste(List params) async { Future addClipboardHack(InAppWebViewController webview) async { if (Platform.isAndroid) { - const oneSec = const Duration(seconds: 1); + const oneSec = Duration(seconds: 1); - new Timer.periodic(oneSec, (Timer t) async { + Timer.periodic(oneSec, (Timer t) async { await webview.injectJavascriptFileFromAsset( assetFilePath: 'assets/clipboardhack.js'); }); @@ -27,6 +27,6 @@ Future addClipboardHack(InAppWebViewController webview) async { } void addClipboardHandlersOnly(InAppWebViewController webview) { - webview.addJavaScriptHandler(handlerName: "COPY", callback: copy); - webview.addJavaScriptHandler(handlerName: "PASTE", callback: paste); + webview.addJavaScriptHandler(handlerName: 'COPY', callback: copy); + webview.addJavaScriptHandler(handlerName: 'PASTE', callback: paste); } diff --git a/app/lib/events/events.dart b/app/lib/events/events.dart index 043f8611..ee96c73a 100644 --- a/app/lib/events/events.dart +++ b/app/lib/events/events.dart @@ -1,32 +1,32 @@ class Events { - static final Events _singleton = new Events._internal(); + static final Events _singleton = Events._internal(); factory Events() { return _singleton; } - Map eventList = Map(); + Map eventList = {}; Events._internal(); // init here onEvent(Type eventType, Function function) { - if (this.eventList[eventType] == null) { - this.eventList[eventType] = []; + if (eventList[eventType] == null) { + eventList[eventType] = []; } - this.eventList[eventType].add(function); + eventList[eventType].add(function); } emit(var event) { var eventType = event.runtimeType; - if (this.eventList[eventType] == null) { + if (eventList[eventType] == null) { return; } - for (var function in this.eventList[eventType]) { + for (var function in eventList[eventType]) { function(event); } } reset() { - eventList = Map(); + eventList = {}; } } diff --git a/app/lib/helpers/flags.dart b/app/lib/helpers/flags.dart index 2f577552..7793d123 100644 --- a/app/lib/helpers/flags.dart +++ b/app/lib/helpers/flags.dart @@ -6,7 +6,7 @@ import 'package:threebotlogin/services/tools_service.dart'; import 'globals.dart'; class Flags { - static final Flags _singleton = new Flags._internal(); + static final Flags _singleton = Flags._internal(); late FlagsmithClient client; @@ -85,7 +85,7 @@ class Flags { Future setDeviceTrait(Identity user) async { String info = await getDeviceInfo(); TraitWithIdentity trait = - new TraitWithIdentity(identity: user, key: 'device', value: info); + TraitWithIdentity(identity: user, key: 'device', value: info); return (await client.createTrait(value: trait)); } diff --git a/app/lib/helpers/globals.dart b/app/lib/helpers/globals.dart index aa6b698f..fb0daa25 100644 --- a/app/lib/helpers/globals.dart +++ b/app/lib/helpers/globals.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:threebotlogin/helpers/hex_color.dart'; import 'package:threebotlogin/jrouter.dart'; -import 'package:threebotlogin/models/paymentRequest.dart'; +import 'package:threebotlogin/models/payment_request.dart'; class NoAnimationTabController extends TabController { NoAnimationTabController( @@ -19,14 +19,14 @@ class NoAnimationTabController extends TabController { } class Globals { - static final bool isInDebugMode = true; - static final HexColor color = HexColor("#0a73b8"); + static const bool isInDebugMode = true; + static final HexColor color = HexColor('#0a73b8'); ValueNotifier emailVerified = ValueNotifier(false); ValueNotifier phoneVerified = ValueNotifier(false); ValueNotifier identityVerified = ValueNotifier(false); - final JRouter router = new JRouter(); + final JRouter router = JRouter(); int incorrectPincodeAttempts = 0; int sendSmsAttempts = 0; @@ -63,7 +63,7 @@ class Globals { ValueNotifier hidePhoneButton = ValueNotifier(false); - static final Globals _singleton = new Globals._internal(); + static final Globals _singleton = Globals._internal(); factory Globals() { return _singleton; diff --git a/app/lib/helpers/hex_color.dart b/app/lib/helpers/hex_color.dart index 01866a4b..0471223b 100644 --- a/app/lib/helpers/hex_color.dart +++ b/app/lib/helpers/hex_color.dart @@ -2,9 +2,9 @@ import 'dart:ui'; class HexColor extends Color { static int _getColorFromHex(String hexColor) { - hexColor = hexColor.toUpperCase().replaceAll("#", ""); + hexColor = hexColor.toUpperCase().replaceAll('#', ''); if (hexColor.length == 6) { - hexColor = "FF" + hexColor; + hexColor = 'FF$hexColor'; } return int.parse(hexColor, radix: 16); } diff --git a/app/lib/jrouter.dart b/app/lib/jrouter.dart index 6bb77f1d..84d0b5d4 100644 --- a/app/lib/jrouter.dart +++ b/app/lib/jrouter.dart @@ -66,7 +66,7 @@ class JRouter { path: '/identityverification', name: 'IdentityVerification', icon: Icons.lock, - view: IdentityVerificationScreen(), + view: const IdentityVerificationScreen(), ), app: null), AppInfo( @@ -74,16 +74,12 @@ class JRouter { path: '/settings', name: 'Settings', icon: Icons.settings, - view: PreferenceScreen(), + view: const PreferenceScreen(), ), app: null), ]; } - Map getRoutes() { - return Map.fromIterable(routes, key: (v) => v.path, value: (v) => v.view); - } - bool emailMustBeVerified(int index) { if (routes[index].app != null) { return routes[index].app!.emailVerificationRequired(); @@ -100,15 +96,15 @@ class JRouter { List getContent() { List containers = []; - routes.forEach((r) { + for (var r in routes) { containers.add(r.route.view); - }); + } return containers; } List getAppButtons() { List iconButtons = []; - routes.forEach((r) { + for (var r in routes) { iconButtons.add(Tab( icon: Icon( r.route.icon, @@ -116,7 +112,7 @@ class JRouter { ), text: r.route.name, )); - }); + } return iconButtons; } } diff --git a/app/lib/main_testing.dart b/app/lib/main_testing.dart index 3103667a..7737fe73 100644 --- a/app/lib/main_testing.dart +++ b/app/lib/main_testing.dart @@ -1,4 +1,4 @@ import 'package:flutter/material.dart'; import 'package:threebotlogin/screens/warning_screen.dart'; -void main() => runApp(WarningScreen()); +void main() => runApp(const WarningScreen()); diff --git a/app/lib/models/login.dart b/app/lib/models/login.dart index bfa440da..467fcad3 100644 --- a/app/lib/models/login.dart +++ b/app/lib/models/login.dart @@ -37,7 +37,9 @@ class Login { Login.fromJson(Map json) : doubleName = json['doubleName'], state = json['state'], - scope = (json['scope'] != null && json['scope'] != "" && json['scope'] != "null") + scope = (json['scope'] != null && + json['scope'] != '' && + json['scope'] != 'null') ? Scope.fromJson(jsonDecode(json['scope'])) : null, appId = json['appId'], @@ -53,7 +55,7 @@ class Login { Map toJson() => { 'doubleName': doubleName, 'state': state, - 'scope': scope != null ? scope?.toJson() : "", + 'scope': scope != null ? scope?.toJson() : '', 'appId': appId, 'appPublicKey': appPublicKey, 'randomImageId': randomImageId, @@ -72,7 +74,8 @@ class Login { Uint8List pk = await getPublicKey(); Uint8List sk = await getPrivateKey(); - String decryptedLoginAttempt = await decrypt(data['encryptedLoginAttempt'], pk, sk); + String decryptedLoginAttempt = + await decrypt(data['encryptedLoginAttempt'], pk, sk); dynamic decryptedLoginAttemptMap = jsonDecode(decryptedLoginAttempt); print('Decrypted login attempt'); diff --git a/app/lib/models/paymentRequest.dart b/app/lib/models/payment_request.dart similarity index 75% rename from app/lib/models/paymentRequest.dart rename to app/lib/models/payment_request.dart index be5ca7d5..67d34fcc 100644 --- a/app/lib/models/paymentRequest.dart +++ b/app/lib/models/payment_request.dart @@ -18,10 +18,11 @@ class PaymentRequest { 'message': message, }; + @override String toString() { - var encodedAmount = base64Encode(utf8.encode(this.amount.toString())); - var encodedMessage = base64Encode(utf8.encode(this.message)); - var encodedAddress = base64Encode(utf8.encode(this.address)); + var encodedAmount = base64Encode(utf8.encode(amount.toString())); + var encodedMessage = base64Encode(utf8.encode(message)); + var encodedAddress = base64Encode(utf8.encode(address)); return '{"encodedAddress": "$encodedAddress", "encodedAmount": "$encodedAmount", "encodedMessage": "$encodedMessage"}'; } } diff --git a/app/lib/screens/authentication_screen.dart b/app/lib/screens/authentication_screen.dart index 63c5833c..01d638b2 100644 --- a/app/lib/screens/authentication_screen.dart +++ b/app/lib/screens/authentication_screen.dart @@ -280,7 +280,7 @@ class AuthenticationScreenState extends State { globals.incorrectPincodeAttempts++; } - var dialog; + CustomDialog dialog; if (globals.incorrectPincodeAttempts >= 3 || (globals.tooManyAuthenticationAttempts && diff --git a/app/lib/screens/home_screen.dart b/app/lib/screens/home_screen.dart index d87a46b7..1ae400ad 100644 --- a/app/lib/screens/home_screen.dart +++ b/app/lib/screens/home_screen.dart @@ -48,7 +48,7 @@ class _HomeScreenState extends State int lastCheck = 0; final int pinCheckTimeout = 60000 * 5; - _HomeScreenState() {} + _HomeScreenState(); void checkPinAndNavigateIfSuccess(int indexIfAuthIsSuccess) async { String? pin = await getPin(); diff --git a/app/lib/screens/main_screen.dart b/app/lib/screens/main_screen.dart index 57b62f68..70b80b36 100644 --- a/app/lib/screens/main_screen.dart +++ b/app/lib/screens/main_screen.dart @@ -164,7 +164,7 @@ class _AppState extends State { } if (widget.initDone != null && !widget.initDone!) { - InitScreen init = InitScreen(); + InitScreen init = const InitScreen(); bool accepted = false; while (!accepted) { accepted = !(await Navigator.push( @@ -175,7 +175,7 @@ class _AppState extends State { if (!widget.registered!) { await Navigator.push(context, - MaterialPageRoute(builder: (context) => UnregisteredScreen())); + MaterialPageRoute(builder: (context) => const UnregisteredScreen())); } await Globals().router.init(); diff --git a/app/lib/screens/mobile_registration_screen.dart b/app/lib/screens/mobile_registration_screen.dart index 8cc742b0..f8ea984b 100644 --- a/app/lib/screens/mobile_registration_screen.dart +++ b/app/lib/screens/mobile_registration_screen.dart @@ -66,6 +66,7 @@ class _MobileRegistrationScreenState extends State { super.initState(); } + @override void dispose() { super.dispose(); } @@ -189,7 +190,7 @@ class _MobileRegistrationScreenState extends State { 'Something went wrong when trying to create your account.', actions: [ TextButton( - child: Text('Ok'), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index a801a761..322f1bf0 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -128,7 +128,7 @@ class _PreferenceScreenState extends State { } biometricDeviceName = snapshot.data; return CheckboxListTile( - secondary: Icon(Icons.fingerprint), + secondary: const Icon(Icons.fingerprint), value: finger, title: Text(snapshot.data.toString()), activeColor: @@ -261,7 +261,7 @@ class _PreferenceScreenState extends State { context, MaterialPageRoute( builder: (context) => - MainScreen(initDone: true, registered: false))); + const MainScreen(initDone: true, registered: false))); } else { showDialog( context: preferenceContext!, @@ -271,7 +271,7 @@ class _PreferenceScreenState extends State { 'Something went wrong when trying to remove your account.', actions: [ TextButton( - child: Text('Ok'), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -311,7 +311,7 @@ class _PreferenceScreenState extends State { } } else { Navigator.pop(context); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( content: Text('Pin invalid'), )); } @@ -364,7 +364,7 @@ class _PreferenceScreenState extends State { actions: [ // usually buttons at the bottom of the dialog TextButton( - child: new Text('Close'), + child: const Text('Close'), onPressed: () { Navigator.pop(context); setState(() {}); @@ -425,7 +425,7 @@ class _PreferenceScreenState extends State { ), ); - if (pinChanged != null && pinChanged) { + if (pinChanged) { showDialog( context: context, builder: (BuildContext context) => CustomDialog( @@ -434,7 +434,7 @@ class _PreferenceScreenState extends State { description: 'Your pincode was successfully changed.', actions: [ TextButton( - child: new Text('Ok'), + child: const Text('Ok'), onPressed: () async { Navigator.pop(context); }, diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index 66f1669b..479444c9 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -157,8 +157,7 @@ class _RecoverScreenState extends State { child: TextFormField( keyboardType: TextInputType.multiline, maxLines: null, - decoration: const InputDecoration( - border: OutlineInputBorder(), labelText: 'SEED PHRASE'), + decoration: const InputDecoration(labelText: 'SEED PHRASE'), controller: seedPhraseController, validator: (String? value) { if (value!.isEmpty) { diff --git a/app/lib/screens/sign_screen.dart b/app/lib/screens/sign_screen.dart index 5df38aaf..90901f2c 100644 --- a/app/lib/screens/sign_screen.dart +++ b/app/lib/screens/sign_screen.dart @@ -276,7 +276,7 @@ class _SignScreenState extends State with BlockAndRunMixin { } Widget downloadButton() { - return Container( + return SizedBox( width: MediaQuery.of(context).size.width * 0.9, child: Column( children: [ diff --git a/app/lib/screens/unregistered_screen.dart b/app/lib/screens/unregistered_screen.dart index 9b8a63bd..750cd35b 100644 --- a/app/lib/screens/unregistered_screen.dart +++ b/app/lib/screens/unregistered_screen.dart @@ -50,8 +50,8 @@ class _UnregisteredScreenState extends State context, MaterialPageRoute( builder: (context) => const SuccessfulScreen( - title: "Recovered", - text: "Your account has been recovered."))); + title: 'Recovered', + text: 'Your account has been recovered.'))); Navigator.pop(context); @@ -80,7 +80,7 @@ class _UnregisteredScreenState extends State minHeight: 250, minWidth: 250), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.center, children: [ Container(), Column( @@ -95,7 +95,7 @@ class _UnregisteredScreenState extends State image: AssetImage('assets/logo.png')), ), ), - const SizedBox(height: 10.0), + const SizedBox(height: 100), ], ), SizedBox( diff --git a/app/lib/services/3bot_service.dart b/app/lib/services/3bot_service.dart index f652a786..e99d2d61 100644 --- a/app/lib/services/3bot_service.dart +++ b/app/lib/services/3bot_service.dart @@ -193,7 +193,7 @@ Future finishRegistration( return http.post(url, body: json.encode({ - 'doubleName': '${doubleName}.3bot', + 'doubleName': '$doubleName.3bot', 'sid': sid, 'email': email.toLowerCase().trim(), 'public_key': publicKey diff --git a/app/lib/services/open_kyc_service.dart b/app/lib/services/open_kyc_service.dart index 1ab4d53f..52e0ac6a 100644 --- a/app/lib/services/open_kyc_service.dart +++ b/app/lib/services/open_kyc_service.dart @@ -201,7 +201,7 @@ Future verifyIdentity(String reference) async { } Future updateEmailAddressOfUser() async { - String timestamp = new DateTime.now().millisecondsSinceEpoch.toString(); + String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); Uint8List sk = await getPrivateKey(); Map payload = { diff --git a/app/lib/services/socket_service.dart b/app/lib/services/socket_service.dart index dfe316da..9cf226e0 100644 --- a/app/lib/services/socket_service.dart +++ b/app/lib/services/socket_service.dart @@ -43,7 +43,7 @@ class BackendConnection { print('[connect]'); socket.emit('join', {'room': doubleName.toLowerCase(), 'app': true}); - print('Joined room: ' + doubleName.toLowerCase()); + print('Joined room: ${doubleName.toLowerCase()}'); }); socket.on('email_verification', (_) { @@ -83,7 +83,7 @@ class BackendConnection { void closeSocketConnection(CloseSocketEvent event) { print('Closing socket connection'); - print('Leaving room: ' + doubleName); + print('Leaving room: $doubleName'); socket.emit('leave', {'room': doubleName}); socket.clearListeners(); @@ -143,7 +143,7 @@ Future emailVerification(BuildContext context) async { description: 'Your email has been verified!', actions: [ TextButton( - child: new Text('Ok'), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -191,7 +191,7 @@ Future phoneVerification(BuildContext context) async { description: 'Your phone has been verified!', actions: [ TextButton( - child: new Text('Ok'), + child: const Text('Ok'), onPressed: () { Navigator.pop(context); }, @@ -431,7 +431,7 @@ Future openLogin(BuildContext ctx, Login loginData, bool? warningScreenCompleted = await Navigator.push( ctx, MaterialPageRoute( - builder: (context) => WarningScreen(), + builder: (context) => const WarningScreen(), ), ); diff --git a/app/lib/services/uni_link_service.dart b/app/lib/services/uni_link_service.dart index 0cf5acc9..696fb059 100644 --- a/app/lib/services/uni_link_service.dart +++ b/app/lib/services/uni_link_service.dart @@ -102,11 +102,11 @@ Future handleSignUniLink(Uri link, BuildContext context) async { bool isValidSignAttempt = true; - req.forEach((element) { + for (var element in req) { if (queryParams[element] == null || queryParams[element] == 'undefined') { isValidSignAttempt = false; } - }); + } if (!isValidSignAttempt) { print('One or more parameters are missing'); diff --git a/app/lib/widgets/image_button.dart b/app/lib/widgets/image_button.dart index 65a2407a..7700f747 100644 --- a/app/lib/widgets/image_button.dart +++ b/app/lib/widgets/image_button.dart @@ -8,6 +8,7 @@ class ImageButton extends StatefulWidget { const ImageButton(this.imageId, this.selectedImageId, this.callback, {super.key}); + @override State createState() => _ImageButtonState(); } diff --git a/app/lib/widgets/pin_field.dart b/app/lib/widgets/pin_field.dart index 778617b2..dd0efafa 100644 --- a/app/lib/widgets/pin_field.dart +++ b/app/lib/widgets/pin_field.dart @@ -152,8 +152,10 @@ class _PinFieldState extends State { void onOk() { HapticFeedback.mediumImpact(); - String pin = ""; - input.forEach((char) => pin += char); + String pin = ''; + for (var char in input) { + pin += char; + } if (widget.callbackParam != null) { widget.callback(pin, widget.callbackParam); } else { diff --git a/app/lib/widgets/preference_dialog.dart b/app/lib/widgets/preference_dialog.dart index ea7a3863..657cb858 100644 --- a/app/lib/widgets/preference_dialog.dart +++ b/app/lib/widgets/preference_dialog.dart @@ -16,6 +16,7 @@ class PreferenceDialog extends StatefulWidget { const PreferenceDialog( {super.key, this.scope, this.appId, this.callback, this.type}); + @override State createState() => _PreferenceDialogState(); } diff --git a/app/lib/widgets/reusable_text_field_step.dart b/app/lib/widgets/reusable_text_field_step.dart index d96207eb..8b31bada 100644 --- a/app/lib/widgets/reusable_text_field_step.dart +++ b/app/lib/widgets/reusable_text_field_step.dart @@ -38,7 +38,7 @@ class ReuseableTextFieldStep extends StatelessWidget { autofocus: true, keyboardType: typeText, decoration: InputDecoration( - border: OutlineInputBorder(), + border: const OutlineInputBorder(), labelText: labelText, suffixText: suffixText, suffixStyle: const TextStyle(fontWeight: FontWeight.bold), From 5cafe677c428a0da7bdf92417348dc1f05e26bad Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 9 Dec 2023 16:43:18 +0200 Subject: [PATCH 008/457] Fix recover textfields style --- app/lib/screens/recover_screen.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index 479444c9..72b101b6 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -140,7 +140,8 @@ class _RecoverScreenState extends State { keyboardType: TextInputType.text, decoration: const InputDecoration( border: OutlineInputBorder(), - labelText: 'NAME', + labelText: 'Name', + filled: true, // suffixText: '.3bot', suffixStyle: TextStyle(fontWeight: FontWeight.bold), ), @@ -157,7 +158,11 @@ class _RecoverScreenState extends State { child: TextFormField( keyboardType: TextInputType.multiline, maxLines: null, - decoration: const InputDecoration(labelText: 'SEED PHRASE'), + decoration: const InputDecoration( + labelText: 'Seed Phrase', + border: OutlineInputBorder(), + filled: true, + ), controller: seedPhraseController, validator: (String? value) { if (value!.isEmpty) { From 15575be89c46c42d16337c118f502e937f138728 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 20:15:05 +0200 Subject: [PATCH 009/457] Update flutter to 3.16.8 --- app/pubspec.lock | 6 +++--- app/pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index b91b992d..9ed62fa8 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -669,10 +669,10 @@ packages: dependency: "direct main" description: name: shuftipro_sdk - sha256: "25de8738561c48b1c4cbf4fc56d43ed1c0c512d7c05fdb9f4844bb28a4ca5969" + sha256: "869b9d67191c671f1ea5b229a994173520381cc0524994496c61523592a45a0a" url: "https://pub.dev" source: hosted - version: "1.2.5" + version: "1.3.7" sky_engine: dependency: transitive description: flutter @@ -951,5 +951,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0-194.0.dev <=3.2.2" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.7.0" diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 6b5e9944..c2463629 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: "none" version: 3.9.0+176 environment: - sdk: ">=3.0.0<=3.2.2" + sdk: ">=3.0.0" dependencies: flutter: From 1c4542809707a7068beadd042239c3038d44f0e8 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 20:15:28 +0200 Subject: [PATCH 010/457] Add dark colors --- app/lib/main.dart | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/app/lib/main.dart b/app/lib/main.dart index f3afb435..e6418b3c 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -44,6 +44,15 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { + var kColorScheme = ColorScheme.fromSeed( + brightness: Brightness.light, + seedColor: const Color.fromARGB(255, 10, 115, 184), + secondary: const Color.fromARGB(255, 87, 190, 142)); + + var kDarkColorScheme = ColorScheme.fromSeed( + brightness: Brightness.dark, + seedColor: const Color.fromARGB(255, 10, 115, 184), + secondary: const Color.fromARGB(255, 87, 190, 142)); var textTheme = GoogleFonts.latoTextTheme( Theme.of(context).textTheme, ); @@ -55,12 +64,8 @@ class MyApp extends StatelessWidget { var textStyle = GoogleFonts.lato(); return MaterialApp( theme: ThemeData( - primaryColor: HexColor('#0a73b8'), - colorScheme: ColorScheme.fromSwatch().copyWith( - secondary: HexColor('#57BE8E'), - brightness: Brightness.light, - background: Colors.white, - ), + useMaterial3: true, + colorScheme: kColorScheme, brightness: Brightness.light, textTheme: textTheme, tabBarTheme: @@ -71,6 +76,20 @@ class MyApp extends StatelessWidget { toolbarTextStyle: accentTextStyle, ), ), + darkTheme: ThemeData( + useMaterial3: true, + colorScheme: kDarkColorScheme, + brightness: Brightness.dark, + textTheme: textTheme, + tabBarTheme: + TabBarTheme(labelStyle: textStyle, unselectedLabelStyle: textStyle), + appBarTheme: AppBarTheme( + color: Colors.white, + titleTextStyle: accentTextStyle, + toolbarTextStyle: accentTextStyle, + ), + ), + themeMode: ThemeMode.system, home: MainScreen(initDone: initDone, registered: registered), ); } From a357815090254ada6386d6cc83e03eed7f17456e Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 20:16:32 +0200 Subject: [PATCH 011/457] Update settings screen colors --- app/lib/screens/preference_screen.dart | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index 322f1bf0..20ca2f57 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -84,6 +84,9 @@ class _PreferenceScreenState extends State { alignment: Alignment.center, width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary.withOpacity(0.2), + BlendMode.srcIn), ), ListView( children: [ @@ -170,18 +173,20 @@ class _PreferenceScreenState extends State { ExpansionTile( title: const Text( 'Advanced settings', - style: TextStyle(color: Colors.black), ), children: [ ListTile( leading: const Icon(Icons.person), - title: const Text( + title: Text( 'Remove Account From Device', - style: TextStyle(color: Colors.red), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(color: Theme.of(context).colorScheme.error), ), - trailing: const Icon( + trailing: Icon( Icons.remove_circle, - color: Colors.red, + color: Theme.of(context).colorScheme.error, ), onTap: _showDialog, ), @@ -260,8 +265,8 @@ class _PreferenceScreenState extends State { await Navigator.pushReplacement( context, MaterialPageRoute( - builder: (context) => - const MainScreen(initDone: true, registered: false))); + builder: (context) => const MainScreen( + initDone: true, registered: false))); } else { showDialog( context: preferenceContext!, From 1340ad3278356a8e7b3f0807e666426f91bfd5f8 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 20:55:48 +0200 Subject: [PATCH 012/457] Update drawer icons colors --- app/lib/widgets/layout_drawer.dart | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/lib/widgets/layout_drawer.dart b/app/lib/widgets/layout_drawer.dart index cf14a024..37a0ff19 100644 --- a/app/lib/widgets/layout_drawer.dart +++ b/app/lib/widgets/layout_drawer.dart @@ -56,7 +56,7 @@ class _LayoutDrawerState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.home, color: Colors.black, size: 18) + Icon(Icons.home, size: 18) ], ), title: const Text('Home'), @@ -71,7 +71,7 @@ class _LayoutDrawerState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.article, color: Colors.black, size: 18) + Icon(Icons.article, size: 18) ], ), title: const Text('News'), @@ -86,8 +86,7 @@ class _LayoutDrawerState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.account_balance_wallet, - color: Colors.black, size: 18) + Icon(Icons.account_balance_wallet, size: 18) ], ), title: const Text('Wallet'), @@ -125,7 +124,7 @@ class _LayoutDrawerState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.chat, color: Colors.black, size: 18) + Icon(Icons.chat, size: 18) ], ), title: const Text('Support'), @@ -140,7 +139,7 @@ class _LayoutDrawerState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.person_outlined, color: Colors.black, size: 18) + Icon(Icons.person_outlined, size: 18) ], ), title: const Text('Identity'), @@ -155,7 +154,7 @@ class _LayoutDrawerState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.settings, color: Colors.black, size: 18) + Icon(Icons.settings, size: 18) ], ), title: const Text('Settings'), From 8fbf89de21120376c60277e5c33fca31c4bbba08 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 20:58:13 +0200 Subject: [PATCH 013/457] Update colors in the home screen --- app/lib/screens/registered_screen.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/lib/screens/registered_screen.dart b/app/lib/screens/registered_screen.dart index 7f2f701d..12200488 100644 --- a/app/lib/screens/registered_screen.dart +++ b/app/lib/screens/registered_screen.dart @@ -60,12 +60,12 @@ class _RegisteredScreenState extends State width: MediaQuery.of(context).size.width / 1.75, child: RichText( textAlign: TextAlign.center, - text: const TextSpan( + text: TextSpan( style: TextStyle( fontSize: 18.0, - color: Colors.black, + color: Theme.of(context).colorScheme.onBackground, ), - children: [ + children: const [ TextSpan(text: 'Welcome to the\n'), TextSpan( text: 'ThreeFold Connect App! \n', From f2f011b78afb0ba9be9c778aabd9b008df47fdd4 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 21:00:20 +0200 Subject: [PATCH 014/457] Clean the home screen --- app/lib/main.dart | 1 - app/lib/screens/home_screen.dart | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/lib/main.dart b/app/lib/main.dart index e6418b3c..ca111270 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:threebotlogin/helpers/globals.dart'; -import 'package:threebotlogin/helpers/hex_color.dart'; import 'package:threebotlogin/screens/main_screen.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; import 'package:google_fonts/google_fonts.dart'; diff --git a/app/lib/screens/home_screen.dart b/app/lib/screens/home_screen.dart index 1ae400ad..95c9e485 100644 --- a/app/lib/screens/home_screen.dart +++ b/app/lib/screens/home_screen.dart @@ -20,7 +20,6 @@ import 'package:threebotlogin/events/go_wallet_event.dart'; import 'package:threebotlogin/events/new_login_event.dart'; import 'package:threebotlogin/events/uni_link_event.dart'; import 'package:threebotlogin/helpers/globals.dart'; -import 'package:threebotlogin/helpers/hex_color.dart'; import 'package:threebotlogin/screens/authentication_screen.dart'; import 'package:threebotlogin/services/socket_service.dart'; import 'package:threebotlogin/services/uni_link_service.dart'; @@ -239,7 +238,7 @@ class _HomeScreenState extends State preferredSize: const Size.fromHeight(0), child: AppBar( automaticallyImplyLeading: true, - backgroundColor: HexColor('#2d4052'), + backgroundColor: Theme.of(context).colorScheme.background, ), ), body: DefaultTabController( @@ -254,6 +253,9 @@ class _HomeScreenState extends State alignment: Alignment.center, width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary.withOpacity(0.2), + BlendMode.srcIn), ), SafeArea( child: TabBarView( From a6499f332102b980fbc66ce68258f53232ab6b23 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 21:01:06 +0200 Subject: [PATCH 015/457] Update colors in the unregistered screen --- app/lib/screens/unregistered_screen.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/lib/screens/unregistered_screen.dart b/app/lib/screens/unregistered_screen.dart index 750cd35b..29a99b96 100644 --- a/app/lib/screens/unregistered_screen.dart +++ b/app/lib/screens/unregistered_screen.dart @@ -71,6 +71,9 @@ class _UnregisteredScreenState extends State alignment: Alignment.center, width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary.withOpacity(0.2), + BlendMode.srcIn), ), WillPopScope( child: ConstrainedBox( From 21cd8c74cf0e14180f96a2d12c60b03c1738d481 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 21:37:12 +0200 Subject: [PATCH 016/457] Update authentication screen colors --- app/lib/screens/authentication_screen.dart | 48 +++++++++++----------- app/lib/screens/change_pin_screen.dart | 7 +++- app/lib/widgets/pin_field.dart | 5 ++- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/app/lib/screens/authentication_screen.dart b/app/lib/screens/authentication_screen.dart index 01d638b2..1c9e2c74 100644 --- a/app/lib/screens/authentication_screen.dart +++ b/app/lib/screens/authentication_screen.dart @@ -114,7 +114,7 @@ class AuthenticationScreenState extends State { height: height / 50, width: size, decoration: - const BoxDecoration(color: Colors.black, shape: BoxShape.circle), + BoxDecoration(color: Theme.of(context).colorScheme.onBackground, shape: BoxShape.circle), duration: const Duration(milliseconds: 100), curve: Curves.bounceInOut, ); @@ -222,32 +222,34 @@ class AuthenticationScreenState extends State { return Scaffold( appBar: AppBar( automaticallyImplyLeading: true, - backgroundColor: HexColor('#0a73b8'), title: const Text('Authentication'), + backgroundColor: Theme.of(context).colorScheme.background, ), - body: Container( - color: Colors.white, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.only(bottom: 50), - child: Text(widget.userMessage), + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.only(bottom: 50), + child: Text( + widget.userMessage, + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(color: Theme.of(context).colorScheme.onBackground), ), - Container( - alignment: Alignment.center, - color: Colors.white, - child: Column( - children: [ - generateTextFields(context), - const SizedBox(height: 25), - generateNumbers(context), - ], - ), + ), + Container( + alignment: Alignment.center, + child: Column( + children: [ + generateTextFields(context), + const SizedBox(height: 25), + generateNumbers(context), + ], ), - ], - ), + ), + ], ), ); } diff --git a/app/lib/screens/change_pin_screen.dart b/app/lib/screens/change_pin_screen.dart index dc8bece9..76c387c6 100644 --- a/app/lib/screens/change_pin_screen.dart +++ b/app/lib/screens/change_pin_screen.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:threebotlogin/helpers/hex_color.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; import 'package:threebotlogin/widgets/pin_field.dart'; @@ -42,7 +41,7 @@ class _ChangePinScreenState extends State { return WillPopScope( child: Scaffold( appBar: AppBar( - backgroundColor: HexColor('#0a73b8'), + backgroundColor: Theme.of(context).colorScheme.background, title: widget.currentPin == null ? const Text('Choose your pincode') : const Text('Change pincode'), @@ -57,6 +56,10 @@ class _ChangePinScreenState extends State { child: Center( child: Text( getText(), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(color: Theme.of(context).colorScheme.onBackground), )), ), PinField( diff --git a/app/lib/widgets/pin_field.dart b/app/lib/widgets/pin_field.dart index dd0efafa..b9069447 100644 --- a/app/lib/widgets/pin_field.dart +++ b/app/lib/widgets/pin_field.dart @@ -37,8 +37,9 @@ class _PinFieldState extends State { margin: EdgeInsets.all(height / 120), height: height / 50, width: size, - decoration: - const BoxDecoration(color: Colors.black, shape: BoxShape.circle), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.onBackground, + shape: BoxShape.circle), duration: const Duration(milliseconds: 100), curve: Curves.bounceInOut, ); From 73d3fc4ba41ba691d6e6e76b756b6ffd2cd91ea4 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 21:37:58 +0200 Subject: [PATCH 017/457] Update the verification screen color --- app/lib/screens/identity_verification_screen.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/lib/screens/identity_verification_screen.dart b/app/lib/screens/identity_verification_screen.dart index e353c352..6dc22a72 100644 --- a/app/lib/screens/identity_verification_screen.dart +++ b/app/lib/screens/identity_verification_screen.dart @@ -227,6 +227,9 @@ class _IdentityVerificationScreenState alignment: Alignment.center, width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary.withOpacity(0.2), + BlendMode.srcIn), ), FutureBuilder( future: getEmail(), From a17ee26eda166d62d87ea87b5d93e4a5b71779c0 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 23:13:08 +0200 Subject: [PATCH 018/457] Add card and elevated buttons theme --- app/lib/main.dart | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/app/lib/main.dart b/app/lib/main.dart index ca111270..12523dd8 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -70,10 +70,18 @@ class MyApp extends StatelessWidget { tabBarTheme: TabBarTheme(labelStyle: textStyle, unselectedLabelStyle: textStyle), appBarTheme: AppBarTheme( - color: Colors.white, + color: kColorScheme.primary, + iconTheme: const IconThemeData(color: Colors.white), titleTextStyle: accentTextStyle, toolbarTextStyle: accentTextStyle, ), + cardTheme: const CardTheme().copyWith( + color: kColorScheme.secondaryContainer, + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8)), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: kDarkColorScheme.primaryContainer), + ), ), darkTheme: ThemeData( useMaterial3: true, @@ -83,10 +91,18 @@ class MyApp extends StatelessWidget { tabBarTheme: TabBarTheme(labelStyle: textStyle, unselectedLabelStyle: textStyle), appBarTheme: AppBarTheme( - color: Colors.white, + color: kColorScheme.primary, + iconTheme: const IconThemeData(color: Colors.white), titleTextStyle: accentTextStyle, toolbarTextStyle: accentTextStyle, ), + cardTheme: const CardTheme().copyWith( + color: kDarkColorScheme.secondaryContainer, + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8)), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: kDarkColorScheme.primaryContainer), + ), ), themeMode: ThemeMode.system, home: MainScreen(initDone: initDone, registered: registered), From e89e799fc0890f294618f061f3e2dcb7a3ce6744 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 23:14:40 +0200 Subject: [PATCH 019/457] Update background color of the authentication --- app/lib/screens/authentication_screen.dart | 1 - app/lib/screens/change_pin_screen.dart | 1 - 2 files changed, 2 deletions(-) diff --git a/app/lib/screens/authentication_screen.dart b/app/lib/screens/authentication_screen.dart index 1c9e2c74..1783aa3a 100644 --- a/app/lib/screens/authentication_screen.dart +++ b/app/lib/screens/authentication_screen.dart @@ -223,7 +223,6 @@ class AuthenticationScreenState extends State { appBar: AppBar( automaticallyImplyLeading: true, title: const Text('Authentication'), - backgroundColor: Theme.of(context).colorScheme.background, ), body: Column( mainAxisAlignment: MainAxisAlignment.center, diff --git a/app/lib/screens/change_pin_screen.dart b/app/lib/screens/change_pin_screen.dart index 76c387c6..3b40c166 100644 --- a/app/lib/screens/change_pin_screen.dart +++ b/app/lib/screens/change_pin_screen.dart @@ -41,7 +41,6 @@ class _ChangePinScreenState extends State { return WillPopScope( child: Scaffold( appBar: AppBar( - backgroundColor: Theme.of(context).colorScheme.background, title: widget.currentPin == null ? const Text('Choose your pincode') : const Text('Change pincode'), From 903012038b3b8222f4017d101913c20d376abd6e Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 23:15:56 +0200 Subject: [PATCH 020/457] Update custom dialog colors --- app/lib/widgets/custom_dialog.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/lib/widgets/custom_dialog.dart b/app/lib/widgets/custom_dialog.dart index 576514da..8f36b8f1 100644 --- a/app/lib/widgets/custom_dialog.dart +++ b/app/lib/widgets/custom_dialog.dart @@ -107,7 +107,7 @@ class _CustomDialogState extends State { } }, child: CircleAvatar( - backgroundColor: Theme.of(context).primaryColor, + backgroundColor: Theme.of(context).colorScheme.primaryContainer, radius: 30.0, child: Icon( widget.image, @@ -127,12 +127,11 @@ class _CustomDialogState extends State { padding: const EdgeInsets.only(top: 30.0 + 20.0), margin: const EdgeInsets.only(top: 30.0), decoration: BoxDecoration( - color: Colors.white, + color: Theme.of(context).colorScheme.background, shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(20.0), boxShadow: const [ BoxShadow( - color: Colors.black26, blurRadius: 10.0, offset: Offset(0.0, 10.0), ), @@ -146,10 +145,9 @@ class _CustomDialogState extends State { padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Text( widget.title, - style: const TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.onBackground), textAlign: TextAlign.center, ), ), @@ -162,6 +160,9 @@ class _CustomDialogState extends State { ? Text( widget.description!, textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.onBackground), ) : widget.widgetDescription, ), @@ -177,7 +178,6 @@ class _CustomDialogState extends State { ), boxShadow: const [ BoxShadow( - color: Colors.black26, blurRadius: 10.0, offset: Offset(0.0, 10.0), ), From 0ddb150d3dad0585942072a1a719f447c13d631b Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 20 Jan 2024 23:16:50 +0200 Subject: [PATCH 021/457] Remove scaffold background color to use the default from the theme --- app/lib/screens/home_screen.dart | 1 - app/lib/screens/login_screen.dart | 1 - app/lib/screens/mobile_registration_screen.dart | 1 - app/lib/screens/recover_screen.dart | 2 -- app/lib/screens/sign_screen.dart | 1 - app/lib/screens/successful_screen.dart | 1 - app/lib/screens/warning_screen.dart | 1 - app/lib/widgets/error_widget.dart | 6 ++---- app/lib/widgets/layout_drawer.dart | 2 -- 9 files changed, 2 insertions(+), 14 deletions(-) diff --git a/app/lib/screens/home_screen.dart b/app/lib/screens/home_screen.dart index 95c9e485..a7946fa3 100644 --- a/app/lib/screens/home_screen.dart +++ b/app/lib/screens/home_screen.dart @@ -238,7 +238,6 @@ class _HomeScreenState extends State preferredSize: const Size.fromHeight(0), child: AppBar( automaticallyImplyLeading: true, - backgroundColor: Theme.of(context).colorScheme.background, ), ), body: DefaultTabController( diff --git a/app/lib/screens/login_screen.dart b/app/lib/screens/login_screen.dart index 75df317a..8eb14e02 100644 --- a/app/lib/screens/login_screen.dart +++ b/app/lib/screens/login_screen.dart @@ -206,7 +206,6 @@ class _LoginScreenState extends State with BlockAndRunMixin { key: _scaffoldKey, appBar: AppBar( // automaticallyImplyLeading: false, - backgroundColor: Theme.of(context).primaryColor, title: const Text('Login'), ), body: Column( diff --git a/app/lib/screens/mobile_registration_screen.dart b/app/lib/screens/mobile_registration_screen.dart index f8ea984b..4993c8b3 100644 --- a/app/lib/screens/mobile_registration_screen.dart +++ b/app/lib/screens/mobile_registration_screen.dart @@ -600,7 +600,6 @@ class _MobileRegistrationScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - backgroundColor: Globals.color, title: const Text('ThreeFold Connect - Registration'), ), body: registrationStepper(), diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index 72b101b6..6e9f35ad 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -108,7 +108,6 @@ class _RecoverScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - backgroundColor: Globals.color, title: const Text('Recover Account'), ), body: Container( @@ -182,7 +181,6 @@ class _RecoverScreenState extends State { ), ElevatedButton( style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).primaryColor, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10)), ), diff --git a/app/lib/screens/sign_screen.dart b/app/lib/screens/sign_screen.dart index 90901f2c..e42bcbfe 100644 --- a/app/lib/screens/sign_screen.dart +++ b/app/lib/screens/sign_screen.dart @@ -79,7 +79,6 @@ class _SignScreenState extends State with BlockAndRunMixin { key: _scaffoldKey, appBar: AppBar( // automaticallyImplyLeading: false, - backgroundColor: Theme.of(context).primaryColor, title: const Text('Sign'), ), body: Column( diff --git a/app/lib/screens/successful_screen.dart b/app/lib/screens/successful_screen.dart index 04270612..9ba8db0d 100644 --- a/app/lib/screens/successful_screen.dart +++ b/app/lib/screens/successful_screen.dart @@ -27,7 +27,6 @@ class _SuccessfulScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - backgroundColor: Theme.of(context).primaryColor, title: const Text('Recovered'), ), body: Container( diff --git a/app/lib/screens/warning_screen.dart b/app/lib/screens/warning_screen.dart index 1eeef059..e25c30ff 100644 --- a/app/lib/screens/warning_screen.dart +++ b/app/lib/screens/warning_screen.dart @@ -20,7 +20,6 @@ class _WarningScreenState extends State { title: 'Login from a new location', home: Scaffold( appBar: AppBar( - backgroundColor: HexColor('#2d4052'), title: const Text('Login from a new location'), ), body: Padding( diff --git a/app/lib/widgets/error_widget.dart b/app/lib/widgets/error_widget.dart index af15a2ee..9e4b726d 100644 --- a/app/lib/widgets/error_widget.dart +++ b/app/lib/widgets/error_widget.dart @@ -1,11 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:threebotlogin/helpers/hex_color.dart'; Widget getErrorWidget(BuildContext context, FlutterErrorDetails error) { - return SafeArea( + return const SafeArea( child: Scaffold( - backgroundColor: HexColor('#0f296a'), - body: const Column( + body: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Center( diff --git a/app/lib/widgets/layout_drawer.dart b/app/lib/widgets/layout_drawer.dart index 37a0ff19..1d457b23 100644 --- a/app/lib/widgets/layout_drawer.dart +++ b/app/lib/widgets/layout_drawer.dart @@ -22,8 +22,6 @@ class _LayoutDrawerState extends State { // Here we take the value from the MyHomePage object that was created by // the App.build method, and use it to set our appbar title. title: Text(widget.titleText), - backgroundColor: Theme.of(context).primaryColor, - iconTheme: const IconThemeData(color: Colors.white), toolbarHeight: 60, ), body: widget.content, From 75c3ae22ffc581eb1578b670d3e5bc5059c2c4b6 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 16:26:45 +0200 Subject: [PATCH 022/457] Update the colors of the identity screen --- .../screens/identity_verification_screen.dart | 39 +++++++++++-------- app/lib/screens/recover_screen.dart | 1 - 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/app/lib/screens/identity_verification_screen.dart b/app/lib/screens/identity_verification_screen.dart index 6dc22a72..35c55394 100644 --- a/app/lib/screens/identity_verification_screen.dart +++ b/app/lib/screens/identity_verification_screen.dart @@ -854,14 +854,14 @@ class _IdentityVerificationScreenState Container( width: 30.0, height: 30.0, - decoration: const BoxDecoration( - shape: BoxShape.circle, color: Colors.green), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Theme.of(context).colorScheme.primaryContainer), child: const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.check, - color: Colors.white, size: 15.0, ), ], @@ -871,7 +871,6 @@ class _IdentityVerificationScreenState Icon( icon, size: 20, - color: Colors.black, ), const Padding(padding: EdgeInsets.only(left: 15)), Row( @@ -891,19 +890,27 @@ class _IdentityVerificationScreenState MediaQuery.of(context).size.width * 0.55), child: Text(text == '' ? 'Unknown' : text, overflow: TextOverflow.clip, - style: const TextStyle( - fontSize: 12, fontWeight: FontWeight.bold))) + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith( + fontWeight: FontWeight.bold, + color: Theme.of(context) + .colorScheme + .onBackground))) ], ), const SizedBox(height: 5), - const Row( + Row( children: [ Text( 'Verified', - style: TextStyle( - color: Colors.green, - fontSize: 12, - fontWeight: FontWeight.bold), + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith( + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold), ) ], ) @@ -912,17 +919,17 @@ class _IdentityVerificationScreenState step == 1 ? const Column( mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.edit, size: 20, color: Colors.black) - ], + children: [Icon(Icons.edit, size: 20)], ) : const Column(), step == 3 ? const Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(Icons.chevron_right, - size: 20, color: Colors.black) + Icon( + Icons.chevron_right, + size: 20, + ) ], ) : const Column() diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index 6e9f35ad..2f1abdf9 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -6,7 +6,6 @@ import 'package:flutter_pkid/flutter_pkid.dart'; import 'package:sodium_libs/sodium_libs.dart'; import 'package:http/http.dart'; import 'package:threebotlogin/helpers/kyc_helpers.dart'; -import 'package:threebotlogin/helpers/globals.dart'; import 'package:threebotlogin/services/3bot_service.dart'; import 'package:threebotlogin/services/crypto_service.dart'; import 'package:threebotlogin/services/migration_service.dart'; From 8b61ecfd5c9116979f9f0e722958784a23ed0a9c Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 16:27:22 +0200 Subject: [PATCH 023/457] Use the same colors as the current dashboard --- app/lib/main.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/lib/main.dart b/app/lib/main.dart index 12523dd8..b586fc78 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -44,14 +44,14 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { var kColorScheme = ColorScheme.fromSeed( - brightness: Brightness.light, - seedColor: const Color.fromARGB(255, 10, 115, 184), - secondary: const Color.fromARGB(255, 87, 190, 142)); + brightness: Brightness.light, + seedColor: const Color.fromARGB(255, 26, 161, 143), + ); var kDarkColorScheme = ColorScheme.fromSeed( - brightness: Brightness.dark, - seedColor: const Color.fromARGB(255, 10, 115, 184), - secondary: const Color.fromARGB(255, 87, 190, 142)); + brightness: Brightness.dark, + seedColor: const Color.fromARGB(255, 26, 161, 143), + ); var textTheme = GoogleFonts.latoTextTheme( Theme.of(context).textTheme, ); From 67e1fb3d1c14f0fd1bc828609a3d0a6e0ec978c1 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 16:56:08 +0200 Subject: [PATCH 024/457] Update the alert dialog of the identity verification --- .../screens/identity_verification_screen.dart | 78 ++++++++++++------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/app/lib/screens/identity_verification_screen.dart b/app/lib/screens/identity_verification_screen.dart index 35c55394..5519a5d2 100644 --- a/app/lib/screens/identity_verification_screen.dart +++ b/app/lib/screens/identity_verification_screen.dart @@ -1238,33 +1238,59 @@ class _IdentityVerificationScreenState return StatefulBuilder(builder: (statefulContext, setCustomState) { return AlertDialog( title: emailWasEmpty == true - ? const Text('Add email') - : const Text('Change email'), + ? Text( + 'Add email', + style: Theme.of(context) + .textTheme + .headlineMedium! + .copyWith( + color: + Theme.of(context).colorScheme.onBackground), + ) + : Text('Change email', + style: Theme.of(context) + .textTheme + .headlineMedium! + .copyWith( + color: + Theme.of(context).colorScheme.onBackground)), contentPadding: const EdgeInsets.all(24), - content: Container( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - emailWasEmpty == true - ? const Text('Please pass us your email address') - : const Text( - 'Changing your email will require you to go through the email verification process again.'), - TextField( - controller: controller, - decoration: InputDecoration( - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).primaryColor), - ), - labelText: 'Email', - errorText: validEmail == true ? null : errorEmail), - ), - const SizedBox( - height: 20, - ), - statusMessage - ], - ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + emailWasEmpty == true + ? Text('Please pass us your email address', + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground)) + : Text( + 'Changing your email will require you to go through the email verification process again.', + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground)), + TextField( + controller: controller, + decoration: InputDecoration( + focusedBorder: UnderlineInputBorder( + borderSide: + BorderSide(color: Theme.of(context).primaryColor), + ), + labelText: 'Email', + errorText: validEmail == true ? null : errorEmail), + ), + const SizedBox( + height: 20, + ), + statusMessage + ], ), actions: [ TextButton( From 273c4ce441027cbea3485562fdc47e4be3f953ec Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 17:02:01 +0200 Subject: [PATCH 025/457] Update the checkbox color of the biometric check --- app/lib/screens/preference_screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index 20ca2f57..ca19123d 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -135,7 +135,7 @@ class _PreferenceScreenState extends State { value: finger, title: Text(snapshot.data.toString()), activeColor: - Theme.of(context).colorScheme.secondary, + Theme.of(context).colorScheme.primary, onChanged: (bool? newValue) async { _toggleFingerprint(newValue!); }, From f7920e770e5e85ea8139efe3cf8f2d2ea7ced27e Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 17:06:40 +0200 Subject: [PATCH 026/457] Update the color of the seed phrase dialog --- app/lib/widgets/custom_dialog.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/lib/widgets/custom_dialog.dart b/app/lib/widgets/custom_dialog.dart index 8f36b8f1..14010762 100644 --- a/app/lib/widgets/custom_dialog.dart +++ b/app/lib/widgets/custom_dialog.dart @@ -107,12 +107,12 @@ class _CustomDialogState extends State { } }, child: CircleAvatar( - backgroundColor: Theme.of(context).colorScheme.primaryContainer, + backgroundColor: Theme.of(context).colorScheme.primary, radius: 30.0, child: Icon( widget.image, size: 42.0, - color: Colors.white, + color: Theme.of(context).colorScheme.onPrimary, ), ), ), From 759c3840b7cdf877d0758ac778f81b3cb90348ce Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 17:12:23 +0200 Subject: [PATCH 027/457] Update verified circle for the email --- app/lib/screens/identity_verification_screen.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/lib/screens/identity_verification_screen.dart b/app/lib/screens/identity_verification_screen.dart index 5519a5d2..213db43a 100644 --- a/app/lib/screens/identity_verification_screen.dart +++ b/app/lib/screens/identity_verification_screen.dart @@ -856,13 +856,14 @@ class _IdentityVerificationScreenState height: 30.0, decoration: BoxDecoration( shape: BoxShape.circle, - color: Theme.of(context).colorScheme.primaryContainer), - child: const Column( + color: Theme.of(context).colorScheme.primary), + child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.check, size: 15.0, + color: Theme.of(context).colorScheme.onPrimary, ), ], ), From b323fd82c35f116c590d469403708159079d47ec Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 18:20:06 +0200 Subject: [PATCH 028/457] Update the logo --- app/assets/logoTF.png | Bin 0 -> 3835 bytes app/lib/screens/main_screen.dart | 10 +++--- app/lib/screens/registered_screen.dart | 13 ++++--- app/lib/screens/unregistered_screen.dart | 43 +++++++++++++++-------- app/lib/widgets/layout_drawer.dart | 11 +++--- app/pubspec.yaml | 2 +- 6 files changed, 50 insertions(+), 29 deletions(-) create mode 100644 app/assets/logoTF.png diff --git a/app/assets/logoTF.png b/app/assets/logoTF.png new file mode 100644 index 0000000000000000000000000000000000000000..4be2121e08a6a2dc9e439e0e7ab6c45ad7b6eb38 GIT binary patch literal 3835 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 literal 0 HcmV?d00001 diff --git a/app/lib/screens/main_screen.dart b/app/lib/screens/main_screen.dart index 70b80b36..e22f2249 100644 --- a/app/lib/screens/main_screen.dart +++ b/app/lib/screens/main_screen.dart @@ -61,8 +61,11 @@ class _AppState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( - 'assets/logo.png', + 'assets/logoTF.png', height: 100, + colorBlendMode: BlendMode.srcIn, + width: 300, + color: Theme.of(context).colorScheme.onBackground, ), const SizedBox( height: 40, @@ -73,10 +76,9 @@ class _AppState extends State { updateMessage != null ? updateMessage.toString() : errorMessage.toString(), - style: TextStyle( - fontSize: 16, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( fontWeight: FontWeight.bold, - color: errorMessage != null ? Colors.red : Colors.black), + color: errorMessage != null ? Theme.of(context).colorScheme.error : Theme.of(context).colorScheme.onBackground), ), ), const SizedBox( diff --git a/app/lib/screens/registered_screen.dart b/app/lib/screens/registered_screen.dart index 12200488..b44ea3db 100644 --- a/app/lib/screens/registered_screen.dart +++ b/app/lib/screens/registered_screen.dart @@ -38,14 +38,17 @@ class _RegisteredScreenState extends State children: [ Container( width: 300.0, - height: 90.0, - decoration: const BoxDecoration( + height: 35, + decoration: BoxDecoration( image: DecorationImage( + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onBackground, + BlendMode.srcIn), fit: BoxFit.fill, - image: AssetImage('assets/logo.png')), + image: const AssetImage('assets/logoTF.png')), ), ), - const SizedBox(height: 30), + const SizedBox(height: 50), Container( width: 200.0, height: 200.0, @@ -55,7 +58,7 @@ class _RegisteredScreenState extends State image: AssetImage('assets/threefold_registered.png')), ), ), - const SizedBox(height: 30), + const SizedBox(height: 50), SizedBox( width: MediaQuery.of(context).size.width / 1.75, child: RichText( diff --git a/app/lib/screens/unregistered_screen.dart b/app/lib/screens/unregistered_screen.dart index 29a99b96..86917f15 100644 --- a/app/lib/screens/unregistered_screen.dart +++ b/app/lib/screens/unregistered_screen.dart @@ -90,12 +90,15 @@ class _UnregisteredScreenState extends State mainAxisAlignment: MainAxisAlignment.center, children: [ Container( - width: 360.0, - height: 108.0, - decoration: const BoxDecoration( + width: 300.0, + height: 35.0, + decoration: BoxDecoration( image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage('assets/logo.png')), + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onBackground, + BlendMode.srcIn), + fit: BoxFit.fill, + image: const AssetImage('assets/logoTF.png')), ), ), const SizedBox(height: 100), @@ -109,19 +112,24 @@ class _UnregisteredScreenState extends State ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: - Theme.of(context).colorScheme.secondary, + Theme.of(context).colorScheme.primaryContainer, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(30)), ), ), - child: const Row( + child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - 'SIGN UP', - style: TextStyle( - color: Colors.white, fontSize: 16), + 'Sign Up', + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + color: Theme.of(context) + .colorScheme + .onPrimaryContainer), ), ], ), @@ -133,19 +141,24 @@ class _UnregisteredScreenState extends State ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: - Theme.of(context).colorScheme.secondary, + Theme.of(context).colorScheme.primaryContainer, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(30)), ), ), - child: const Row( + child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - 'RECOVER ACCOUNT', - style: TextStyle( - color: Colors.white, fontSize: 16), + 'Recover Account', + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + color: Theme.of(context) + .colorScheme + .onPrimaryContainer), ), ], ), diff --git a/app/lib/widgets/layout_drawer.dart b/app/lib/widgets/layout_drawer.dart index 1d457b23..66307819 100644 --- a/app/lib/widgets/layout_drawer.dart +++ b/app/lib/widgets/layout_drawer.dart @@ -32,20 +32,23 @@ class _LayoutDrawerState extends State { // Important: Remove any padding from the ListView. padding: EdgeInsets.zero, children: [ - const SizedBox( + SizedBox( width: 200, height: 100, child: Padding( - padding: EdgeInsets.all(20), + padding: const EdgeInsets.all(20), child: DrawerHeader( decoration: BoxDecoration( image: DecorationImage( + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onBackground, + BlendMode.srcIn), alignment: Alignment.center, - image: AssetImage('assets/logo.png'), + image: const AssetImage('assets/logoTF.png'), fit: BoxFit.contain, ), ), - child: Text(''), + child: const Text(''), )), ), ListTile( diff --git a/app/pubspec.yaml b/app/pubspec.yaml index c2463629..a1155660 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -52,7 +52,7 @@ dev_dependencies: flutter_native_splash: color: "#FFFFFF" - image: assets/logo.png + image: assets/logoTF.png android: true ios: true From c591fd6264fc6b5f5b0b66d75051656889e2143f Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 18:43:37 +0200 Subject: [PATCH 029/457] Update recovered screen color --- app/lib/screens/successful_screen.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/lib/screens/successful_screen.dart b/app/lib/screens/successful_screen.dart index 9ba8db0d..1f17bdb0 100644 --- a/app/lib/screens/successful_screen.dart +++ b/app/lib/screens/successful_screen.dart @@ -38,14 +38,16 @@ class _SuccessfulScreenState extends State { Icon( Icons.check_circle, size: 42.0, - color: Theme.of(context).colorScheme.secondary, + color: Theme.of(context).colorScheme.primary, ), const SizedBox( height: 20.0, ), Text( widget.text, - style: const TextStyle(fontSize: 18), + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.onBackground), ), const SizedBox( height: 60.0, From 9d861557445a143f385c26cff51a9d5be7365778 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 19:02:21 +0200 Subject: [PATCH 030/457] Update loading spinner color --- .../screens/identity_verification_screen.dart | 40 +++++++++++++------ app/lib/screens/main_screen.dart | 8 ++-- .../screens/mobile_registration_screen.dart | 19 ++++++--- app/lib/screens/recover_screen.dart | 20 +++++++--- app/lib/screens/sign_screen.dart | 18 ++++++--- 5 files changed, 72 insertions(+), 33 deletions(-) diff --git a/app/lib/screens/identity_verification_screen.dart b/app/lib/screens/identity_verification_screen.dart index 213db43a..1adbd223 100644 --- a/app/lib/screens/identity_verification_screen.dart +++ b/app/lib/screens/identity_verification_screen.dart @@ -490,19 +490,27 @@ class _IdentityVerificationScreenState } Widget _pleaseWait() { - return const Dialog( + return Dialog( child: Column( mainAxisSize: MainAxisSize.min, children: [ - SizedBox( + const SizedBox( height: 10, ), - CircularProgressIndicator(), - SizedBox( + CircularProgressIndicator( + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox( height: 10, ), - Text('One moment please'), - SizedBox( + Text( + 'One moment please', + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(color: Theme.of(context).colorScheme.onBackground), + ), + const SizedBox( height: 10, ), ], @@ -517,19 +525,25 @@ class _IdentityVerificationScreenState builder: (BuildContext context) { return WillPopScope( onWillPop: () => Future.value(false), - child: const Dialog( + child: Dialog( child: Column( mainAxisSize: MainAxisSize.min, children: [ - SizedBox( + const SizedBox( height: 10, ), - CircularProgressIndicator(), - SizedBox( + CircularProgressIndicator( + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox( height: 10, ), - Text('One moment please'), - SizedBox( + Text( + 'One moment please', + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onBackground), + ), + const SizedBox( height: 10, ), ], @@ -857,7 +871,7 @@ class _IdentityVerificationScreenState decoration: BoxDecoration( shape: BoxShape.circle, color: Theme.of(context).colorScheme.primary), - child: Column( + child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( diff --git a/app/lib/screens/main_screen.dart b/app/lib/screens/main_screen.dart index e22f2249..db06e0cc 100644 --- a/app/lib/screens/main_screen.dart +++ b/app/lib/screens/main_screen.dart @@ -78,7 +78,9 @@ class _AppState extends State { : errorMessage.toString(), style: Theme.of(context).textTheme.bodyMedium!.copyWith( fontWeight: FontWeight.bold, - color: errorMessage != null ? Theme.of(context).colorScheme.error : Theme.of(context).colorScheme.onBackground), + color: errorMessage != null + ? Theme.of(context).colorScheme.error + : Theme.of(context).colorScheme.onBackground), ), ), const SizedBox( @@ -86,8 +88,8 @@ class _AppState extends State { ), Transform.scale( scale: 0.5, - child: const CircularProgressIndicator( - color: Color.fromRGBO(0, 174, 239, 1), + child: CircularProgressIndicator( + color: Theme.of(context).colorScheme.primary, ), ), const SizedBox(height: 20), diff --git a/app/lib/screens/mobile_registration_screen.dart b/app/lib/screens/mobile_registration_screen.dart index 4993c8b3..f13a53f3 100644 --- a/app/lib/screens/mobile_registration_screen.dart +++ b/app/lib/screens/mobile_registration_screen.dart @@ -276,19 +276,26 @@ class _MobileRegistrationScreenState extends State { return showDialog( context: context, barrierDismissible: false, - builder: (BuildContext context) => const Dialog( + builder: (BuildContext context) => Dialog( child: Column( mainAxisSize: MainAxisSize.min, children: [ - SizedBox( + const SizedBox( height: 10, ), - CircularProgressIndicator(), - SizedBox( + CircularProgressIndicator( + color: Theme.of(context).colorScheme.primary), + const SizedBox( height: 10, ), - Text('Loading'), - SizedBox( + Text( + 'Loading', + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(color: Theme.of(context).colorScheme.onBackground), + ), + const SizedBox( height: 10, ), ], diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index 2f1abdf9..78d12c21 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -247,19 +247,27 @@ class _RecoverScreenState extends State { showDialog( context: context, barrierDismissible: false, - builder: (BuildContext context) => const Dialog( + builder: (BuildContext context) => Dialog( child: Column( mainAxisSize: MainAxisSize.min, children: [ - SizedBox( + const SizedBox( height: 10, ), - CircularProgressIndicator(), - SizedBox( + CircularProgressIndicator( + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox( height: 10, ), - Text('Loading'), - SizedBox( + Text( + 'Loading', + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(color: Theme.of(context).colorScheme.onBackground), + ), + const SizedBox( height: 10, ), ], diff --git a/app/lib/screens/sign_screen.dart b/app/lib/screens/sign_screen.dart index e42bcbfe..d02adc4b 100644 --- a/app/lib/screens/sign_screen.dart +++ b/app/lib/screens/sign_screen.dart @@ -218,7 +218,11 @@ class _SignScreenState extends State with BlockAndRunMixin { const SizedBox( height: 15, ), - isBusy ? const CircularProgressIndicator() : Container(), + isBusy + ? CircularProgressIndicator( + color: Theme.of(context).colorScheme.primary, + ) + : Container(), isBusy ? const SizedBox( height: 10, @@ -362,15 +366,19 @@ class _SignScreenState extends State with BlockAndRunMixin { child: Container( constraints: BoxConstraints(minHeight: MediaQuery.of(context).size.height * 0.8), - child: const Column( + child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - CircularProgressIndicator(), - SizedBox(height: 20), + CircularProgressIndicator( + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox(height: 20), Text( 'Loading ...', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ) ], ), From 92f33c0c4f1d3f8aa1d685d8b4ecf86c7e855b1e Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 19:30:09 +0200 Subject: [PATCH 031/457] Update the recover screen color --- app/lib/main.dart | 2 +- app/lib/screens/recover_screen.dart | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/lib/main.dart b/app/lib/main.dart index b586fc78..8614f77a 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -80,7 +80,7 @@ class MyApp extends StatelessWidget { margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8)), elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( - backgroundColor: kDarkColorScheme.primaryContainer), + backgroundColor: kColorScheme.primaryContainer), ), ), darkTheme: ThemeData( diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index 78d12c21..b479c683 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -135,6 +135,8 @@ class _RecoverScreenState extends State { Padding( padding: const EdgeInsets.only(top: 8.5), child: TextFormField( + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onBackground), keyboardType: TextInputType.text, decoration: const InputDecoration( border: OutlineInputBorder(), @@ -154,6 +156,8 @@ class _RecoverScreenState extends State { Padding( padding: const EdgeInsets.only(top: 8.5), child: TextFormField( + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onBackground), keyboardType: TextInputType.multiline, maxLines: null, decoration: const InputDecoration( @@ -175,8 +179,9 @@ class _RecoverScreenState extends State { ), Text( error, - style: const TextStyle( - color: Colors.red, fontWeight: FontWeight.bold), + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + color: Theme.of(context).colorScheme.error, + fontWeight: FontWeight.bold), ), ElevatedButton( style: ElevatedButton.styleFrom( @@ -186,9 +191,12 @@ class _RecoverScreenState extends State { padding: const EdgeInsets.symmetric(horizontal: 11.0, vertical: 6.0), ), - child: const Text( + child: Text( 'Recover Account', - style: TextStyle(color: Colors.white), + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(color: Theme.of(context).colorScheme.onPrimaryContainer), ), onPressed: () async { setState(() { From e6771174e9515a944e4a71ac38a41a23e60360ac Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 19:44:10 +0200 Subject: [PATCH 032/457] Update the registration screen color --- app/lib/screens/mobile_registration_screen.dart | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/lib/screens/mobile_registration_screen.dart b/app/lib/screens/mobile_registration_screen.dart index f13a53f3..0aa0ecee 100644 --- a/app/lib/screens/mobile_registration_screen.dart +++ b/app/lib/screens/mobile_registration_screen.dart @@ -6,7 +6,6 @@ import 'package:flutter_pkid/flutter_pkid.dart'; import 'package:sodium_libs/sodium_libs.dart'; import 'package:http/http.dart'; import 'package:threebotlogin/helpers/flags.dart'; -import 'package:threebotlogin/helpers/globals.dart'; import 'package:threebotlogin/helpers/kyc_helpers.dart'; import 'package:threebotlogin/services/3bot_service.dart'; import 'package:threebotlogin/services/crypto_service.dart'; @@ -307,10 +306,7 @@ class _MobileRegistrationScreenState extends State { Widget registrationStepper() { return Theme( data: ThemeData( - primaryColor: Globals.color, - colorScheme: ColorScheme.fromSwatch().copyWith( - secondary: Globals.color, - ), + colorScheme: Theme.of(context).colorScheme ), child: Stepper( controlsBuilder: (BuildContext context, ControlsDetails details) { @@ -607,7 +603,7 @@ class _MobileRegistrationScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('ThreeFold Connect - Registration'), + title: const Text('Registration'), ), body: registrationStepper(), ); From cca247118a009cf403faf69588c34824e5dff3ff Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 19:56:47 +0200 Subject: [PATCH 033/457] Remove the background from the most of the app --- app/lib/screens/home_screen.dart | 27 +-- .../screens/identity_verification_screen.dart | 206 ++++++++---------- app/lib/screens/preference_screen.dart | 202 ++++++++--------- 3 files changed, 193 insertions(+), 242 deletions(-) diff --git a/app/lib/screens/home_screen.dart b/app/lib/screens/home_screen.dart index a7946fa3..cd967de1 100644 --- a/app/lib/screens/home_screen.dart +++ b/app/lib/screens/home_screen.dart @@ -2,8 +2,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; - //import 'package:threebotlogin/apps/free_flow_pages/ffp.dart'; //import 'package:threebotlogin/apps/free_flow_pages/ffp_events.dart'; import 'package:threebotlogin/events/email_event.dart'; @@ -245,25 +243,12 @@ class _HomeScreenState extends State child: WillPopScope( onWillPop: onWillPop, child: Scaffold( - body: Stack( - children: [ - SvgPicture.asset( - 'assets/bg.svg', - alignment: Alignment.center, - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.primary.withOpacity(0.2), - BlendMode.srcIn), - ), - SafeArea( - child: TabBarView( - controller: globals.tabController, - physics: const NeverScrollableScrollPhysics(), - children: Globals().router.getContent(), - )), - ], - ), + body: SafeArea( + child: TabBarView( + controller: globals.tabController, + physics: const NeverScrollableScrollPhysics(), + children: Globals().router.getContent(), + )), ), ), ), diff --git a/app/lib/screens/identity_verification_screen.dart b/app/lib/screens/identity_verification_screen.dart index 1adbd223..713b4e82 100644 --- a/app/lib/screens/identity_verification_screen.dart +++ b/app/lib/screens/identity_verification_screen.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:core'; import 'package:flutter/material.dart'; import 'package:flutter_pkid/flutter_pkid.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:http/http.dart'; import 'package:shuftipro_sdk/shuftipro_sdk.dart'; import 'package:threebotlogin/events/events.dart'; @@ -220,120 +219,101 @@ class _IdentityVerificationScreenState Widget build(BuildContext context) { return LayoutDrawer( titleText: 'Identity', - content: Stack( - children: [ - SvgPicture.asset( - 'assets/bg.svg', - alignment: Alignment.center, - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.primary.withOpacity(0.2), - BlendMode.srcIn), - ), - FutureBuilder( - future: getEmail(), - builder: (ctx, snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - if (isLoading) { - return _pleaseWait(); - } + content: FutureBuilder( + future: getEmail(), + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + if (isLoading) { + return _pleaseWait(); + } - return Column( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: const EdgeInsets.all(15), - child: Column( - children: [ - AnimatedBuilder( - animation: Listenable.merge([ - Globals().emailVerified, - Globals().phoneVerified, - Globals().identityVerified - ]), - builder: (BuildContext context, _) { - return Column( - children: [ - // Step one: verify email - _fillCard( - getCorrectState(1, emailVerified, + return Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsets.all(15), + child: Column( + children: [ + AnimatedBuilder( + animation: Listenable.merge([ + Globals().emailVerified, + Globals().phoneVerified, + Globals().identityVerified + ]), + builder: (BuildContext context, _) { + return Column( + children: [ + // Step one: verify email + _fillCard( + getCorrectState(1, emailVerified, + phoneVerified, identityVerified), + 1, + email, + Icons.email), + + // Step two: verify phone + Globals().phoneVerification == true + ? _fillCard( + getCorrectState(2, emailVerified, phoneVerified, identityVerified), - 1, - email, - Icons.email), - - // Step two: verify phone - Globals().phoneVerification == true - ? _fillCard( - getCorrectState( - 2, - emailVerified, - phoneVerified, - identityVerified), - 2, - phone, - Icons.phone) - : Container(), - - // Step three: verify identity - Globals().isOpenKYCEnabled - ? _fillCard( - getCorrectState( - 3, - emailVerified, - phoneVerified, - identityVerified), - 3, - extract3Bot(doubleName), - Icons.perm_identity) - : Container(), - - Globals().redoIdentityVerification && - identityVerified == true - ? ElevatedButton( - onPressed: () async { - await verifyIdentityProcess(); - }, - child: const Text( - 'Redo identity verification')) - : Container(), - Globals().debugMode == true - ? ElevatedButton( - onPressed: () async { - bool? isEmailVerified = - await getIsEmailVerified(); - bool? isPhoneVerified = - await getIsPhoneVerified(); - bool? isIdentityVerified = - await getIsIdentityVerified(); - - kycLogs = ''; - kycLogs += - 'Email verified: $isEmailVerified\n'; - kycLogs += - 'Phone verified: $isPhoneVerified\n'; - kycLogs += - 'Identity verified: $isIdentityVerified\n'; - - setState(() {}); - }, - child: const Text('KYC Status')) - : Container(), - Text(kycLogs), - ], - ); - }) - ], - ), - ) - ], - ); - } - return _pleaseWait(); - }, - ), - ], + 2, + phone, + Icons.phone) + : Container(), + + // Step three: verify identity + Globals().isOpenKYCEnabled + ? _fillCard( + getCorrectState(3, emailVerified, + phoneVerified, identityVerified), + 3, + extract3Bot(doubleName), + Icons.perm_identity) + : Container(), + + Globals().redoIdentityVerification && + identityVerified == true + ? ElevatedButton( + onPressed: () async { + await verifyIdentityProcess(); + }, + child: const Text( + 'Redo identity verification')) + : Container(), + Globals().debugMode == true + ? ElevatedButton( + onPressed: () async { + bool? isEmailVerified = + await getIsEmailVerified(); + bool? isPhoneVerified = + await getIsPhoneVerified(); + bool? isIdentityVerified = + await getIsIdentityVerified(); + + kycLogs = ''; + kycLogs += + 'Email verified: $isEmailVerified\n'; + kycLogs += + 'Phone verified: $isPhoneVerified\n'; + kycLogs += + 'Identity verified: $isIdentityVerified\n'; + + setState(() {}); + }, + child: const Text('KYC Status')) + : Container(), + Text(kycLogs), + ], + ); + }) + ], + ), + ) + ], + ); + } + return _pleaseWait(); + }, ), ); } diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index ca19123d..8de8dc56 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:threebotlogin/app_config.dart'; import 'package:threebotlogin/apps/free_flow_pages/ffp_events.dart'; @@ -77,120 +76,107 @@ class _PreferenceScreenState extends State { Widget build(BuildContext context) { return LayoutDrawer( titleText: 'Settings', - content: Stack( + content: ListView( children: [ - SvgPicture.asset( - 'assets/bg.svg', - alignment: Alignment.center, - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.primary.withOpacity(0.2), - BlendMode.srcIn), + const ListTile( + title: Text('Global settings'), ), - ListView( - children: [ - const ListTile( - title: Text('Global settings'), - ), - ListTile( - leading: const Icon(Icons.person), - title: Text(doubleName), - ), - FutureBuilder( - future: getPhrase(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return ListTile( - trailing: const Padding( - padding: EdgeInsets.only(right: 7.5), - child: Icon(Icons.visibility), - ), - leading: const Icon(Icons.vpn_key), - title: const Text('Show phrase'), - onTap: () async { - _showPhrase(); - }, - ); + ListTile( + leading: const Icon(Icons.person), + title: Text(doubleName), + ), + FutureBuilder( + future: getPhrase(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return ListTile( + trailing: const Padding( + padding: EdgeInsets.only(right: 7.5), + child: Icon(Icons.visibility), + ), + leading: const Icon(Icons.vpn_key), + title: const Text('Show phrase'), + onTap: () async { + _showPhrase(); + }, + ); + } else { + return Container(); + } + }, + ), + FutureBuilder( + future: checkBiometrics(), + builder: (context, snapshot) { + if (snapshot.hasData) { + if (snapshot.data == true) { + return FutureBuilder( + future: getBiometricDeviceName(), + builder: (context, snapshot) { + if (snapshot.hasData) { + if (snapshot.data == 'Not found') { + return Container(); + } + biometricDeviceName = snapshot.data; + return CheckboxListTile( + secondary: const Icon(Icons.fingerprint), + value: finger, + title: Text(snapshot.data.toString()), + activeColor: + Theme.of(context).colorScheme.primary, + onChanged: (bool? newValue) async { + _toggleFingerprint(newValue!); + }, + ); + } else { + return Container(); + } + }); } else { return Container(); } - }, - ), - FutureBuilder( - future: checkBiometrics(), - builder: (context, snapshot) { - if (snapshot.hasData) { - if (snapshot.data == true) { - return FutureBuilder( - future: getBiometricDeviceName(), - builder: (context, snapshot) { - if (snapshot.hasData) { - if (snapshot.data == 'Not found') { - return Container(); - } - biometricDeviceName = snapshot.data; - return CheckboxListTile( - secondary: const Icon(Icons.fingerprint), - value: finger, - title: Text(snapshot.data.toString()), - activeColor: - Theme.of(context).colorScheme.primary, - onChanged: (bool? newValue) async { - _toggleFingerprint(newValue!); - }, - ); - } else { - return Container(); - } - }); - } else { - return Container(); - } - } else { - return Container(); - } - }), - ListTile( - leading: const Icon(Icons.lock), - title: const Text('Change pincode'), - onTap: () async { - _changePincode(); - }, - ), - ListTile( - leading: const Icon(Icons.perm_device_information), - title: Text('Version: $version - $buildNumber'), - onTap: () { - _showVersionInfo(); - }, - ), + } else { + return Container(); + } + }), + ListTile( + leading: const Icon(Icons.lock), + title: const Text('Change pincode'), + onTap: () async { + _changePincode(); + }, + ), + ListTile( + leading: const Icon(Icons.perm_device_information), + title: Text('Version: $version - $buildNumber'), + onTap: () { + _showVersionInfo(); + }, + ), + ListTile( + leading: const Icon(Icons.info_outline), + title: const Text('Terms and conditions'), + onTap: () async => {await _showTermsAndConds()}, + ), + ExpansionTile( + title: const Text( + 'Advanced settings', + ), + children: [ ListTile( - leading: const Icon(Icons.info_outline), - title: const Text('Terms and conditions'), - onTap: () async => {await _showTermsAndConds()}, - ), - ExpansionTile( - title: const Text( - 'Advanced settings', + leading: const Icon(Icons.person), + title: Text( + 'Remove Account From Device', + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(color: Theme.of(context).colorScheme.error), ), - children: [ - ListTile( - leading: const Icon(Icons.person), - title: Text( - 'Remove Account From Device', - style: Theme.of(context) - .textTheme - .bodyLarge! - .copyWith(color: Theme.of(context).colorScheme.error), - ), - trailing: Icon( - Icons.remove_circle, - color: Theme.of(context).colorScheme.error, - ), - onTap: _showDialog, - ), - ], + trailing: Icon( + Icons.remove_circle, + color: Theme.of(context).colorScheme.error, + ), + onTap: _showDialog, ), ], ), From 563cd592f4613de0385ab5690a82276c88994b1c Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 20:14:39 +0200 Subject: [PATCH 034/457] Update the registration screen text colors --- .../screens/mobile_registration_screen.dart | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/app/lib/screens/mobile_registration_screen.dart b/app/lib/screens/mobile_registration_screen.dart index 0aa0ecee..e3460f26 100644 --- a/app/lib/screens/mobile_registration_screen.dart +++ b/app/lib/screens/mobile_registration_screen.dart @@ -306,8 +306,8 @@ class _MobileRegistrationScreenState extends State { Widget registrationStepper() { return Theme( data: ThemeData( - colorScheme: Theme.of(context).colorScheme - ), + colorScheme: Theme.of(context).colorScheme, + elevatedButtonTheme: Theme.of(context).elevatedButtonTheme), child: Stepper( controlsBuilder: (BuildContext context, ControlsDetails details) { return Column( @@ -316,25 +316,15 @@ class _MobileRegistrationScreenState extends State { mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - TextButton( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - Theme.of(context).colorScheme.secondary), - ), + ElevatedButton( onPressed: () { details.onStepCancel!(); }, child: Text( state == _State.DoubleName ? 'CANCEL' : 'PREVIOUS', - style: const TextStyle(color: Colors.white), ), ), - TextButton( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - Theme.of(context).colorScheme.secondary), - foregroundColor: MaterialStateProperty.all(Colors.grey), - ), + ElevatedButton( onPressed: state == _State.SeedPhrase && didWriteSeed == false ? null @@ -343,7 +333,6 @@ class _MobileRegistrationScreenState extends State { }, child: Text( state == _State.Finish ? 'FINISH' : 'NEXT', - style: const TextStyle(color: Colors.white), ), ) ], From 0924016fc7ead234e899eaba1138cb41fa227797 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 20:17:51 +0200 Subject: [PATCH 035/457] Show the text on the recover screen on dark mode --- app/lib/screens/recover_screen.dart | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index b479c683..93bbfd7f 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -125,11 +125,14 @@ class _RecoverScreenState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Padding( - padding: EdgeInsets.only(bottom: 12.0), + Padding( + padding: const EdgeInsets.only(bottom: 12.0), child: Text( 'Please insert your info', - style: TextStyle(fontWeight: FontWeight.bold), + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith(fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.onBackground), ), ), Padding( @@ -193,10 +196,8 @@ class _RecoverScreenState extends State { ), child: Text( 'Recover Account', - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(color: Theme.of(context).colorScheme.onPrimaryContainer), + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onPrimaryContainer), ), onPressed: () async { setState(() { From 09753e766aa7cf7cff3c3cd373bc53a8aeeb25f4 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 21:16:22 +0200 Subject: [PATCH 036/457] Update resgistration colors --- .../screens/mobile_registration_screen.dart | 519 ++++++++++-------- app/lib/widgets/reusable_text_field_step.dart | 15 +- app/lib/widgets/reusable_text_step.dart | 17 +- 3 files changed, 301 insertions(+), 250 deletions(-) diff --git a/app/lib/screens/mobile_registration_screen.dart b/app/lib/screens/mobile_registration_screen.dart index e3460f26..a1456c91 100644 --- a/app/lib/screens/mobile_registration_screen.dart +++ b/app/lib/screens/mobile_registration_screen.dart @@ -304,270 +304,298 @@ class _MobileRegistrationScreenState extends State { } Widget registrationStepper() { - return Theme( - data: ThemeData( - colorScheme: Theme.of(context).colorScheme, - elevatedButtonTheme: Theme.of(context).elevatedButtonTheme), - child: Stepper( - controlsBuilder: (BuildContext context, ControlsDetails details) { - return Column( - children: [ - Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceBetween, + return Stepper( + controlsBuilder: (BuildContext context, ControlsDetails details) { + return Column( + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ElevatedButton( + onPressed: () { + details.onStepCancel!(); + }, + child: Text( + state == _State.DoubleName ? 'CANCEL' : 'PREVIOUS', + ), + ), + ElevatedButton( + onPressed: state == _State.SeedPhrase && didWriteSeed == false + ? null + : () { + details.onStepContinue!(); + }, + child: Text( + state == _State.Finish ? 'FINISH' : 'NEXT', + ), + ) + ], + ), + ], + ); + }, + type: StepperType.vertical, + steps: [ + Step( + // Ask DoubleName + isActive: state.index >= _State.DoubleName.index, + state: state.index > _State.DoubleName.index + ? StepState.complete + : state == _State.DoubleName + ? StepState.editing + : StepState.disabled, + title: Text( + 'ThreeFold Connect Id.', + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith(color: Theme.of(context).colorScheme.onBackground), + ), + subtitle: state.index > 0 + ? Text( + doubleNameController.text, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onBackground), + ) + : null, + content: Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, children: [ - ElevatedButton( - onPressed: () { - details.onStepCancel!(); - }, - child: Text( - state == _State.DoubleName ? 'CANCEL' : 'PREVIOUS', - ), + Text( + 'Hi, please choose a ThreeFold Connect username.', + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: + Theme.of(context).colorScheme.onSecondaryContainer), ), - ElevatedButton( - onPressed: - state == _State.SeedPhrase && didWriteSeed == false - ? null - : () { - details.onStepContinue!(); - }, - child: Text( - state == _State.Finish ? 'FINISH' : 'NEXT', - ), - ) - ], - ), - ], - ); - }, - type: StepperType.vertical, - steps: [ - Step( - // Ask DoubleName - isActive: state.index >= _State.DoubleName.index, - state: state.index > _State.DoubleName.index - ? StepState.complete - : state == _State.DoubleName - ? StepState.editing - : StepState.disabled, - title: const Text('ThreeFold Connect Id.'), - subtitle: state.index > 0 ? Text(doubleNameController.text) : null, - content: Card( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'Hi, please choose a ThreeFold Connect username.', - style: TextStyle(fontWeight: FontWeight.bold), - ), - const Divider( - height: 50, - ), - Padding( - padding: const EdgeInsets.only(top: 8.5), - child: TextFormField( - focusNode: nameFocus, - maxLength: 50, - autofocus: true, - keyboardType: TextInputType.text, - decoration: const InputDecoration( - border: OutlineInputBorder(), - labelText: 'Name', - // suffixText: '.3bot', - suffixStyle: TextStyle(fontWeight: FontWeight.bold), - ), - controller: doubleNameController, - inputFormatters: [ - FilteringTextInputFormatter.allow( - RegExp('[a-zA-Z0-9]')) - ], - enableSuggestions: false, - autocorrect: false, + const Divider( + height: 50, + ), + Padding( + padding: const EdgeInsets.only(top: 8.5), + child: TextFormField( + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context) + .colorScheme + .onSecondaryContainer), + focusNode: nameFocus, + maxLength: 50, + autofocus: true, + keyboardType: TextInputType.text, + decoration: const InputDecoration( + border: OutlineInputBorder(), + labelText: 'Name', + // suffixText: '.3bot', + suffixStyle: TextStyle(fontWeight: FontWeight.bold), ), - ), - Row( - children: [ - Padding( - padding: const EdgeInsets.only(top: 10), - child: Text( - errorStepperText, - style: const TextStyle(color: Colors.red), - textAlign: TextAlign.left, - ), - ), + controller: doubleNameController, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[a-zA-Z0-9]')) ], + enableSuggestions: false, + autocorrect: false, ), - const Divider( - height: 50, - ), - ], - ), + ), + Row( + children: [ + Padding( + padding: const EdgeInsets.only(top: 10), + child: Text( + errorStepperText, + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith( + color: Theme.of(context).colorScheme.error), + textAlign: TextAlign.left, + ), + ), + ], + ), + const Divider( + height: 50, + ), + ], ), ), ), - Step( - isActive: state.index >= _State.Email.index, - state: state.index > _State.Email.index - ? StepState.complete - : state == _State.Email - ? StepState.editing - : StepState.disabled, - title: const Text('Email'), - subtitle: state.index > _State.Email.index - ? Text(emailController.text) - : null, - content: Card( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ReuseableTextFieldStep( - focusNode: emailFocus, - titleText: 'What is your email?', - labelText: 'Email', - typeText: TextInputType.emailAddress, - errorStepperText: errorStepperText, - controller: emailController, - ), + ), + Step( + isActive: state.index >= _State.Email.index, + state: state.index > _State.Email.index + ? StepState.complete + : state == _State.Email + ? StepState.editing + : StepState.disabled, + title: Text( + 'Email', + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith(color: Theme.of(context).colorScheme.onBackground), + ), + subtitle: state.index > _State.Email.index + ? Text( + emailController.text, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onBackground), + ) + : null, + content: Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ReuseableTextFieldStep( + focusNode: emailFocus, + titleText: 'What is your email?', + labelText: 'Email', + typeText: TextInputType.emailAddress, + errorStepperText: errorStepperText, + controller: emailController, ), ), ), - Step( - isActive: state.index >= _State.SeedPhrase.index, - state: state.index > _State.SeedPhrase.index - ? StepState.complete - : state == _State.SeedPhrase - ? StepState.editing - : StepState.disabled, - title: const Text('Seed phrase'), - content: Card( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - ReuseableTextStep( - titleText: - 'In order to ever retrieve your tokens in case of switching to a device or app, you will have to enter your seedphrase in combination with your TF Connect username. \n\nPlease write this seedphrase and your username on a piece of paper and keep it in a secure place. Do not communicate this key to anyone. ThreeFold can not be held responsible in case of loss of this seedphrase.', - extraText: _registrationData.phrase, - errorStepperText: errorStepperText, + ), + Step( + isActive: state.index >= _State.SeedPhrase.index, + state: state.index > _State.SeedPhrase.index + ? StepState.complete + : state == _State.SeedPhrase + ? StepState.editing + : StepState.disabled, + title: const Text('Seed phrase'), + content: Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + ReuseableTextStep( + titleText: + 'In order to ever retrieve your tokens in case of switching to a device or app, you will have to enter your seedphrase in combination with your TF Connect username. \n\nPlease write this seedphrase and your username on a piece of paper and keep it in a secure place. Do not communicate this key to anyone. ThreeFold can not be held responsible in case of loss of this seedphrase.', + extraText: _registrationData.phrase, + errorStepperText: errorStepperText, + ), + CheckboxListTile( + title: const Text( + 'I have written down my seedphrase and username', + style: TextStyle(fontSize: 14), ), - CheckboxListTile( - title: const Text( - 'I have written down my seedphrase and username', - style: TextStyle(fontSize: 14), - ), - value: didWriteSeed, - onChanged: (newValue) { - didWriteSeed = newValue!; - setState(() {}); - }, - controlAffinity: ListTileControlAffinity - .leading, // <-- leading Checkbox - ) - ], - )), - ), + value: didWriteSeed, + onChanged: (newValue) { + didWriteSeed = newValue!; + setState(() {}); + }, + controlAffinity: ListTileControlAffinity + .leading, // <-- leading Checkbox + ) + ], + )), ), - Step( - isActive: state.index >= _State.ConfirmSeedPhrase.index, - state: state.index > _State.ConfirmSeedPhrase.index - ? StepState.complete - : state == _State.ConfirmSeedPhrase - ? StepState.editing - : StepState.disabled, - title: const Text('Confirm seed phrase'), - content: Card( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ReuseableTextFieldStep( - focusNode: seedFocus, - titleText: - 'Type 3 random words from your seed phrase, separated by a space.', - labelText: 'Seed phrase words', - typeText: TextInputType.text, - errorStepperText: errorStepperText, - controller: seedConfirmationController, - ), + ), + Step( + isActive: state.index >= _State.ConfirmSeedPhrase.index, + state: state.index > _State.ConfirmSeedPhrase.index + ? StepState.complete + : state == _State.ConfirmSeedPhrase + ? StepState.editing + : StepState.disabled, + title: const Text('Confirm seed phrase'), + content: Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ReuseableTextFieldStep( + focusNode: seedFocus, + titleText: + 'Type 3 random words from your seed phrase, separated by a space.', + labelText: 'Seed phrase words', + typeText: TextInputType.text, + errorStepperText: errorStepperText, + controller: seedConfirmationController, ), ), ), - Step( - isActive: state.index >= _State.Finish.index, - state: state.index > _State.Finish.index - ? StepState.complete - : state == _State.Finish - ? StepState.editing - : StepState.disabled, - title: const Text('Finishing'), - content: Card( - child: Column( - children: [ - const SizedBox( - height: 10.0, - ), - const Padding( - padding: EdgeInsets.all(16.0), - child: Text( - 'Please check the data below, press finish if it is correct. Otherwise click the pencil icon to edit them.', - style: TextStyle(fontWeight: FontWeight.bold), - ), + ), + Step( + isActive: state.index >= _State.Finish.index, + state: state.index > _State.Finish.index + ? StepState.complete + : state == _State.Finish + ? StepState.editing + : StepState.disabled, + title: const Text('Finishing'), + content: Card( + child: Column( + children: [ + const SizedBox( + height: 10.0, + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + 'Please check the data below, press finish if it is correct. Otherwise click the pencil icon to edit them.', + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: + Theme.of(context).colorScheme.onSecondaryContainer, + fontWeight: FontWeight.bold), ), - const SizedBox( - height: 15.0, + ), + const SizedBox( + height: 15.0, + ), + Padding( + padding: const EdgeInsets.only(top: 8.0, bottom: 4.0), + child: ListTile( + leading: const Icon(Icons.person), + title: Text(doubleNameController.text), + trailing: const Icon(Icons.edit), + onTap: () => setState(() { + state = _State.DoubleName; + FocusScope.of(context).requestFocus(nameFocus); + }), ), - Padding( - padding: const EdgeInsets.only(top: 8.0, bottom: 4.0), - child: ListTile( - leading: const Icon(Icons.person), - title: Text(doubleNameController.text), + ), + Padding( + padding: const EdgeInsets.only(top: 4.0, bottom: 15.0), + child: ListTile( + leading: const Icon(Icons.email), + title: Text(emailController.text), trailing: const Icon(Icons.edit), onTap: () => setState(() { - state = _State.DoubleName; - FocusScope.of(context).requestFocus(nameFocus); - }), - ), - ), - Padding( - padding: const EdgeInsets.only(top: 4.0, bottom: 15.0), - child: ListTile( - leading: const Icon(Icons.email), - title: Text(emailController.text), - trailing: const Icon(Icons.edit), - onTap: () => setState(() { - state = _State.Email; - FocusScope.of(context).requestFocus(emailFocus); - })), - ), - ], - ), + state = _State.Email; + FocusScope.of(context).requestFocus(emailFocus); + })), + ), + ], ), - ) - ], - currentStep: state.index, - onStepTapped: (index) { - setState(() { - state = _State.values[index]; - }); - checkStepFocus(state); - }, - onStepContinue: () { - errorStepperText = ''; - checkStep(state); - }, - onStepCancel: () { - setState( - () { - errorStepperText = ''; - if (state.index > _State.DoubleName.index) { - state = _State.values[state.index - 1]; - } else { - Navigator.pop(context); - } - }, - ); - checkStepFocus(state); - }, - ), + ), + ) + ], + currentStep: state.index, + onStepTapped: (index) { + setState(() { + state = _State.values[index]; + }); + checkStepFocus(state); + }, + onStepContinue: () { + errorStepperText = ''; + checkStep(state); + }, + onStepCancel: () { + setState( + () { + errorStepperText = ''; + if (state.index > _State.DoubleName.index) { + state = _State.values[state.index - 1]; + } else { + Navigator.pop(context); + } + }, + ); + checkStepFocus(state); + }, ); } @@ -579,7 +607,10 @@ class _MobileRegistrationScreenState extends State { padding: const EdgeInsets.only(top: 10), child: Text( errorStepperText, - style: const TextStyle(color: Colors.red), + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(color: Theme.of(context).colorScheme.error), textAlign: TextAlign.left, ), ), diff --git a/app/lib/widgets/reusable_text_field_step.dart b/app/lib/widgets/reusable_text_field_step.dart index 8b31bada..1e1aa25f 100644 --- a/app/lib/widgets/reusable_text_field_step.dart +++ b/app/lib/widgets/reusable_text_field_step.dart @@ -26,7 +26,10 @@ class ReuseableTextFieldStep extends StatelessWidget { children: [ Text( titleText, - style: const TextStyle(fontWeight: FontWeight.bold), + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith(color: Theme.of(context).colorScheme.onSecondaryContainer), ), const Divider( height: 50, @@ -34,6 +37,11 @@ class ReuseableTextFieldStep extends StatelessWidget { Padding( padding: const EdgeInsets.only(top: 8.5), child: TextFormField( + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(color: Theme.of(context).colorScheme.onSecondaryContainer, + decorationColor: Theme.of(context).colorScheme.onSecondaryContainer), focusNode: focusNode, autofocus: true, keyboardType: typeText, @@ -52,7 +60,10 @@ class ReuseableTextFieldStep extends StatelessWidget { padding: const EdgeInsets.only(top: 10), child: Text( errorStepperText, - style: const TextStyle(color: Colors.red), + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(color: Theme.of(context).colorScheme.error), textAlign: TextAlign.left, ), ), diff --git a/app/lib/widgets/reusable_text_step.dart b/app/lib/widgets/reusable_text_step.dart index b868052b..c3a14e0d 100644 --- a/app/lib/widgets/reusable_text_step.dart +++ b/app/lib/widgets/reusable_text_step.dart @@ -17,9 +17,13 @@ class ReuseableTextStep extends StatelessWidget { children: [ Text( titleText, + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(color: Theme.of(context).colorScheme.onSecondaryContainer), ), const Divider( - height: 50, + height: 30, ), Padding( padding: const EdgeInsets.only(top: 8.5), @@ -29,8 +33,10 @@ class ReuseableTextStep extends StatelessWidget { padding: const EdgeInsets.all(5), child: Text( extraText, - style: const TextStyle( - fontWeight: FontWeight.bold, fontSize: 24), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + color: Theme.of(context).colorScheme.onSecondaryContainer, + fontWeight: FontWeight.bold, + ), ), ), ), @@ -42,7 +48,10 @@ class ReuseableTextStep extends StatelessWidget { padding: const EdgeInsets.only(top: 10), child: Text( errorStepperText, - style: const TextStyle(color: Colors.red), + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(color: Theme.of(context).colorScheme.error), textAlign: TextAlign.left, ), ), From aad4fc164d5be283f5d5bf83db22a9322fb01deb Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 21:19:42 +0200 Subject: [PATCH 037/457] Update recorver text colors --- app/lib/screens/recover_screen.dart | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index 93bbfd7f..47d8725e 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -139,12 +139,13 @@ class _RecoverScreenState extends State { padding: const EdgeInsets.only(top: 8.5), child: TextFormField( style: Theme.of(context).textTheme.bodyMedium!.copyWith( - color: Theme.of(context).colorScheme.onBackground), + color: Theme.of(context).colorScheme.onBackground, + decorationColor: Theme.of(context).colorScheme.onBackground + ), keyboardType: TextInputType.text, decoration: const InputDecoration( border: OutlineInputBorder(), labelText: 'Name', - filled: true, // suffixText: '.3bot', suffixStyle: TextStyle(fontWeight: FontWeight.bold), ), @@ -160,13 +161,14 @@ class _RecoverScreenState extends State { padding: const EdgeInsets.only(top: 8.5), child: TextFormField( style: Theme.of(context).textTheme.bodyMedium!.copyWith( - color: Theme.of(context).colorScheme.onBackground), + color: Theme.of(context).colorScheme.onBackground, + decorationColor: Theme.of(context).colorScheme.onBackground + ), keyboardType: TextInputType.multiline, maxLines: null, decoration: const InputDecoration( labelText: 'Seed Phrase', border: OutlineInputBorder(), - filled: true, ), controller: seedPhraseController, validator: (String? value) { From 6b79dd538c17b9a42efeb3c657fe7620a7c887ab Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 22:05:18 +0200 Subject: [PATCH 038/457] Add margin to the custom dialog --- app/lib/widgets/custom_dialog.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/widgets/custom_dialog.dart b/app/lib/widgets/custom_dialog.dart index 14010762..20cc5f11 100644 --- a/app/lib/widgets/custom_dialog.dart +++ b/app/lib/widgets/custom_dialog.dart @@ -155,7 +155,7 @@ class _CustomDialogState extends State { ConstrainedBox( constraints: const BoxConstraints(maxHeight: 300, maxWidth: 310), child: Container( - padding: const EdgeInsets.symmetric(horizontal: 5.0), + padding: const EdgeInsets.symmetric(horizontal: 10.0), child: (widget.widgetDescription == null) ? Text( widget.description!, From 9aeac39c526fc9c6c3cb47d3bff25d4e0aa4edd2 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Jan 2024 22:12:32 +0200 Subject: [PATCH 039/457] Change pin field colors --- app/lib/screens/authentication_screen.dart | 20 +++++++++++--------- app/lib/widgets/pin_field.dart | 18 +++++++++++------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/app/lib/screens/authentication_screen.dart b/app/lib/screens/authentication_screen.dart index 1783aa3a..591c87c6 100644 --- a/app/lib/screens/authentication_screen.dart +++ b/app/lib/screens/authentication_screen.dart @@ -5,7 +5,6 @@ import 'package:flutter/services.dart'; import 'package:threebotlogin/events/close_auth_event.dart'; import 'package:threebotlogin/events/events.dart'; import 'package:threebotlogin/helpers/globals.dart'; -import 'package:threebotlogin/helpers/hex_color.dart'; import 'package:threebotlogin/models/login.dart'; import 'package:threebotlogin/services/fingerprint_service.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; @@ -113,8 +112,9 @@ class AuthenticationScreenState extends State { margin: EdgeInsets.all(height / 120), height: height / 50, width: size, - decoration: - BoxDecoration(color: Theme.of(context).colorScheme.onBackground, shape: BoxShape.circle), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.onBackground, + shape: BoxShape.circle), duration: const Duration(milliseconds: 100), curve: Curves.bounceInOut, ); @@ -142,7 +142,9 @@ class AuthenticationScreenState extends State { shape: const CircleBorder(), child: Text( buttonText, - style: const TextStyle(color: Colors.white, fontSize: 20), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ))); } @@ -167,16 +169,16 @@ class AuthenticationScreenState extends State { if (buttonText == 'C') { return buildNumberPin(possibleInput[i], context, backgroundColor: input.isNotEmpty - ? Colors.yellow.shade700 - : Colors.yellow.shade200); + ? Theme.of(context).colorScheme.primaryContainer + : Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.5)); } else if (buttonText == 'OK') { return buildNumberPin(possibleInput[i], context, backgroundColor: input.length >= widget.pinLength - ? Colors.green.shade600 - : Colors.green.shade100); + ? Colors.green.shade700 + : Colors.green.shade300); } else { return buildNumberPin(possibleInput[i], context, - backgroundColor: HexColor('#0a73b8')); + backgroundColor: Theme.of(context).colorScheme.primaryContainer); } }); return SizedBox( diff --git a/app/lib/widgets/pin_field.dart b/app/lib/widgets/pin_field.dart index b9069447..e1731f50 100644 --- a/app/lib/widgets/pin_field.dart +++ b/app/lib/widgets/pin_field.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:threebotlogin/helpers/hex_color.dart'; class PinField extends StatefulWidget { final int pinLength = 4; @@ -67,7 +66,9 @@ class _PinFieldState extends State { shape: const CircleBorder(), child: Text( buttonText, - style: const TextStyle(color: Colors.white, fontSize: 20), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ))); } @@ -92,16 +93,19 @@ class _PinFieldState extends State { if (buttonText == 'C') { return buildNumberPin(possibleInput[i], context, backgroundColor: input.isNotEmpty - ? Colors.yellow.shade700 - : Colors.yellow.shade200); + ? Theme.of(context).colorScheme.primaryContainer + : Theme.of(context) + .colorScheme + .secondaryContainer + .withOpacity(0.5)); } else if (buttonText == 'OK') { return buildNumberPin(possibleInput[i], context, backgroundColor: input.length >= widget.pinLength - ? Colors.green.shade600 - : Colors.green.shade100); + ? Colors.green.shade700 + : Colors.green.shade300); } else { return buildNumberPin(possibleInput[i], context, - backgroundColor: HexColor('#0a73b8')); + backgroundColor: Theme.of(context).colorScheme.primaryContainer); } }); return SizedBox( From 9ec4e07e770a9ad8f16a8298a26d3c0bef1357a7 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 29 Jan 2024 23:40:13 +0200 Subject: [PATCH 040/457] Add warning color on the colorscheme --- app/lib/main.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/lib/main.dart b/app/lib/main.dart index 8614f77a..29087288 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -5,6 +5,12 @@ import 'package:threebotlogin/screens/main_screen.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; import 'package:google_fonts/google_fonts.dart'; +extension ColorSchemeExtension on ColorScheme { + Color get warning => brightness == Brightness.light + ? const Color.fromARGB(255, 255, 208, 0) + : const Color.fromARGB(255, 255, 219, 61); +} + Future main() async { WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); From 6f0c0c01101a01d051fbee986bf7ce3b9951fbbf Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 29 Jan 2024 23:40:48 +0200 Subject: [PATCH 041/457] Update the colors on the login screen --- app/lib/screens/login_screen.dart | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/app/lib/screens/login_screen.dart b/app/lib/screens/login_screen.dart index 8eb14e02..e68ef1d7 100644 --- a/app/lib/screens/login_screen.dart +++ b/app/lib/screens/login_screen.dart @@ -7,7 +7,6 @@ import 'package:threebotlogin/events/events.dart'; import 'package:threebotlogin/events/pop_all_login_event.dart'; import 'package:threebotlogin/helpers/block_and_run_mixin.dart'; import 'package:threebotlogin/helpers/globals.dart'; -import 'package:threebotlogin/helpers/hex_color.dart'; import 'package:threebotlogin/helpers/login_helpers.dart'; import 'package:threebotlogin/models/login.dart'; import 'package:threebotlogin/services/3bot_service.dart'; @@ -112,7 +111,8 @@ class _LoginScreenState extends State with BlockAndRunMixin { padding: const EdgeInsets.only(right: 24.0, left: 24.0), child: Text( isMobileCheck ? scopeTextMobile : scopeText, - style: const TextStyle(fontSize: 14.0), + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + color: Theme.of(context).colorScheme.onBackground), textAlign: TextAlign.center, ), ), @@ -187,7 +187,7 @@ class _LoginScreenState extends State with BlockAndRunMixin { padding: const EdgeInsets.only(right: 24.0, left: 24.0), child: Text( 'Attempt expires in ${(timeLeft >= 0) ? timeLeft.toString() : '0'} second(s).', - style: const TextStyle(fontSize: 12), + style: Theme.of(context).textTheme.bodyMedium!.copyWith(color: Theme.of(context).colorScheme.onBackground), textAlign: TextAlign.center, ), ), @@ -221,11 +221,9 @@ class _LoginScreenState extends State with BlockAndRunMixin { child: Padding( padding: const EdgeInsets.all(8.0), child: TextButton( - child: Text( - "It wasn't me - cancel", - style: - TextStyle(fontSize: 16.0, color: HexColor('#0f296a')), - ), + child: Text("It wasn't me - cancel", + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + color: Theme.of(context).colorScheme.error)), onPressed: () { cancelIt(); Navigator.pop(context, false); From 98411cd071b6a504fd237d3df747d45783bc23a5 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 29 Jan 2024 23:41:04 +0200 Subject: [PATCH 042/457] Update the colors on the warning screen --- app/lib/screens/warning_screen.dart | 197 ++++++++++++++-------------- 1 file changed, 101 insertions(+), 96 deletions(-) diff --git a/app/lib/screens/warning_screen.dart b/app/lib/screens/warning_screen.dart index e25c30ff..e081f29a 100644 --- a/app/lib/screens/warning_screen.dart +++ b/app/lib/screens/warning_screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:threebotlogin/helpers/hex_color.dart'; +import 'package:threebotlogin/main.dart'; class WarningScreen extends StatefulWidget { const WarningScreen({super.key}); @@ -16,108 +16,113 @@ class _WarningScreenState extends State { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Login from a new location', - home: Scaffold( - appBar: AppBar( - title: const Text('Login from a new location'), - ), - body: Padding( - padding: const EdgeInsets.fromLTRB(20, 20, 20, 0), - child: Column( - children: [ - const Row( - children: [ - Icon( - Icons.warning, - color: Colors.orangeAccent, - size: 48, + return Scaffold( + appBar: AppBar( + title: const Text('Login from a new location'), + ), + body: Padding( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 0), + child: Column( + children: [ + Row( + children: [ + Icon( + Icons.warning, + color: Theme.of(context).colorScheme.warning, + size: 48, + ), + Padding( + padding: const EdgeInsets.fromLTRB(10, 0, 0, 0), + child: Text( + 'Security warning!', + style: Theme.of(context).textTheme.titleMedium!.copyWith( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.onBackground), ), - Padding( - padding: EdgeInsets.fromLTRB(10, 0, 0, 0), + ) + ], + ), + const Padding( + padding: EdgeInsets.fromLTRB(0, 16, 0, 16), + child: Divider(), + ), + Wrap( + direction: Axis.horizontal, + children: [ + Text( + 'Please check the URL bar in your browser and make sure it matches one of the images below.', + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onBackground), + ), + ], + ), + Row( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 10, 0, 0), + child: Image.asset('assets/url_bar.png'), + ), + ], + ), + Row( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 10, 0, 0), + child: Image.asset('assets/url_bar_ff.jpeg'), + ) + ], + ), + const Padding( + padding: EdgeInsets.fromLTRB(0, 16, 0, 0), + child: Divider(), + ), + Wrap( + direction: Axis.horizontal, + children: [ + Text( + 'Does the URL bar match?', + style: Theme.of(context).textTheme.titleMedium!.copyWith( + color: Theme.of(context).colorScheme.onBackground), + ), + ], + ), + Padding( + padding: const EdgeInsets.fromLTRB(0, 20, 0, 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Theme.of(context).colorScheme.errorContainer), + ), + onPressed: () { + Navigator.pop(context, false); + }, child: Text( - 'Security warning!', - style: TextStyle(fontWeight: FontWeight.bold), + "No, it doesn't", + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onErrorContainer), ), - ) - ], - ), - const Padding( - padding: EdgeInsets.fromLTRB(0, 16, 0, 16), - child: Divider(), - ), - const Wrap( - direction: Axis.horizontal, - children: [ - Text( - 'Please check the URL bar in your browser and make sure it matches one of the images below.', - ), - ], - ), - Row( - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 10, 0, 0), - child: Image.asset('assets/url_bar.png'), ), - ], - ), - Row( - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 10, 0, 0), - child: Image.asset('assets/url_bar_ff.jpeg'), - ) - ], - ), - const Padding( - padding: EdgeInsets.fromLTRB(0, 16, 0, 0), - child: Divider(), - ), - const Wrap( - direction: Axis.horizontal, - children: [ - Text( - 'Does the URL bar match?', + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Theme.of(context).colorScheme.primaryContainer), + ), + onPressed: () { + Navigator.pop(context, true); + }, + child: Text( + 'Yes, it does', + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onPrimaryContainer), + ), ), ], ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 20, 0, 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - TextButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(Colors.redAccent), - ), - onPressed: () { - Navigator.pop(context, false); - }, - child: const Text( - "No, it doesn't", - style: TextStyle(color: Colors.white), - ), - ), - TextButton( - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(HexColor('#2d4052')), - ), - onPressed: () { - Navigator.pop(context, true); - }, - child: const Text( - 'Yes, it does', - style: TextStyle(color: Colors.white), - ), - ), - ], - ), - ) - ], - ), + ) + ], ), ), ); From fc914358bcf36f2b6370c821b314070e2657886d Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 29 Jan 2024 23:41:34 +0200 Subject: [PATCH 043/457] Update the colors on the preference screen --- app/lib/widgets/preference_dialog.dart | 197 +++++++++++++++++-------- 1 file changed, 135 insertions(+), 62 deletions(-) diff --git a/app/lib/widgets/preference_dialog.dart b/app/lib/widgets/preference_dialog.dart index 657cb858..263962ad 100644 --- a/app/lib/widgets/preference_dialog.dart +++ b/app/lib/widgets/preference_dialog.dart @@ -162,10 +162,10 @@ class _PreferenceDialogState extends State { (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color:Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -182,9 +182,15 @@ class _PreferenceDialogState extends State { title: Text( scopeItem.toUpperCase() + (mandatory ? ' *' : ''), - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -201,10 +207,10 @@ class _PreferenceDialogState extends State { (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -221,9 +227,15 @@ class _PreferenceDialogState extends State { title: Text( scopeItem.toUpperCase() + (mandatory ? ' *' : ''), - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -235,10 +247,10 @@ class _PreferenceDialogState extends State { case 'digitalTwin': return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -253,9 +265,15 @@ class _PreferenceDialogState extends State { }), title: Text( scopeItem.toUpperCase() + (mandatory ? ' *' : ''), - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -267,10 +285,10 @@ class _PreferenceDialogState extends State { (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -286,9 +304,15 @@ class _PreferenceDialogState extends State { }), title: Text( 'PHONE NUMBER${(mandatory ? " *" : "")}', - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -305,10 +329,10 @@ class _PreferenceDialogState extends State { (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -325,9 +349,15 @@ class _PreferenceDialogState extends State { title: Text( scopeItem.toUpperCase() + (mandatory ? ' *' : ''), - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -344,10 +374,10 @@ class _PreferenceDialogState extends State { (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -363,9 +393,15 @@ class _PreferenceDialogState extends State { }), title: Text( 'NAME (IDENTITY)${(mandatory ? " *" : "")}', - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -382,10 +418,10 @@ class _PreferenceDialogState extends State { (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -401,9 +437,15 @@ class _PreferenceDialogState extends State { }), title: Text( 'DATE OF BIRTH (IDENTITY)${(mandatory ? " *" : "")}', - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -420,10 +462,10 @@ class _PreferenceDialogState extends State { (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -439,9 +481,15 @@ class _PreferenceDialogState extends State { }), title: Text( 'GENDER (IDENTITY)${(mandatory ? " *" : "")}', - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -458,10 +506,10 @@ class _PreferenceDialogState extends State { (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -477,9 +525,15 @@ class _PreferenceDialogState extends State { }), title: Text( 'DOCUMENT META DATA (IDENTITY)${(mandatory ? " *" : "")}', - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -496,10 +550,10 @@ class _PreferenceDialogState extends State { (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -515,9 +569,15 @@ class _PreferenceDialogState extends State { }), title: Text( 'COUNTRY (IDENTITY)${(mandatory ? " *" : "")}', - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), ), ); @@ -535,10 +595,10 @@ class _PreferenceDialogState extends State { if (!snapshot.hasData || snapshot.data.length == 0) { return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -553,10 +613,15 @@ class _PreferenceDialogState extends State { Text( scopeItem.toUpperCase() + (mandatory ? ' *' : ''), - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 16), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), const Icon( Icons.warning, @@ -581,10 +646,10 @@ class _PreferenceDialogState extends State { } return Container( - decoration: const BoxDecoration( + decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: Colors.grey, + color: Theme.of(context).colorScheme.onBackground, width: 0.5, )), ), @@ -614,9 +679,15 @@ class _PreferenceDialogState extends State { title: Text( scopeItem.toUpperCase() + (mandatory ? ' *' : ''), - style: const TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black), + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + fontWeight: FontWeight.bold, + ), ), )) ], @@ -671,7 +742,9 @@ class _PreferenceDialogState extends State { padding: const EdgeInsets.all(8), child: Text( '${widget.appId} would like to access', - style: const TextStyle(fontWeight: FontWeight.bold), + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.onBackground), textAlign: TextAlign.center, ), ), From bc3c31c7d67aac6e8bb42f94d3b316cbaaaa77c5 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Thu, 1 Feb 2024 00:25:39 +0200 Subject: [PATCH 044/457] Change the logo size Remove the half cricle from the unregistered screen --- app/lib/screens/main_screen.dart | 4 +- app/lib/screens/registered_screen.dart | 4 +- app/lib/screens/unregistered_screen.dart | 192 +++++++++++------------ app/lib/widgets/layout_drawer.dart | 32 ++-- 4 files changed, 104 insertions(+), 128 deletions(-) diff --git a/app/lib/screens/main_screen.dart b/app/lib/screens/main_screen.dart index db06e0cc..11223ed8 100644 --- a/app/lib/screens/main_screen.dart +++ b/app/lib/screens/main_screen.dart @@ -62,9 +62,9 @@ class _AppState extends State { children: [ Image.asset( 'assets/logoTF.png', - height: 100, + height: 28.33, colorBlendMode: BlendMode.srcIn, - width: 300, + width: 250, color: Theme.of(context).colorScheme.onBackground, ), const SizedBox( diff --git a/app/lib/screens/registered_screen.dart b/app/lib/screens/registered_screen.dart index b44ea3db..1affc848 100644 --- a/app/lib/screens/registered_screen.dart +++ b/app/lib/screens/registered_screen.dart @@ -37,8 +37,8 @@ class _RegisteredScreenState extends State mainAxisAlignment: MainAxisAlignment.center, children: [ Container( - width: 300.0, - height: 35, + width: 250.0, + height: 28.33, decoration: BoxDecoration( image: DecorationImage( colorFilter: ColorFilter.mode( diff --git a/app/lib/screens/unregistered_screen.dart b/app/lib/screens/unregistered_screen.dart index 86917f15..32e58bdc 100644 --- a/app/lib/screens/unregistered_screen.dart +++ b/app/lib/screens/unregistered_screen.dart @@ -1,6 +1,5 @@ //import 'package:community_material_icon/community_material_icon.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:threebotlogin/helpers/flags.dart'; import 'package:threebotlogin/screens/change_pin_screen.dart'; import 'package:threebotlogin/screens/mobile_registration_screen.dart'; @@ -64,119 +63,104 @@ class _UnregisteredScreenState extends State Widget build(BuildContext context) { return Material( child: Scaffold( - body: Stack( - children: [ - SvgPicture.asset( - 'assets/bg.svg', - alignment: Alignment.center, - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.primary.withOpacity(0.2), - BlendMode.srcIn), - ), - WillPopScope( - child: ConstrainedBox( - constraints: const BoxConstraints( - maxHeight: double.infinity, - maxWidth: double.infinity, - minHeight: 250, - minWidth: 250), - child: Column( + body: WillPopScope( + child: ConstrainedBox( + constraints: const BoxConstraints( + maxHeight: double.infinity, + maxWidth: double.infinity, + minHeight: 250, + minWidth: 250), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container(), + Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Container(), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - width: 300.0, - height: 35.0, - decoration: BoxDecoration( - image: DecorationImage( - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.onBackground, - BlendMode.srcIn), - fit: BoxFit.fill, - image: const AssetImage('assets/logoTF.png')), + Container( + width: 250.0, + height: 28.33, + decoration: BoxDecoration( + image: DecorationImage( + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onBackground, + BlendMode.srcIn), + fit: BoxFit.fill, + image: const AssetImage('assets/logoTF.png')), + ), + ), + const SizedBox(height: 100), + ], + ), + SizedBox( + width: 250, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.primaryContainer, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(30)), ), ), - const SizedBox(height: 100), - ], - ), - SizedBox( - width: 250, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: - Theme.of(context).colorScheme.primaryContainer, - shape: const RoundedRectangleBorder( - borderRadius: - BorderRadius.all(Radius.circular(30)), - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Sign Up', + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + color: Theme.of(context) + .colorScheme + .onPrimaryContainer), ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'Sign Up', - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith( - color: Theme.of(context) - .colorScheme - .onPrimaryContainer), - ), - ], - ), - onPressed: () { - startRegistration(); - }, + ], + ), + onPressed: () { + startRegistration(); + }, + ), + const SizedBox(height: 20), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.primaryContainer, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(30)), ), - const SizedBox(height: 20), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: - Theme.of(context).colorScheme.primaryContainer, - shape: const RoundedRectangleBorder( - borderRadius: - BorderRadius.all(Radius.circular(30)), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'Recover Account', - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith( - color: Theme.of(context) - .colorScheme - .onPrimaryContainer), - ), - ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Recover Account', + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + color: Theme.of(context) + .colorScheme + .onPrimaryContainer), ), - onPressed: () { - startRecovery(); - }, - ), - ], + ], + ), + onPressed: () { + startRecovery(); + }, ), - ), - ], + ], + ), ), - ), - onWillPop: () { - return Future.value(false); - }, + ], ), - ], + ), + onWillPop: () { + return Future.value(false); + }, ), )); } diff --git a/app/lib/widgets/layout_drawer.dart b/app/lib/widgets/layout_drawer.dart index 66307819..e5f6f36a 100644 --- a/app/lib/widgets/layout_drawer.dart +++ b/app/lib/widgets/layout_drawer.dart @@ -28,28 +28,20 @@ class _LayoutDrawerState extends State { drawer: Drawer( elevation: 5, // space to fit everything. - child: ListView( - // Important: Remove any padding from the ListView. - padding: EdgeInsets.zero, - children: [ + child: Column( + children: [ SizedBox( - width: 200, height: 100, - child: Padding( - padding: const EdgeInsets.all(20), - child: DrawerHeader( - decoration: BoxDecoration( - image: DecorationImage( - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.onBackground, - BlendMode.srcIn), - alignment: Alignment.center, - image: const AssetImage('assets/logoTF.png'), - fit: BoxFit.contain, - ), - ), - child: const Text(''), - )), + child: DrawerHeader( + padding: const EdgeInsets.all(20), + child: Image.asset( + 'assets/logoTF.png', + height: 18.13, + colorBlendMode: BlendMode.srcIn, + width: 160, + color: Theme.of(context).colorScheme.onBackground, + ), + ), ), ListTile( minLeadingWidth: 10, From 8092680ed9635519d7e019fd5bf87573b43a7694 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Fri, 2 Feb 2024 16:01:41 +0200 Subject: [PATCH 045/457] Change the ok color in the pin screen --- app/lib/screens/authentication_screen.dart | 4 ++-- app/lib/widgets/pin_field.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/lib/screens/authentication_screen.dart b/app/lib/screens/authentication_screen.dart index 591c87c6..8bd0fe51 100644 --- a/app/lib/screens/authentication_screen.dart +++ b/app/lib/screens/authentication_screen.dart @@ -174,8 +174,8 @@ class AuthenticationScreenState extends State { } else if (buttonText == 'OK') { return buildNumberPin(possibleInput[i], context, backgroundColor: input.length >= widget.pinLength - ? Colors.green.shade700 - : Colors.green.shade300); + ? Colors.green.shade600 + : Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.5)); } else { return buildNumberPin(possibleInput[i], context, backgroundColor: Theme.of(context).colorScheme.primaryContainer); diff --git a/app/lib/widgets/pin_field.dart b/app/lib/widgets/pin_field.dart index e1731f50..bb2327e2 100644 --- a/app/lib/widgets/pin_field.dart +++ b/app/lib/widgets/pin_field.dart @@ -101,8 +101,8 @@ class _PinFieldState extends State { } else if (buttonText == 'OK') { return buildNumberPin(possibleInput[i], context, backgroundColor: input.length >= widget.pinLength - ? Colors.green.shade700 - : Colors.green.shade300); + ? Colors.green.shade600 + : Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.5)); } else { return buildNumberPin(possibleInput[i], context, backgroundColor: Theme.of(context).colorScheme.primaryContainer); From 53eabcbff22fe3bb58fc61fe97f34cdc1fc1b875 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Fri, 2 Feb 2024 16:19:24 +0200 Subject: [PATCH 046/457] Change the elevated button style --- app/lib/main.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/lib/main.dart b/app/lib/main.dart index 29087288..a8c2b14e 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -86,6 +86,8 @@ class MyApp extends StatelessWidget { margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8)), elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5)), backgroundColor: kColorScheme.primaryContainer), ), ), @@ -107,6 +109,8 @@ class MyApp extends StatelessWidget { margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8)), elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5)), backgroundColor: kDarkColorScheme.primaryContainer), ), ), From cfade457be42ed838ee18dfef238fd047923ab59 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Fri, 2 Feb 2024 16:19:55 +0200 Subject: [PATCH 047/457] Change the style of the signup screen --- .../screens/mobile_registration_screen.dart | 53 +++++++++---------- app/lib/widgets/reusable_text_field_step.dart | 26 +++++---- 2 files changed, 38 insertions(+), 41 deletions(-) diff --git a/app/lib/screens/mobile_registration_screen.dart b/app/lib/screens/mobile_registration_screen.dart index a1456c91..42bc42b6 100644 --- a/app/lib/screens/mobile_registration_screen.dart +++ b/app/lib/screens/mobile_registration_screen.dart @@ -310,7 +310,7 @@ class _MobileRegistrationScreenState extends State { children: [ Row( mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ ElevatedButton( onPressed: () { @@ -371,8 +371,12 @@ class _MobileRegistrationScreenState extends State { color: Theme.of(context).colorScheme.onSecondaryContainer), ), - const Divider( - height: 50, + Divider( + height: 40, + color: Theme.of(context) + .colorScheme + .onSecondaryContainer + .withOpacity(0.2), ), Padding( padding: const EdgeInsets.only(top: 8.5), @@ -415,9 +419,6 @@ class _MobileRegistrationScreenState extends State { ), ], ), - const Divider( - height: 50, - ), ], ), ), @@ -526,27 +527,27 @@ class _MobileRegistrationScreenState extends State { : StepState.disabled, title: const Text('Finishing'), content: Card( - child: Column( - children: [ - const SizedBox( - height: 10.0, - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: Text( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( 'Please check the data below, press finish if it is correct. Otherwise click the pencil icon to edit them.', style: Theme.of(context).textTheme.bodyMedium!.copyWith( color: Theme.of(context).colorScheme.onSecondaryContainer, fontWeight: FontWeight.bold), ), - ), - const SizedBox( - height: 15.0, - ), - Padding( - padding: const EdgeInsets.only(top: 8.0, bottom: 4.0), - child: ListTile( + Divider( + height: 40, + color: Theme.of(context) + .colorScheme + .onSecondaryContainer + .withOpacity(0.2), + ), + ListTile( + contentPadding: EdgeInsets.zero, leading: const Icon(Icons.person), title: Text(doubleNameController.text), trailing: const Icon(Icons.edit), @@ -555,10 +556,8 @@ class _MobileRegistrationScreenState extends State { FocusScope.of(context).requestFocus(nameFocus); }), ), - ), - Padding( - padding: const EdgeInsets.only(top: 4.0, bottom: 15.0), - child: ListTile( + ListTile( + contentPadding: EdgeInsets.zero, leading: const Icon(Icons.email), title: Text(emailController.text), trailing: const Icon(Icons.edit), @@ -566,8 +565,8 @@ class _MobileRegistrationScreenState extends State { state = _State.Email; FocusScope.of(context).requestFocus(emailFocus); })), - ), - ], + ], + ), ), ), ) diff --git a/app/lib/widgets/reusable_text_field_step.dart b/app/lib/widgets/reusable_text_field_step.dart index 1e1aa25f..0b860b7c 100644 --- a/app/lib/widgets/reusable_text_field_step.dart +++ b/app/lib/widgets/reusable_text_field_step.dart @@ -26,22 +26,23 @@ class ReuseableTextFieldStep extends StatelessWidget { children: [ Text( titleText, - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith(color: Theme.of(context).colorScheme.onSecondaryContainer), + style: Theme.of(context).textTheme.titleMedium!.copyWith( + color: Theme.of(context).colorScheme.onSecondaryContainer), ), - const Divider( - height: 50, + Divider( + height: 40, + color: Theme.of(context) + .colorScheme + .onSecondaryContainer + .withOpacity(0.2), ), Padding( padding: const EdgeInsets.only(top: 8.5), child: TextFormField( - style: Theme.of(context) - .textTheme - .bodyLarge! - .copyWith(color: Theme.of(context).colorScheme.onSecondaryContainer, - decorationColor: Theme.of(context).colorScheme.onSecondaryContainer), + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + color: Theme.of(context).colorScheme.onSecondaryContainer, + decorationColor: + Theme.of(context).colorScheme.onSecondaryContainer), focusNode: focusNode, autofocus: true, keyboardType: typeText, @@ -69,9 +70,6 @@ class ReuseableTextFieldStep extends StatelessWidget { ), ], ), - const Divider( - height: 50, - ), ], ); } From 067b0b8b31e9ab1b2a26bcd1e6f250732c55e80d Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Wed, 21 Feb 2024 01:03:38 +0200 Subject: [PATCH 048/457] Update the home screen --- app/lib/screens/registered_screen.dart | 134 ++++++++++++++----------- app/lib/widgets/home_card.dart | 57 +++++++++++ 2 files changed, 132 insertions(+), 59 deletions(-) create mode 100644 app/lib/widgets/home_card.dart diff --git a/app/lib/screens/registered_screen.dart b/app/lib/screens/registered_screen.dart index 1affc848..9d0d0319 100644 --- a/app/lib/screens/registered_screen.dart +++ b/app/lib/screens/registered_screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:threebotlogin/widgets/layout_drawer.dart'; +import 'package:threebotlogin/widgets/home_card.dart'; class RegisteredScreen extends StatefulWidget { static final RegisteredScreen _singleton = RegisteredScreen._internal(); @@ -25,67 +25,83 @@ class _RegisteredScreenState extends State @override Widget build(BuildContext context) { - return LayoutDrawer( - titleText: 'Home', - content: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - height: MediaQuery.of(context).size.height * 0.8, - width: MediaQuery.of(context).size.width, - child: Column( + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const SizedBox( + height: 100, + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.7, + width: MediaQuery.of(context).size.width, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 250.0, + height: 28.33, + decoration: BoxDecoration( + image: DecorationImage( + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onBackground, + BlendMode.srcIn), + fit: BoxFit.fill, + image: const AssetImage('assets/logoTF.png')), + ), + ), + const SizedBox(height: 150), + SizedBox( + width: MediaQuery.of(context).size.width / 1.75, + child: RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: TextStyle( + fontSize: 18.0, + color: Theme.of(context).colorScheme.onBackground, + ), + children: const [ + TextSpan(text: 'Welcome to the\n'), + TextSpan( + text: 'ThreeFold Connect App! \n', + style: TextStyle(fontWeight: FontWeight.bold)), + ]), + ), + ), + const Spacer(), + const Row( + crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - width: 250.0, - height: 28.33, - decoration: BoxDecoration( - image: DecorationImage( - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.onBackground, - BlendMode.srcIn), - fit: BoxFit.fill, - image: const AssetImage('assets/logoTF.png')), - ), - ), - const SizedBox(height: 50), - Container( - width: 200.0, - height: 200.0, - decoration: const BoxDecoration( - image: DecorationImage( - fit: BoxFit.fill, - image: AssetImage('assets/threefold_registered.png')), - ), - ), - const SizedBox(height: 50), - SizedBox( - width: MediaQuery.of(context).size.width / 1.75, - child: RichText( - textAlign: TextAlign.center, - text: TextSpan( - style: TextStyle( - fontSize: 18.0, - color: Theme.of(context).colorScheme.onBackground, - ), - children: const [ - TextSpan(text: 'Welcome to the\n'), - TextSpan( - text: 'ThreeFold Connect App! \n', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan(text: 'Click on the '), - TextSpan( - text: 'menu ', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan(text: 'icon \n to get started'), - ]), - ), - ), + children: [ + HomeCardWidget( + name: 'News', icon: Icons.article, pageNumber: 1), + HomeCardWidget( + name: 'Wallet', + icon: Icons.account_balance_wallet, + pageNumber: 2), + HomeCardWidget( + name: 'Farming', icon: Icons.fire_truck, pageNumber: 3), ], ), - ), - ], - )); + const Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + HomeCardWidget( + name: 'Support', icon: Icons.chat, pageNumber: 4), + HomeCardWidget( + name: 'Identity', + icon: Icons.person_outlined, + pageNumber: 5), + HomeCardWidget( + name: 'Settings', icon: Icons.settings, pageNumber: 6), + ], + ) + ], + ), + ), + ], + )); } void updatePreference(bool preference) { diff --git a/app/lib/widgets/home_card.dart b/app/lib/widgets/home_card.dart new file mode 100644 index 00000000..47ec3409 --- /dev/null +++ b/app/lib/widgets/home_card.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:threebotlogin/helpers/globals.dart'; + +class HomeCardWidget extends StatelessWidget { + const HomeCardWidget( + {super.key, + required this.name, + required this.icon, + required this.pageNumber}); + + final String name; + final IconData icon; + final int pageNumber; + + @override + Widget build(BuildContext context) { + Globals globals = Globals(); + final size = MediaQuery.of(context).size.width; + return Card( + margin: const EdgeInsets.all(3), + shape: const RoundedRectangleBorder(), + clipBehavior: Clip.hardEdge, + elevation: 2, + child: InkWell( + onTap: () { + globals.tabController.animateTo(pageNumber); + }, + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(10), + height: size / 4, + width: size / 4, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + icon, + color: Theme.of(context).colorScheme.onSecondaryContainer, + ), + Text( + name, + style: Theme.of(context).textTheme.titleMedium!.copyWith( + color: + Theme.of(context).colorScheme.onSecondaryContainer, + fontWeight: FontWeight.bold), + ) + ], + ), + ) + ], + ), + ), + ); + } +} From d4fe44293976910a42be7715d952790097c345b4 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Wed, 21 Feb 2024 19:21:16 +0200 Subject: [PATCH 049/457] Add the new logo and map in the assets --- app/assets/TF_log_horizontal.svg | 22 ++++++++++++++++++++++ app/assets/TF_logo.svg | 15 +++++++++++++++ app/assets/map.png | Bin 0 -> 113114 bytes 3 files changed, 37 insertions(+) create mode 100644 app/assets/TF_log_horizontal.svg create mode 100644 app/assets/TF_logo.svg create mode 100644 app/assets/map.png diff --git a/app/assets/TF_log_horizontal.svg b/app/assets/TF_log_horizontal.svg new file mode 100644 index 00000000..bfdf6fe2 --- /dev/null +++ b/app/assets/TF_log_horizontal.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/assets/TF_logo.svg b/app/assets/TF_logo.svg new file mode 100644 index 00000000..961e9693 --- /dev/null +++ b/app/assets/TF_logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/assets/map.png b/app/assets/map.png new file mode 100644 index 0000000000000000000000000000000000000000..142ae4acdcbb7b5d2ca1a391636ef51b63b4da89 GIT binary patch literal 113114 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 l*}uLOyS8To&ibdr&XFw$s9Dl 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 literal 0 HcmV?d00001 From ec0762dc3ffafdf07d7f8b3e390dc0c721e972ab Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Wed, 21 Feb 2024 19:28:06 +0200 Subject: [PATCH 050/457] Update the home screen --- app/lib/screens/registered_screen.dart | 85 +++++++++++++++++--------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/app/lib/screens/registered_screen.dart b/app/lib/screens/registered_screen.dart index 9d0d0319..15550b23 100644 --- a/app/lib/screens/registered_screen.dart +++ b/app/lib/screens/registered_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:threebotlogin/widgets/home_card.dart'; class RegisteredScreen extends StatefulWidget { @@ -29,42 +30,68 @@ class _RegisteredScreenState extends State body: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ - const SizedBox( - height: 100, - ), SizedBox( - height: MediaQuery.of(context).size.height * 0.7, + height: MediaQuery.of(context).size.height * 0.3, width: MediaQuery.of(context).size.width, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - width: 250.0, - height: 28.33, - decoration: BoxDecoration( - image: DecorationImage( + child: Stack( + children: [ + Image.asset( + 'assets/map.png', + fit: BoxFit.cover, + ), + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/TF_logo.svg', + alignment: Alignment.center, colorFilter: ColorFilter.mode( Theme.of(context).colorScheme.onBackground, BlendMode.srcIn), - fit: BoxFit.fill, - image: const AssetImage('assets/logoTF.png')), + ), + SizedBox( + height: 30, + width: 240, + child: Divider( + thickness: 2, + color: Theme.of(context).colorScheme.primary, + ), + ), + Text( + 'ThreeFold Connect App', + style: Theme.of(context).textTheme.titleLarge!.copyWith( + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold), + ) + ], ), ), - const SizedBox(height: 150), + ], + ), + ), + Container( + margin: const EdgeInsets.symmetric(vertical: 50, horizontal: 10), + height: MediaQuery.of(context).size.height * 0.5, + width: MediaQuery.of(context).size.width, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ SizedBox( - width: MediaQuery.of(context).size.width / 1.75, + width: MediaQuery.of(context).size.width / 1.2, child: RichText( textAlign: TextAlign.center, text: TextSpan( - style: TextStyle( - fontSize: 18.0, - color: Theme.of(context).colorScheme.onBackground, - ), + style: Theme.of(context).textTheme.titleMedium!.copyWith( + color: Theme.of(context).colorScheme.onBackground, + ), children: const [ - TextSpan(text: 'Welcome to the\n'), TextSpan( - text: 'ThreeFold Connect App! \n', - style: TextStyle(fontWeight: FontWeight.bold)), + text: + 'ThreeFold Connect App is 2FA authenticator. '), + TextSpan( + text: + 'By using ThreeFold Connect you can ensure that a user is who the say they are.'), ]), ), ), @@ -80,7 +107,9 @@ class _RegisteredScreenState extends State icon: Icons.account_balance_wallet, pageNumber: 2), HomeCardWidget( - name: 'Farming', icon: Icons.fire_truck, pageNumber: 3), + name: 'Farming', + icon: Icons.fire_truck_outlined, + pageNumber: 3), ], ), const Row( @@ -90,16 +119,14 @@ class _RegisteredScreenState extends State HomeCardWidget( name: 'Support', icon: Icons.chat, pageNumber: 4), HomeCardWidget( - name: 'Identity', - icon: Icons.person_outlined, - pageNumber: 5), + name: 'Identity', icon: Icons.person, pageNumber: 5), HomeCardWidget( name: 'Settings', icon: Icons.settings, pageNumber: 6), ], - ) + ), ], ), - ), + ) ], )); } From 9147867a1778aa36b96729516f47eca349344ac1 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Fri, 23 Feb 2024 14:49:37 +0200 Subject: [PATCH 051/457] Adjust the values to be related to the mobile size --- app/lib/screens/registered_screen.dart | 4 ++-- app/lib/widgets/home_card.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/lib/screens/registered_screen.dart b/app/lib/screens/registered_screen.dart index 15550b23..966f370c 100644 --- a/app/lib/screens/registered_screen.dart +++ b/app/lib/screens/registered_screen.dart @@ -51,8 +51,8 @@ class _RegisteredScreenState extends State BlendMode.srcIn), ), SizedBox( - height: 30, - width: 240, + height: MediaQuery.of(context).size.height * 0.04, + width: MediaQuery.of(context).size.width * 0.6, child: Divider( thickness: 2, color: Theme.of(context).colorScheme.primary, diff --git a/app/lib/widgets/home_card.dart b/app/lib/widgets/home_card.dart index 47ec3409..01f4e15e 100644 --- a/app/lib/widgets/home_card.dart +++ b/app/lib/widgets/home_card.dart @@ -16,9 +16,9 @@ class HomeCardWidget extends StatelessWidget { Widget build(BuildContext context) { Globals globals = Globals(); final size = MediaQuery.of(context).size.width; - return Card( + return Card( margin: const EdgeInsets.all(3), - shape: const RoundedRectangleBorder(), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3)), clipBehavior: Clip.hardEdge, elevation: 2, child: InkWell( From a1ebc56368df9960a3a235b21328870422cf36bd Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Fri, 23 Feb 2024 15:15:57 +0200 Subject: [PATCH 052/457] Adjust drawer divider color and the logo size --- app/lib/widgets/layout_drawer.dart | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/app/lib/widgets/layout_drawer.dart b/app/lib/widgets/layout_drawer.dart index e5f6f36a..270519be 100644 --- a/app/lib/widgets/layout_drawer.dart +++ b/app/lib/widgets/layout_drawer.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:threebotlogin/helpers/globals.dart'; class LayoutDrawer extends StatefulWidget { @@ -27,19 +28,24 @@ class _LayoutDrawerState extends State { body: widget.content, drawer: Drawer( elevation: 5, + width: MediaQuery.of(context).size.width * 2 / 3, // space to fit everything. child: Column( children: [ SizedBox( - height: 100, - child: DrawerHeader( - padding: const EdgeInsets.all(20), - child: Image.asset( - 'assets/logoTF.png', - height: 18.13, - colorBlendMode: BlendMode.srcIn, - width: 160, - color: Theme.of(context).colorScheme.onBackground, + height: 70, + child: DrawerHeader( + decoration: BoxDecoration( + border: Border( + bottom: + BorderSide(color: Theme.of(context).colorScheme.primary), + ), + ), + child: SvgPicture.asset( + 'assets/TF_log_horizontal.svg', + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onBackground, + BlendMode.srcIn), ), ), ), From c97974a63af047cd40a40ec6035493ca252be1ed Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Fri, 23 Feb 2024 16:51:45 +0200 Subject: [PATCH 053/457] Update theme colors and styles --- app/lib/main.dart | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/app/lib/main.dart b/app/lib/main.dart index a8c2b14e..67efc50f 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -62,24 +62,14 @@ class MyApp extends StatelessWidget { Theme.of(context).textTheme, ); - var accentTextStyle = GoogleFonts.lato( - textStyle: Theme.of(context).appBarTheme.titleTextStyle, - ); - - var textStyle = GoogleFonts.lato(); return MaterialApp( - theme: ThemeData( - useMaterial3: true, + theme: ThemeData().copyWith( colorScheme: kColorScheme, brightness: Brightness.light, textTheme: textTheme, - tabBarTheme: - TabBarTheme(labelStyle: textStyle, unselectedLabelStyle: textStyle), - appBarTheme: AppBarTheme( - color: kColorScheme.primary, - iconTheme: const IconThemeData(color: Colors.white), - titleTextStyle: accentTextStyle, - toolbarTextStyle: accentTextStyle, + appBarTheme: const AppBarTheme().copyWith( + backgroundColor: kColorScheme.primary, + foregroundColor: kColorScheme.onPrimary, ), cardTheme: const CardTheme().copyWith( color: kColorScheme.secondaryContainer, @@ -96,13 +86,9 @@ class MyApp extends StatelessWidget { colorScheme: kDarkColorScheme, brightness: Brightness.dark, textTheme: textTheme, - tabBarTheme: - TabBarTheme(labelStyle: textStyle, unselectedLabelStyle: textStyle), - appBarTheme: AppBarTheme( - color: kColorScheme.primary, - iconTheme: const IconThemeData(color: Colors.white), - titleTextStyle: accentTextStyle, - toolbarTextStyle: accentTextStyle, + appBarTheme: const AppBarTheme().copyWith( + backgroundColor: kDarkColorScheme.primaryContainer, + foregroundColor: kDarkColorScheme.onPrimaryContainer, ), cardTheme: const CardTheme().copyWith( color: kDarkColorScheme.secondaryContainer, From a436aab7038c021b87276ab56ed58ac6c86938bc Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Fri, 23 Feb 2024 16:52:30 +0200 Subject: [PATCH 054/457] Remove unused center widget --- app/lib/screens/registered_screen.dart | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/lib/screens/registered_screen.dart b/app/lib/screens/registered_screen.dart index 966f370c..f232a33d 100644 --- a/app/lib/screens/registered_screen.dart +++ b/app/lib/screens/registered_screen.dart @@ -34,38 +34,38 @@ class _RegisteredScreenState extends State height: MediaQuery.of(context).size.height * 0.3, width: MediaQuery.of(context).size.width, child: Stack( + alignment: Alignment.center, children: [ Image.asset( 'assets/map.png', fit: BoxFit.cover, ), - Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset( - 'assets/TF_logo.svg', - alignment: Alignment.center, - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.onBackground, - BlendMode.srcIn), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/TF_logo.svg', + alignment: Alignment.center, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onBackground, + BlendMode.srcIn), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.04, + width: MediaQuery.of(context).size.width * 0.6, + child: Divider( + thickness: 2, + color: Theme.of(context).colorScheme.primary, ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.04, - width: MediaQuery.of(context).size.width * 0.6, - child: Divider( - thickness: 2, + ), + Text( + 'ThreeFold Connect App', + style: Theme.of(context).textTheme.titleLarge!.copyWith( color: Theme.of(context).colorScheme.primary, - ), - ), - Text( - 'ThreeFold Connect App', - style: Theme.of(context).textTheme.titleLarge!.copyWith( - color: Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold), - ) - ], - ), + fontWeight: FontWeight.bold), + ) + ], ), ], ), From 7a420ebaefbd4fdeb9b4ba099184a05d0a17ac0b Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Fri, 23 Feb 2024 17:49:35 +0200 Subject: [PATCH 055/457] Add widget for the logo to be reused Add the new logo to the main, registered, and the unregistered screens with animation --- app/lib/screens/main_screen.dart | 130 +++++++++---------- app/lib/screens/registered_screen.dart | 31 +---- app/lib/screens/unregistered_screen.dart | 156 ++++++++++------------- app/lib/widgets/home_logo.dart | 36 ++++++ 4 files changed, 172 insertions(+), 181 deletions(-) create mode 100644 app/lib/widgets/home_logo.dart diff --git a/app/lib/screens/main_screen.dart b/app/lib/screens/main_screen.dart index 11223ed8..a7a35d32 100644 --- a/app/lib/screens/main_screen.dart +++ b/app/lib/screens/main_screen.dart @@ -16,6 +16,7 @@ import 'package:threebotlogin/services/migration_service.dart'; import 'package:threebotlogin/services/socket_service.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; import 'package:threebotlogin/widgets/error_widget.dart'; +import 'package:threebotlogin/widgets/home_logo.dart'; import 'package:uni_links/uni_links.dart'; class MainScreen extends StatefulWidget { @@ -56,71 +57,69 @@ class _AppState extends State { }; return Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/logoTF.png', - height: 28.33, - colorBlendMode: BlendMode.srcIn, - width: 250, - color: Theme.of(context).colorScheme.onBackground, - ), - const SizedBox( - height: 40, - ), - Container( - padding: const EdgeInsets.only(left: 12, right: 12), - child: Text( - updateMessage != null - ? updateMessage.toString() - : errorMessage.toString(), - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - fontWeight: FontWeight.bold, - color: errorMessage != null - ? Theme.of(context).colorScheme.error - : Theme.of(context).colorScheme.onBackground), - ), - ), - const SizedBox( - height: 40, - ), - Transform.scale( - scale: 0.5, - child: CircularProgressIndicator( - color: Theme.of(context).colorScheme.primary, - ), - ), - const SizedBox(height: 20), - Visibility( - maintainSize: true, - maintainAnimation: true, - maintainState: true, - visible: errorMessage != null, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.secondary, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(30)), - ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Hero( + tag: 'logo', + child: HomeLogoWidget(), + ), + const SizedBox(height: 50), + Container( + padding: const EdgeInsets.only(left: 12, right: 12), + child: Text( + updateMessage != null + ? updateMessage.toString() + : errorMessage.toString(), + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + fontWeight: FontWeight.bold, + color: errorMessage != null + ? Theme.of(context).colorScheme.error + : Theme.of(context).colorScheme.onBackground), ), - child: const Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'RETRY', - style: TextStyle(color: Colors.white, fontSize: 16), - ), - ], + ), + const SizedBox( + height: 40, + ), + Transform.scale( + scale: 0.5, + child: CircularProgressIndicator( + color: Theme.of(context).colorScheme.primary, ), - onPressed: () async { - await pushScreens(); - }, - )) - ], - ))); + ), + const SizedBox(height: 20), + Visibility( + maintainSize: true, + maintainAnimation: true, + maintainState: true, + visible: errorMessage != null, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.secondary, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(30)), + ), + ), + child: const Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'RETRY', + style: TextStyle(color: Colors.white, fontSize: 16), + ), + ], + ), + onPressed: () async { + await pushScreens(); + }, + )) + ], + ), + ), + ); } pushScreens() async { @@ -198,8 +197,9 @@ class _AppState extends State { // await Navigator.push(context, MaterialPageRoute(builder: (context) => UnregisteredScreen())); await Navigator.pushReplacement( context, - MaterialPageRoute( - builder: (context) => HomeScreen( + PageRouteBuilder( + transitionDuration: Duration(seconds: 1), + pageBuilder: (_, __, ___) => HomeScreen( initialLink: initialLink, backendConnection: _backendConnection))); } diff --git a/app/lib/screens/registered_screen.dart b/app/lib/screens/registered_screen.dart index f232a33d..501e5677 100644 --- a/app/lib/screens/registered_screen.dart +++ b/app/lib/screens/registered_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:threebotlogin/widgets/home_card.dart'; +import 'package:threebotlogin/widgets/home_logo.dart'; class RegisteredScreen extends StatefulWidget { static final RegisteredScreen _singleton = RegisteredScreen._internal(); @@ -40,32 +40,9 @@ class _RegisteredScreenState extends State 'assets/map.png', fit: BoxFit.cover, ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SvgPicture.asset( - 'assets/TF_logo.svg', - alignment: Alignment.center, - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.onBackground, - BlendMode.srcIn), - ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.04, - width: MediaQuery.of(context).size.width * 0.6, - child: Divider( - thickness: 2, - color: Theme.of(context).colorScheme.primary, - ), - ), - Text( - 'ThreeFold Connect App', - style: Theme.of(context).textTheme.titleLarge!.copyWith( - color: Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold), - ) - ], + const Hero( + tag: 'logo', + child: HomeLogoWidget(), ), ], ), diff --git a/app/lib/screens/unregistered_screen.dart b/app/lib/screens/unregistered_screen.dart index 32e58bdc..e916adcc 100644 --- a/app/lib/screens/unregistered_screen.dart +++ b/app/lib/screens/unregistered_screen.dart @@ -5,6 +5,7 @@ import 'package:threebotlogin/screens/change_pin_screen.dart'; import 'package:threebotlogin/screens/mobile_registration_screen.dart'; import 'package:threebotlogin/screens/recover_screen.dart'; import 'package:threebotlogin/screens/successful_screen.dart'; +import 'package:threebotlogin/widgets/home_logo.dart'; class UnregisteredScreen extends StatefulWidget { const UnregisteredScreen({super.key}); @@ -63,104 +64,81 @@ class _UnregisteredScreenState extends State Widget build(BuildContext context) { return Material( child: Scaffold( - body: WillPopScope( - child: ConstrainedBox( - constraints: const BoxConstraints( - maxHeight: double.infinity, - maxWidth: double.infinity, - minHeight: 250, - minWidth: 250), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container(), - Column( - mainAxisAlignment: MainAxisAlignment.center, + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Hero( + tag: 'logo', + child: HomeLogoWidget(), + ), + const SizedBox(height: 150), + SizedBox( + width: 250, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Container( - width: 250.0, - height: 28.33, - decoration: BoxDecoration( - image: DecorationImage( - colorFilter: ColorFilter.mode( - Theme.of(context).colorScheme.onBackground, - BlendMode.srcIn), - fit: BoxFit.fill, - image: const AssetImage('assets/logoTF.png')), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.primaryContainer, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(30)), + ), ), - ), - const SizedBox(height: 100), - ], - ), - SizedBox( - width: 250, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: - Theme.of(context).colorScheme.primaryContainer, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(30)), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Sign Up', + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + color: Theme.of(context) + .colorScheme + .onPrimaryContainer), ), + ], + ), + onPressed: () { + startRegistration(); + }, + ), + const SizedBox(height: 20), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.primaryContainer, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(30)), ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'Sign Up', - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith( - color: Theme.of(context) - .colorScheme - .onPrimaryContainer), - ), - ], - ), - onPressed: () { - startRegistration(); - }, ), - const SizedBox(height: 20), - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: - Theme.of(context).colorScheme.primaryContainer, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(30)), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Recover Account', + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + color: Theme.of(context) + .colorScheme + .onPrimaryContainer), ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'Recover Account', - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith( - color: Theme.of(context) - .colorScheme - .onPrimaryContainer), - ), - ], - ), - onPressed: () { - startRecovery(); - }, + ], ), - ], - ), + onPressed: () { + startRecovery(); + }, + ), + ], ), - ], - ), + ), + ], ), - onWillPop: () { - return Future.value(false); - }, ), )); } diff --git a/app/lib/widgets/home_logo.dart b/app/lib/widgets/home_logo.dart new file mode 100644 index 00000000..9135161e --- /dev/null +++ b/app/lib/widgets/home_logo.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class HomeLogoWidget extends StatelessWidget { + const HomeLogoWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/TF_logo.svg', + alignment: Alignment.center, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onBackground, BlendMode.srcIn), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.04, + width: MediaQuery.of(context).size.width * 0.6, + child: Divider( + thickness: 2, + color: Theme.of(context).colorScheme.primary, + ), + ), + Text( + 'ThreeFold Connect App', + style: Theme.of(context).textTheme.titleLarge!.copyWith( + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold), + ), + ], + ); + } +} From fccae08fafe812918da6f1484b518bafb91c455d Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 24 Feb 2024 01:26:58 +0200 Subject: [PATCH 056/457] Remove unused logo --- app/assets/logoTF.png | Bin 3835 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/assets/logoTF.png diff --git a/app/assets/logoTF.png b/app/assets/logoTF.png deleted file mode 100644 index 4be2121e08a6a2dc9e439e0e7ab6c45ad7b6eb38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3835 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 From e68894c4887caee78a5db773e3446d07cb3171d7 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sat, 24 Feb 2024 01:28:14 +0200 Subject: [PATCH 057/457] Update farming and support icons in registered screen and drawer --- app/assets/server.png | Bin 2825 -> 0 bytes app/lib/screens/registered_screen.dart | 4 +- app/lib/widgets/layout_drawer.dart | 80 ++++++++----------------- 3 files changed, 26 insertions(+), 58 deletions(-) delete mode 100644 app/assets/server.png diff --git a/app/assets/server.png b/app/assets/server.png deleted file mode 100644 index e0deee9c54f79ebb77a7c957633a8a2d20af6da1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2825 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 pageNumber: 2), HomeCardWidget( name: 'Farming', - icon: Icons.fire_truck_outlined, + icon: Icons.storage, pageNumber: 3), ], ), @@ -94,7 +94,7 @@ class _RegisteredScreenState extends State mainAxisAlignment: MainAxisAlignment.center, children: [ HomeCardWidget( - name: 'Support', icon: Icons.chat, pageNumber: 4), + name: 'Support', icon: Icons.build, pageNumber: 4), HomeCardWidget( name: 'Identity', icon: Icons.person, pageNumber: 5), HomeCardWidget( diff --git a/app/lib/widgets/layout_drawer.dart b/app/lib/widgets/layout_drawer.dart index 270519be..62f4fbc0 100644 --- a/app/lib/widgets/layout_drawer.dart +++ b/app/lib/widgets/layout_drawer.dart @@ -34,11 +34,11 @@ class _LayoutDrawerState extends State { children: [ SizedBox( height: 70, - child: DrawerHeader( + child: DrawerHeader( decoration: BoxDecoration( border: Border( - bottom: - BorderSide(color: Theme.of(context).colorScheme.primary), + bottom: BorderSide( + color: Theme.of(context).colorScheme.primary), ), ), child: SvgPicture.asset( @@ -51,13 +51,9 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: const Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.home, size: 18) - ], - ), + leading: const Padding( + padding: EdgeInsets.only(left: 10), + child: Icon(Icons.home, size: 18)), title: const Text('Home'), onTap: () { Navigator.pop(context); @@ -66,13 +62,9 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: const Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.article, size: 18) - ], - ), + leading: const Padding( + padding: EdgeInsets.only(left: 10), + child: Icon(Icons.article, size: 18)), title: const Text('News'), onTap: () { Navigator.pop(context); @@ -81,13 +73,9 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: const Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.account_balance_wallet, size: 18) - ], - ), + leading: const Padding( + padding: EdgeInsets.only(left: 10), + child: Icon(Icons.account_balance_wallet, size: 18)), title: const Text('Wallet'), onTap: () { Navigator.pop(context); @@ -97,18 +85,9 @@ class _LayoutDrawerState extends State { if (Globals().canSeeFarmers) ListTile( minLeadingWidth: 10, - leading: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Padding(padding: EdgeInsets.only(left: 30)), - Image.asset( - 'assets/server.png', - scale: 1.0, - height: 18.0, - width: 18.0, - ), - ], - ), + leading: const Padding( + padding: EdgeInsets.only(left: 10), + child: Icon(Icons.storage, size: 18)), title: const Text('Farming'), onTap: () { Navigator.pop(context); @@ -119,12 +98,9 @@ class _LayoutDrawerState extends State { Container(), ListTile( minLeadingWidth: 10, - leading: const Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.chat, size: 18) - ], + leading: const Padding( + padding: EdgeInsets.only(left: 10), + child: Icon(Icons.build, size: 18), ), title: const Text('Support'), onTap: () { @@ -134,13 +110,9 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: const Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.person_outlined, size: 18) - ], - ), + leading: const Padding( + padding: EdgeInsets.only(left: 10), + child: Icon(Icons.person, size: 18)), title: const Text('Identity'), onTap: () { Navigator.pop(context); @@ -149,13 +121,9 @@ class _LayoutDrawerState extends State { ), ListTile( minLeadingWidth: 10, - leading: const Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding(padding: EdgeInsets.only(left: 30)), - Icon(Icons.settings, size: 18) - ], - ), + leading: const Padding( + padding: EdgeInsets.only(left: 10), + child: Icon(Icons.settings, size: 18)), title: const Text('Settings'), onTap: () { Navigator.pop(context); From ea34f67257c24394f5418aacb558caacfb8ee214 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 25 Feb 2024 02:10:21 +0200 Subject: [PATCH 058/457] Add new package pinput --- app/pubspec.lock | 24 ++++++++++++++++++++++++ app/pubspec.yaml | 1 + 2 files changed, 25 insertions(+) diff --git a/app/pubspec.lock b/app/pubspec.lock index 9ed62fa8..fdc82d6a 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -553,6 +553,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" + pinput: + dependency: "direct main" + description: + name: pinput + sha256: a92b55ecf9c25d1b9e100af45905385d5bc34fc9b6b04177a9e82cb88fe4d805 + url: "https://pub.dev" + source: hosted + version: "3.0.1" platform: dependency: transitive description: @@ -678,6 +686,14 @@ packages: description: flutter source: sdk version: "0.0.99" + smart_auth: + dependency: transitive + description: + name: smart_auth + sha256: a25229b38c02f733d0a4e98d941b42bed91a976cb589e934895e60ccfa674cf6 + url: "https://pub.dev" + source: hosted + version: "1.1.1" socket_io_client: dependency: "direct main" description: @@ -806,6 +822,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc + url: "https://pub.dev" + source: hosted + version: "1.0.0+1" url_launcher: dependency: "direct main" description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index a1155660..2af8050f 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -43,6 +43,7 @@ dependencies: open_filex: ^4.3.2 country_picker: ^2.0.20 pinenacl: ^0.5.1 + pinput: 3.0.1 dev_dependencies: flutter_native_splash: ^2.3.1 From 91b4ddc1e171abe398bd9758729860fbff9b4f44 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 25 Feb 2024 02:10:56 +0200 Subject: [PATCH 059/457] Add new widget for pin code --- app/lib/widgets/pin_code.dart | 115 ++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 app/lib/widgets/pin_code.dart diff --git a/app/lib/widgets/pin_code.dart b/app/lib/widgets/pin_code.dart new file mode 100644 index 00000000..2aee5009 --- /dev/null +++ b/app/lib/widgets/pin_code.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; +import 'package:pinput/pinput.dart'; +import 'package:threebotlogin/helpers/globals.dart'; + +class PincodeWidget extends StatefulWidget { + const PincodeWidget( + {super.key, + required this.userMessage, + required this.title, + required this.handler}); + final String title; + final String userMessage; + final Function(String) handler; + + @override + State createState() => _PincodeWidgetState(); +} + +class _PincodeWidgetState extends State { + Globals globals = Globals(); + final pinController = TextEditingController(); + final focusNode = FocusNode(); + final formKey = GlobalKey(); + + @override + void dispose() { + pinController.dispose(); + focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final focusedBorderColor = Theme.of(context).colorScheme.primary; + final fillColor = Theme.of(context).colorScheme.secondaryContainer; + final borderColor = Theme.of(context).colorScheme.primaryContainer; + + final defaultPinTheme = PinTheme( + width: 56, + height: 56, + textStyle: Theme.of(context).textTheme.titleLarge!.copyWith( + color: Theme.of(context).colorScheme.onSecondaryContainer, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(19), + border: Border.all(color: borderColor), + ), + ); + + /// Optionally you can use form to validate the Pinput + return Scaffold( + appBar: AppBar( + elevation: 0, + title: Text(widget.title), + ), + body: Center( + child: Form( + key: formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + widget.userMessage, + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + color: Theme.of(context).colorScheme.onBackground), + ), + const SizedBox(height: 150), + Pinput( + autofocus: true, + obscureText: true, + controller: pinController, + focusNode: focusNode, + defaultPinTheme: defaultPinTheme, + separatorBuilder: (index) => const SizedBox(width: 8), + onCompleted: (value) { + widget.handler(value); + pinController.clear(); + }, + hapticFeedbackType: HapticFeedbackType.lightImpact, + cursor: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + margin: const EdgeInsets.only(bottom: 9), + width: 22, + height: 1, + color: focusedBorderColor, + ), + ], + ), + focusedPinTheme: defaultPinTheme.copyWith( + decoration: defaultPinTheme.decoration!.copyWith( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: focusedBorderColor), + ), + ), + submittedPinTheme: defaultPinTheme.copyWith( + decoration: defaultPinTheme.decoration!.copyWith( + color: fillColor, + borderRadius: BorderRadius.circular(19), + border: Border.all(color: focusedBorderColor), + ), + ), + errorPinTheme: defaultPinTheme.copyBorderWith( + border: + Border.all(color: Theme.of(context).colorScheme.error), + ), + ), + ], + ), + ), + ), + ); + } +} From 01bcccf15f9ee7197d2e9cb6d37141d3585ac6d6 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 25 Feb 2024 02:11:33 +0200 Subject: [PATCH 060/457] Change the usage of the pin code in the authentication screen --- app/lib/screens/authentication_screen.dart | 183 +-------------------- 1 file changed, 7 insertions(+), 176 deletions(-) diff --git a/app/lib/screens/authentication_screen.dart b/app/lib/screens/authentication_screen.dart index 8bd0fe51..382594ab 100644 --- a/app/lib/screens/authentication_screen.dart +++ b/app/lib/screens/authentication_screen.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:threebotlogin/events/close_auth_event.dart'; import 'package:threebotlogin/events/events.dart'; import 'package:threebotlogin/helpers/globals.dart'; @@ -9,6 +8,7 @@ import 'package:threebotlogin/models/login.dart'; import 'package:threebotlogin/services/fingerprint_service.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; import 'package:threebotlogin/widgets/custom_dialog.dart'; +import 'package:threebotlogin/widgets/pin_code.dart'; class AuthenticationScreen extends StatefulWidget { const AuthenticationScreen( @@ -104,165 +104,16 @@ class AuthenticationScreenState extends State { List input = []; - Widget buildTextField(int i, BuildContext context) { - const double maxSize = 7; - double size = input.length > i ? maxSize : 1; - double height = MediaQuery.of(context).size.height; - return AnimatedContainer( - margin: EdgeInsets.all(height / 120), - height: height / 50, - width: size, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.onBackground, - shape: BoxShape.circle), - duration: const Duration(milliseconds: 100), - curve: Curves.bounceInOut, - ); - } - - Widget buildNumberPin(String buttonText, BuildContext context, - {Color backgroundColor = Colors.blueGrey}) { - var onPressedMethod = () => handleInput(buttonText); - double height = MediaQuery.of(context).size.height; - - if (buttonText == 'OK') { - onPressedMethod = - (input.length >= widget.pinLength ? () => onOk() : () {}); - } - if (buttonText == 'C') { - onPressedMethod = (input.isNotEmpty ? () => onClear() : () {}); - } - return Container( - padding: EdgeInsets.only(top: height / 136, bottom: height / 136), - child: Center( - child: RawMaterialButton( - padding: const EdgeInsets.all(12), - onPressed: onPressedMethod, - fillColor: backgroundColor, - shape: const CircleBorder(), - child: Text( - buttonText, - style: Theme.of(context).textTheme.titleLarge!.copyWith( - color: Theme.of(context).colorScheme.onPrimaryContainer, - ), - ), - ))); - } - - Widget generateNumbers(BuildContext context) { - List possibleInput = [ - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - 'C', - '0', - 'OK' - ]; - List pins = List.generate(possibleInput.length, (int i) { - String buttonText = possibleInput[i]; - if (buttonText == 'C') { - return buildNumberPin(possibleInput[i], context, - backgroundColor: input.isNotEmpty - ? Theme.of(context).colorScheme.primaryContainer - : Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.5)); - } else if (buttonText == 'OK') { - return buildNumberPin(possibleInput[i], context, - backgroundColor: input.length >= widget.pinLength - ? Colors.green.shade600 - : Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.5)); - } else { - return buildNumberPin(possibleInput[i], context, - backgroundColor: Theme.of(context).colorScheme.primaryContainer); - } - }); - return SizedBox( - width: double.infinity, - child: Center( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: pins.take(3).toList()), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: pins.skip(3).take(3).toList()), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: pins.skip(6).take(3).toList()), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: pins.skip(9).take(3).toList()), - ], - ), - ), - ); - } - - Widget generateTextFields(BuildContext context) { - List textFields = List.generate(widget.pinLength, (int i) { - return buildTextField(i, context); - }); - - return Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: textFields); - } - @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - automaticallyImplyLeading: true, - title: const Text('Authentication'), - ), - body: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.only(bottom: 50), - child: Text( - widget.userMessage, - style: Theme.of(context) - .textTheme - .bodyLarge! - .copyWith(color: Theme.of(context).colorScheme.onBackground), - ), - ), - Container( - alignment: Alignment.center, - child: Column( - children: [ - generateTextFields(context), - const SizedBox(height: 25), - generateNumbers(context), - ], - ), - ), - ], - ), + return PincodeWidget( + title: 'Authentication', + userMessage: widget.userMessage, + handler: validate, ); } - Future onOk() async { - HapticFeedback.mediumImpact(); - - String pin = ''; - for (var char in input) { - pin += char; - } - + validate(String pin) { int currentTime = DateTime.now().millisecondsSinceEpoch; if (globals.incorrectPincodeAttempts >= 3 && @@ -305,26 +156,6 @@ class AuthenticationScreenState extends State { ); } - await dialog.show(context); - - setState(() { - input.removeRange(0, 4); - }); - } - - void onClear() { - HapticFeedback.mediumImpact(); - setState(() { - input.removeLast(); - }); - } - - void handleInput(String buttonText) async { - if (input.length < widget.pinLength) { - HapticFeedback.lightImpact(); - setState(() { - input.add(buttonText); - }); - } + dialog.show(context); } } From db1f35e294cb029a860a1cc15fc855a482971058 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 25 Feb 2024 02:12:16 +0200 Subject: [PATCH 061/457] Change the usage of the pin code in the change pin screen --- app/lib/screens/change_pin_screen.dart | 42 ++++---------------------- 1 file changed, 6 insertions(+), 36 deletions(-) diff --git a/app/lib/screens/change_pin_screen.dart b/app/lib/screens/change_pin_screen.dart index 3b40c166..d710e299 100644 --- a/app/lib/screens/change_pin_screen.dart +++ b/app/lib/screens/change_pin_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; -import 'package:threebotlogin/widgets/pin_field.dart'; +import 'package:threebotlogin/widgets/pin_code.dart'; class ChangePinScreen extends StatefulWidget { const ChangePinScreen({super.key, this.currentPin, this.hideBackButton}); @@ -38,41 +38,11 @@ class _ChangePinScreenState extends State { @override Widget build(BuildContext context) { - return WillPopScope( - child: Scaffold( - appBar: AppBar( - title: widget.currentPin == null - ? const Text('Choose your pincode') - : const Text('Change pincode'), - elevation: 0.0, - automaticallyImplyLeading: widget.hideBackButton == false), - body: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: [ - Container( - padding: const EdgeInsets.only(top: 0.0, bottom: 32.0), - child: Center( - child: Text( - getText(), - style: Theme.of(context) - .textTheme - .bodyLarge! - .copyWith(color: Theme.of(context).colorScheme.onBackground), - )), - ), - PinField( - callback: (p) => changePin(p), - ) - ], - ), - ), - onWillPop: () { - if (state != _State.done && widget.hideBackButton == true) { - return Future(() => false); - } - return Future(() => true); - }, + return PincodeWidget( + title: + widget.currentPin == null ? 'Choose your pincode' : 'Change pincode', + userMessage: getText(), + handler: changePin, ); } From d325124b4ee5177f26121807d5a552d2f3ea12de Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 25 Feb 2024 02:13:07 +0200 Subject: [PATCH 062/457] Remove the pin field widget --- app/lib/widgets/pin_field.dart | 189 --------------------------------- 1 file changed, 189 deletions(-) delete mode 100644 app/lib/widgets/pin_field.dart diff --git a/app/lib/widgets/pin_field.dart b/app/lib/widgets/pin_field.dart deleted file mode 100644 index bb2327e2..00000000 --- a/app/lib/widgets/pin_field.dart +++ /dev/null @@ -1,189 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -class PinField extends StatefulWidget { - final int pinLength = 4; - final callback; - final callbackParam; - final Function? callbackFunction; - - const PinField( - {super.key, - required this.callback, - this.callbackParam, - this.callbackFunction}); - - @override - State createState() => _PinFieldState(); -} - -class _PinFieldState extends State { - @override - void initState() { - super.initState(); - if (widget.callbackFunction != null) { - widget.callbackFunction!(); - } - } - - List input = []; - - Widget buildTextField(int i, BuildContext context) { - const double maxSize = 7; - double size = input.length > i ? maxSize : 1; - double height = MediaQuery.of(context).size.height; - return AnimatedContainer( - margin: EdgeInsets.all(height / 120), - height: height / 50, - width: size, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.onBackground, - shape: BoxShape.circle), - duration: const Duration(milliseconds: 100), - curve: Curves.bounceInOut, - ); - } - - Widget buildNumberPin(String buttonText, BuildContext context, - {Color backgroundColor = Colors.blueGrey}) { - var onPressedMethod = () => handleInput(buttonText); - double height = MediaQuery.of(context).size.height; - - if (buttonText == 'OK') { - onPressedMethod = - (input.length >= widget.pinLength ? () => onOk() : () {}); - } - if (buttonText == 'C') { - onPressedMethod = (input.isNotEmpty ? () => onClear() : () {}); - } - return Container( - padding: EdgeInsets.only(top: height / 136, bottom: height / 136), - child: Center( - child: RawMaterialButton( - padding: const EdgeInsets.all(12), - onPressed: onPressedMethod, - fillColor: backgroundColor, - shape: const CircleBorder(), - child: Text( - buttonText, - style: Theme.of(context).textTheme.titleLarge!.copyWith( - color: Theme.of(context).colorScheme.onPrimaryContainer, - ), - ), - ))); - } - - Widget generateNumbers(BuildContext context) { - List possibleInput = [ - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - 'C', - '0', - 'OK' - ]; - List pins = List.generate(possibleInput.length, (int i) { - String buttonText = possibleInput[i]; - if (buttonText == 'C') { - return buildNumberPin(possibleInput[i], context, - backgroundColor: input.isNotEmpty - ? Theme.of(context).colorScheme.primaryContainer - : Theme.of(context) - .colorScheme - .secondaryContainer - .withOpacity(0.5)); - } else if (buttonText == 'OK') { - return buildNumberPin(possibleInput[i], context, - backgroundColor: input.length >= widget.pinLength - ? Colors.green.shade600 - : Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.5)); - } else { - return buildNumberPin(possibleInput[i], context, - backgroundColor: Theme.of(context).colorScheme.primaryContainer); - } - }); - return SizedBox( - width: double.infinity, - child: Center( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: pins.take(3).toList()), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: pins.skip(3).take(3).toList()), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: pins.skip(6).take(3).toList()), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: pins.skip(9).take(3).toList()), - ], - ), - ), - ); - } - - Widget generateTextFields(BuildContext context) { - List textFields = List.generate(widget.pinLength, (int i) { - return buildTextField(i, context); - }); - - return Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: textFields); - } - - @override - Widget build(BuildContext context) { - return Column(children: [ - generateTextFields(context), - const SizedBox(height: 25), - generateNumbers(context), - ]); - } - - void onOk() { - HapticFeedback.mediumImpact(); - String pin = ''; - for (var char in input) { - pin += char; - } - if (widget.callbackParam != null) { - widget.callback(pin, widget.callbackParam); - } else { - widget.callback(pin); - } - setState(() { - input = []; - }); - } - - void onClear() { - HapticFeedback.mediumImpact(); - setState(() { - input.removeLast(); - }); - } - - void handleInput(String buttonText) async { - if (input.length < widget.pinLength) { - HapticFeedback.lightImpact(); - setState(() { - input.add(buttonText); - }); - } - } -} From 062d34c5e6945a38564b1c753f8e9bdcdbdef50a Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 25 Feb 2024 23:31:47 +0200 Subject: [PATCH 063/457] Remove the native splash screen --- .../app/src/main/res/drawable-hdpi/splash.png | Bin 13395 -> 0 bytes .../app/src/main/res/drawable-mdpi/splash.png | Bin 7343 -> 0 bytes .../res/drawable-night-v21/background.png | Bin 0 -> 69 bytes .../drawable-night-v21/launch_background.xml | 6 + .../main/res/drawable-night/background.png | Bin 0 -> 69 bytes .../res/drawable-night/launch_background.xml | 6 + .../src/main/res/drawable-v21/background.png | Bin 68 -> 69 bytes .../res/drawable-v21/launch_background.xml | 5 +- .../src/main/res/drawable-xhdpi/splash.png | Bin 18498 -> 0 bytes .../src/main/res/drawable-xxhdpi/splash.png | Bin 36321 -> 0 bytes .../src/main/res/drawable-xxxhdpi/splash.png | Bin 42760 -> 0 bytes .../app/src/main/res/drawable/background.png | Bin 68 -> 69 bytes .../main/res/drawable/launch_background.xml | 5 +- .../src/main/res/values-night-v31/styles.xml | 19 ++ .../app/src/main/res/values-night/styles.xml | 4 + .../app/src/main/res/values-v31/styles.xml | 6 +- .../app/src/main/res/values/styles.xml | 5 +- .../BrandingImage.imageset/Contents.json | 23 --- .../LaunchBackground.imageset/Contents.json | 17 +- .../LaunchBackground.imageset/background.png | Bin 68 -> 69 bytes .../darkbackground.png | Bin 0 -> 69 bytes .../LaunchImage.imageset/LaunchImage.png | Bin 7343 -> 69 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 18498 -> 69 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 36321 -> 69 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 4 +- app/ios/Runner/Info.plist | 170 +++++++++--------- app/pubspec.lock | 40 ----- app/pubspec.yaml | 7 - 28 files changed, 141 insertions(+), 176 deletions(-) delete mode 100644 app/android/app/src/main/res/drawable-hdpi/splash.png delete mode 100644 app/android/app/src/main/res/drawable-mdpi/splash.png create mode 100644 app/android/app/src/main/res/drawable-night-v21/background.png create mode 100644 app/android/app/src/main/res/drawable-night-v21/launch_background.xml create mode 100644 app/android/app/src/main/res/drawable-night/background.png create mode 100644 app/android/app/src/main/res/drawable-night/launch_background.xml delete mode 100644 app/android/app/src/main/res/drawable-xhdpi/splash.png delete mode 100644 app/android/app/src/main/res/drawable-xxhdpi/splash.png delete mode 100644 app/android/app/src/main/res/drawable-xxxhdpi/splash.png create mode 100644 app/android/app/src/main/res/values-night-v31/styles.xml delete mode 100644 app/ios/Runner/Assets.xcassets/BrandingImage.imageset/Contents.json create mode 100644 app/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png diff --git a/app/android/app/src/main/res/drawable-hdpi/splash.png b/app/android/app/src/main/res/drawable-hdpi/splash.png deleted file mode 100644 index 2826abe833f5c86bf5b6c24a04afdb997ae98062..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13395 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 PKEPxo6vV4V4FdijyFj6Z diff --git a/app/android/app/src/main/res/drawable-mdpi/splash.png b/app/android/app/src/main/res/drawable-mdpi/splash.png deleted file mode 100644 index 4482d6a651cdd515c556584b1f109fbc2730335c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7343 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 D$0S=n diff --git a/app/android/app/src/main/res/drawable-night-v21/background.png b/app/android/app/src/main/res/drawable-night-v21/background.png new file mode 100644 index 0000000000000000000000000000000000000000..71e9c817e8c3531d8b353b9818aeece0e1e64971 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*|ti3tfno(Kc$izVN6 PfGh@2S3j3^P6 + + + + + diff --git a/app/android/app/src/main/res/drawable-night/background.png b/app/android/app/src/main/res/drawable-night/background.png new file mode 100644 index 0000000000000000000000000000000000000000..71e9c817e8c3531d8b353b9818aeece0e1e64971 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*|ti3tfno(Kc$izVN6 PfGh@2S3j3^P6 + + + + + diff --git a/app/android/app/src/main/res/drawable-v21/background.png b/app/android/app/src/main/res/drawable-v21/background.png index e29b3b59f99290135b0cf3745bc9993ce935b27c..3107d37fa533216ce211fdcdd7c9b8633fab4cc4 100644 GIT binary patch delta 49 zcmZ>9ogk^h#K6EXp*;8=kmB)laSW+oO#b=*zdZvRA2SnE+1>|0aRyIUKbLh*2~7Y< C%MJMe delta 48 zcmZ>DnINgn#=yWJFM6aCNO60*IEGX(CjaDTVc_CtVT_n;@((D?;OXk;vd$@?2>|vK B3nu^o diff --git a/app/android/app/src/main/res/drawable-v21/launch_background.xml b/app/android/app/src/main/res/drawable-v21/launch_background.xml index 3fe6b2e8..f88598cf 100644 --- a/app/android/app/src/main/res/drawable-v21/launch_background.xml +++ b/app/android/app/src/main/res/drawable-v21/launch_background.xml @@ -3,7 +3,4 @@ - - - - \ No newline at end of file + diff --git a/app/android/app/src/main/res/drawable-xhdpi/splash.png b/app/android/app/src/main/res/drawable-xhdpi/splash.png deleted file mode 100644 index b1aa9453a19822be6b7aebd5c5565385b3eddb82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18498 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 Ce-h6C diff --git a/app/android/app/src/main/res/drawable-xxhdpi/splash.png b/app/android/app/src/main/res/drawable-xxhdpi/splash.png deleted file mode 100644 index 4cda529c038ec869760e05e3f8d9df51b448cce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36321 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%0A`x0sM#pd9$XrnT7cFE-um(kDIeD z!R$PXy55o5((d3N$8A{0UaWA>EVVqtVba2^XSH_b-f~i_KL2a?8!Jr((>*S|?$6+5 zjn&^OgG|i>_ekX|28#=c0_JyO3y+?HK#4*4%s2Rkt59-%ebFz9ME>>laQapZX^Z+L zR$KY>Yv%N&zpN8}?KNpO?16h7^0SelC8r-gTN*8yC7Wjdt}=M@Z8c3FA0v=0Bx*Y! zr$26Ds{nM<(qWDRk1TvJY)Fj%C|ahydM*2@tVUhxY~7Rf^q-q&de1(SGI{guCeu+} zmDaDXN9W|f1Xu=Yq4%Ho-6tEvwHht+4*j$l5yKRLa#WOyFJf`7d`zg`vA*Pcrp5kR zdWr1#NIk7)u)uI*{HWb!gFJgX&t-QRjrKen6q&ogjDMN~|D6NlAnu8Rl6_+JKrTa3dL|H(6Jg#Li@s|!)BhKCsWFrnQ%JpJ^R|IPWyd5N9p zD~tzjDDqsYang$$)E})MnOGRTy_~LmFGIvM*4R(RD_KzMcj^M?H8TC&S40|QVJ{ZH zrWwiF=h@C8t4uBP1?o!ba4)*1CGYonE?FW8*MmD0T{{R}4f{MHaeHU6@P=NCWq*6A z75jG*QLJwnH@7S;`A&BnQWv^K0I64P_q&kgtzMC)q0mchXP|+>4dPk@Tf=IUp~OMM zb?eGVaf8N`3G-ePOW|KTMZUS+w1b1H)Wgm3Uz!TDSvN-ms4EX`_i{FMI&2My!7o3S zP|}VLKQ-L0&ugp}T!`PxQuL|SY;f`|Dv^s9JfsYd?YVO;qXK2 ztK&sUcV@q4p?u@xs=bMGnXQMJ-I=V&Pbsi^%InW*mh8pd)7;~1$zqRWB)ZH!rrW*} za{bav(}ybjCp(&bER1~!??fAob4IGI{qwqm)|!LYM;?}%rveE}xckLx-+4uNiC_M~ zT<($+i4QJ3uqJ)po?5dRCicSxi4eN+ekpaH?(Op{pXjkk#U%;1kLY%N@G{PQwY9hJhQsX5@zIox6$&3ih? z_l;Y%Jk@6bqvf}DEt^h-#q2UcpyE>NGqc}sU8j4x`|iJZ`rGe)O6dJoiUY;q8d6a@ zcZR^8v$U~-s^;p_w+wY2-)W~fGH26p?I!u7J#uD^^|yI{d?_DA)!NLFCG;7Eyv5Fs z#@$^`0^HC~|IrQar2HVg4e@|Fwrsh<$!A-2>_wQE;O}1IE$k;i4xllDmDhg%hr7I= z80wM>Vs0y0CENXU=3JPH-Ln>qhzWdzLY}D~}ImJOLn`&ejkeRc23|TyHAvYVDD^Deogz znS9@TcByY>%Q-=GgWM@&%NOw?d9BIGUsYF)a^q5K)Vi~9mJT|0DeEAHn7>n z(!Fc()dKt3#kNO7+Z=gR z9Y6|WCe{0Uha;ucOP0|^FzrbX!c}|8r`TzxfW6)EmA}-n<&81dQ%DH#@lx=V+PW~# z`sU%^*Z9OOiPgRLR=+KUW8Uho&2(E9McOP4j5XX?SuZhq=tYuTY08**Ma zmTePies=}3NEebj(G7QDW^RKjmAAy3KPLV8_0`0#?0TQH?`<4{9j#(GrBpOyhT8Ll zi2zY-yv)fS+`X-xvcilPzWTDRPrRytkEE02)nQ2QCDdf~y1Lm{aZAVFOj*X2b$95x z#n%4x?3Z<&Tz3Uj4=pz}^|$$z;4?EkJ7K;Xmh352vp?Qf)_7T`SK{Upz5MLlNgJIo ze@D{|SJ{Gz>B1sT%455(hI;ou`U87XG6qAZ+2*x4KcjQFFgL zrnD*NVr`dcgQ%i<&|J`0jjbDj$?rt7C-!X)s&pVlEAwwWTNr=dn)Q3)J`rlNhiJ&? zHMfxWS{dxvYo72w7^V6o`qS0P>0I@yZJ^%`wN`QJ7YU5@^p7|tq5o4j4%IBYDqL+i zer^$(erd{ZMx;^xwqQKZSqk1YeIaw4qB4Fv{8I9#t=<9h?jLB+mIw0*hx;H(^PAK` zCj6q|!Ue;h=6-`0mn7r_k=fx$@anM;l7{D2{kY{{(Q-p`utazjU#8?o#CMg;p7N8W z(^E*{?e%!DWcK3K_5IO@yp4%>3$1thvXl0*T>(pX)@BIAkF5u%T$cuBmc&FBV;snm zhHe|%T=XCCcYBYXL_5eSW(LN~PPHhQUH;Kwv%T%P3v|d4CV$OQzKr}$uHc*GqCI2s zqE3ZhVKU1q$#qt+`qsQF&T7Mv3$zzqk$y6MD^Sa_q90dQQPL1$dRBRGaAeO9w;s|e zC=w7S)SFIMnYp3Ba9Z9kZ6a7fy2be!;HRJmoVNr%T-w{*0uBZ`ZV!jcI-TT6(J`OgLt_j;A%1 z>4T6iyO8M6v+h4#ZL{N&Do5X?ceetHp|b>+v5A63ujz)yxy48!1;TQ7m5q7RFSpfV z?Kc&|HPiFsPecFwD6S9*l&13EX4s$GP2GI3tJ$*^q~+;}4(fgW6jZ+X+LY<1VD)bh z(>qJN23vA&>;@=;NpN7ud^>Bi~& z<2pjueJ-jbjG-gwg6^_=%ii0{*B+%B1wG-O;%Cqz8a>K?zU)eBeI{)G2nl-rXV~qY zAKrqbBfXVU;^pB~@H6U>_XFtVZqm%kgCrS>H*HJqPmW2Ps9>DDT;XWFcl(5Z<-)AP z(R47A^Q9!)gKrN@b?7EOTIIS2tR%qymXI~I6$Q^@>TN?nfw)ide?D|&^VIc012@%4 z;wKXaYb5>aE9(bF4S4bOk^@^_GtI;D>OEgojf+iJiziUSpeXbMWkIW4cICOfJ*eh>lTWAokodT%-^aFe zi(l!dmX@quDE@wAdJ*V~b~~0YICRitbfGG;rsyaYchx&9fXYjLC-k*y>M?Wc;+t>i zxrD0i`Hsi@43=J`8w~d5MOC6+EBd)-<^6I+2#w$w^%aW$T}>zZTK7jQGwbme*M217 zN066BLdv(^Qh@J3JNA0OdX1S(v&N4!e`8KE2~E1yHMBF?qsAmqf4dv^Ek*rW zNX62rV~L*AJ$~M=PlBTU)UUyd6VvIiUI@v9Q()RRwI7Rg`Gn5e9?LX_uBRBa5lMPN z!A1{{&&FN?@L8Xg;f2u5ORxQu>XN=x%5ik;4xE#0BfQ4G4fpDD=?m+L8pAXjTp;w& zoMNDhICpR7-uDtefDioEJzfZPbzI$@lNajS9c@^AJ>1Vldv(2%aaY-Z|ByHGx7@`3 z4zLrs7hPxfYAf&y7qWHd77rIu60xa3UohIRakB+SJIxgejdg!LSH{fU_VkySmV|k|1Jk!8d@jGe zBEDRIl)Sch3gs^(AmehB8@~B|nvUFE<77>W?Z9Xs8foFx)|^f6&eysNH%d_FIef=< zTz!OCW?KD=9-9PaE%A`iowhOj5x6d>B_8{XXDhxLi8~?s(9-`}d9fb$ruQ%Y$ARwJ zf(IUp69R$wg3UmahIWaAolK zZYQ(X+I86**qN8e_PE2@*%FFohHIEcH)309rnaU+UG4)x#uIO?FHWj76sA^4a7Cms z987dn2;A^WKD{`^YsJ%CQLM-6$Ud}TGJ;?l_nDqgGcq0(e~&HE0W^FNNO7kA5~GNe zVzPn;^P5}-zwmdXY0@kG>k3ewrV|sU&iqVg&n6CVB)A$q{4qWE@Jce*n5U0DlDzY1 zmxyxceX6|_NR}RFlWDYQRO!* z#(Rf0q(Q`$=(@+++mYLNm%ypG5ZJyNA=eCuTqk$m#$x0#ljiQcU;IR z{;i|Nh8Hp6Ov0dNrOD8R_2yd>(?&p_36bF^M+{H>ws>=!XBNI#Zzk$Y1@6RM0T$Jv znlA{}++k^v#|q24=eyz`v~>|S*n?WkmAW_hC@a!3mu<{vz6FszzQ2hk#QeBJMDe2zKsieEqSX1v;VT|%u-U-)DQVD z-|v&L?ydKY4f)+I!j|P_pL--(E{+(8^riGXcMT(eG&Et&lk2kEqhHU=_|1kjDimb@ z8d)2aUaPV<7fECD5N_B_O9QhNlF0=d{`S>U5?IwwTS>S|{1?^iG{vn^1!+LCvt3OYkqJ4h3|NKttMS-%}ndw zxhz8xDzXUhx^taCA_k@@HKQ4KSJqeo2HmAU$jv%^M{d_!-s18B20rss%QglJU3kOc z9Y1s)21Xn6(s3;+$#XpXQ)%!;HgB90!6V__l=>Wdd!}BFyQ93A!L14H=(Ghkn|-V9 zVsALZY2K#~gvo;xI%aNGi*KA*FQ(b}Po?nWz%jxyiQRnp%ossO?-)p2sHdt94}Lx` zlj=8|VplS|9nP%f9r+&D+^9?4bmLuoc|gkf+WuGjTP*mjfA-gUXTA5@e)kHuBjtHN zc{IrCUz&Z<<*EAHNxl8hWbDboeHC)rn5~><&BSz|1Lxixd)>_1m%?ySm)_XGEcUMc zQz`M?GuV@?n3J1^p# z=naS*^6_AnTwBfmL(??|*0nb4G)7}Jwi`ESoEwcC}l91>Pf+;$P}+$U3t&A#}vocXx?M{sCZ zCgSZeUU}c&jmHbT572T0h8(?5qiSoSeBFKx+Vw}{c_V2MZ-0a2kzDROKCq^{VCz;# zGeUi}T)fUxM@wPd*up=Gbb?@{9@edVL&cd-Id|+>SK-~+hBJ=`_;*~dkD5;I4!>+$J?>TJQ!K&U{l_Ol7Wz3q{~o^N{2?%sMsB ztVIzMRt1-5dc5zO)or(`Ys{^RTDyvRx^@OVE{~2ZdRGC(1(M%JD+&2TSJ ztq#vVy7#Q|TU|=m_IdR5xwQz{25rg~)wE#Y@w7Bb`}nN97yoHl9cO0l{?x3-coUA} zk9Rpy^(6G(noUt~C+L;vvQydHR=2s-cV{2}HeSmc->6_*VGwFPZ#j$7q3gm$kE0Q& zVbmP;rB}Ct27dm z6oO*(QUGb?h?Nu4Wp8oR@`2(yYYqR=jT$#iZJ<6oea!OFrQnmvtjvSV@`{etqtI@b zKq2Z4S&IM7u;nIrD2k;|0g(@%rSZ0Do37h4Q^+R-eiwZa@4(1?axiB^G(s}D$vosR z0Pd(cg-+g8tH=5Qa>dJ5cJ;W2I`+HA3I+ODZ=>CpuWL%q?cKp8fh?)o^tgsImvN1j zj+^%<9ir3yUvsQW3-xt8^IUVe=~--N={p1U8a=Jny|&>Qi>(Y+rdr-d@^L=Tyt z>Z|7Y*V?{2AEO`)Pc&0!HLjIw=4pn=)k-60ICoG?HJRyM$9uan?C^d3+o@Z#PU>oi zY-vBSR8`rCb9s_}+jhXktEKu+1;rIx&h@vIPthm%B%dYj8Hy>e9f5{f$I_03-P@4z zi=ldWkovpRlS#!q--;*C)`h?BI$4OG?UC@CL|KocvdX&X)bqQEixb!Ir3uzKDczf} z?s(EAoysMT`+GdNKyJ=*-uhiR-e&OPD=Y4+k_7)|%gK?8>(Pal>yn8}*Y$`u{X6IE z0Hl6oS-`~XjT_>~0v=8oOhHH1ceU+%7M?w_O&9W;#}d3E58UigCCjLH@ZwItt!XHi zs&@VQutn_fOA=C!_W^z@tYV&rm=d znr9R5cC=T+Z2o%_dvR1Xe%CFl8gh{O0jd{Q&+R5(dr3>JtcJRdTvt%IryP+TXVxQU zlc-Cw_+?Rmn{bolZ|(PLB7Zhdj;MPp`H04xlTQ8xtVja18eIxM?ou%~gR|N~tUxAY zKixQOtEFn-8HwO;CrisRCB~Zok$rNY9&zFH-q=%3mEFRsBi&n8%DVkQcaTbv!gA*x z=bx_btdBqY={zoDyzdgDjak7%!qx2$8$O#DmUG{0P+fM>P$GhE`SDp?y@7#$UM;NF zVfM4CjF$~gt>>8zpEDg0OdTzaJDSlw?(@B3nt8I3hlH8)JQ|OYYgoEev2x&FoX_E> zpHuXj*spL6ZEwW91WdyloYRFh$qM|UtR6bQSnd4%)v@{h?LB;C5LcsE!|pr!Ka&-m zGUV2s&F*Nk!7CI5kn4YY-4bi^HOD2(?hJxHz)WE;im{V~fLSL{ue)(FuhwGQJ`pQk z(Ma(mDK?+WuNSHSh1L5f|Mi(QM$2xe7rL#+XgMrsvdLM5Gi5W&uAf6=axevFg|)}+ z4ML9-lc$&w%TYwGq{5!_Dao3$z>#p2=tbkai>ZcVIdjOaNnAEK>2qq=L53}N zxliJ3W*_UG-P_kLd#?SJx-G=QbQTYvzNY*&=Z!dk;PDk&+=fh-kz-+nXlxe`jo7zo zu;0=pYZJ+>`SRbCo=lx8KS2=)wYcKTioiQBh{}w}y!D9{4X)h%y_7rJW0`Q0%w`Uj z(CjS!<8+g@x_rnyc;7a^ySvu&uoWZ=ZtR_~SWSCbA$@U|So0HJmfXJAheQW+!uyW9 z<_fx#5ScuX68dKpJP@DQ3aCuqVEZ@WW zcK6gEbnE$tsg_9JfyGBrSYR1EQL}Z)cu?R!Lq@{)NYiE7$a|!-dEwHe@K`F89}{@y zbI+=urO!pej@XGC@9dh;G|(|oz%%}k|F{gsTN>{M2vAbE$_*Ye?z zi${a(x#pvUr)x>g#G{{oR`pn?$PyXP0)*UV@YmgiYmGC6MTi18nRmdzyQ^b6`Ltz-;OHxF7XvNNK5ngg1YYti*6#zhm!EXO{mf<(=pe1c1Hv zWgFF~r=o>@*v#1;?BTeaf@7+|cH=!eg=+fJhtA(C=NilG7uUD5Y~JuAiuaxDTO8ff zT6m3#a){s(XQz|yNbn7c5&4GBkx6E>rU$IHyN1SUIRehcJeBTojBJ}dt z$xPqQSVPqaq2MfWqN?uK_4fLZCSDfGW|7Z;*6R~wDFp6ofHgjn_v^sC(DQN3zJrBY z*(ca$xnH(%OH`%TPp@7EhC~K0=y$cOE)aUu>lpt+cYf#Q327FbggkdXK2AeujH6fd z)RN{?B%!c(!hL2ANvN=a^s0K&dhak!y`e|hvrVB{C2$==;p411!dkDp6tJU+Yjx5?&<=o7yGt*M$ zohEaNnTB~$P0vp-ZGVFwmTJp;S^gP(`<&I|_&v@s>a3v}#dj5a6O51S z;`8Fw%qt9pJ-$mx>|c}R+=EB($B!&sK|enWoQ0FQ2ywp$LrPFOA@|8bkQTNIe{#ZI z-8#9SPxU9*X+w`ylSdtnxv_(?1*7;&P$@UZ7I26xZTy3CpM~*?42Y~M=t{WTV>m}p zcfy#CK@rCX98ZIS_srJ#*jsVm0rv`n!d2$`SYk=G1Deu(?~CqYP^9JN@~U$@2Crk{ z=-PbJM)sL;d-Q)l<~z6sm2*ds^kxnG%GlvYjjS0aRw80 zaVy$2T}*g@bw0K0nhd-fUmD~VR#wA(xb%AKA=ST&kh;YRr2hqry%m1Q*yxMiuTE74 z&zYc2YrLD45l5tK9M5H0q~~B}EuTwaYJEt1#>dAlnU~KF5;t$39W=wi!rTh&H00h; zaM4s>e$NqnR^wsECL_Q5s=wIOVUbFWY$Fg_ki0{It^fhSvxQ(lXf~keL21k1x zUjEyFXxq-HPh?@GAs8MQJ1o@i60G@KE_iFjp5Anll&tZ^bZu7IgG9ieuyhGOkxz;E9vP3WrHfpLwdfj*fV&Q0TFa7Z2Ocln+o{ zmx_1(F>^!pW{Z4{gM9y~#1GT?+Rg=rnAe)C2l=_$NtS>)=Q=BfIeT{ZDge=rn%aUc z5Cb~iG9{}&E8D_Tg?rlWIOoG0_6Y%s=GSQc(glrEReHG+eB{tp-7jAUfCoa|53h?| zDW6v^K9`F<{?P)>2RF%WiuN+U+>m9#(RO~oHL12Tc)9Vq=ecyjYZW_tg=p0gFz5T!uJB z*Qnn#O4=eP)@+#{373vOY&sAub1htPGkQk)c8_Ki>xeWOs;AM98(s}!EWo{-8l7Fs z!ue6c=ClkY9jlnsm(__av17x*4zyay6UroU#;Y#!TllshJW(Od=2Tm2bNfM!T!W1w z3ljB{r*E}|P=sJ}-_Aq8igYSL7-W!*QWSw0xfrb5(O0nNS=nY;GAo#Ky0|NgjYA2) zVn^~vrqz^5X|Lxk(0tr^Bo>!`%@L7ix=rLNt}^Gi&Fhw_odTCx$~Td_Zli&8K#Y7s zb4n}&#Q4T%DF0m#hmLUm1XIR`GtY#=EHmdy4OLPuj z8lfeYGvZ1z`iV=M-eGU}*R3;qOijdVqkm)=%Hgc(2H{#qr1%`1q`zS=y^q=#* zn-@>eX5hsrPPc-y{oVusclhYXwBEdJmm?_n*_;z80=$;9rc&2|7-VAc&Jgb!uE!uk z)%Kxu{fXtggpCRRp>nT!@vKen!8gJ+fGis>)EMmHq~b%VglKak`FmB<6nBY(;J7r} zqXsLe0^|DEGbY2-T4H;DI;T{~Y9&GIAMeSzJ|LUXDnHy`CQiP`@w>x?9GW@?$PPX` zCk|+RZlA??yc*g$@5=?afP9f?dL>N(XQ@h#Ig+CiI%wW!J13r;BLjq)Y5s7!KoIP| zGPRd{qX!6(tm`ADt8kpf-krrvfwQTBPk!G{KSOiOo17n=Bi{Pn(SjSxO>`K|>qu)| z1%y0AN7m_xc-%;7K}Gk4Bp-%j$$y2j#vY~pOr!?B`QQcykr7ryUr|u-# zq6N!iB}$1DJ{=SwxuKQwlfgbuHX5~&OJud{Il>|?ZrCsKb{t~;QS8$WkdeCkszOa` zsOE3`ztIZn>Pfm^+*+`dtI~=snDFpSpFU8|r9j<@dY?(?*2xlJ>L~;!r4pDexwm`e z3dekM4gHRFhD3RPnR{GqnSsAWqn;{J24Hn2jD6#`Z#ZPbz2Mr2HfoJ?p|!_QMYQ|$ z-w~UPbQGK-@91GOx2ehdoKf#|Z2GG;mU8$clgdr0n zqe&9B+8i`pen{V=gtEbXrUjx=__KG~NxdD>5r%BIf%7%iu4S=y%|PBy>rTRM%10eK zKK!@Om*{s=SP~+Ah}OgVAlTCy7A3cngLE zMC=d~EKWqT1OaSu9*x(jff&u0eGM+ltiK(wY-(@o&>H!o_=~dx%xNuB9x-ypo|K!{ zF7c1nzaOq15G{S_hN3lE&S-5w#vHb#D`!#bv-M_>=|JZ!OAYhnQ4D(e8T!#J!BB2a zk*$2s*)EtMFHxTEQbARRpJ9ngTv(>)8z>l|X+4-OKERPPgsq_61rWKpl5)lp0#F4c z!pf{7QHZDAjPm2h(%#I=p7kN>d|e6-Bzv23ue28lTv>3Xq|ZE|-=!5_xAl4LXO7;* zC@Qi8ZvE26} zyTg6#-Rt|3!kN_wZcaAziX!Y{pfZq>^n*M_E(5RU=>+N@{5Nm7&o2QHt$@1_%^qd` zDHID13I(S)Tgl!d++CZ?j;l3-=h;9EDcOG|T8*P{XxSUb0lwEXc5P!*Ek)BgTq!>?}bESR!85|d|`~4IA zyOhV1)0y9R;0@(G(zV*AqdQ|M~vypBx`f`)!Audj^!I^}6a>qNon@bt1S@HsZ=W^QHwp4pWA3@<)PVCkuXJ;KW_ zrVzhg|42QbINb2PC)}fsW;;pVb$!$xn|OZ6OEP$fwd`(Vv$!~)RJ-O+2dH!E4aBM{61d< zZ##5rthC$xdh!BkU1az-g{SsI^o7a=$z?k7{nlwG8Pk~W%gEa1BeswQ@23Lrnd6(%;Zv8`uwv!ceD4~GwiJZA&J}S_xnAC6 zg{B6dmuMP+o|*e57KbOu-r;1a}{(Yj;dSUn`_z^!aYmT2v7lS$ME)+Zuv%zlTKzf~SXol8i$eqg8ZbM^gG2qN zlA|h2!tibPb8v)ovVe?;9c-pF8l$EIae|xVf^8FifBMhco(qL#AGuX~_A%470oND7 zj{|rjFQ0pEwWZ=vfHs?_G^$?0E8aG*RcjVm)qp=r&rcB!K_ie@xE}aL2PV^Rd~7DyO5_d!-*4PcR=nIDKzP8!JLUXY{5Msu z{^JsB?9@4(GDR1$yDJ|ginVy?OAt;UzMg1jus@+-4%XJ<%_Ce?E1A?-8$3;fB9m&Y z`eeTsz}_hqG@;mi-ZIQVKfc-LL}C4#QZbgnwOBcVOGX1IG+yQ^*)0|%c6R_r2Dx~) zm0gnrHNvU922`LIe6T@)d*rUPuGC|3j$GRBL_3~V(U$YisZW>S#-Th140XE z{z2ySJhBpTj*C0*1I8gD+Q2dxmLEw0;?$(Tu^@Hli4bByu^98(1simr#)THi{&4nA zO7mj{GIXTj^-5ITh}nB%X$d<;It`|uPg5thP?ankZh28UC-Rch;zi&a@1h{(li|WGO+-sXj zDf#?EP*QnH*oW0R>)bOr`w8L>weRGP&cgO4~l6Mdz9eKAS-$H&m{r~Hn@z_jetBM(Ka>d#^#@s0c+Nur2*J-e|#D8$d- zG&4lXN5FjKJR`<+nyaqOC-!Qc_{-DIn4#D4y9ipp?|tJ$k&%j0jVd*Kf>#wGNF^@5 zkqDzuhy}B5`fObfg^S--vi#&EOt1>&^6aI)&*|BQ+47u%CX0ZT2?& zg%>|yxxzl_8LSOyB_*O^`|?trPYXZQU6E5j(pM-Y?SJ|ROBFcw6MI{^`|M3HcG z)#sFkYW{iLBMw>%fz2QuV$?o~uwI97$P)wWD-YMBdYxJPCrPqJ5YnyI>KQta?75V* zu8SnhKrHb6;xkL1FuiXWszMaD=A_o0&D3uAz%Q^I;PJsN^zB|6gzBwtENDxSC%2fF zf8ckt;V@+E@^X6p7bTou`^%_>Z%vwCyLrRvH(|s$>v`FhtNG-&mkvLFBhR<2g&dz- z?DG)iBzr$93V6YPf!9}=A{=rFzuJEH&x6j;SytL+)jbkE$~a+m2z@dX(9p-bX!8d6 zb+Ux^%jIS4Fr_+HF`xE&E*yBcC9?xwm+Kul%8pt-dnnB%v zkI9$^02#d8vApAsS!^kPPr9Bs|K%Lv5;+K|0FT>AntF|+uj&I4A{vqn?od_gP z;;{cKH3EXHnoly>gwSLL@SX1z)^vq)+5MV78;co((2BV;v_!ISjyE8V$wz5@w7yBA zuwM>MlK!idXd|%UW1K%7;XBjtw&ly|*$auHGe%O4&zNTSy8|U?@kL$kqU*grqxown zQ}oOY!IoPH*`|e714zS~iZjk;`}+ze0xv$|RF|{Wo~6zie#&$wSYnMm2&5|;pnd6( zN)Y;+L{##qY|)#XVsMsFO{OCy+rzs2!JL}x^mh#dRUo|?MN`5ztD`KJ&2+yv`W%f? zr~X@t-F$dB^9`izc(|@-%=|;E5F{Q|Q#RP3`qyYEi}8XveZ^)JQP{ZM2bix59|%6> zao@bJUxu1fQi_8%LIXyfadtCo^a1MxW&~2L%08zR~9)h?ET^(Zo?@tqaVKjlfi~)=mC77(+9SojzJSMrq z5g0$Nc2U60;#Z`?%x#5Pm(NHSk>cyrUZvQL$%RV7fGEsOM_oGUWH>w{8pv` zV%R|o%kQWH7yRBn148>Ed?hh{07ZPF3;LG*RFt>dLW9O9pyM2UpW`0bqG84K2fv96 z3LWz44>G!$ic^Y~0J(r4VM8s&>8yH-?jj}lK}J#ot3@q0?5D_cY(#NbOEB1(<69?X zcD=&UON&ak{7Skp4AH4&^ci}u15$3wPhB?!N3mtJa@*T45nSsmglzuv-HoRsDb61p z1>OEK>p$!v8zq;BIAq~DHS9wNePh-R-Q_O*2kcP@rBP-fingUX57VQh19Wg0GZgv;f!et-k-pAI+QRZ7&fhBKknaOR9^ zNVflpOgE&Q4SGp#Yx`uSLl3+C{Of}4&OotRx=M+s@aJ7!ts;fH&RJ<0mXS7HZhT-C zhJ@n3fKxKD1S_3<_lG-;#i)e{frVy$Y$I7p;RdF1A!69y%kQY}=#%XhuP;q)`v!eE2UR&O6i%{mUCj4r=u|G3KlM>= zzJg3<-X1Xtt-GNDY(U6tDTF(|B3~;6U2%F(z&O^f!=weWfMpMcZ!5^OVju-bzzgnw zVPRG_jsW@y8sQsqR-!xx;3KWDw914PgWx4)YmVWceO+eqg%z|2L{iK_&!QvAUJu4L zN+*$GF+6P)xH;uWSFHnKJ$GZ#%VeLd^}rP`lsOPd5?ZC;(|nBz|A7(@Tl zmFFD77r^k4KNxutgVJ8@E?*$kX&#E*QKbmyi_x*v{tttXsdonvIyDwLFP7+woXE9f ziBdZ)RWZmr8K=lxdl2GrbS7^Q| z3Hh_%cnD?EvNR;GKE`?Mpt`NNo^NAY}fSqe4V6a;$LP8|pP>&AzKK1mc#doaq= zYF4%ic3EJHGSa|#i1#q!a6>!JSA(|sy1pK?ER+=5rea9Q@~J}Dlq7V2uT+)3d@K!H z7JXxnv@5|*1*mf_c9vzhhr%5hS}Lq`PI4PuN^ae*y=2UQtQKmL(CAU>ZA2v8NRyFV z4U1|@nbJ^5vW2=glIB_08N3x&sE^5x6wKt~^E|9IwHEHnbKR{uU^Vb`jf`@{1rlH+ zcB{32jNjiM6J2#yR`H(n?}ddZ&s3qK-L)ePmjZ%S{)d7i#Tz%3j-5KR7tn^U4!##9 zNFVt7f6Q~=l9G#?+}Pf{x77WqWG2qJt}tjqP3Qm zLzn=nBQB^U{}Cg}dki^HkYwUNLBjM770{H>1dkGg=~$8=Eg>oPvmxITo5DK|-C%LX zqoG_`8}k}RrN#*C08D!f@7zqTU1bJBqgu;oZvh|*jZ6w*Ak8w|HT&#qKhuNZsD|?$en<{ z=xe#d^2pnP`oC&nV33~}!PiVV?j)Q-w;jZYf3?DvQu-nLnK zF!zvNk~o=Xc;W(kj@W2q{Yv)O#vIWK=D zzEBL7(EY1)PVt|RSS@NqooV%HItY^!S_Xpi$O(VMMCT@))U9hv+xi#PPj=RC(FprFR#@#=QQBTOv4y%cLQD zFq01`Q$s%F;;KG$#>CoX^FHH!R%v4mI`lg%4Q;uIh2+Thjmf6!XU@$n zO~@7BnHY~aKYi@cEyakoQZ#kPR&)6D{2Y$4Tl$|_pr)TV1r=s(upN>GrWUtCHm=l> z)DVO0#!q7TVDN+Jk&!SV25ThFxVISO&jc&>+XfGA#h4M1E?6zaX^utzJ!@mR()y*~ zQjE#`g^x0AJcNZ&U1^{6g5V|fta2SP%#Fs(m#7I|6cP`rR9g0_5Lj+}Wis=KKZ|zb<;DJM&qC-8>9PvkO z|1sk3-L+HmZi1u6&32~p6-2%}Kw8=3^qjKvGTi~@1+y`D25*&bOB#8_d3|%l8fg=f zbOk5%^t{$ z4dJayJf5X6j340!Kx?u%!%SLI{7IBNiveJh0=3EA!Czf6ybGSSbb@omf5pBlv9k+>c$-8b)-E8mld7~8NEcr zDMFyfg@DjJ;53D7PB8fdbK4(@F*c#)Wm~E&D791)qtQOOP)e%*93dP+FwgDnwIzd` zZfW^K)$rW;0y;HGPBcQZ2uJ0|8j~CM(9GpOXdoCAau{$9QX|n=JYu%yaAxwKB3)GI zUK&!&DJobmeff;L!1u=RsjdsnBZd<#!I?MYa`Q;;WEpe~8J`w`Dr`DIitvl;uC4h# zwpxUK?KeqGrJ#cRJYRxY4sO(`QeI>tIZQa&*R_!Li7ga6r^v-HDb3=IjP0yMUpU<5 z1&B8h)Aa$>ix{ek+>li~{}X=jjXS#QX3lxZCwVqr8LDV|jIz`CL?j_o0*&c9*% zu|X)+^|%rIIk@TMin2;)Dw`EAOBKyOk~qjtC@C|yDG{OrS>u=ZNdg%OPJ)AN-5q|J zFfRxYAf!$T&hVX*IGN!C5}%uw^GmAbg=TpP_{fdR*Mi5-4!xZXp1NQz-=1uQ9}W(O zE1}ni*Y=*Lpe=QBk%VCeridn(@213T96ETvL%;zqtsQSR+Un@XEe(}h<1{m;Li&7y zCbA$EeEGLI&Lbe0dA)vF=QG8iO5A_7E!ag;a;tmdmrPkicIxu%2K#G7->D0!YI!GJ zbiP!(8diluBAw)mohmaff?tvW80ic-uHi>J)){rOD&gPCi{Nl91mbW$HmzYEbs-`f zJ8s_Q$8l%G$*Rr31OLt{-xF<0O&!&odV1TG2DBD8pfKjw_!(W5?1wMpG!}PWrhRaU zZzi%0-RIh<3(6Sb+axwTWah|pncrz1xKY8z-KAD=b*nGC4x7sKxq_4f_+06xuFYak z>UL{6(teZX)_aU%tWSsd-0o#IksYIn&Xs^Sg4S~(IFg>@Kc+oT>fER)j=hhI%(5C} z`iCn}>oYu+ecSl!3#3XDjhZ${Ql(#?;t{OxY&NBQnIpvu2Z&d3_8Fi)KmDDrFE6fSzC{Z{Jek}fKPu)!-awi@tA55)~-(0JZOyt9h(Dd7wTK!3wh$nnTe zKxPsrOtAdED-4RiUhP%G&|t%T4h==ynGZ=t0Z}xnA`)&53`B#Syxt^UiDs4Es@6BY zF&<7mE2@6XbNSVBUzjxq`g$de1tI4Y|Dy0TH_rzvl9w5F8><2WLG`~b4db`h?SXTa zpcBHix^X|~SDZ(bk(&mT-;nmg5geh>Yi5$Ll7RgIYP=(m^K+?CHvbVF`D#vh80^Mi zSBv;v@0!PCy2UOPb4`!Q-nx3k<+Z@2gxVd^G0BCg4+WGzlPgu!9UBkVq|{r;H@<Jvpj0z)a-qz{;BS1BG%i{HD{Ii~%T)$J>#CU-A1_L6)dg9e`v z_;kw?{zLLSL*7TZ-$mR&$7}0Sm;m?Kn;gXO9JjQ2DFY<1o9?q9k4OS zxpCf^7_Msm;Wo$M=so8|OQ!#-Y@VPbr@Iun4Ms!UQ^Y=iUdu2kB$V7HRD?XR^Rnyc z{NC`H*0FMt($-<>PuJP=&VHr`)`h`Q)8lGS!=sLa=#G`AoAspyj0Zux?^-Vk$htND zGRh#zhv6swy2@4|CLOs7{`~_ApY%qCahpCT``yxmy|zDjCM@MDl0W%Ay-r_9c<*2f zr_Ec{=I4lSWzt5isJwWTaVgs)n6f}jMFP}S*i!GUs5defUW6-}&hHOQ!mNr*YEBXp zM~>~vzlZZP_dkjA;;*N^Nhc~pNpbN#yLVN7&d;?ft%CMwHkX*b89^$u*oSrN(r3}M z%u}mR-3!wTj2!sT)hBhT*R41J-gB}}nm{!Wwnp&~hDnSSl{AFd1*cUSr6~gjP@D1Of$HrXtt6zHmwY!e)jk@JhFk0C+$iAn( zHrWntV4g7)^X>V7u_F#un#SP*w`@GExiC#;QCwqB#5-r10lTv&K0y_BC8vIw$C1bI z{kKiZh_|><%?<9h7*4)P=PTp^17d#|=By$HEQJ*N{D|XspMr0VLHbRb_`vp(QAQ}P zA%L)Aw8X$_ac>iHMn-}K$2+rjU_$5y zH)KY28WCFBx{U36*K5*MpiI(Bj3YB2MA;Q{xz^(9K%O&eZ)@yY9t*zWlxRwl!`ML) z=dF~g#R!Z9Ja4n{P2o{b$beP00mPE|6UqZmH6!H_KKkxH4mBxsi2a5V|Jn!fkUSYv zO_ocjw3VF&qb8#=zkfQkw8s>T*1)rPBfms;&%q{d%`QZr9iRpHS-4p=M3w`xBc@t; z?XPsJ+P(vE3$CcENh;3ps8`X7r&j8~uyp2!aKZjtpxo*X+?dq2hg!}x()ejo08S)Y@Fos&^$9+t(A z2AQ3#mgAE3U))MiOx#1p9A0c;F<*@~yZv(#eEGHEYyEsWGqBFN4byS&qe`y0BCt-v zwVX)OKG%m1V2(x|NsQX^-Q;ogQ2m8Uwt?HiFK}I^ud%`k+!Nm(!D)LkD*39>iq;{P z)=IHT0B<+sX7?UTnlQ>=n%LA{l-c8xxBREv);$6PThlcnO0h?T6jFKIG&!-Ebznz6TzDA zF)HA>t&;3Mw%@0k6;CH7{Po-Du;3ybVN> z5IQAzl0Io2sb5b`LYc5#LnYA9U_v}BWfi`jchy?y9dp>suX_ilF6RYd%_c3yl9fMU zXy@6tPy3O?ZJBKh53H}BtQKlRD$xl1R*4e7(C$XjRE6(OfakTkSB?9UT(beR4Jf^& z@eBN|%#~uwJl77qzLtKRoy~F>A8Cy}Rp|fr0%vL8j)TpYQB|OD4XiCl(0Y`cP<3)S zb%f}cJhyEXqTo`jn=^~wVEXDl&mdLEpb8+?u1($5 zf;?`#fF5nPzjl*b=~mMsOAw7i>0u>m3k%tcxJ-fye!}v1Oc;JYIJtEU1$pPW%G4ff zd3i<1tjB81PFY+CRLbT`sC@6a$i7*A&L{B?f+|3|f}U{pMl*wz|JZzv0SwIon`@Qz z*}@cImE_9J$3>?o`7GqRNXgMG8QaWo9`LGk*Z=yeqbvezj3LoD;UrHdsHfVLWjPIx z8%QFK>@N8O+5adt^7^2z93FOk@bQ4zIw>Ob!<;RgO%@UC)3ht*m+Om43}EDUe48m0 zcq_A10Fdqq?g`ANy9#vpb8QmD%J>uEf4UD{V((D`KCDJN)_Xn)l5lDYwl7gG1|!$F zw1HH7zl`JeDiVuKTo~YKKY;F}LngQj(J3oK|MUn)v!Qu?F`)RU`aKTQKNm$4J?~9! zph;b>z{KI9q(YigB3Uzx|CEtTHME7I4|wu)fsFwmH&~#QKix{{QG0z(C%W`mEUNc_ z;{;%xAy;eC@G4q*uADmn6q%&Hg{F0-K>d^~safxY+>b=Te+@5cUh(Y;7r^+1>TH7^e|E6G=xq#2 zU_fX%;l)#+$#FH4#5!?9cm4jGNty%HH~@J9Bw&z1s2@X!ymxH{H`5gV+NgeBA_#2C z^8b$UPyXH6Cl?o(tf(>|inmUb2%$gu4LIPu_MDWidb3WhiDMCit73jd7Hb(Q_u2Y5 z(tavOS1}6T#cUnpj89Ka-iUVxN;q)g)e>(mQDpGg>1K3c+)CQ8Da zOM2^L;V@Pom#J`j$=@`hp9ssWL^`@_e8H&voF^J>ZIP%C)?{D}>>0^!Xfb72!Vi(Dr$>0m2gu4t_C3e-HC@&=I8lbI%U<+6tCAjS$L_>*J92DP;*g8$$ zSaU1Rv>aE3Nge85=4thGoszfE&Hl=?Mx4E%Z0{k3#l8{*vY*Qxs8@RajJVN`Qc4oC zT_LiB%OkSz{3p6Y%bSc9QVHd-o{4uHpGJ!%(Dm(5s5$Cg*{L@gv) zMJoM)JvmwMyQIP;OHI}K!tG$VIbE-V;ZxsiTAkZjk_OU6=k)ns=2zN2)kz#}gCVA0 zM^=YVXS*B&64!gdKf zs>h`YOTn1Eg>9_ttajJ_lQ@}eO<+)$3k$8hEB1`F5$+3_*-5_681Z-jdy~LDLyA0O4@k*9D+Q5 zPf=&{uP>DHyL{GIGW}Q-FtyNNbbiHMUFk2ep)8IKzX9~JG#ztSmD97+TTSJsL9ZGU z*!LA~O4MC4&2vEnGCriw0DU!3sBr-1c{P6@XwXwA))V^v6JwLBhLy>m{Q5S_jXDjC zH?03)0W@?M5oU~m*ZpGja`PSDYJS!6Hupv0Zzo|(Q=WBp!a(0;%5QI#D+S&Nm0ng^ z-CcqLAn$a*L1Vb74w;Y*>PdS6)Ney8B;j+TL_0AuCto*m>nT|i18mbPR zb5uQhRi-keUD4L|43gWdaSS^gkd(jv=7+Y$vze zDD1+7c)RZzh=Sg~I`#wXdFK>M=;eOUTU|A|Lmr(nFo07v#YqTrQPwj})c%h~63! zjo1PsgZ)|hJT`O|dQ!;m!&ICASYASTV*Q|8L{0DvH>7@Lh-j(fk?g|F!qkZ&7_;xO9V* zNS8>5igY7_QbVJX(lsE_u5=sgVp#qXa*U&97bPg#ZF*E}VeaFxD{ulS2U(OHb z+0V1i-tSubU9tDtZqm~*6|PXlY64`=k2Jvgg-ak_kh#*|W3x1}dPJh}jp2lsB*!Di z6TyZL95oG&k+O`QOM8NanqJh}T)?L*h0(8|f}3<>7lULo^luTrVQrYL-%(Nub2(H# zVs9p8!9zc~+Sf-^xf!8}2l9lXPvh}W``?mJ0Lcv=_Ae}^1^0M%bd-S&8oCI}lN50` zs1lXLN8-I}Ho4yc%Ce(6EQ(a7!VZ_`J5KXoXIpEZ<7|;ihDw{8`YGX!tR^l~cuEbx zlVdq2)?WYF{;W6d{c)W!#UFy&dvBTj=#L~oH(*u7velTqv^nA6*C%uR1Ycyd(Kp^_ zfS5KYFtY;Z>+$PTyz*02bG)V1Wv|h&-fZz}!vLCjX~NoH6k6cmo@K-QFc+0T(N&1m zaK+8MSdQ>j4qyMHKcfHfhhU1$tT34x}+e>D-|{5#X^~>GR)rva=0m7Npm0CZ5+;|a1{U>p=ohE zwi`P=75UXU6~;9?O?NR5C5d@TYk0^C3ciJe{K#$svPEYyKiQ|uBxA9uYR3|!obRgA z72GCi$CD(x-69t7divUsW!-b9V^}|TzQYy=8E%3dhu32#;rBcil*K%3zM;(Vg4XRG zW%#jnn5dFm6&hdl{?Tpi^>gyBB5tf3OVZ`|{%7n#r;y zb(ace)UYtvK*kKm6G^kwhzX>jF~4_N`Yr^o69?wCsobJp+T9cTdoTe4a(^OmA3zDK z8aQ5zn+{q9%YfoD9u99cqg8olG+6{GI=^(MOUW-=gL3xi-Msm$aKDbZ*P`!Tv=9bH z%E2BR<`5s<_?9!t{Brcf=L8z1zkP0T1ngzVw7c(2hozpIfY1zxGUnpiQAHR zs>5H$4Usgba#4GGOi;H+voX5aHC`qb8>>biHL)7HdX{(fD6UP!r1i0~QHS65Dd&@W zQ52k{jgcNb?_%se^9S%@JK*M|`^o<}Hf9W?$bICyyk34z)DaHVA#@!+m=s*_BM0ee zXZ3l@g$W=ZXAOzyeEGbb-WFaO?%MQ`oQnjYO8)Ff5o-rb|3~T~ty%S3cQooqyp=1j z_{WQV9;`5x%JxBLi4+fmTI>76=TZucy1~Qo79hHO8=G7DQ61FYIDx@Q8B_xzPX6p8)1NxYs2O>H_7JYn9vGi@5to^U|SWFaw!d+mB(ELxK zr2F^l^!3Nd*RlrUc@Z<)!S8B=$d0PyY|_BT&RMogU?{znxcI`8d-wmIv_2lx zezT51D=Q{tcmjBH$#;tG{?r( z`co&X;qzhsHZRem1>Vk}P^-YZinzJ&Uindlm{cB+eOYnpHfJZ zt@gCQ>V9o}+1-9gQ~ZbJd>xJxr>#ZZN6t0MzCvLw)4{bLZs=a9v0MUbVOFgJKdAlW*Rq$0-pVL-q?p?;Q5! zGFAgbl;Ic69sK?pje^@GU0=pdK+c-lf-1s8)LfdaUT+LcKcASh0j6O6J%qDeC|gFejl$=8c@BwEXH)z*xSWWU3$M$LAc0V+&FUSHlTX7rv|qyA3H);KGxj6W{i3XbF_X;7+ijNL|^* z#i_4zr2dHGm*$2xaZ7kexn#kV#5Fwfd8V>am}Gay@%w^{gZtKl0Q|8&fY9GN3mj&0 z?Kyh%kMbh%#wQ%8aF~#};puDJS6bC=&%766dkEGh|EE0!(hJK}af*$XKDjIVbs{;Q zjR8f52Gv$7vk>JtupVz5C_o{eDZpM-i;2g3VDu0axeV3Qi%7SDWIWZaMKR$xR^czREw%>fEox9*V*I*tT&GU9*F9zg zPKdjzM?{#>*^BT%?+c0Z0TMVx0pI@TleCOd)44oin$_H&VRPwolEPKc5<*P&d7`10&MSce_FmhcI zYkmaZtxWObf`3?(9f)cr)nSc1^omMt%aiponzGS$yH-Z7rT&%lllE-?JILBX$;z9b zI}+QnZPB62d*=(Hok8fe^svs)T|i!SKGOxO;{|q=Mms+wpg~)Bad>Y;RQWm`tH0uz zwEKA-WL+fux>?FSv@5z>68}X&Fm}(rNad5T$jau`H8x7`*Qqcmi|3{^H2K)5*WR># zi5}eKdsxJI=CwfmPC;(TW2&8kIh2(v=Id>Sdbflus|ayF(_NM-urMtPC4Gx-eb_73JPH!X#*F&)*4Zm&w- zCnqiSngbTvGnm7{5-3?yg@JUe!u)&Q-N;#xJsSa4?ku!rnFv&!|B&NttK_Qz_y0*x z5VJ`kVytCn^A77J zX6kS0Z`RLY%0q|TYikb_dBjeUBA|F5j9d-9r*b+cAsA?366cC=d9>j}AFieD|{+PiR@**>`!1behe9ii}T~=L7@32P^04jy^E;+Y1Z}2+S1{ukeQ$u&Pb=HL8L`5KOewHcFEdo3E+AI(Cw6$Xcrf4frt_0 zPMc64J3y!P-hIlBv6dJAD-dOj%W^r<6+r zv=ipVU3{lG(4OI?@g*E}0s>L|{K5-)Dsp*8w9n?};p>&ZLIQSn?UjJoqf%Nbo@&ilN37UkKyb(WU|Jn%x(iJL$`pEA-A70(a;e>$Cc#g1#aHgtaoy2h! zC(R!2D#pIB_nAdhlvmGxI>4h_N&Lyd73Y+}p7nlJLiKgaOZ7Q>N=LULB(7uE@=Pe( z6^^rXtP|hk@oe@*86W!%Glpan2E=Xv(lNj_EqO>dmwlVWBhD>GYO^&rqri9}xJoAHSBn1#H9FaIw|^i%O(T)@jZDZTnhLh}%QroAO{2KD z`hKZk(YG!+oHZ)$#z9y3B_q&*OQ$BS03<5d8kT`1l7Az)>1Ww$X(<<`z`vxB7X8sj z>?=2iXTMVrw{uuITi#85L^ z9clUf3(hRv*i*}}dxqkOmxa&`S>7M&7N;i;@j<7K$CO@$v%I9LDo8z+<1^qx4WzlT zMP$t1-o>aEOl!T!cdq@1IBtJ8F%|@Y_d{w;yZ(|`{)d&O#J|!0MKkC@%Gs65E?3)2 zZUEqB?USbt#yDaeR;&`W9@JG3;{?XT2(!&7yOQp`7@vTE0)V3v)x;n`;tMJU!@D}% zJTHL;`WLlV9~s9HYbW;~ew&ssR{S?0^hSS_khBn4st>dI|gm!!%w$AyRXyQ;Qz6kLK^$*+sxdBa@ zE-sEi-%f}n=a56ZslfAvyf*Dx`9Z4uH>*NxX~r354CcBxNw|6>IL|GS8T!<%xG^5S z0;k^{q-Tt+n75A?eypSCY|@$5rj0XFW=voID7o-a6uW7u6BSp%0sT25glzRX%`eWj z)@yhs6-@rk#H7d#ni}75sAYB`?XlL|AK-ia6_IT!{5ms(c$C2JSj3%Nr%bO{De7Z5 zvN(68ZO6(LkDB!-^#hmin!F&ITLQLK4r2ZJl?a|^!fi+SL@*IrZ^AfBlsxbk&>U{(y)8q+rmE-i9p)THQ&h#_Q;iV0KU$b9_YK#U z71!?sNuFq-$dVY2xXx=k^Zhy*Rdwov-N|K|6}JYdwu`-^o=OuOB(J zd_;HCKArsjrkWk=PtTEN~{8U^Gh_Bw_Efe75j| zuF7pEX}HGg5Mg|B@BM`R?g*%mfYb)U?qgYtT0N;E47UU(T!q>GCOp+vqV-PJnyqU+ zzU}Fv-QS0fq(QM^6#1~BRxit5$7xfMO+-7BJ>NHI@{`Q*yp|n`S+!6?{Hvw#A5=ay ziaAKIkg3^usl8#MWNb0h^S47ea#kPgfk8#3c`iK#;-k2Rfb~E)*OtoJ6>{lnGLz`~~E~#fUzm ze|ITnzCsrlpEDipzp9Be9my`j;XNtHrif`!22-QLi-?*d@fQ1UuX(v|+>=$6wub?} zXy4#SRzBL;tzT6GKD}e@k|cJKd!3wK3WN^he`ElrWo6fT0)ZncWlyiFTleTLsm70u zK=ZOS!*RxUedB>o@pROyyTa`j&fSs%GI+XpI9wI-19QgiRBO?24u4=OXE5tO@NJ}wYR58&c;*Dpw+>y{o9Bt}o788}9zDwF0dF6&&UN@X!t~SCyH$D3h z?bC$xrm}*G*SIx5T8X!-p=+cxP|0;>;h1NxEZ+;jKe-C!9asBCgZEy_zw}emNXr)` zNDS;@VfEMrXZ$r;#p{t32@j zUAHZ0j0>L}d%HG|>^*m#T^UTmgomAW<()Z?>>kHCHu1o$iT477rI*TOu`VGJF$#{mKM$ zf6B1IQ==eC*+U}|jC*-w8YJf{oEr*&%$|{c(Fk$wiD^75YrYtD3AbsBs=&oAk;8a` z&so&>aUuz)gLI<-Vfu010eNk8H_KLhHI!ptNy8heFEpnqBjhG$Rrm^B7Ar+^p3q;I zHZ$DvN0D_B1wI);z;w=QiR!K(H(d*EXSDDA zLCG|V>EPQ2=}?pqc(jyL&zw}}kL3O&WdQem&v3qHXeIm_VSf+YKgq@D@*R=Z#=N7R89TTKLrMlBu7&PVTWU9 z1)TON4S%?3?;DjQo4r%f$BRrLSOo0XMiA6=@WL<8z&Q(a%BbScqA|s#W{Y7Yq=&6(a`qUT<-^&ex+D04q-s?5b&L=Ni#3mO*L@( zXiJkTcZk+X6lv}pB&vluFaWebFZ~ONKx-RHlAQz`FLTu&Xe{N?&tGuZemqZy?290$ z`RYaa5pdoChaeF#SlM#5$8FRz-EKzsjXj@lqZ=)xD?!Pf5&l~0<-rdx#?4d|kL|hv z;S$5(k;2scAD=dn{*m?r54*ei04lx2P1gDh|Bb( ztHLM#`g8p-Cl(A9@mtI7f9F||%MP`=z6QH5ydq`bz?@CH*Q^bkB(-~DelL{QShPtb zb=%FXCpQ(iSNCig^I~tXbyCL`EQA~@@b=jj z8ojF%+8L!W`By&4)Qv>Nyti`uJ&l)bfv`X24tOVa471y0;1x0`8bTp&__h;VnNBVmR z(BAXqV&x~Chi(L1@eYA3-dXhfz7b5@^hQWz4js%Si$X9QGKCGzsk(RGcek?uRv85< zFD~F@(6XK`t3tgOcckpPo5gK~qKV=V=CCGdnZ_I37@Pxvv+l!|9JTCkjzs&E_yNVH z&|tS3Ga$v$b8zWM6Ub5IMNrEksZl#K%&nr zMxx#6s~M@IDa;kTr@sZDGVqrLUj%+6gn#b4z`%&t3cn6)G(^W@_Mea5bnou&Of3sJ zqob;UizbOr8Ztco5GzVuZMC`j2nE#M!t%*8Uv)Z*a0 ziD`ZfZ|ny-U#>3keyFGa#p2F(=;Jn8n=skU>$g_$p}xmvWVIhGw1bBBmJI}lGw{6h z$eL7!B|3&~{`w1DfF0$AEQSj*g(WOmqcdF_`eoNWFM{UymEhypO3qTVUKatP(Z~v` z()0c&E%OOPLpQ?<#}3vH*aZMqb6@T`JSfSZdp;^$_L2B%Wk;hsjlMa}V0bhQ&qI{* z@SjjmQ2;=o&sO`c6s7agetN2u<3u`2T3AU=(AEE8 zl)0`Te8kVx1T$Yfh+V&)4SB>SQ3&{5YIkoX{S4K$gFC%a*a;EH_+mI$DA$-{!rzRT z=>Xnoz_?Mc7d&Dim_fI6I9=2p#v66?mTY@3^+Y1KrSHTM!ezc9iWEno9#m)pa(4|D zZmr8vgXg}!JM&@WQa54>I}}q7_TeoH7Kvg>205s!TB(BT_b|2Ffi_piQ7R4MzW^## zW=kzOfo5O9vXN!wt6q)c*oP}DVP`8vD>|hgQqOw8&)HnK`{o%ZwC8Qvgy9`#Hv4}y zE$Z4?8*-%>8kf=GO?WLf%955_PKPK@?KgR@P_cQf z8&EdoTA-`7Hk_xWWw9kT-LXF=buXd2DhadhWH7%hIip)pyg!e+(e)b3Evflw^$!N5 zdpKCb&>dfQ<)$E`pzx+5Zi7eq_8Q=LR$deu7+9E%_R# z)`1ue-XvKFHv}|A`&zJDFr6($wXu{#PCE~W(Z>@G%9X2w1Lr5*?HGiQ+){M5a_CNH zdt2bC^GVM2@0A%*J3pDGNnq0_1+U%LtzTe(Cy-7E@nau*k@ z%=ZE>e@}Fnn@B6ah(Ukx~(v!~i#iyWL!2o$^(o3iRj z@E+Fk``Y|i)AfVGrqr`_b)wy1AukIw$<%1Qi7*qsG_xtE}snt4#?4#K1TK~ zu*gj_Dt>(hUI_gCmK=>0nH^`fJDVcNJHUH(?!+@867;V@>lh<;4EA}Z?nM0Woj`+a oxrFWJYWx2`|C^5gcc$f**rkaPh2I&$`R~79z0g&wP_>TuKRLPok^lez diff --git a/app/android/app/src/main/res/drawable/background.png b/app/android/app/src/main/res/drawable/background.png index e29b3b59f99290135b0cf3745bc9993ce935b27c..3107d37fa533216ce211fdcdd7c9b8633fab4cc4 100644 GIT binary patch delta 49 zcmZ>9ogk^h#K6EXp*;8=kmB)laSW+oO#b=*zdZvRA2SnE+1>|0aRyIUKbLh*2~7Y< C%MJMe delta 48 zcmZ>DnINgn#=yWJFM6aCNO60*IEGX(CjaDTVc_CtVT_n;@((D?;OXk;vd$@?2>|vK B3nu^o diff --git a/app/android/app/src/main/res/drawable/launch_background.xml b/app/android/app/src/main/res/drawable/launch_background.xml index 3fe6b2e8..f88598cf 100644 --- a/app/android/app/src/main/res/drawable/launch_background.xml +++ b/app/android/app/src/main/res/drawable/launch_background.xml @@ -3,7 +3,4 @@ - - - - \ No newline at end of file + diff --git a/app/android/app/src/main/res/values-night-v31/styles.xml b/app/android/app/src/main/res/values-night-v31/styles.xml new file mode 100644 index 00000000..a3653cb1 --- /dev/null +++ b/app/android/app/src/main/res/values-night-v31/styles.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/app/android/app/src/main/res/values-night/styles.xml b/app/android/app/src/main/res/values-night/styles.xml index 449a9f93..7b20e158 100644 --- a/app/android/app/src/main/res/values-night/styles.xml +++ b/app/android/app/src/main/res/values-night/styles.xml @@ -5,6 +5,10 @@ @drawable/launch_background + false + false + false + shortEdges @drawable/launch_background + false false + false + shortEdges | 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

mRFDTstGL0;MrJcyA#JBByUT54TdPS@o z9`H-w`Pk49w4(Z(Nuh}dLLr~@hMte1wcylz!r$Ny|!nc)_j}vHRGX5is*QpuT-V5aXou+rv`OGT%3y`w; z`h2B)t>L(KV5Y@Ye80w}EECvFI>kT0RFJodo9CEFRE+45 zIsNmV2xY}c#U{R$wP}KAe5QV3^q)3;^jnCwW$9QMRSaIQYvX52Vq)Ul2wOlv8}5bb zAwv5x2FLbpR8+eV%wd<_mxB^khFrIF6j|)C@HxfUknVrDa(~+{%q>j+ zkBu4k<(Wlc7952_*_Ka8%ds9~d?c*vfOY9GSCxU!i&US_Q_jDxL<(xiig%9qfH7Un zvN9(>Lq8AoGj?Zd@qzvcyRK3*QocQI&ZLQt!cBO*5?(yY+F2sz!wp=60#fAApJqN^ znX&Pcy9!{|UrL~17ad+k|D3viCkTUkURz`vqakg^Lelvy0V-OU<38Ub`B{6Mm{q^W z(HN)uyXJq^^97B#+l~K(oSBPhZV(qHuBhu2#${wuf(;&9VIA=&va8cs7yY%ry1c#f zJF#6kKv6({&6b-Ogfq68j#nvWudMK`xci1;?gU(^uGGMu{#*V@P>%7g9eJ%Gzr>b} zOVEsyr)Ws4F2)kg|Da@uksepf!onv#Ki*YT-1!*{Cn$fl#Aouc!JP=#ZJDi)oH+uE z{riYP-awnm)%mz@N}>0dy7`1wpMH|PrF8z8s$ez@_8fjn_XPIk?C5ASynn5UM18Li zoA#ViU42JgSo)~$!uM?arUT;Q`SBXe2c^=r$2X%lQ1O+Ds|uV??yZMle1jm7CME#^ z;}UANTQbs3?9`0b+?E0B%u9*d87pd-O44h;25;<^ySB5@Xr}LHc(N|7tbtA;WpPmfYe zk^kYwx--#3=0XWczIw4fw;FSU#>rnvY;plKk2W5DYDQ)|qptp=4?7Kbv&^1_!3GO5 zQY}TTMm@QlADm`9C+fWc?8^Q|E*%qs+tB`f4 z8r-Co+ZEriWeQEKnaNJD6j<45F$ z3|xR)H}aebz5$xp?l+qf>qVej3lCj}f$C#I7Iaj-dH z`KmMGK?dj^b{g34mbg*~Dj6ClqOAl-O~i2HHDN3q3q`7tW;!-!w%q>#naHKf1+)n_ zi01PMx4OiXJ2Z0mIo{TpFD1NAR$VKV)ku?Ga|PZc@y`GL__wh_q#{I~RUxe$r&c6; zdwaR*@|GC5CtEdy{Pq=?+5~-Gn4bXFxZky>eA6wXMz(!(sJ8gy<>fa)8}6ombWaPD zn3HZ^shC}PTx))t+Oxcr3BriKjX&dnc%RtHZ|ibLBzSBHw)GLK9EA)vGNKClQvd7G3EcgwY=<{T!w5EL{0XM z#SxuCgD`(3m3NZ)#1q!Rj$IuACh6(p2VPx!a~Hi`4EYl_Y0@$Zjuc8Mt$W}v6ZBuD zY3Jkpcc^$WM|x5|@`;64+cZaC*s}VVp^;8VMHO)~+j;XVBNh6^f4o{v&(2g(8u=e! z1=I|>JZSR%<=V)|wQo?xk0|{)u4`kY2k2ACPgiD`r|YM4dCuew6zF(;4z>w-<0Z$5 zvxUHqdh17NWscnhD!l&^jS#n{aG1sYQ?_P#d=Pt6@NLUGoiLd;*+qY=ab~+o9koMY ziKSJ$j&IPyZjJ_>2D`AD+1bi`t0!6I{dN;7W8@^G&bM>nNZR%3$@#?oS(Mrx+yu7u zhMhka?!(R6tk^oDU_5VEltfjZx4$L;8N2pL;~E2VtB_Eb;2$~IMj;5ZW-F!m4->H@ z!KjF3HqJD&i?6@el_Y(!GN33OVz}7e*e&{49GuYhjhgXWezsjOl?O%yWUH@BS}Vd; zEcnoC)a$iMTt{M{2ZS481eW&JcwfISm3y)J;1jOHY7Ssu{YE>M91!x4vr`!)huau* z+67LX=$DBt8b^Cp2BcvG6&M|_adLb@wvBQA!}$GsVG{M`{PT2naYA2$yjr;Gr`Q-x zxBtnRWk{wK3iH7Ka%_=T13iv3spa%&$u%KW`1G@CLoO^_B!>D3D8(DR0_0|uohx*! za&dcHrPnSVr@Xjk-)$2N6~c}DW4K?)-O{6GB-&bCf0@>4e^TAyHvBNuAAQ2wBYh4P z*kHa)S3WECm=6vFB!)Ulm&Yhu$=7;i7THPn0AGH>_mI$eK~&(yw0(x}!s51t7;_gB zJ9+uhR<2(XS6YJ2W@c)DI?f9o(9=GS1%lnVJpNNk#Le@gqyssQ{_2OWUv=PYf$vAk zo13c&qeG1h!qNevR*tlm;y|ApwH*^)=$`zOjL-)R+#HM?SF99wqm#Gm<7^k6qN*jL z8LrxJYBAL-6z{780*FpZ^Br#$++Sp?y$&_Vk}z=giy~1@PLLv@S~mu2egG$699Hi; zV-C36f*=DkEeImQwD2Dm$rOcyE|*_!3+r}+DfI`B+1{g)a$L46RL`fh4=gw_#9uNoMoW#SS=mf zvvkk5Rwd^B4|cl#+3@a!Gw)`|w2W={soS(ATa5Hf!kdeS1ldtWt)iU3QBWKfj4tT%R?djE@~u5rYo#()ohdm+0w2?aZCcv?1)HoP8u)Q=vT7m(oaY)=xi{48HErFR$fPk50RAWj{rJFGhS1 z;9jSZ27CO6|60_kVkK-#QZp!nY8CTFqI+H+$_Dq z@swecck@&mx#Pi4m5+FLhv+;?JvyzkQiJbsFZEg~U5ahhd+w#$&hj|?6UrCpuAnZ| zYnhhR4!g~J+eX8k{}~8Mh=mup*r4R*7IQDdUG3V56sO9fHcpnmX2d~Kl~Sj9KH^J( zMAi6Xfv^qe%7`Fmu5h8~-*3N~oY?m%Dk%u(@6!*yO7bE$r+j43*P^FMq{)$T2>BdR z6o%yU>HG(Bu@%Sy{}uRF2qpb=v^ee+`43} zhv6VMHu{pNAe3ot5p}8cD3BK?8^y)FR6v|jWdxZW)9vI-dwsQrZ9mXODAV=z=>02+ zUHvV#0XvjoYckuDa_RDDPj>-ohWg^i65<&8qUKOCkQ{8d46oE?(p$hV&SN+9;Nik9 z^^$?9zswR)rl^#9nRu3ygub0xFmd@&xzcvrj;-3ew%0h4V?g(#$_wq>&96%%bP9VT zfVWxf9j)?{?DV!i|2%zvD2Ooie(>MSY4hot0<)$E#7JLbp2g=od*16429iwF>?ihZ zYV6|N7oZHf*ZNKx?n23=Y>}RVrBCy^fkCOh&u|_0i~jXNE5}Iz*Pe(oMski!eXkeK z-(IW=^!qrE{JIV~{-WFk+SD#~V8N((mqYY(k=f2pZuPaXEcaqQG2Hk?mpVEYYi|W_ zOpUak{L#@;Ay!0k@|CxHChK@iiihbSh@Gb9I6Zh?9Vi=oSAvTk!v{A?t8-`W* z>D@}g!m#a?9I&($?^T<*kvOG^lKrkI)}RXi^hLe~tmOJ^bc2BGI^A1+ngBjvZ>QfF z7Bw_hn-Z!cMj8Fwb}rN&?hG99=$26}TkvkQ*g9nW`M-`8Yfy_HB?S;xHdnfs`KK5B zPvwl*y?O^~deO#Fm!x^orsRxJM;#lG{GA5ej%nEuA%{-8*QT6RsY-|0U)!ULT3L6zJhR>*j zA*{Yv3*XHLSoiz~j0}JM`Hw4&e613**`>Ij_g@LEtMMLa6J*^Xg_*-XrH2R3*fxs+yw{6|*LPku@$KZ-ymid#OP(B1Wrq5tU zyQn6q7^EN%Si~-^yD7w<;}9nU!}GoO6ZGjNM6#HQi4cZ+_93^t{Rn! zky3m*lF=G;%vP`2zPd;bkQK98Ktk-jY*3+NoSZ!NK3F&*=}Qygoyt~`#7#gzje$V8 z(CWOQ*l2#L-FJ014Vp@qOPZx2${@jV&rJ2cO8A#w%h0F?Vy`ekD? z)+gXxZe3&4FL_+D>qye0eG%Nfn{j$T`YZAr7I~o;iT+V112nHetkVpb$Aey|6Ogg(fk<3a(x0KKILGR9qIMtWklSdW6j zPR>anak-C0fbEt8%*dXFh<#zn8YQE&HcNw@2MBQ-*+aL#pE&lFCK-`C8+nU~;-0!4e0odJj z38H(_PS6H{K~D=k;4R9?k(whq1^cEQm^UsTz+KhJ3M)no+tx*LAmvM>q?J&OY8M}@z9 zqvxY8m=t;1MqdMlEs(N;>_0338z2Q4P1KI}-FLJ=c(UtsJ~~Xs9|Os|6*Jgs!=8aTIW1(cAG~E>%r?G^K=y@HUf!oSK*rtp zz0Ashfs+Ar1q)1MiMz*ixT}L;fmyH2#C4yYDjDAQo_lnO1?Zw6KjC?UA+L?x~F9ddLX^{f{PH+#TW}ET3|JM86*03vS8O4D>R}Qb?g<74~%I zn5(U89lM&oS& z?xl(Q97g=J*L&4UjzC+i7k2vh?8s&TLgfBoXJUTl49Heqb;(&oD#N7r z)!hI+lX2Rx1^;5P{~0YkI`>hf%)OxLZEtE*@J28Q#N(;0e)XpBUx|}ZV$5xiqmB;0 zuUM2msmi4t$i##9!!izWeZVn<~u*yP@+O-AGox548@MS+S#hG`~ z1CH{;av8fGvrySu5yVpyixNv^=H!}TYU3*T+(Zy)tq7adhNV+G(|4%Tdm$PC)ods+ zTVUMV;$f}nK&7jF_lPIb#H4~GXm5tr5ssMrmREN2A()zJyjRsCC|{1=Ys#-f-^!P2AOabM##r*fu78;7e&z$7tc&y8$0 zA)LqA)PdbSJxQi@O$aoeRZX{?;g#SBl%kOSCFk<;+|>Ir$|-Y8S^)oPq<=MVCxFLE3eBEyREE-Zw<}}TMe_S zT@fbmRW5m+%Nv-^1qx}*oSawHK{j&`dz~YkZSfo>aue|&cF_>hmtt6NR(CaiGm4gR zwL4Do%C)HCsN7UFt#0>{ORc-bFQd3*z$Rd#PzU=sY_VT!lt89#(K)cSun2B*Lc z#usmW9t*-&lg2w+W}7p6zIJeJ)05W}1bi|5Q*oh3Ur5b$ix z4QE(*2qa*D%UdACWxAM|s!u%66w5;$>q|Ah$26FmhAkNSguq~|1ukO$rGpCP@@Cfu zW2V$cF%8H)`<=I)ISH)4P-hZoWd^Cr#J`5hw%&_WOZR7KQzFMrbOVAY;EhQP&6$qW zQV+M`U#g4_i{jt~+{>=|oudRicu;?eGYwAI@}%{1GMYYmuvllW5C!SrUlf`X21f}! z9!l^#*cCsu0UV$6MwA@erh-7%k#h@E!e?#AvH1+2oX>K2MZHz!HdeN%L!hm3oI(!YGs7GOySK^Yp}+!Ll3CaA2LbuDO3K_yF8_#TZw$L3v6Wvx6QcExVeL3whv zvB46xowXB4v6eeMV9?dF_(1VqsEW7gOTSKz*3~BnLi_R$YO>hb<0knYwTHi%T?&|J zk%(d28b>(e2IeUKD?x*$mk$-6@6gZbd32`y>a?y{v@NAArT32VN7Mwqth98Z%0qi8 z$=m7P@is1F)dRxnfO%`!oI8i`m7AY$#0J>cGvji>go`_|xg4Tb^k&No9n1@~5A3w< z_$4=QF60`>u=Hg=P}Ov0+L=Bfx+)cPOj^pBQ&`49Gv*=+ zZ1BoVTK$&KQo9Rg<@iE?XX0%<;MeGv0K+bD&&-T7NTLca1*KArCB?58so#GbV~x81&e9q;D< zTk0kU?@Lr56NELQavmsn)vNH8c@Cjp^5|Bv9@y5vR0jJfrw`oHsW(4G9-?!6EI;nd zY@^S!3{>bOu?G51^bsrk((t%93)s}u;@RI0XRn;rHo|lLY*E8Vho=vEeq@Hd2s`~V zd@dU=hPshZ0F0MyZT2%eJpd-GJnG_=-kfBYYPC>tG<4WKj_^8)B&Ezd_I zD!{mg`t8y&_cN)_{qmMG+b{a+L07)Bn6v=F^1BZWqjzwp>?LBne1K)$ZyRjl+ev zr;7L_d?_~}N$A)EFOfv*qPuq;%5kaePUy$^u4x-MTvE%H#j2}&&><6C47A;vm$&0W zH_A)`4l6vAJ=8lDbA~u_!jNks-r%$ndNrl1^}ynGJ>J!$qWKUixl{W_osY72R|FmC zb^B4~cDC2cG}Drzo!ek|e3@?dEwjr$sT+ssSmF5})Im<0sm{?-g{3uOBU;-^_uGvt z03n^7pS!N74;S^kot7Pjoe*{K&5;4cwVF%2My_pljBd45MoX=lm;gi29X$}|NOhxU z)A6dBC|njbgJk=WHpf2F#;maZ`hy$#2`QyDX2?Mod*jAtUEzZ3^Tb2jKiZ0HLDm^k zFPk`g^|vHUpKH0qK~C-liK0R72NVg`P?op1k5O#@gg5 z_bw}+>#E+32Ovn>ZNa}H9va=ntb|ZAhSP5i>cvQ^b;G>P%FoIA^<`wp6cBW| zA6A;-i!G*|gL3z?B2K#)!DdF$k>?O!wnugUoL~ZDH*?N)avTBaO+0l-2=3%*7A|33R@D7+v`PXWkp80s-N{9Gk@uU$! z?oyd6k>DuNR#@AF;hk<`fB$B#{{IVA`RJeG6}in=8#`?^XO>=(mf2wM8dQN^S?N%j z7yE>yCH%U!4A8UP%f7%o3|R4Q!30<|IH!C9`V8DU5@#!{7aiyw2)D|VDeBP&Xxv9; zYL$uA9)WA3bP~@dD`h12W@X_#)=UDBJ+@W;PVNld+`>fNeXcD}#%nOCbA&;C4hdas zbx?oOe(Yf5eWT1Q1ChTdIAGRcC4@p6fB)h)mr#SVrq>P9d9%i!((lgYjdbI|PiotYhGoB6~qz`0cxF z(4>s>$HR8y{FOF$RvMr0(6USmUat4c=DT_i5EK{L%k|Xsq6b&4fkn2qIdDzKXknzo6^7V%cAx)g`e$z1gxbH6>IqOLeMisLQH!V-0I_7*3QtuY^wWU8vL0 zrz;L#l6tqK zq?$vOxsb?hC7_eBwAALxvchHYUG2wB5zv?8h?cK&Pzm$v+5TO@!S&B1Giy&s*0}+P z;)QO#S9p417UjEO-wka>W_jdsb>5uj61c;BskglQLZos4U0jJFKJ$m$%PvRHkaT-& zV6|d{ynwy|p`lELzS)T&j98tj?FXdrL-p-BZq+DQ?m)76fqA|fYk6y`9Tu9)`|A8r z(EJh1IpkOKG~E(M6@ORjpA@V2A5`4eb!i!wwo!Kl%td{Rs)x+gz;MElj$Cda+lr-q z6nvJ$z9cUR7BG=|By2U@8n#4$sCoF^HBPImu!{76v~d7uB$ujKR`KnSHnFKjK^xV# zOD^T}8q>L6l}AGC-0hYdv0hgIN+#kThLo!`T>61G8tc<7E1^_EZ76k<<2L?+BzB2R zURa{$#&yl!m9SOp-m%537#5)A%2uXka;>p)<9=Yu;`e$1s;dG&RVsLlY( zTuOSE2dlT=fDS&tG^V=eQk$aqxKBA|YgoXVzJZe~7#>dX!Z(b&zbp*BGi?@Y(r=qN z2cL^K*8#?ZHkW$63RFVnNApr}nUAiP9zoUt%6+o0Aa*25MU3QWoS>PSi;gRMrD)OyZ*27L%+o}w@jO%C?LgnW+6zSt z8l_mW^8;TI<^9WxZ#T7=v^hIB(c;j=ao2~bZA0b@Y8SF8Im( z*{!7Q_@x>@xj}AUzPe+biaowNh|#jfR5^4}bY+*y_Kzv|z~!asZU2y3{3#t*X!DS{ zm}4eUakw<#0tgTU>1bGup+(V!Y7YBu`0VSitYy~ZtO0}wNXuYjG2dIjeu*kEBM}*h z8fzocC}+QVPyzCcK6aMdm49H}t`8Vi9j{hoE7vpL1hKnL8BH7`qq=77Kv#kq3Dw`J zL*^wb7+jD(>{JVv>O)}it&|CrD-!IFQ6%!%xxw-W@9 z+${#?XN6yf<$b83+b-69(7l9gaMKL25U0&N%FTw}}+Je%<0}L0($&A6LVM;4j#Bvx`JduTp&8o6X1-we-mK_G0xB z@9WIBD3V0(MFr z((TnHyN?al_=)6WNW@@3mwA&+GB?|H4QPw)!z8v}qIbyX87zOyuEY-`nU_TJKWVP= z{7m?dd$o1d+^W$qB(+p;JhAe%N_|jY%W6MuoIRyFcXo4m0oW)=CbO>xtk6SFwsB2= z4zObFx9q%u86)|ly+i8F>$lcsTg;w$uWuL7(#I*bD%%x!c&~4XZKm#8&mlk}$UOz< zA7c5bY9yVEH5zP@_&KX;sLr$f19SPy4>jDrY+XyF`HqFz%CeN`mGpF4mI{!Ge6X0g zWvK`}Kc;>ZhpVOpz0$$2!)Hg#!TpwQZ#`n^^_O|{CApj4nOgUzr1&Y}s=4jE#r)YR zWf7dBB@s!+I%;nVBfgkN!w4v&PFSl^r)54D8ig*CoGY_NvCw}~(#O|R z0_>G|W2dvRan<<1kW=hPndF9Qgy*H<&#KYo9&+fxyMe)V@|U00rW3o^Z3FPFP2OGT zB%>50kU!lPh;_AKMs%|QmKi^O;%}n)`Rd3ayH04Ha%)31x49>&|6~}y{xzhAvNx3RqxA%x;MVL?obfD0_blxaIY82$uTCQQv$Z(> z<25nUm0rVRfjOG(W{Ya#Yvkg0!$?OIwtNWxY!_WP7jLIm-K>17lWQH#rJA);K~&XR z;qp{dLZp)2FXXSfo-Y~V?G|MKtkZga((aS!SYhGeH+6u6U})RfQ$|OjHGvZS!SXS# z4^vVK+UPzXCU8i@-dHTU;iMc=O@#%}Zj-j6t+_csyXSl?)GSX`f2l1zZ|~vT17q*1 zv0Rkgp|qK(Al7^4DU{jqTC!}q<3iT(1MV-gmO80(5Q`LQQk}Wod0Q0^BgJR7qYF}l zyqyw$=z-qyjPQ6>7dR5-3kF>Cv%^XZ8yOYEBbZs{mGec5(aXRxGro^o+xNY{hP)r! zqEHaN0jQM~&memGnnKfJgc>Ng0~OSGdSecK!kN$pZC)o236$1Uivxi~;jGK@IIxaE zVHOnJSFd%P|DSs@Gm|culL&-~r-bqOqK01B*I}7~k-^LPH3D_?`Q-xO_&ot)TT#s& z16nySv=$4CFr+Jj!z5A01`n77yh`QJvawy>p}f=HEI7;751vc@IIl7Csx}Y-Jlct- z_}7`0**}M6@LlM?DO;^)#WsC2v>)M2c_RX{mXZ5932V^8ZQi7*WvEF&2gh{4+2of6 zT?4IXs6HN3|G?kd$M++hXh0nA@wr==&xcH^8?h_#V1wq)U><{lC%23b$Ju0>H04we z&DF7%%t$nkB!9Tj?=`-Qzz;{?g(Gn`A#yGCrsC8w|2$8mMkkys2b`BhCq=ISmIuBR z0JwdeyUs%IT}9>(Jtcbm*-2_Tzy=S9k96CSPbt_^k>G0~S^E0=b*1C(vgtkfz!?D{ zG2WT<9B^1cJ8Qs346w2m=n)6Y^XZ7OOD?cL-%o4o6)k{X*H4wZ;9{1E;?Je+k&iH00*C`dxg>lXkKsF}Xfr0?Cr z!Lhq6uxegHpeGQIJw9;)_%a;W2=->k&_%gEIcU3Mz##fdHQj z0>J&begO)LyPyAioj>yL=l@)HfdN{(2kh7NzrcUpOi&4Ey8$=-?-dBS_dfskx{Jo{ z=l@>+i`FkR|BKcyH2;Iv9@_sKTK^xt-%S3$K)r8$TLudbc%4;CU6h%Et$EK z@1E~>p5OU?C)ufs1SBtrPel;URd_Z%?+cQn+-1+f*9*o4OU(!(3}qjV zb#H7Df=rpERc2Z;6^jUp(F;j6lS>P&dLy6_Bqr8sB&h=0g67hBT7!&#`&cU<)v9Iu z42c3$80B=nc7e@Ar`b}Jl&yf0s`;^RqcK(j4CrYKiCXnKgPE|(_@j0SShHdgA035Q z3S|6wtV1+Yu>_SfCK{CpBLx&5Awi?0LOe1&LMok$iZMJ|ghh++Z~-1kL|}wijCwzO z@McnLh}8H*uP=C$@$)SfBOwwM7Z(eQ!-b3~PlQXQQV}K=iNyjy2+So03uzS?%%S5J z;%PHw(i$yV#(=UG$y}z;BI84(V=3s36J`x&Z<(NAA}eVW;X;f}X%wiYCUC|=lWx?x zniA1ET2C7+X29YTSYtk8Va)l=GfYoxf6oDwR-u^i@uRWm^%E}4mV_cm!&{IaMVpl+ zMp~3go0&orMJE(Nn4xSoMnZ0)Neg3AGK_Bgpq7k>jLPNg!AQ|J6(prKuzCFQDJ?pl zw9qm>ixA+rKrB&W(S$_uYYZnaYz(Jh)LKo+4{%Z?7Da?h;fTKng{D!H7V;;-YKqV> zCOru$YxQIvEixMN_~=9-2|1%^U>r4c_c24j1-84 z_-MEa1(9qpTSx;%C&$b9P#&RHt0tmwO)jR9s0ER@S}KUhjgSaPNiHdn(o!s%(x}5D zXnI^fo}miaCK%UO|Bw2MO0a(ribT(x0uLkC9NsgbVwC=p=`m18cGG6ouiG(g z?XVy(XwQtz7UYOed%*IJIN_WnYt!r!4Sr@pz0W6We>*ki#he*S!=|GpPj(H(yp;Rs zRw>bU@QLD|p2CW6)I_Yq@y9`b`=z-J{mqVa&xP9=U(X5XS{P`ZlBBwuVS6sFDXgW?)Kd)>)IW(GNc{3*3$Cmt;UCIcDE{>e{g70F2qJ^FK>UiZ)Z8D$fZ(c zDV?Vt4n6V=Y;g@$4kJkO;GZ2MjgIe9>W9jXU3g?nD(BpHebCU~Q{`SAa{9(|e;-GV^~zO(+i%x)2jjjuH3J#W6`&y9c0RC^DxC?UnJxPr zryvbQ;DcAeNY>#Msx>{o3GPQ_*E3$CkRsPASKUW}9r99E-~Up&)8XvU+Z-bO8cB)Vq3LQ_c(udH3@bs+k~z>KwY};`R)`4vXtL-9=}ve_X-04gGUvy?LxM z0m@14pv9~*2rqvMk*BxJKI6_T=j4B*wY8aF<@$wPcxtk71&Ln3aXvYe`dm6P|7CTnv&9XB+ZT_EiA zvDasP;-}lb@1kee7rC*0G93$hS3Yf8(ORc;CR=@xtE+JT6A8AH_Yz;b>aeA$Zg+$t z+=>JsiHrY0riZov-#^2et-LX2`xRUeu1{PoP~r~Huw4P{nX!S)tdC;3&1S0dvL$V6 zi-fJk)n3+Iy4Oz^3Iwa(HU_95xxa7+u!P$3#iBs#`(UmN>LCZB%s%TSout54^{%~s zG3!CW(UA2-(9cHO0I<4uK=12+Vg4|KMn}sHu))ro{YPIpa}ekNhEPg}PiZx1ezcgn zpM3||e0Olh32f)yq?nB${aw|ty$>>ecd&`%R*y}$a#sz>J>MCcJ-?j8J;+FUJ#Mhn zmg!PDza+Vho$_pO%WbH_W8WBotgys2(@tOuE3E5W*Tk`*Vqxdjf58GP!{p0h z?3K$8hBShwqHcwR*XwY!z)u8g+mYrcygOpqwG6WuCVN)8lMD=LG{O4b>RFzK=^rmF z=X3?TmM?^#&;f12`^s0dU@7)R-3J^g?^O)Sa9{MwGFPItns?wus8f%7nQGVJk(MhT zgU83yYE*?G$Gc(Nx1Lt0&N=%3axd>VJ5IB^YaH99Q(|{>*>Da`-kQK>#Zq`hnyv2PIE8fk*|m{J^}KakzjIUCtsP&)19XOD^zKgrhX Vi37^hJoZm*azaXc%<9&rfV!x{JVx-1yWW;p~0<-9-dK}Xn*pZA~@Ob}wG zj{`nAFrnY~1+aa8>nl$m0TKtF5|{$xeml7DzT^fmfh)c51h|NUdC~v2tcF97#I|48 zLs+lVIOK^lUPLe7GhW`vBS(-5a`I}(eMU~sZl3f)Nr+ycE~lifAcvHfSC>~-msf)z zrZ@;<1!FVGDJaO_`nkr94G6jg|Mgy0{4K<Ve_tOQ z_G=7SB>eZ-?0i4R(+5}j8X4D(?u|)^ld&d;BSsK>;~T`yc!IFu^mZFP(0PcHjg5_+ zjgy_7lZRsq2hWbJoSa*C?BwIy!N<3ghm&#qylg)F=NZPu!NJANwT+v5+jeel?(Osw z_x8;$JpVfbY}7zJY>+N=3jq^_;5;w{4{W0kEON`nOPDs8B{Ph1fCTaKx|5Z4itJhJZ7{nORxbm=TZ$CaP zCceY8_O#*wLgd>ctf&OD@1K4+`zrC@DT>;AG|?P;?D<`yvOv4VAa1(&{EK&fpJ#L> zl5#GTB)@z=G<)w!UB~d;Nf*+^lw9ho&XIW)Jxf>rOR4uu>$^r5cpx|&%$A8UCsr0_ zCB_u?$n!FR8Tg3uF)KvGZ>P_o*7WUnMe)<02$2a#%yu~Y9{7P`p-+HyuhR2&Fp0YY z*kcyTMBL!-Dg2+$K;o|{Yb`g4Mkr?0eU5qX z3yQA{5Q&%eGzDTV+)zBeJ7;&~mN>~=^y3@e!^j~Bw3m0ie)Ln*q1Pt2Le0iCy{XMX zYr7RfX{6WgS1tuPWXDY{R=ZAh*Etjt+q(Ol#d3qHs%i6Ksh*7=U)jy7Xn$GG2up~? zkn?}cSPd&))87?=WuXw#6m;VDGG!?p!e_zu#W=@mU$sS*vhz`b4L6_%?~4*zvqMu{ zPPPxeCQVRE^^_|s>@b<@TmAFa{2I@4{=xPp>Nb1u{0&krXUhz~rK+2U<}nCO&mRx<(YwJU5YVjA^HCYYsydkdDn3{f}y`VxR zZ%FwX3EJm-ui%W>vXX^T{UrZ-^tmq&=L8bhoWGX%c~+#pm;W&GF3_ds2lqw!q;KA< zed}4nn0!C`+a1$=?~9{vj%Hrdnlgxk9r!#Y z%&p%D6&n!S5A`+ed;J+ksRzoQP&AZUdLG3H=k}euBrpz~hCb`B@M2C9l~Ku37WEX;*N6(3*QQ4+j+MLYZ4gFf;a|3dH6 z^@JZQdV+=sXY3;TFzHo3;z9BIg7$X7)yVdd@+%^kcOSo!^Rk*At-HQk`{QGFZZ^{S z+V`$MvUp^wr7mqiyDAH+w++2AV0+Osw<~LB5H9hZn8>nr?x5cUnl#%+J^A9~h(hOk z{e!lHi1BRC*KX&&Osu}v_VL{_PFZfAAQ5|SJa}B_R6?_QRQsvGKUeHrS=Fe@286IZ zLAvZK|M=SC9}Bq~(5lTyu}N~{6jlwzS=DP8E5a$phKagvU-rF;@M%HYx@H5~csoNg z5KoCa{z>IKrpPplx6D91@%ezIfdbLZJ7GF0*FeyOPg1{J(8L?1YpNc(HBwaabMVI} z?dlS`V@ktoaWt2M8Fq%UGVbJ}%E>U78EVr)X~(&owsS>=BdNT*1NWK`0;Svw=Wb4{ zZplc-XZ>_~@>?xcsF11&`I?$ldwVA!I|<@dInkMRz5AcEx_XE+f)DxW4S;yZdxq z1QrU}fS&tNiudQ|;^5OgA40DUh?pxBnyr_#Ie_(=M|A|UW|~JOr=7kl=3=Y6rn`79 zf9qGOSQ3{Gl${n~>+q4J&SLgsxphZJZ78WE{1b9%M}K?o?n2{lS)bod7a7d{_{KVs zT6W(#9aC8_r?PVH&{)p~}~VcS=w)5Uw9;#Oim*gDE7-RoI8J9|y*_B)?) zoRvyt>TK6R5A+!Uc)O(Rw<-@0Z+RN`Mpl@l(9c7PTw)cUP)uhc+#i zT{QT-Ag-!v7=Yumb+{|*KdV}KE@xm3=e@#hM{1WZ8uP}@mAp1cmvz7Nq<>(3#Zqv0 zg$Y?TP4#J~HvFBZmXUpq+Inu6a!UsD^);0>&kd-(^Qq$yA!6TW`SMR|()B*3gRYA^ zcLs*Uv6=)Ob+5b6qTaF5KGS&I94C1SnU|Dv!!&8Yw8=DkdwbG-_WiWurg!fUf1pl{ z?KMy}I$3_2D2aNg;iO@7tsuhf3{&PK$92Ok-F@0AJ(@-h3U@M94gHjF>1=0)y^WJx z*e7Ai&fIJCF|EEYNeU~#uMs{79n^a;X*aoyw(NUPShjc13y64fp_XE(`KZ+W;uHI} zb8mz0y_tMj_|V+aVC#K)(AJg@ z04g2j=Q8@o&fT%?ChSrO_#}Bm{CsS}V?F+D&KI?Mabk+XV*7r)4&&Cg+!r) zA|%f~$SKULO1PD3WMTs@dmWNIv8UY>`}Net`I-k@zv^8QV|Q?u2l}P&iaLfaL^!EdR z<6lD`c6N9D35ZQ7L8f|#kAT?#+W~@1u}CD=%kQ*~*8u&Iap(~||3}$j{Qqosn1D66 z@FePrnd0fV{e2w9W0C)@+|(COWR#x>!0VX)ZoY+tb0&Hbjye&Y=qq4M@`URN-(OTg zzo$0_SNgOeL!8UzF#qvdb6}eMx7V6E<2TDs5S(?a=_4?XZO#NQZ_6_{fLuVKZl12c zz{gFmFa>iu>_sGcdEmV~U4M4r{8dAr!r#idewCZLxt{rZ1;?)nFt^|B>AZrN+?>Ov zNdnkw(?o$Y_-HSqj{E0J!9_d#C--qN%IJJ4%xJmmpU;RH#xpzP3{Efxl>$SKer);4 zB!FNUGniwP>O-lWZ|WGZV55)yix1&CV42|a6K=xvJBEq4$+v>^M+C4?f6ku%2+_?? zR=R+J14-clu0Pp@UibU>TN%CWZ!g@{SV%BCdz|; z4ADy`=-*TW3jc%Zpu@kZb8{M|zlo2r3>II!n={V$B;JtDKCpkhhnZ0aih03@mGNM3 z^l$HCbtQQDdHh@bQ9y6nlZo()7V{ke75xw+qo;ZRN5r+i@ka?i@FTuWL zvoXDdUSr_liUgPcuh)<8BjEqBJura(&k`eF*MDvyEKYc$xs&TZT5&t$@OX1v0MWo# z-`vRXmylxnRs4^}>}R|PL5J{euD>9)b#w9hzly=iS+O`5CqIVJWGCSW#Q)O#p-U-X3C?1t&T$-2xw7 za614&Q97WU584S_F#oz}{&ms(>!SJBMf0zV=3f`hzb=}8T{Qo?Xf`#gJwRK6AUp5@ z+7)n+K!+eKFjh_jmj)6zInIE4BKY_+?tmEv+z$Wi7D(s__(MVpkQ^ir(G8-XTHB^o z#|p857lHqcPn$3w+D{sgbeV& zd-|#eXo@lhR|og>Vp&lnqY2SnQ;Ls}V~KpycT;E+l(%F@pA2b7R1YBKW5iU-ux z(DbmRs;r!tOG(~?d%HQ8##$Qp!i{L6N zucoFZE2kir8NCcy^HV5rNmjkEkgMX1ciq4{sx* z-vj?wXnAXs~`1p_M^Yk;HakP z(WCP6M^#l+6yy~TA3mUl#VIM%m3Z}vZ`l7;V>gzo z=78Jjx4*@V)-Q4J@AY2@{0o79A@DB*{)NE55cvNQ1pYEqaGpT5@CRlH$N=2)GXqeE zZUG^nZ3sAG(*gp|^n;NUxS4YI-_P*PV)#D}#6ORpJwa1A0<`;Q<^Rsp#&eJqh&aTG zN5DW9-DXnYOPDpV+33T;=qBOj0S8Hb%xo;I^mIUAzcGQjzbcu)>wo47g1{7l1;Nb3 z#>C771^}IzK<*{qc4pRXNH#eg9yt4nJ@Vp?Vu}ZLC@HIW^YW`Ip!Nz#96GADW#>N8 zBfH{&s~>@2<^Y+8Tew)+nVH#POw14u%O3ed@$hX(x$l48{)E^r&g$e7@tAjqPVL(R z<|zIjqC_RXy(G313VcVgNyjXnP!AI#i^R_3E+i}Ko)j>>bI;|Xe`&(=X~p8YjucDB z(yG+4lX=pFX@u z9jA!++doi#ta2y3AJ={oMQm3(X2I|HRsnb6$zeY6Kb0&J$I2?<5dL9Sxt9Wmbn z%12&Ev@4nwmz<2d6@|@l*}0i02m|?%^nk`{Q1BfckQIw(L^|Nl?QC+qm?j&`C*x?? z%bmK*qsbB<>rHLP5^4n-cyp$4;ksoLJKS$_n0LEc8>X~eagLQesl!vD8SX|6n{JTc zxA68Pdow56`9>6FaJa}*hf=TkC6_6sc(%nE(+1_gJrQlkMaqxw$HJ9b#q6??oIRp6 zuF&aHRJcWjW~34=nyOFc>S$w|>%oW1*lBnv_aNCUHLv+Wyp1WGdgRyQum&EokCVbv z3_sj1Tz8EB>b*?t?U+nrA!koqmCis*d1|beAh?j9&yV(w)2o-ll`jS5X4T%J>-P8-miB9qPQf?_aQxs zbV@_ME2VN#^*bVu#f2!(=?$(z5Fa%_=xS~agc6O9J;9W7{94efF`>quM2{YH6fQx` z8cgzR;&ggQ3OdRNYoGJoP$>VV)&4G3{ya)+QIwEcICkh!gVOlaJ5q4?E^26;G5X za+0$|1E>m)^5)i9%kkFi&Maf83|)S$;`&CHwg92`!ql<+TasH<^d4=3Z&A#4o^!B? zX)+7VRI|tSvwTssxK#1(2mm5$m$H|ekb_Yh5q`dXvGy86IVVz8spI8gMW2djJ6fK! zB6ioH_gcYZ;{ZR@r`~OWQqW8lP)s|Z7}&!lS|^L?R3reK^X?jUM?RME;%+6H*j^vJ z8p1lPafi{xXS^QzCC9~Ylb1RojBAu>~ z6;>pKNmkI+#6xKq$V$<`yZl%pE`b%PtI>d|@ z!R5y#w=-1=xKbVC>D>7peeceQP=1zq7JF)bwlyhze@f%&ZY%cWmX1~ci!DQW6n?{9 zV7!6kGBrN?sPaxmD3ijD8q2wii2rrem3Tx)K1o$hTnCBwt z@6Nl+|H26j>R!9Iwy1H(YnF;pD>R&6A5fldP0F6an`npuyulH6F}s<%ghiN)d4r1H z1D0NxV+-o}7(ZtQI)3Ne5ZnqeDDm)|pbjW5p1yE$+!g<$K1xDNG#r9Z-^6T}$D*uV zCg$8lYYwyr6s0;Qm!So}8@x04oJejvkdyzXI=0h_+_tw_!EdD8ywUlOqwZO?w#mx; z*92NM(cC(jWzYp$O$_ODYf+kE(MbuzltZRvby0pKM=TA0x&A?=?Vx!BlY4PlWHY}R z9fI9Vo~=xi-GB+H4e%YUC~J6!#5Ml8gz*e2-rctwCNp4|>k#{A5e)O@d7j2J;}6r5YYciS8s1+)upr%6LlYC(UpjXJ1x*q5?8;mz`eZAm{)4@h!S!Ju7Dbx-ipN@6zj~T9mm7RsyFZiNnc4W2yQ!b| zrP9oWa3JSs*qB}WWE>Ne`ZZ3;?hdjYv}xE@p-O=~YACQ97~K|jfBT}N&hMRM<5*vs zn6DoQ=a)QSS%8!P;7yFj3_y_bNu4hJAqt(i8Yo-`ve5UsQJ(spx+_$F(c!yN{5|6K zu~uEG_Y7}FY?+u~Dj%8th`!}X4%}g2=7il5E$Lr-kO1u=1$4P6W#Ho}2mm|i5xEsD zlwS;aP>(uy&iO{rcM#f?f=7`qti0^U^*buA6`nPYN!Ca^vbPu=v;#$OtH+Pp5+snR z_2*l4UItB2bv6mJCf$)gVG{nN42C{ibxwl!4Ti$jCt3?g?rfD`I2f@qbT#520d56& zyJ?^|{Y(sPl(*fg=u}mJ5I*iem*#^7e9PPh`s_VJ(Up2j|hV3vD zo>PmTzB!y&^&rs0Sj^Yzfc`A61g+-5 za*B%HRo2^qvDnq7+0qB+4my~xMSStB9a=DS(69nah)L1kR-{95uL|fFeu@$`A3P<~ zchd@{$YNT9kUVP@BW{I8#nPea*)8e@ASh*{oe-}Bfnz)Gce@IWoD=S~;#}#Yo@l)^ zC7XoWlSOK90sO0R@slc+s!vFvkuvqxXQ-*>0+Mlui=a%2Yjhy8A~|j1@C?C8*DPFK z0NHqQj30K;HRi_3gy1}{;v=BIgaCM?_3#ut1(cGI?Ay>!r%=99Cr73#on!@AG1HCV zt0uhcrp(@!5Tv*3SgOfn>r~#ggmh-aV#Yj;W6!C|BYj5 z3Hka-X5@KG(8>~E63j>WW-BD?k?>Q-${EMv2La=%7q>2LH6Mg=Kv!2a{Z$y zj|Aq7;t7>-oI*)pdOQYt859Aeg7b%OLScg$^>0X2qd zhci#{vRv*3TI zWvs)q{)5l%EuUVp7|bxg&g33@-|lw*#~Z_c#LPP9JWC!HY*8VrJS!e9ycg=Rl(f7w zDPl?Jn|mkF#?O@|e%Vqp{BR>rtPOx}gkul(T1s=@O+E?UZcGKwh|4jh3=S5t_b@^u z&m%3Fp!+`tfys9K7`0`70)l)7h9KxOss$pLH?TB~wn&^Q*k$GjlMSpYI&iE>xv!W% z=XeM2+w!tWyR6|-v+};q39!ZSjH_cQY$tX2a(go;E#wGLXR0?_nYT6AZ=_tKcaHnWm^V_uW+G~y#Y~4R zKiGl03ZL>p<*AelvIw~ey;gxNEh1w|M{fu?Q>%C=T8^?zT15?fLfResKOt9-) zyUMTYm*-vbuf!gk&Z=4bJmH01_X#TrYR^?WJoa#D@D&GoFPo(n2NEb*dJljyrIVS! z6jJT@O}-`NdJEsv!i+s^67SE%xqIyE2&wwLP*fHAbCVV8_)z(Wpp zzZw7xSd(M%^#cvb>LyR|O1WGYy@wD+?J|%tZ4nKCMT}YQZKpZ4(ACv+`>drIjKX7 zd~TP>l0SO=WFzEO0k$ImWWmBrM<5?mI(0e6_hFu%UK*?|W{M|I%mX3WxN|OZrv9zA zf*(X3Qb%Yv zwj%r{CJoY03G8yR6%Oy zNYTHtoA($Ha8O6cfDBDkaHS4NI%S%eHFas4t`Pvi1y)(4C)hXh3h4W}6Z3cbek%w% z{nk4b3vM$=nWVp~-pVekk=)2{^me@MNZ8T_q}sp#*%am>6`QohFZ*%D-A9^HJ$BjS z_BSTC!p3d~JzXW3Z$QamDf8OHe3KF-i^9iBC~&LRq8n4$4T3G!RAk=)SDC(c)Yq6{FEig9c>J0w9S* z8}B48L4b&bJlih+gP4z4AGUk`)^uqeAmf$#3 z3+e{45Evf-xFH_18_5C&%i%b^<6AFUjbx=j^Nmh4#E#z?&G*SO7Xf}&%#wJ z&&M~~XdLHa_sR5oh^6rwc^^*%M!F+kDe?mChw$BmQb(nG-Q=Lz+OuUf?+hbr1t%u> zqVXtO^ftN%`*usi&1k>+r-#eN6LVHfCF%BxBX22^0+{_yu6jf3aSV5j<8!+^0{U>$ z5W=rVQeYxJ%5hI&^)cUG3BxFs<%wb5-g^-oIfV0+p@)u}M2)cX?T+=nkbo8}yeSPj zm|tj@jtT9-#}`n+N-4(TH%7iTP%Qrjao~UW^BY~S$R7os5u`Qxr0($>jn>jY!BTci zv<2n_H0f&SUEM2CBb#yaX2>m1K; zeK1|YDzleieZz}w8i47-*-_WrCCN*x5e40LMY{6u-N_+9$<{&G%>ZkY{_64K)sRiN zt00a>yFswV9?C8ERBr(H&Q$yZ{L#l9!ZjZpBM}5AOTxOYP?Pb*40jxE)C~C4sk2xepL&)k|s}#9;sx2y+7nTkS+y5 z(H(Jnuo2FJ9dvJ01YMf+?!iXWfi5kCj<@=oJo!cE%b`ospJhw4wKe9bb}x)ID#a!X zbw3=NiaimSb}Hh~e!ZoceyxYAQR`hA8_?IaS$o-f;gZp3$rI7#eGi1l@!`C${F1st z)^#9YCJH_75p235284*!rM^H-6Er~I5fS^_%lf5xAIIMWh~AV>x^l6K!# z^ol(;%Mse+a&7!+PjR@KlHcUAY>_>vHEoclS$eC+FKeJ5I z?mB6RpRKP5flE+>+#>eZNEoK6ZJDTZ#wExL-}P&kGwzN2ltDU8_XxB+X~S0VS_)bz zIj90X1m4lEysPuLP>X+?06uO%Kzjp)&H68yBG(8|A`$X+m@e-7t+{aQ{+z$b``l@t zNz2LV0oT@V^?urX!goh@_jCnod3*^A{2-zq#M+?jzGXmK=e|*eUbVJHc7gqyrHZMo z2Np|WBreW&8e)2!i4%9L3K-(TJ>QFtcf5Yk*;!3}~6k6%f0S*CpbGVq!i*jo;-of2zvir`hT%?AG6(jkO5(#Gadc)Zxi48zH zUm!W2igHu%1)9iwLcoolv;!r!oBFYlZ!eQ`r+I@?m+P4VYnC3YB^vy2!YF)4yt+xr zDNOEV3}jajt|+vR0d7JgzYMiX=)6q4BN>3RR*0%YNYO_aVF@l$*}Bv;l`a>S*W#x& zoxnOW%a~s%PfYL@9lP^baI|0ei#75mxH)p{mBzmT%jZ?kXczE>S;YQXUW5jASdm*5 z31ckWb>#)xqMF2bP3e!aVnTP(ax5_u5dDrjnYO*|T*9{06 zwb?H9`v&__a01E<=! z$As%jKgIg`X1e#3$TDh(6ja0bq zv632y{UDMBqx%L{f5YVzOg4>G*uEefnP7C`jbs8fUm0#Rf>U4ZEM7mp7)1N;^VV{Z~xd#h@&GwXB&rpZV*vk@N zw-rPW?21X^N~V3-pTKaP_5fk}?$SOXG7Z+iA#Po8^+JuaU7D4cU0NCT>WEmEU%PD5 zqXrqFZ!~PH`ULPWc=*y_a>l6g!c3qlhfCXumEXMd(!p6iAY)jBb@|@R1{B!0qBL`n zqZ4>|#B5jY(uEKZD%i^FfE<g3Q}O#%HMZ13+LdCHs!`0GMDnwLc>A?IjW$akRS>rf7t)hzun=GFKV z+F~kQ1HmM)5F!rx+-OLB3KgYB9ct>-Evlo9_e93fUOvi#hPd1^*x#Wdm0DT8PE6T| z=Gg-GY&RVT?}%SpGuVz)#4+25V~6sy>S(hzM9&gP$%aCKr0Wv)?EjQT^Y1)-a%YrL znTlO8-<2~cuxAL=!iN>Oz<@Me&F7QA2=$;%?5wvt$&fa{IzPO)f{r`Tc?_W92H2x( z0HA?iq62G;DrwcZ&?Aj|;leJuqYcYctD5q)$}j3;k7vr7ps&fr{`=o9k9`~__6IFq zP;q$uu5$gyoV#C}ZcE6g$hicm6gK*%Km`t;hf7`TpUFMqT&1oJ?1@)AfzSu+ax9?* z%XP(By@~FEQgmwaAZ6=n3_m}2Qe^9TXs}I$&(sORb+2K;Mw2bFbcA@jkWNRv=o_ZD{@E-29hmlEXo$2p}BjX%x7kSJ4MiCMqAt{A}j)hjBb$G-s5n+(xAZgc8VuQ*9IUqsgowoARHs#3cSqDmxwt)-|7th{tCV>s zAzbeWwg3QszzUb?78D{0b92jyY-^ocm0FLR#LMMq^e_4Q)=6r zhR>G=7E+FAtM9m^kygGR$!-nAKLT-+fMRZfW(y_`IdA9D)1M#5vu*11&4? zfvlMCe_VoppS;h#a8Bsk!0WtmJ;@nM%caf>W=5`23wNjAiIvJbUFjyaN_9*Zn5t82o`VXrg*+iM7HzDZlS1YG+Sx{s8T zCeS?Sd!6E!(LfN9yiuMyEaOyyEKM};&f*F_PE5E==A;h1PXTtaLW()E2^Vzw9sdg5 zPsKy_W*Vamu@A(77@z1{^T)OWz_?&)5p3e>a@{4(=C<(wmdH0ZCG5 zG;(_*nFjYa8G2G2<681Q#B6@bgu6a$dQQh;QM8#r1fp_uICC;x73e%Q3Dt+!XFC%IL z72k&3j|)v~a#Pc);Y0DhEn0d3Rbs<|)5%d#DQU@aO#3zXeWstR0dT={$uBRZ3j%KX z9a6Zn_7E_~+4W28%k=;%20yvUC>7hu#$Y*LH7TXI1LrlFCdk#%%Dg<9Dbry?jZ2)_*NayYk69+-txb{vy)A8?id z8I>o-9GAu%X%2K$fCgnVr;y^vqf&TDqC3({rAw83DrbeoFJU}I-|nWZW}|Gx`gJwd zSLfch9iL?-soPY_p8(%$zR@4N_ISy%p@P~70@>JbSvw?e&BxS6XWECvl3|&Co8*$A zp-DCC3aidzb;^4^F}#L-wx88d6E9qP?tg^IhT)ed;-6i3R{-34jV@!`TYH1f*y!Q6ws`IPH&{liRuJ+y4MJ9$$EB=E$+_GbTEap zZR@$5n7dlv7{*>QC@lTL_eYq@-2J4$`<*EigKh}0#u-}31iTUWHV%)8NNK{B93hzQ zv0D%?Ne7mTyJaO6POymE->yndVZ!yD?TwWGmK3c6!pD{PAC%oeR+ZL#(Vlq;eyL1$ zmxVmyZ3XggS^`1-@eIo7Lew5vD8~1?4!>mLfy_G;|1@$l1WeDTEU$}c0JUFhU!r%o z_NkkkKX`#|5W;t~H3(fpbsl|U4fpYgAswz^kF4E~y%u!2OY^yTM)C^a2PWVciwXtN z9}~(Ehp-CqKxO@NzJZpF8&GGq&7$R4eO7RPgFO9-(lm0+K67(lr{bIuEtu70gHwb=q{*a)Q5+j*#!N}%xT8cdHxhp}vZ zSvC86v<763C9_+9e<_t7lLW%C`|%JxRKcaxMo5?H+MO52g?l(L9tmPGqEDHD4pal_ z7BNSbshe!OgaZ{_r@9AI$JQEwg*l( zsqjnPN&)+H;r({A= zOi^~d3E&QrP4=Er!elfE;p1~B7NDHxRztk?E}?hp!+Kw=8w*?HeM!U5TG>L7wLw=@ zXop62&h?!B<*or||80=7a`D4wuV1g79r|NejnC?nDz`Q6kwq1^XqP5Tr-yTwpm7Zx zd*>90j1DiHTL)v%jWVXpILH!s&t8-dz4q9V@Kw|b;z=c?B``oAU$HZ}3}gTtXecEH zM;gC+?1`eJl6pYo&EuqQjqb$Y$+q58hK<&o>5hVVz)3v%GU!XZQ5XK@;3@WyTES6h z%Yg1YVwGBl=Di+>n@-VfEpr3Qg8{LGFxrZEk!w<8~z49t)* zzI3lMWe7%2m`p!#`n6-9?OJKZD9ES~8qym>wBBfa@!hx?(Qz|BDkN=QBtjF{wzyT6 z#gY)RHddXpetP~4v~{HaOWRWiIkni^Xy^2hcasC?Krw;^z6iEwPE+FP+&$M)Se(q%~y*|2hHrOA_`b|^QHRcn%b;Ll&g*2wRe@v?oo4(x`ed#R&3;0 zir@4mwq~l1WMRLzJ{k&HXpzk=y=!JPQ&Zcp1+z06pMMiJJyW>>zQ6M~g;fe@tC#(a zaTKY@8t7U@{=FvD<5X`7Op352;TuSv*)mZ>AuwY$G4fo+m0vphYR|(|D~O&QLNO=% zIQEfR%T!Z7U}~e{R6hX!PyvoMY{8z~RL@vbTqHfNpC$j5zBvev$$V->hGi)C3s+nAiHv4V5c`QA9zk;g=<&Ab zkKdNcroyO`+zNOTtC=k3+3d!!{%>22{TJy78FQc`L@$I7cm*)cdNgQ~=aZ#Fiqq+(3PgBHPKn8^x+&uf~HMi>g zz76Q5HqAfI?_b`e%=9C1wAfh0T=bpPj!BwMMh1J z)Q#ciV<+WjI~w+;x`7lE!xGPO(u>PnWiqwX@rJ-4b1^{K}kNXtE_(D&9&1qm5W< zqzMcE*s3~TC_hjb2qaGp@YaTNmA1i`rWY#CDMHYGeJTJJkY;ofqt=!JiOCGwr=?te zU0%cVsFB?t$ecJfOBb*gBrrc5EwNArsxgS8fFviLSR#mUnU;OG2H_}rW*N)!Xl=u8 zd{9&Rp8el+AQ$DAT(}~_J~8220GS}@0D@U0A4i~~!E8$n1~}X8W^nB+?0lstU;M%Q z1_K=IBq%10(-MRhvqy}z*A6aE&Agq(v{fZQ-0A)jSz#u@UZV>th22ZB!hNCMKV;u- z4fL*R2EQjUgPUFGIhVHk?z11HVBnf^FAt6KD?(dpy{wRo#|-6X=+$QZCig!=YFz{Le+DsLlK5xXHYBOMIb;fEfgC>5%G`#+sc7ZV-;+Xx3S z^(w7A^)m30DcQt%Tq2HXz?@`ic#3t)>Xr`5)O6)*KiGO`_3-2+3x6FbWMS4aUW*h| z++aJgyO&zwHp|hRRXwG0XgLIERn4;RHz402iRwuq_V@}-kn5<_rv;Kn1l+R;c2|6# z94$$$GIsaLr)@x4_7=-ap9*zXK1cX?UDbA~5XlwJ8|vh(J70uF*{NfnrczMd>>2r4 zwMoyIT6JzV9(2FS-MS)TGaoE6oi~lo3S5&8NmZ!CpyRvI# zX+|PBj5GA;YV+bH^e1@pA2;Gd%tY>%2fB_6z3D!u)5kojwQV-*Qgq+arP=rH7%H~4 z$co{ZbZs#nTWx2AD#7o>04>)x>9r0&1a^}P#ImDQAg>^l=OK1~E+FNliuteT*INXX z@fv;CEnA%7E!NfSjQ|)yquwbCdd7S6G7?vD<(f5C2S$@ssS#CWQ{ilusvx7*=wh)W z1bJbK=nh%B9vgfyoqyVb)|B>8_ZeY32)M_g5f)`EGod{iH6=Lo;UY9&uCdO-qo8-o z=V!I+?7Qc*y&+b!iiuru`+AcYl z62z?_hmZYD+_*2=`d^;b6{ej#?s2{{95pVTVwmgLS`=5_f1~ofXu6APVLeR0KI zqp+cG?W33M_tuV=W89|7U4vbn*XzHpJ1P2ML4sumaeVJ4T2RwWu69mf3ps@WX%&OD z)W$#J=Z~5cSyv~ICJueke#hF-);=|IcU)xTDzye$TzKDa9wzOb{U|Fwrmt$D&~`=8 zxUfLT^Fv(9|50i8dpnG~z_ENTPl`zD5WN`!fwlXB5I4f}~pxSmtd!)1@@ECPR zt|`F=(`_YrzQX0uj2Bf~RfnO4K?XDkdZ+M)IUHib^!DrgWYOPkapgfs`$7!Ca;K4Jc0xlut(u%pkcITjeu~Jf1Eu ze2ded8M+n}adYNTI+QQ`$&r#Oxt#|j3TobE;X2R&P}Iz=160$UbM&a9ac^?VaDocH z7JaHz!bz&5|GiCX_Re5TM`aBJ`I%6crAD_tTy-B_4R)WKdI8p~5yjuYojnpKcU%Cb^5G9PF8PwwM*!sE(arz0;a~E#2u+F35_>vg^Dkrx(z{g`a^7t zjA3fSUKp*-zGj6-W$Ema)UB$O)wY$EX|WI4d)0w3%LEzt_<)(Yz}a`B*>7a;3ZMCA za@9fqS^i}8vDGh2v2B&n3q6#uKSI4m9VDs`0T00XddSYnu*mka}{oL{5X;$GB!=W4-TH&dqD_gaf ze3oQPG}h#Q^tTs^bxw;UhjlKUfyN74s>?PY%jyHwWTQ(~Ri$BJ>qcuz-z{tHakI`- z4gsr2mj7(kA})1tPHcU9|Fzef{*jDv0pK~l+UEv+N!_{D6>?`p>*{P+^fmm_-C36! z`Rk7ShxR2nox(|=HZj$*iK$KJ{7+m#x^^Ay6TfkVuu$MCBEK^N9_Yw2fGb6TedjA4 z?8^O#tMe5Fz_t`41r78GkJ%*D?2(z|q4Gn3)4~Z5Z>|mmoLZ1jOHvlZ&&Lcboe!gk zqxd_G5fZo{O&t)L-Z>{E6CY<&ij3)zcbq_9f3kje-EFar_Ob9A5<)~|77Vz!Ys_F8 z^GzK_vx`FY7AvQ!Nq(~NzWVj)jrzIHxE`5_V=XSmuNYrN@WW!OQZU7$=5hwbqUo6B z%=)UmYZ0GC5ED0ZRiEYHH7b>o%T>CyWkZgw2rSjlbKDKufEw2H!o&++=P5k57ju1L zV1sM9X<*5fP;9k5)k&t-PBD}=BbtV3ayV1z{&0nZvTm1UW`AWS3)NPAL`1%7W!=51 zIE)Z3xavR4`bB%FZGp9>^~37a%8R9()zy{J%YI>*pOzD6+eTiuQFk8*J^4fLeMsK) z-47d(jLw&^s0Hom!sH;Sx64|J+BZaw(6fMfL3(iu>KaeEUYlpj>NxD_Lp(i%0wrD5 zt&oGrw&|Y7FND(-h%1h;^z8_F!gITtv$=<;79EXdju2(bs2tt@%7r_HjVFK(6reTd z3sad2YCHM=laqrW4{;W&!+dB`tW`-?83Ty zbx_BmzZbE;Ut6onJG6FD>RZ3rBI2Xax4ZE9Xs>0`5^DLtYRy{kYX4aFHlpIS^&zcO z)7eLZ^z>fbn{oY;A_knc@LD^x6?;JapDqdOf%E4^gRMcz2(u*r07JWD=fAFuyLCzw z0&biG5DWGMkXJhz-|eMY(!UN7<2RlAycU@nx%d-7Pmj|P1Po0OPbGOPcj_Q4B)TE~ zJelU;hdb4F@rUyi!*=;YASVin>5)V8U2*J@nYJSU8R-Gi&WYiF!%ZoO$%3?~u-bPZ zHzuz%O-p-Tk9^P^g2p+&`7FMfiuDQesEB%NKCWddnO5cu3>@(Z;F(BxHD3H2sDjkc z@KhjQ?}=JejP_jFyXL3;fQ(u!nC5b+PKwubpO+VtM-# zcG;|58yBK97d2BjcVvLnbo|lD_YT&JD__p}RvE8FE@U^hRaPEavsf2h73(>tse_nw zXsf1V9{JWLP5eK2`VM%i_y7NoofJ0}MIn-86=kmmSs}_^m67aqWE_s>MP-w+%1Ss^ z<}q8glf6gwIQBe;qyOu4zrX)|^tg|PQSbSBJ=gnsCl}A@W8;62a+c^*p;ZnK`F%5I z1WJE?!P%((Iv8Oz4TpBC zg$aQ>7iMD6Y%5K#O!8hN#iIqZ2AG-hD{iEj`q3tR)u&8_;af#zlqObA7m-(8#7`-e zkslBlmPgGM#qw*kSqT>?TII1GmaZ7J257)o<$7UYf=ds3 zVSp{!WhLz4-q0NPJk8qm`mIcLjGS0U(!Zp|@x07GNV3=`Zf1s?(uPayQ(L3IDL+x?q_~-ReQ$SKk5`+7<90z0WRc^dGbi1vRhLbC1DNE716h;@u<$Zj-_` zg6nE{c3r||ND78WFN|35C&ak**R!vA57bmt-5E@q9x>MBkD?1L8b~W}lc0+(@8o}0 zWr!~`E>xZCnajZ2tnV7mJ6f8Rj<#esiq6LCsfxr96pyzAs#~5{+}*cUEZ_H&W>)`s z*%~dr(@fGDB+ikk*KVh}npG#6k|cJXE0T#P*Zv@VT(sjQ1DBqKb>;nBZkL*hA|%h; zL}TB$h7Hy33GHF1vtT$Yq+TopOzycya7Q4|QK`3JeT?TbPkf4wJcA0jol92V9GzfL zSyQz3xxRUO##egy^CC+O`U%u^?*ep+7V?_8?F0J#FX&j0N@ak9^I*}myL!B4kgWBj zps+S^*D=ECbw44)sx0mTVab^9%YIg7Pr%JRy#L3M1WQ(|+P7JqXocpD_sv|3d$VYR z9n-pn-R4eip+86p!w7dPJMEZ{h@ySK(~77KyFR7FC0=Wngpr6V)diH zN~gsZ>}Gb~3_hw*hd6#`ZV{iGDd;mFe-9}7_R4yErA>J zpN`_JS=zkU)01*MNOZHqQwDK2Xfm72SZjG%iPXHkIMh!K$JikCs{?(VQ;Ypr5uv7@#76 zua!^r6piv4>$qWehw8j|4&~&7Ybro_=wT_vdqWznBR$MR)u<- z1|-TZtnNM%8V^fSvaH-V6foJnDaGEspS3=0@iH|DM`-&*szxzi6*IBpH(UFdYtzRV ztGDKUxgo9UyG>i6M*McV`nloGtwFxx{iJ@h+2kLjRVf+wp_XQey{#r^FW~WLGz*IS zVqW#>GWQqX%-g^Bl4{c0p6)1ZvFB7<7~b3vQdTCXFqx>BhR6?CV3yr2|Ci zo`BYsHp4{dDM-F3%`27gzf@uo5!&(qvo)N^xRDSo^pNIUaO@J!?)))?+RW~b#nae! zi{gZ4<>#R7nu7+1f9+z?J(G1;)k4~o0pVjMtjerGni41;NEm}zqH^uih({0$teY8F z(=bT%Ndq_u8}Adg<|1=>&2iEo)nA`dhYjJYyepu5W9RVu>MP+-N8vC#{AB;aG<#( zv~ZmnWvKPa&pid^3?pS|D+CN@L%xY{U8^d=y_Dw_>1QE7eP0_cGHvzzv0+8qCoKm7 z3VrI;aYd`-ct4O2?AUNVv+-`ACf-U7CoPskdEqF`|7tKwpeSd7rGv$M|Mt%&2gf|( z)SUCuJcA1=j4pFYyPVj$Ve_ysjwuZUcCX%J6SS&$hkMmPDrwkO=vb&+Wz5lRkJ4+5 zzy=JE{KC)(vH>GH$FQZAudP`JFoE$v}b}dQUMD0a?D4^tcC>tYIbB2pqd7=*LTTr1Q z(ZPmwD(`+c+^IY$ejY~SPF=`Momqk0gY(C#6jROlho5RZKiN%97I#FbkAsOwU5PplM_5NXu4d}f=qQtuavKxk9t7y_2kgELT{ z$Xw9jXbutvHuR~DxYeL}IP{{Ciya^(0B=`*{C&b&`jwu-Ql4T|+iyYERI|O@ioDKD z!~GjM7u^Qs(R7=J-oD%gGKu#S(8=2Jd8DAcq#G{DR$!$F&k5%LKFPY7KE&r4N}F}A zj-wSsQMQHRanGtcmKRIYW$b#$FV}rZ{p&iPmASBlN(ITylF}aZTkbpla0<=3gecDY zvu)33u2=W0G%2ySmz%gz*6bC6FF4P+g9lZ!^< zITd#{+d{7|)X?u9G6kTR+U&s)qg9;s?97=R6QsxFLJZLS&_pUI!_mYq-p*sezy-oO zxIYfXwaHUg2Aee&mM?T9IKJX^RjX!H%j8lmpVB%4y07&4nUwpe`f$2`Sw9yv1^km% zE&qQLAJ~%xOj1SBTZI)u~W&UO1Q>MY)C5A%Y=W8xpllY%ZCDq$|ze)JPk<=x{GE|_77p~ZsJ7lnSe%or3 zU5OzHEx*QqQ@W^RQGH~mp0|@ZakG~&IEC%SRat)cwX^&Z9Vp`eJBfc%Gy1zY3 z5s4kZe~Lb6fenz4Zgw&+YQ5A}j?kF%cOpQvA+!s;>czjFSLh&ci}X_DOhyQJs!w6g zbDY&f;i+py&)qMZ*ONY}RpJP&jvqqp+4xz(S>WzfFdZONR?nfpnqhC~QSNb0TVXhY zTf0eHJ3mSq3q0@5np(N_^OS80BCW6_f!*jF9B z#GO^Gwr%Gn%ha*|ePS=J&f8ZkaU^a{s$R^?f8;lj>kIQcuTjGLX_|75a*N=V<@84< zG*4kbUUDh7O_;WzLjnK&c1|A%Q^A6x2Q1?U0c*N^gZPK1FmP2caEgv0lT-(7TjGv2 zT2~*W4?Z?(wp}Z|CNWRV?C>lrKbnO3|HFP*C8VKUjhKTGKAN@yTVc-12n0m661;E2 zbkCsNWRBI+xufu3OfEzqh&$uERt!jxtb*O+1$(*FJI^VDc|V^rUBaxQ`sZq)2P!HU zm)GuW9SHQgi(53D}>pkymq1i|EWxy_Fa_Q4QTG*1L+QG z*3!*em+0pXW<7*EK%~Q;e+bNT!vFjyig7qemvszkC*k9D6@)R3A*Q0?612v*UQ+?b z9nCU0>9qM%n3bc0l^rCGwa_5 zYCNiS$;?~lUWV@9RJv&)vdX2y1x)|JnKkB<1E{jn^Q($Ov+DX*GPDIH%8!@^U4!jEmjs<1-s`{3gI(bl-@x zW6iTv>idp?GNKpZ3@;9-45B!uhIJ7znq6E1Vset|XLFhLl-_(NThs3kyfJmps;y~) zBd%7I6QQ6gGFy9(zVH)7Nk?#YAV39sV10)r&wV%rGQNW5`f%Y=Ou1kz7OGL4HAV;n z2Z=R;&_w5a(2jV3LW`dlj&mqPfPX>gvd^k6+;gf`RcMcJ3TbFSz`9^`Ms(pe>Pp{A zV?5jI)#)Y`dZu1G)~MR*=l&~OI_~~6RhvKIbQdS9&pO*hqi#K6SKAg#BGWDDT=e6v zlVcCvtREVc{_$~YPyu)V@M;sn!8+);Y3)9!z%c7D7#Oz~FYC}fvb(r!|M;T6&sym$ z!>?29eZ1^;`2fM>_PL9@O-B_2&HPo5ACeKAo>exsqN3kfG&{wt?>D$R-CVvtB`|Yz z3=o%nTmP#hxlVZ&!N%#^(#b^|dzSrVC+;dPrLNt$PnQr{?P6c1dmS|vcB@#O0_xVc zZcYw1&0Wm7Anh8Mwq@N zMkc&H0y;*1@n7I$0Qe)DU-mam7(Z`JWc@{`a6=5iG_qok_0gM`m{>znos}s-A?WO} zk!wFBjnz_)gz3h-HG;lCs~9jVkR9n&D^LV@P!7Qs64n5V6yLBdVb7*aMC}Xg5$h}< zB%!HjIBe5on`g!YABs>W$x(>6Kip8vJP9?-lzY4x8VaN^zJYo_&udd?vZf~~g@m6G zyG3@G2s=OE%`M0t&%1~&|4~-jrxWo9x$5gOXU>ApOG%O%FD2EAn13W;@2%5(Rr7nogUn8xjae4O^>nwE#H|>W&YhFgs}u9p(3sc$wn)EiNM;Jq*poYbVS3*f+H_VT zeqDcHh*Nyb@4EiS^<3{$1oj(sOUrLI1JFM%Vi=ApiRq$M#Ih_>M-BS)4;g*(V#!vr z92L*-c1iOxlM7nq&LBi!8=zKy<(FzU=2W7pX?JUJr%fUfKtc*SFWPy|Ui|gI3dPh$ znJl&ir;1x0!BE`NF&+ba5w7@SSRjRMLS}lkSTmT#?(u;hUtp=hj-Dx-f35k5^`+n?FEG^O}<#X@j_+iv?0@&cXr zX;!JxGG)JYHPLOpn#Jzu2IsiT0dy)cvo9IHycycD=lIS!`LcFA1qYR(6S##LiHp<| zJUG*9%ULKe4ZFIzZ^SKJA>vREv&EIDY*g)tCG7NX{%OE z7F*WQ4m=uBOKg$d5mqs02h%~t;UThXSx`!1+l$`uS{U59iJe{%d+Z<=H?{1&^K!j> zqoy`dW}_RarVDvvZ-Ck zd13EZcSAc&s?XFt&g*Q?33^-7&u1PEj6;+Kqcnrwr9BrK8NvEE2OiK~MxchD3l*>a zrI=ZP`&UVEgf<;Hc2+l525>S#KCjMnEl%Y9%hxz19xBx#0K7`9)G8U(QYM+WLT=^vK!iBVk@yY$2s;`EZ4!eOB0o$cX_yIL)qv^|$UdnaPc+eoxc9 zeR_cmluSOaYJ7*=QdnSCcFMzC1vRthMka%dfc=ClW40!|DOPt}$mE z2-sB%7Y98ZlCDHF>IKYgvwn>)*DwufCUN(plgT{$lKTNwnlAB=8#$Iw;I1zoFn_&R zmYBNA-fbzbNR7U@W|-j@VEJyo>D$ zhuHNsDxhNl-8=h!jN!|k6uM}qe5>@kWsXkkXv)5)uhf?sh0(yu!11B&H`mO27W=HL zS%EKh%QzKUFyf=z#yezMD_<*--MrPaPK5N=8G z@8;d|$t9&nXI&y{ZtV(WCEg>A5z{$K$b7lKhs46s9GcM_hhy;0(YYo+3u&{IJbho6 zsLfmJgduL_9zm{&rMeaUYF`kcCwhVq0bm89{}L^PS^1PB?j;X$UM=0d$^6~S@%4Hj z0fE(DCt%oTvQYkiVeaN**A3Z0#7G@WX_5X zp&S7~bJAZ0qL^c*@yTA!x2P^HvQB^_8uuGFXL&y0i;wBX>lJ-mfCyT|UuRcy8i1ay z!}=n_=5J4>N7BD93cVX~L1*y7Vo5`RG26erinSV1yWfV){~(+C;eddx*2#KQo)&|@ z+%JYUrBpVM&zxRZ>P*WSw$8078Q|9STu&hWLDpk7JZ5@Z@?2dL)Nuo{ZI@;Sa>Z&$ zLbpe`Pp-N=Sos7@HO3>P$WnLT$2BlQNn4KTqpw)6KzSIWzGE>dE zv>ulXiqGAe>VnREb>`%O50L8ng&vj8RYQdiyp5R4pt?o=?m9qQbR*RHA*Bqe z5k$;T*7+ZxGS3f&Bh&^B@Q2Lur(%7stMo74#5&a(7&u_SqYV=D+FteD&~vw-B!t2q zLk)}$!lq`Z$gGS|aWwRpT-KXE{zcoS0NbE(n1Sa&TaHyz$)os(gT`!{y6J(+e~>1Z z9CCB_sbEKL&Fwaewk3J>R-#f@b>1SQyd~RAqWv;6-OfAmMdEI!c^JkTXH4VOU)#dW> z;TO$k`E7@d|Iv@c;#DLx;*7x+_1a@Qs!V}#Q!{#>3EldYq|`Bt|FXs`)Sx)&zq>s% zSaZOyrbE1fyN8pxCLfpdt!j}is#8gL7x&#VAvx26cdkCGz~k5Dk^Wz^{vYX!N=K}I zZ3{H+i3N>lZG}9S9JaOulN2lh2Awus!O`$y!^g_2eIz zDKER*Yszj!kI8=!YCRF^G5~p)ps%5ZQatn=B0~+DHL3=n2h>GB^JC(o#Lv^(8R**k zdMW>JbHVO=98(BY2z+*d`a3NC&ZskTc{phd`3HJggs}rHTRWWOiZCJ65}*0$pVU%` zmY?hf7NIUpD8Y(d>zLh;fU~wTfOxM_W*DT$ovq<`GsDK`y*Lj`<^{Y_UkM zVWp#i(rBMvuJpZ+Xrrl`Q;IJ)mV?)XDfs}@o7Ql%KJWjzHdXYUe^@#))l~Yl!HabJ zEzRjLZ}eB9%Is*2<*kbA^DOx4`n`aF#LC`6FR$3IMupePr+C5sDt$ELTev3hR5^_e zU!fKI5skC+!9C~*)bp_$>l`xUOCt*o?eZwh^e9A;7>ETM59Yn2$ogGX+cDCin-vCI zc+Gi^;^39_o@B*8h?1ptWz8H{e+=Ov2g^fy=^BN4^OeC%SL%+s0eTuP)? zVkvv6fdcN}cL*qnok zqG$;DyM?G=KVH$dLXITr0pwcXnbuUV=KW} z7~t^yLEdLokc4_tefV9wkll9u7qY-6cl`cQ^k8kp^$zpj(o}bgmR=?*P?4??pKeHe zNxa!Nd}q+duh=B;wvTzjD_B-`XD(FMw`=gz%_)B$}TsyNyT%676o;Ni~ z?ZnRP#jxuR((Iu=hBYc67m<#Aqdeh^Kd}uaN|^R!qJAxjFyFOaZ|yX) zVmcPD)kl?6jB*7mh%>e4N;rH`D**lxj;wr`3k0?a{5an6<4Kt?=V2@Gxxvm#cfRV% zifsn#e!Nl+%Xn|3*XpQ(=d^k0@5)r4L6%>oQyc*=W?gRXv60#LZ|=V$Nlb8eEX&LR zj0+7yp;dGUU&|Ngh+Ey^NU_$_+Oks4Y&Af4W@(!D_cz7TOAOhbd0< zmf$%M&d?aU8`ML~XDrpDTz7Ehr&Amc&;qZmjV=`#$+h<>ejvSWRbon7S{RAmu=H8N zEGI|Hd1RQ6b`NVVC0S1UI(ZL{9`v=_xU&9WRv=%xB`Mw6KWpH$VLF_gEK&<4-%@Ir zlv0#pV|=u9>>WI52FP}~{FGU#AeQDVa;rN?bN}n3UyaFsD||9E+Tw4fRnC0aG2$Jl ziyiQ23}`!ff5EA9p6*HI@W0fMQ`n|_%ID;NrxnbS2Ex?&nX(&B`3SjFJu)8z!rw-c zt%Wnq1fi}?YqG5cZ+GKIQ0CSG#+iW7sc#$8xq>PeE)&=W(24caBWFM+lV-wad^Ff8 z-rJGxz4LzI=)X%p7j6nHX&0|!Cl}(JQT1Ic9XjLLq1D_e`+Vr_y<9(u{$z&zJmMYN zgtcI6n^7z3J4s^NSrkw6le12FFILTIKi(i+A5h$_KheJG_VF>-Q>?GcmswAof4yH5 z!BX~4Bg!07ZrQQ@4@)^EH5onXtkX0htY`A5D#~zKvvFjsV){ITw~Pam1=Ov=Nl!xA))sAO)Gk+z4Iq&Y$ocV{Q z`H>fcUc>4q=qd>E>(OhWciuk@ziiGsqG3;o^mTrZXtvdhJUuIvpaD+9Wjh<+iy4iYpM#| z8R?QJh$E=bi*d+^mu>x8ZH}RLht}r*PXm?IeT0n}?o&9GWT3iIMsOE?zqh{2YXQd# z>;_g~kyV;~&A+)_xCP-Zj(BN!u{Q=?R)UrgM4dw z+4~2H4zvzD5%6nkv_UCVfey^OM)XzB!XaQ*n0+ysHOp}rPI@b&aW9hqW_fe(JHQ>q zJIPq`7Y_CdIG=fU>r_ylJ#U??bzKO7aJ++X63($U0j_K`Q+tR|Ofr?FE|M6 zyo0dsN8VU2a24&iOtV{(>Jv$_yEQu85S=B#)i#ax+9mIelfP}Ev~w1wn?L%)w(|^GcBW zR@p!B9&{0dX;#GyS5(z6eZ`&e?LXdD;wlEP2)(=RwLs=0WTj6>@j9Jg@591vD`f3*w1Ef4Ffh}!1(}YkW z4@vZT=g*-0pAcbSBQZxs9fdg-5}0_7?AkV( zB!TzUIT2r5qt7kw>)oH6fp0a$D#&$@R=Kos4|4jFbu3E~nPyIuFB_FfNz95RRZUE5 z2W~&;QBv~7<7V?(Gu!j1_iRc0Kgxy)$#OjpE7ueY`xgVU+d+??+%<|n%>IC6c(=Ba zvu!x}f=(61dtUau!$Hs$LM09GBiBw3KN{n{41)$}WqC>A<^PF^6>g;I8e!Win^or* z79v5I+JLxC8G9Qs@El|nbV~@m^%!?y3__k%VJ@i3h3#Yhr4&xr%4?}TlVK9*3;V+n zI^#_U!J-`W2p|!##sSeh2vJ;sRwBrw3}u)o4#KK{IT+}vn!d;FQW5FCRhiBuh0Xpgid`Xmnq)PnRck5^s%s^-8hk9J4K7M;1tjxDMB*7udU?$rPOH;iGvdg8*PrqB z0m?@$g*8Hr5@`=e)tG}6$o7g50! zGZ)6_+`9z^7;vTge#^afJEeoBieihoTQ4OCYscbkEq2%ErbqL6+(CE@q|D_;4#I-I zasH7Qug{>qXj50FsxG|vz&56w{;DG_PQj9SB~NxsA*A8+4Tz`LOwe@m3>|yzvH2~h+BMWO%K7c5;a7(y(={642ueZd z8jn3k`3mL$zoKE2>g6@&ey5Le78#1LMQ$ClzFrI0?iiBLtZo&YD=K9dQzi+dnP#aS z)T;>c5RzD+?!3|;baE42+({l4slo2BoY`9> zl4mSkfO^4)R7)?iUkr*`(`4i>=rKy#28|3wct9S+e z?B7XrGb4Vo=6STC$ZKmuk&XarNO1=}jqGqwpsdJX6#IjJk?c4y!vXRqYMTFgfV2iu z(;|S~Uwds)nN4TqQ%6*r4Sb5xL|R}uQ*6K5HfaSkbQ0kZPN93Buw4u9Hvp_y_*N)9 zhEi(6XTKr^U2uRjvmPcGUO1T$x@Q$XZ}amGj8WGjkW!5S?&J$q<#TIz=YW#K%_fxO zS@BUaxLlc_z1}uVB)FXR^YBaAYQtae9cDj2GrRh52tSV3L|2rlT+gNsB{3MX zp*pKQV@$(&k$M;h-^fG@NCe35M9Lhc)LYNa_KG}pDnvLX-I3i7KZ`BXSOoWkv)7jA z1K%!?YEo-ZHHr$K*L$hw@-lFI!{oa^{1j3*OFQ#qef6i8Kjfng*2HqFs(M!{I!o5W z&i11wuFsF)7G*iS4F_HQZgzE&iipI3=*lzw7N37td*}6d#y#Ip2|&Azc+EbPXZa?- z+ehP6Nb8X7>D!%y5$SmR)o9@la@T(eF`_douSE{WPe7)eLWMSO7xt3iF+>%2NigqYVn;n2S)L9ea`k!zqoIdKL+ zJNqj~UfBMA-oI%Yj?#%F*3_77Hz>A`%qkQW{n{9Pf|5#dx)Q*^`9)C!^z7}8YU$}B zA{o`?k5tlXk@9!HW#N6+{w}anLXa10#8o-F1^i>MO{loDE)|+WIT!GC$f2l@&ph_< zdnV<=xIuHVQ{-AtmuY-KRbchD3(X=|mD*;hKF)6HW|Et80ujB4#c%yADplO}-(BLq zG{Fgq#4a(mO~0D*?V;qPkuPMrz3HtmY=I{}JAE^-Vr=_ns-(F{|DsqbStoxUKQl$r zTX|_$k@|wzlc98TCvz@!=H)4Z%gx%cB!>1=Uk&ij{BqtyJ`J$^SH>bi*VNd%^qIJZ z(A+AQw5voAT++hL<7QTHKwyoKTYay)dxI`7sA!l2euT?Ln4nH%w=u6zz(@}AN_@mf zuP~}b1FE36K5(T2o^63)h1WaK$|HvnnG5=M^{E%D*9CA zeCx$R5e8I|0l|+2Ks(ER*WYJbfQAr;T2XA@DV}vvMZLVYw%s@MAli>R)I;fkTY%k6 zg5}%2dt1pCzP>KeF^>TVgIpPTi~36(xH{Mh^aA+{*^G-VaFhj8P1F9G`|$| z$AHs5EIHYqv_hA{X!i;p#-Y{|G|Q(t*$w&7*y;)X3axZ=v@YnS@5Z@;qs0m_k8uSs z;%NLsKs8w-U^?uk4z3Bln?SVVVH1E^-=-qewdi)Tc?!_3l6bD--ZXD_XeJ3i zFpHMT*DFt7%`#ZS7je9?2m|j4MWrNpe~ySqv{}_ipsM@4rUXX*<*2e=^ zx!gR`H{kZBVl`l5^W2MSm8x-Rnf z40yS(OqZEtXmy~mfr-e$KhFQy`}DwPqry<=V`hnf8-LGF+7+J2_hPrQ< z2i}D+D|Xz8ycl07Qh*J-w#oiX1%n_3af;2(sa`2m9`aVO6X5)&!x-xn%ZeSVw*vB@ zls87S9|IOCBTCIFy&m;<575NK@H{M;XI=V_CIBu?KzumA=&-&kd_^ioZ-9i(o%FhN zK!bATGwM@oJK3bFQBEiJgGKX~9Ct6~G#WUq^O(X1o1OkX&1JqUB?oqvl9G2d$!L!S z3wi-PKNtHC^VpX?XwQ!A2DUU4;R}$M)20Du7V7@+mFTVanm}d%bFK^-*=+9mULH-+ z(3C|eOA!__0Hy`MZ~w(ux&?PX4))7SnKWCHV#$wgp%&~ydIWP+F9OZ}M<^^yK%V;WZ#F+GAE}4nS3NcNK zFciLhumNF;pFo6SfRsNkb8M&gT!@1(1+;gC{yp8a#0qTD`3E#$aZfb1d;!U4ttdZq zlVWe^9V4!pe+$2U&TXvBIpQH_{Detwny!vPb$>*pSm=uELw?-=QdQ>>wWOv?EO%oAXOht0zgcj9rjJC+R)eKQDYv5pH-^jE>0 z!*r|K{!K9tzau)iUhZhwX|MTa36!MXl4j!HRqy`ZDX$cFJz-~~>U0{`L^w}on){SO zDPHm5Ha9*AO=22fdN)^^xyzZV_+{~3=eNFuqox~n-xB$1UHHAk+7({^9!j-uXBH$m z5GQ`f%%p)1p=Vg3Am1@<&!AhhF1mTrAwlCX)L!kU#U_qe1*3){ux17q0aHtXJZMTG zI3?0|Cr5$R4G~71|1Njn7-5lu__(QzS^j9eQ&YoN5e+j0q8uhEWwrE*d4^}Y#?6yr zm{>l=F$gn>h<c+oQR}cMnv(x!j;nLR4Q#0gm3oM39Q3a!l zPB?e-xbkA&JJz=AqLX z-B9XFXFf&SXkE(B;a!}jxX#@70PEWMNGX%qX96@gTbzFqIlJ}=Tix>Ylj{q!EsF73 z=5IM`HH+d-KeFx!z9($Z-*tE@oN+Lcbt#{b-9GX|_LZ-9>U_&*8IMIgj%~J*UV(RC zjMWlC(++z@g!_ynzujiZA_vJ@Po)vO@$XSX3D1H}Y(O+Vz%9Rfw{XMGGo7>>?Xo9n zNc|;lxgtH|)NnWv2Zd4A(V>sso%yS6&klVrvu~nP0=(P zV)*JyB*z_M&(5B>WJry<`-%F$S%sIDVChb&j~x}}N?xxIb8wuePpC~3xX$yk?nOo7 zOUv)7P{?4E9OY_IhL>FUE(d=Ia7WmvO73=MT#cfabXGo^6S7hL+Hn%BO`?Jvge~|R z2-s9D&$2ihRiIneBRx!`3ckcG8P!Pat8CZsvmNNQBb1wsRu1Y|`xRDA)iq93-)8s6 zYIW+&_}7nzm6XqX6P+L~eDvF#c$2mjM&G@6gOoX6{qKrchc|u%Y!Ts|D`F;IUgLEq z)`h7(8{mP^Fk`*P1Mz^ouCDwA0{`Oi2=(;iT12R^g)RztH4pM0sz)lobJ#hn(8(?k zsLMneQhLo3LeeNB?eH*H^TnJu(-=j5{0m_}%CB{2vL2!GMZ?H(&b@tzJ#AypHpUL6 zj1?pv<@7P38lF3K3h?lP>z=e&s65f~lrA(aWa}q_0H~OsvL8f>!v-8ed7s;~sEP0v z@+LTU{e<@a)=o`mMU7M&O0V46L$mxdG9C(QSXLk+g)8w2)F&SuLCB_pqZHcoPVl_J{n>E}9*OWNemvHSq7CVE?YanF z3yX|Ot;fk(I-yDrYeYxwtHrx+R&g!cP7`X*cQ2C<%YBluP>+in1bmHi%L`uE1+`a? zX@rfDHFYPv@gms_?A_M`d$A%ZYP_aZ<0qKz7tbkZLr5!=VwkbrHjADJY$;JK6BxsP}m zeh9p&BrhHJfTXEYr-1HW1>q@-DI4o5r%1|yo|~C_qf_C4EBxPLMW6-{7dZjwVYZMt z`1=0dc)+;9;6Mdu-d$%!qZL9`jgzyvexq3#?lb;jYtTeD+gyXVN6gv8zIH&6BZ7&oxH=- zS8MEUyBLef3Ex?GM$tJzeIaxH4nVqb_#&+=F5u00=?xkhUx*{TkJQ8zifB{ zplLejpX}}+bgq=smIa^%Wh3`F9FA1^6s+J$CQEd@3kmG}>ju#XCwlVQJH-Ui%%leu0!Ph#law=ZR; zQm?nZmB^strKPXt;bs|XJ)iXlB>cE>@0INRY^%yNkAGOHW_Yv7eXF?o z?m|WsR$lDI#H5;`bb=|$P|;pa#j0r-)6Hd5>zmxVZ-Y?1PDD9)e2rM8EK%f**%&+{ znaepr@oT#q{c0CiF<8I?Dpir>p zSSXtO&xE!p{KF+f<6U19?i}nI=hd1UMqc>GO#yfSj~N>iCTm}%+6Vb`C$cmSWr z!*YE5PI~0WalBxrz?ey;V{uQ3gM`g103o77nB@;epGxdd{j6`$hNFT=U=0<1wcQqj z>-?9g>#FaNVxE8Q-#Rc%L)ZE|0)m1wRD{_Mj>W1QXne5vv9g~{zO^$kp|)c@XPH`~ z>+8~>q+Ee(xiS~EdV0fU!|*N-tQMTzLYUXjhlLoC!Yw9;(bGdQgk*s{iPhH(THQfE zNKARF^_GtXSb9S~>heS6was;Zcyp4n(}%h2KFg0z>(Upt@~bX9ZjC(zbG;kZz!)c-!IB)?1jF|S{Hx|RrHPAK9dViq#S-=U@gK&Kly>W zUm1EIq0NHaQA0~4g=tz)>8!wT{$H2n86yb#6i_F%G?l?(h0j0^b{X~<-!Esi4|X^T zs;}E{*aG0^PXDphqg$mvQuhR$=x|yfgT^O#b@hzM-_C{uG|7yAs>b)7Y`1nUBb* zN9|tKx#|uNp)r9M*S;27*&_c#;iLXcx0nR{yBFLIg)%EV!WY<`X`4fio(*%(7eVr!`T)lZYpuE zDY}dbs4jQpNQA}z1*6JvE<4Py0W@23$ioZ{H*=U)zydu8-e;xZzP)b(ko+l{W~l z_)dYT=aKEGka49HLb54T7p(GOCzK=_vt^%3)2sd4 z9l;Fi9vtJ$?1E;M$~P)sFXuF1@Q{L*jzQ?PfcRWN&Le=hQv*c^)eo%@tW@Y6yZeFq za~o>}=tUK+syS9_9pavoZYBf4Pptjt&oWs`mWJEun zJ3GUEtS`r*5R#+M4O%~rGjJo0ePb%3ydiegY7o_8AN24`JnN>%>eyyrj4ba^!rQHMps)gepgU|&Z1DOQy15`4xA8euWlaah?5&@k!3I-TZBh50ZjJI?E zLI2G~vgB$T2cQna&mcWX|O%xp;m1 zNreYqE;}Yzh#>a=$a)K?Cfm4Se5jy+sH6fSN{1jK9U={rhK(2~NJ)1{2qGaMA}t`` zklYvz8=-VdcQ?}A2>!46yzl>f-}!bw=Q(U{_kCU0uUqlhvOoF4O5dF+XaZg3BewrEE29b?*(BG8s{jKu*=KO7xkBd)BIwq;E;&s)#oVxI&BPFo0Y>p8A6ixoq)fG(Zl3PA~F1BKco(wPuxk z#uMI^3~kWlAdI5}ETpSsw16bjB9!fhL$``P!?^7M^!u-~~zR44MfR^|g>`cc06jL2rs1>=?np`4(Cgst*7E z>ktN>`@)uPMB&j7bP*jL>cUFe#b5Kk@$4U$1r0EOn1bLHNuGXIuKB=@XNATz&#nLr z#Y=S%&c1}h@10aIQD2@3WO@uj^gzZJC_Su&;JplB`_4;;Dw8l?3pNV8T64V}1>=c~j7uA}C2YXlSkb4#8J{fChm! zY3q?{$2J=`WskL+7wq3Ax#=dKQ&uib2RrzjU+gFwMr-lVTr$2?;n>6v64u|+ZCBG9 z5G{Lv=^eLJ%FV!R>vvcAK-6CnvG^hx^wb4lr|wcH78rMv%rFLAP86^B_ycmqcVz?S zyphXjOc)L%sU*IpuYHJzHDIeM0MZNGpvFH zLY?$?=Jn}X>95meAo6a5nKt@f-7!eO4izqZ&gWt5G^*Q$oLC^pXg@Qf`TNb9$qbt zY`t_GUU?=3MlIf71Ob`+>`EYmiZFmJx)$WD`9la$=HDD3G|&EFI}qf!3TtSSAs(rr zAP57<8`vw|N6qJ;t$L@wEs^HNGs4ja)1aSYFDReg#x25E~B67 z#xp<(0Q)cL0Y9mH(r=6ky|c!%OQQhc$@4x^MA<8)K~Kj!{zB3nB>vQHCcN06MlZTN zs(V>2C4Kk0J`|(bwpB7G&wC3$ykq?Sbw#HMN+k$g9p?e?U(+Ke#myY@!ZO|g|EE`X z+Yj{u$r%V?`Xaw}zCbvLbpEp!9)fZryc-f^$wPpei#H(fNDiUP0v+ItTLH>H$Ei(x zuDXKi=vK44EkJ?Mgh%s4aP z_y(KO<1+)I?=q1z05>S$sKvWm!N;*-0IdP6@%lcv8Sowg1;1pN)t>Cg@(!Uhe5Mf3 z{6U`^z&U_M1W|z1A3yAS3+>;$BskpPEpp=-z@bZ89Kt1J*B_@Df!+_sw-Vgso`)Jk z<(X|%>+V(@BwsUj6suV@h@PfREHG2Hgs1?l3#=98+p5HefvF)ZOU&UkV11^9a|F9iGbDb7~ceJVeV_bkcNgEcD%z(Q= z3_vbrICb}nFH8`A1xa(J_jt4cnhfX<1(dw&UkK~9IAPHbO+S|<>X7HR>kKtlaq)9T zj}{Ku3aM8KbcW6LLFK=ZndQ2lSc4m~GHJwd8U~JO4-CH_Zl;g)Svl*j`r0vZPT1#j zc5vlh_JUA}sJ%2uz$bX<`ZB&2LM)1MdM$WxtWa81cv;_lA|P($5M;*#e>}+MIY>wn z@dxK$edJH*58>%kwR#K|2f6&eNDh*%fT?i#1r*FQ9EdFa$J%E831l#o&lr4jkiSQm z#>4_6eElOWp1grbyKUD7T{i}(f=|o69E~58tAjrU!I{s%u+S!aZ+ssBy%vHmYDI}fCIRa`~Lo=B4dz;_-NdnoA>LN$C02r zK6F`kTf3m+y&ey15sJb z2hZ^JhZq;j6mwgr5B9x+fC<;bZe?r1@G%Pi#1HZHM&ok^VD3`u<$-g8rbV!9KyrXr z>t}q8v$+G_{71qBB&{jT{{Q4uY>Zi^UhQ=d*aWKv@(SO87@)vFmAtFU=Qu|^6DLSg z#x+54YXNv?gfWD`qIkPS3w|F@9iVG8h;dB#UztOIP&7c~#WCelo2>g_^l4=+Z$FI{Tgu3xQWoib z(3~Wd=eDgiK^_=b0b<$sd9@M4mUXLYpXa{ogXco%ZFqZML_J8|27d#=8Q+Wrm;wGK z1q~QdyQUm%=lR!Mr9jVpmW19ZVtS&6bJ z*AU;oMRL-F>%>K8zIta2Fv}5a=}BIuzp16+8YkebpgUzN#33Upy~rO=cT;8%QmVM< zvRD59>AlX>-AQJ7AHWkK5dD~kHh^g7#_(i`bG~B5*88H!|E?#Iv_EnG{U2hLzvx%| z74WjKpD@(J25>n1{1VsaRc=BMP=ZzfBV|V#M2{K)h#|ey#XeKxBnqTNx$RxNGbB^RzBM>i-EzTv2-9E{$KWh!vpuO zo-9eKYItQu)U$^GK=>L=yBpE)F-X21p(6kyn<}0p_OXyg{H+0;fV!2HTr!h_W4%`l z2<}oX{`1QgKmb7gHR#Oww+MnZC9H~fIUZ6V{{}cyYVn|N?)om)Zo>{O;hTAX?G|LWo<#mau& z$*Ls_PJ;25Kp@IQj(O-c>?JN%L%58S;HzfVPK0G$z^RtP@1 zR4e$qn(WKNGJQ8IN z3dG9*ycEa3{zq3|FngJ#9iA^4gffO)rv~%5fNL27$!A-C261>82h7pDs-XAq)GKbi z{`j^+|GoZ>L9P*8f)Egbq`))eZ&8uM*bbSThGzu z65J>H5YMeY90OfhO8NmL)UPtl5sm4AJAA2diqz860!*)rudJ+g)E_eh`r3Dj_9i1c zi`-6SSSkxo$_NZGKh(9BX>WJ4P`u{WK|Au8C$d9X{T}8PnmtlekCThC6#ii7ps`|2 z({0(qI%LG?JiNha{+N1zdBry8{ad+F<{4UT@Yiu> zJFDFMEUWz)u1J@+g0g?E%r7s(W1%H-aP~;1L49(zLR7}sL=agUgBPXaLVat<~J2%#^iqz{e^t(=_UFTS{#$%oUZzY zfe6#h&{rXArdG(y6AhmMzxC1q1EN37jz}nyHAK$5Kt7DSv6oJzJhu7@M>*&oEv~HY zL$$0C8=Y?^A3;F%7c!9MOciJ8GjVvEq#+aj&cSLBev%fPyCCmeOx3l~t{$8DD!?fv zG&eAble7B((?f-%7*csuy^viwz9~H8RjQ zqwQW`c1lJCo@6&1Wv!ZXAtjV3(d6O*@7VwMVCXqKqqd}vKha0tlqaEPszRC32I)3mBJU; zY&1tg|0;JvT0*j@Jn`H!WHGxVV$2m&$LyHLpL=^OrJ>4ce#FrCN@n^eIuh>sB*n)v z+4-E2=E{GoN_TdDA&IbM4dz`i)#diO(U*`>`$j9 zcbCQE2va>ywuMLzGxkCbdnGEk$E;(X80_T>H)UX^g~-#Ky`MqBA>Jv!LT~&!eQ5_-1-J7ja_f17B z^jr7#o{%UP^Aq*sVud_EbKn8u8hur1f`>m!jEZx0&iKgUXjAe$sG)~H^CkoJRVy=P z!pvpN5N#3EC&7y2=`Bwm79W-mu~S;g0%f&Dr<1*`E~;Ur>bU(?eVpdX{G&(0Qrx2V zocI0#+&;vB`c<@IAsbRcjtUQ?B6e8=a-5fAzNU0>NT|EI=hiweeI!{+mDA>gr#*#n zrA4wzHfqaC3nQf|sViCx9x9O&^ZNMt6(rBafG+){XkS~*Q-2HDv^Cxnyr_umxJ{RTATtrQ)(-lI7URIGn@C@ILIp@ReU#;r3Y-!6}4l@^&f3DSPSW&{RVRflB zi4;+5O%!XH7DrQ)%Tyn>&biiAg1m?ykG-HstJnCJ$Br-{YQM+g?N-KUulA&C+j!vB zR>~d!ej^;$_q=W6nYz07@2?WwxK5J6WMmIru^Oum|6S@8E0(sDIbb!|CviuF573av zCke+*hWcoGrR{+}FE`HPN8Vhvi%#*48gKbAWDW#+OweMrIi`~+H%tKIic#g%tj5Nw zrX+@zxoyK#kMbR-%jb4$1_R8__i;@2>D}QEgIqz2T61Gm-CSam>yMtM=EPy$=hjfR z8`c5e)6uU-O5RHcbS_yiF6&M_qE#MuIev(k-tzWC?XL8+-7|@+T=qIwnk9bcXxLu&R(g_l4ETaVJSM< zR8;1yl=m2Zh1Lam&MF;ohwcm8JML2kuY>128hZ0wC$hIoXv0v=g7p!ZYmkwmyEfG; zm^E^2P*zM?sw)GtN!M&L->5oRSj^#$IMXlN8X5CLcKY2a5d1h`VQQ&NX%+OIzFqa1 z>l#;eHaBDxbWmxG&%jXkNm<9mo`#Y{F}9tI)+LgKDOMOVBL6}N6Ss!LSI-032BO(i z2Ja;uroCiYjWTLal^LSG+qSSmLQ7T|WF(_fJPWHa(4~$~;WnT-Q_1+0immLaR(?Np zV6QNf>48w+7p-Azt@EC6?s*g?Tpg0~R^euA-N_v(W$$$VUvq zW1qHcQdHPU_52yJK78N4G&@>(mMMsC%@dL4cV9Z7#B#o$zKDHsGRePM$CJbK5KVr( zFfSvBF_*B`8YsJI&_CFJvB2gG^9w}2WWsW?g#5W(^-}M5v3i(LnC)-wpU*%4IPP$C z)LHpywvqMQMmhSvVuGV^Z9H2$xtNqv&vArNM(Yr!D?Bc_EbEjpnaqgoDW^lJYpzvn zm#Qbf{eTG)Eus+i;arkM4p|ty+O)x8;@ce-ifa|`Zq2)eU}R>hJ|0Uomf_n7uOS0L6cB5=)${` z3ZD0|)-UF1?c{ndGEcy#p%eXsRs!?rR^8Q?@D0^`02N76qrjhzF2m)HQ!NXP%2t)B<5*X90ftqBO@Y zbblC3(-8Y1czo<$N0qtlMaa^{LpOEXk$63;-Ib~ej*qalFgmWZ0#$4H*6dDtr@8Jv zuB==aM(ah9_y}bZP7nKj@KR9HH%NQhZfBy%?+>AW}MVd7x7irUEM+_&~c zD=}>q2YediF^+HzX8f#iGKC1=I?)eO$IbGm%G>SdAGGwSZH}0FZx*RpLRC134OY_< z#cf~jTk66%+gHlXA{X-=Sjh_4E{)Bi)KW911e>U|9NKl3Gjd+Ls)vYJ4S zaNqfAj|kHzLCexl!i1|ie9z9quq!VW#n0&kH}(DGxITTdds-aq;JPz1+@e>>I5aqs|@|+*`s7MR@4cz14S*7HeqS9(=PY zn^5#v?bRDG?y0kjCjI^LjfQRi-?({BF>;#Lh}(q33iptkLq{v1*rgxG8XuSOrWCe< z{h61XGDkq8fT``tn-|8&lXo%^ zQE*@GWno63ob)5q=$|O>WvjF2&7n#uUWd^=j3j6vh7%GC@mG{=jy|}E(>NDSr1x3V ziIUdo86+gEFMW;vrto`3Z5DZwGt8qbx0qq*+Nrm5dH*zoUFwOb=)>Z`XmhNoZd)a- zxViPv@P>o5+Go{XK8>>-DM#?&F+*Wq@yHwfvsF;#%g?5F*nQ93u$T*Uv+DO?lKQkk zM7E>sIY-9n8+OZOo9A9A`P|+X{yyuLoa`v!^Jxl8lEKiR^G{gaM~S+~q?mG@{TlCO zGP}Z>hrhF}(oeX^zLjdpq_xR?)7CaC(mXplqqgk(@x7(5U0J!mMZ%t;Q+9mTU9ek@ zMZhIT5N5rzS-w`G9f+38*{q-S)dfLU@_p3%m2l3sU*i^zp-+Nn#@^m{h2;vibN zdiM4=S?w+q*6(=a^vMlYF3J>5(u?(@ZkxcvuO-JO7zpnczJ=dxulxVC?7N;tiW45^ zVI?asRlGwyOq@nlOIbEV7n_*OMD2D|OZs}J_ zFQymRYK#-7HBYB33M1;5gu}+A$kN_&rxnWCTwR_Rl7jJSHfhKmW^R>fUELTC8pC5!|UvGRvy|&>Oxd6k7o+J~hcPXC*6s$<&5*acm0G#*I-r$8BHQo) z`eQFUifH(@6-=288m8z7=jrB5ph|9YQ|9mHpmwX$#xN-I_iIwT>hJT@;llF%Nw~Rw zjs2H)+)AHWN@V9Ro|Hcbgm!$3c8*O*D_Lv`QE2I1HkDb{@)RX{bA3rem3!@R1}O68 zUfs!uIhO8R1u2wAgbuBs&hFUGEdoQw@R1pg)}=b=@IvOZamQP)l2-{WTRWCj<%}eo z*YSNQR|2MzD-77Ux$uQcLn+6j!}-afbaW>EqGC$CrYes=2ojPM(`qYgo@{ zQ$;e-pPRp9f8P*Ub1dViB!?XBTX@E9e%|d zi|EQzStV3OeEf-}{VE|>OPh;etk^KO%E0To45id1KG>|n_e~kh9p^q9x_1U9vSv1N z2HJ6XqRRH9XB1!bi(bFe{`QHK<0nUn>a-Uv$z&DHK!X~h>19{gSwQ%L-+PPpTVe`F zOxF=88w-FLc$>u)FZ*`DR)i2| zr>Vk!_Hxe+pp#lZ&g2if_hFHf{b?+kzO=8N4iZv$h2>@$`O*yB70=b;cBRbZW@{(X z`jBR0bN3JCiTvW5_U2Lq{VA@zg-0m22YWM?o~?^5Oz@+KQewT$xxnYAWLj}T7v#t#_}9jY-XqEM8~~UJX=t0sP-}X zK2J?Bpf)X3BFkaxCWYo(p(k@tH$vBIASqbf|F{!RM|1oPEBXtual(}ck-D}{PBQV5 zOH4>{BM^(Ct?i0Z947UO@34lMs&NwTY2B8B_GQ@mu@?fW9UM0(>#I|dsA~nKYX+R{ zw#Z%fjhEwbSa76a;R|m=k4`DQ)%Z5HGLmN_u;r`XsM3=7@=!~j%~F!WER2}dhE(`qb=5uY z^+`IK%)$#-E^mlvW~!UW7YuMH3e2M^5Bi_2z>9D%VqaO~BFg;ihW1nE{7_5_`2x6CKW%FEF6Exx3h(zx0Ingch)+c4HB*0U!^ik=>daDVtRN~8T$gTQH z5pdf?COK(Y?@E`2Fd;vAJ$I)vT)}~*9r;1Hx!dO>(Qg~~(li#UE4fs1PU7Rw&FxTx z*Gs=ocgSM+W}n1vnkb5FC!U$Ygfg*;;-f)>mZVPB$K?}T7oNHkI({sF?k1;5s5i%Q z-n&~p;kbI`g|4RLqaPj4aj%86p5F{7$M6jYPHYR=QtjcWMjS^R@A9)>$bGZiHxIL< zR}GC9JgH;~D|#kwaggO%z@-Y0(~lx?WuVnot@2{b(H7;>37fpWN9N+1vVermXPf$JbiG)-jJz2C$%Lf@K%vq@jk2+ zlE3MyY_xGdU*m44>76mD#nfWg`Ot7Z+ux7)Z0=0(CQG#l6{XF`)!<1lav?R?asTO3 zax|6|zkr}(u6|Ui;zw{IikdQM1CoNd{6ZdXF^t3%w(W=s#~BfOs>rCErx7J?G6Km@ zldG-~!k%A#dc{(Ck9LVwL*VthN*C`hJiHmVg+>Om1_moCj$OzXmTp@@59gLipJ%Lj z+n}E^SJ77;<`16d|IZmH9t(S3bj5A6&!z74@zZ^GEa-RbsW4WvDpT>C)+ObWX16Ql zPd$H}>#BX$x>AB`Mzqj%*tTt^Mu_{?Fu@}!mUHW!lSx*xe%?ykhIhYF>1 zt|v4?pH=q!xM_buQOED9p5(YZwLB&E;BD>pIuM{=V_hdg7|Eo#9;dyaJIp~|rl zUV$2~zSGY|^;K$5P%`to$Ns zAz0t_R%bWtL-qr%+Skcjo&=C^4*F^s79%=#PR077;zMrKiX~ z=GZc^vaWtbrQ&UrC>K_q`WdDG4ZoP$9f#f>d|LMF?Pt$OVQ=~BYIL}nSLYh-tuhmB z?eED62`Le5y&i9e3?7vwT>YJSDSRO%sG%R^wAD}%`jGsEkm*qFpnYOW$>LI&^3>Ag zhaHC}=a}W?^u?p?yNnj7yW|ZisFMWQeyCI%FkrMU@3vT7CF?_5%fWK`$Q*-=gq2j- zly+kzlw(-XDzh)Xl~w;T_2Z_iUlMJ1(eG5lV8ZR#zHc;*FWj#9xL8&mxncbmvKkQZ zV^^xKaqDO74)=`ivGvbCx=pgX56>qfCZqFWpePQnpu&N(=W@pK2AM*|f;Sy1otY>F z`+~cpr0fsGY~NF&=;%HM9hAHOFo-na)iS5DsA%6!7X9TB7q}{LD9}dI?>YSX8S<%V za|f-cqNU`0Rv#!h3ccx6?wRi= zY%hS3ZI*6Gf&4sRx>pGle^S+ioyW2(B{uepaf1?*sXvjvcCkYvlbBMDv9Bkt}_`8|Hu zEis$lRFRH9rfuwQk97nL3F>g)Tl~2*;rZ!aeD)uxXWS0=pC`uI0R;I@nc-o3|5xb1QsSOSX}&nG>8d(_4d> zzjBC)iJInsJ?LB8)xD`^9jLkHm)l;(m?(l$M_V0vsKJ*u_%~OQWgvonz&~Hum=#l#I78o~v$-f|MV)~6bg^B)%gwSuvmb93-->fe_`o2%R z|4pRP`g+8*83~0H4HJanSOf7&(9Y+gz7`T^UtL$*N$c@d9-6W?r-$`CZ`zUA;ioOB z($--S@C7cjAlIO|UN4?kgNvnx2(EguRQJMkj-hC7kCWuif8c(-%{hk^{1B%LvM^bKkY?!B?={x@Pz9@U? zwEp5=a`unb?9i9g#N|GY-#EBZ&qr4ooqnYqO>jaf8=Lrls(>unx{~G0BmUE0JUm5f zcDbjMtf5U>z6kaDBE<}Nn_(xP_|hwxokts13xtCTh7|w9@OW=`%j-_~U8S5_(5_7j z&A%E+MJS=>eRu={wPEikT(l(jDR*M*sme6_KC;*@8cg;^i7}W5 z-JldvCye{?{Lu$PGEq!#+!dm1w2u2DYEHMH6g=d>6A%+lv&*-EF%QgO@euNcD@X6t zF9$Dtxb&8OnqgFWSEA|1*`?sdj7>taR2I&#@(b<24@1``cpmqw2JTL+jCxJh3|tcQ z?hLzVXV&e6_1Uzot*5#7L3_ zj}XiFJA>Rl+sqtdhF7^1i3XG}SG+0|7qMgS48||aU|n((mqcDhRvm_KnAe@mpy_QB z(tRX})qQHS115e)(KQdS&K4ilsCx)%JKA+Og@6nDg1+VOFOSzM)sa-4s-1`a-*3Gb!@Okp^h5 zc>ddeAvz=lxb7A$(|k`Uv>}pg~c@;IwkJB-0#K|4`d%Oc@k)ujcJVP^xq) zqwle_L;XW1Xr`Z1J2>uF1+sMl~v1r~g|OQ50go%l(~mX+FlWJ%*YdE;|= zIYyf7_tuwK0>|0iS;;~xnin&e`tlY zT$M|eOMO_N1EaNL)3PQ>fEP-n!PQ1`nlJIZ5oMKbb_Wrg9A z1`-dW-vlmy@vu`(N|9Ua}q>Mx8LeiTs>xo_pIX{iafvfN2uO*Lm zZr+t5$)>IBdh$9wlfOhZ)B0!aQ1G|SALrOr%u_#6IkOD!Pj9m3kiy5gBEOnD+b&!D zR#a=FFxWy5!bGIk!L`F!(?exSCe@W{ zSFba)NH}mLxjD~XDRMULuEhyfzj;0D3tQs5hD25tb$a1YnM8|2YSXvg+fpG`JCj+7 z@m2w_Z;7H3C8{Iz!pz5}4UTgn_LM5kHZ1ef#b4SBp_|mE-n2hWggcLI8hn#17Hp@# zP582JZE!Z*MI`S^MPzkuHvqQbbl303?{Z3?bca~g-OxO?5Qf+xQ;VagQlXUNu{~(| zKZbK`CxO#Kv%($64T7aY4m-H%?JcQ)sWzAYC)LJJptIR2`QyA4VJz1IiX$upCcrld zy(=&#xh>&T8s74&Ck56M$B@F&D>PZJnQmA0vEPqyD`?mJC-VypUFxe&-!V3&3M}~y zPs=GhEWRlw#ppgjJUDJm*N9Tlh!xas_gXTGYm`)crR?bSxiJhEkP&IDCcJY~JI*2+ zE2OfuwUE;_7}p`VTI~1eG=Hp za37f|6mCc?sK3y*kW}&|YGL(5*tZaqPHdsY5pC96BI_^NRH+6qy|Ab;O|3 zF!vY4qC?$H#Gt9R;EzqK)YQ&XN*_)h48kY(lt3` zZb}Clqkxa?sp#@hLpW6mGF|WSq^Euk^G%DMIiW%WQAO`aDuVR2G*!=^B6bc7$XpH!llt(&`Mmbh>3 zLDC=^NBmsHu9&S|o&4xw`ImWmS=4ATH;G$f#iCC-2xF-omvN-XW*b`Pa;C25kYlzDl*Uy|y_ zX<*6NTjUh)x3Q0dnrCmaOJz9I1CU|~7zDK`T_*@Ai>7&cUh={S1pmWgz5Pz(JmQqtqaodZBZY1p=M*ngMpnAE)L; zy6TfGjZuTSI!2TlzOb9{NG)5kH|8%nG(!3HRvOlWk2R3<-_pHsu2gdO2+6N_QmXZ| zT?)Du-I_0x$;zp;xf=>q8yA7V9nf=_f4V774-P#%{%4B> za?dzokO8sLEalT6pnEXpl?@D^{5XwxgZSh8l z`LBk{acvMEwDvzmHx6@XWGq`d^Qarzydo!c<~F#W^cpeRi2BM+PEx8rtAy62ylS_Z z)tW*`7A2-w%u2^LKBDdYaa@?T94u=YM`E-D>z10JK9j6a=?&; zUP@ldD&K@ODYipsT9qw%L>Q|rtmXJLLcP#8h)CJt>UT*@FNpS zdaA0Mth%UF+_hyc;hy=^8?E5C@q&;sZhf*7@%=nLI3OTUcV(j!%dOqQ)%d!R0z`{?lPOZgWu_$uv75yj%7w2P z<*A-q$q&BN@(ZGWVJP^cLyCh0`{grMtbgDK*4wNyht-B@er5W3W%YCGM>1IVx=?8j zR-#XppH>s(20O_PV)~j3U0%qEYg*?jkcn_V6$lwq#gy1?>28G1{^U2F3Z2}_Rd`uQ z1=;n3+5!8x=2*emY*mZQ#(BAU`7ZUh*|HImgFnffY6#=P82gEhB&b9Yk_p<@<-NCp zBnX-E-+p-8Z^$+wM$@3iXzAYG;H->Lw?$(`b@F;?Y3a%n9jI@ymzMcZ)%TB2Z-g^ET&$vu+$gXqy>RG{CAqL?xdXJ&76m2U4>KqhnU3pkIJiCbw3r94;Lu%IV zWFh(cr^I!ADZXWg1!mXTe0c9HOpnb{doOs{}U8&r<`Gvb`d0wS)9o7QN*q3FuJ|M?e z*(Sv@(s^L4lznp6tzoo1>DDkR6jz=E3EjWLaM<+z&__AM>*{Emtjstk@`?FF|4X%y z1kK0Ru8WrIgH+r+ab#*d(Gv$Yq(P3+LrvV4Ug2ftZ^b@Y8I2`HG&Bpq_g_N$t3EqG7$N8vNF6DR6jQ|tm>vS{JV~8&~)(oB$GYy zLKlkEJ9tg$nFff-}GCH=JAJtN9z*!b`XuoWjP|N*F`7Mw&MA zGyy#hA8;)9AW*l4uLZU<>wDScX|7p?ElFPYn;)7vcThUnY__X;hpk%Qcz@=Wib_M~ ze#q`wF{>hwiI5n#$qJja$`z0?x})yA`WN!10@_o&e}wkAtrza9ctkW|_4Lfo*KUf^ z2iIk{A|)}%zWLhVplIC6NifvDb?RKeY~{$4IDKnj{K}fbPl}~zx>7+ni)$o+Q})>d z$6@O6uh@pH#S?2I&4J36J=WOcectnThK!hYpS5j+o%64SHTLctq+B^Ki>LMXS`#*rL#_{)JO8ueS(%YJ_!xnlNV^)hl{vqWP!SHO86bL%ZY3_dDOF^P8%?0B`3`Y{Q_X7`HLnTl8q8y^{Ob2uriQXeVgcxA7>#!Bdl-2^y?1u}P=CB5jH}uc%I; z6KF5HZTdYP#j}lrJFgnZ&h;mylqI9Qr^^J-l6U3gro^}g8ahOBhw{I?$sfFCwbYO= zNbj*MlpYFF4acQrLOw;nF@8ltSIP7;&Wd{FrNdNtU{x{7jsBdm3&3)$V+H0BXj zAIZCj(f!KSl}=HN!5i{duXQw3qaV_J>0epx%OA*;QeegE=Q)t)azC|?CgFH{&8yGN zx7X`*g2StJ+2^z95LTI~b#)7RS`KQHyq7m;qLf)EbmY|ZhisR|*!fw`|3b81;_zVk z?;^Xg8u}eU2ena@oxB@W4tJ%?h!SJH7R{i(>Cl{?bvrEPG<6cnhre9c&nqY9K3=S} z^SNrCe=uZtb~sYi-TN^F3jm1n@?SgEKcvc!qq^63Kaz zJ9HU(?5cJCf#+fcb>T5qY`eeYluS}2716Ug@P0sh2B^<6suBueY-4O=oa{F#fZ?mq5d1$ey zLIPEFD_r}rtl3a*I?UNJ=UvL&Va8gxg5Jh847H*I!z$KG4;#ix?Pg=xkiND476erd zq4!t~H#nt5I-5Q4#^1jM#f3Grzn@-yxUkhCL>V!*=2$=`W-0_uA~8LuY5mFXOw@E=%#_>Z>%N@c;Mv6v0?b8gj%S zyEpwzvcvhSgNbU1(^rdm!4wDO<3Y-E*VH_Ta2P#jBP{Iyqv<-}q5l8BL>VDFE0vKE zjk9NE%jS@gm9sfpW)VkL2$^M^y)zD(XV2_)GS0}3?A8B$eSiOlI<7uG_xXI@ulamF z-|x5jO(8ACL)n8yaRZsm2Vu)%tPcLlWn0my)L{3~Pv(}qAt8o;@rq7hGw-oNaSknF zMVa?vYktjjIFYC~&$5S&Gi9fEzrsvBl6=#)6(Psw^hvO1i1|L_1Hp=Wl@b{;KN8+MxwqW; zAnO22reU8l$iNoqeEHSu9ugvLpR{tQ9RUEm`HOe8)z4>*D-wm3HwqQqGSqG{sb95Z zf1k_sX=MOie8W*mm$;FPh50YuYhmh*AlRy1%IMb=4Co_kaBZz|uE1=EO^ULTyl!EY z%O|lh^4(uyJc?m2)VKv=*+VbC6vruFBB1{9JmYC}UAc$5H;P8@>3)!Vo&gq9wqF5$ z5V=@0Rv+Lj*Qk8kfL{=6KPHSnt7X4DT2wvdwm4SYFKNZMdKf$VI=Nq{MYxZ1CSr~& z**ax~+M#3q5>r+$rY>Vd2``RaoJ_ygqjuE>Lr!gKqXrXxEK^JsAts%;^lR;m&&bdD z^2{q9hUNbC{pXpodU|nCd7dR$g}KA-=ARF$3K%aOzLKSjT)W4p&o?zS7} zn5Wf6m;M-`tCCQSw0!Agyppjk@Ii@6fX(B1=XhY$PlGn|SxQB-(_nUJ!CVeirgI8$ zhdnGQcEKMLIG>zT9bZ}V*x69R8cD1vQ_m>EY0srS*47SZ&W;fw8&;>X7FHY-?jvF9 z9y&V&d@IVS=~Ps3+SNyAUE=^wldV{t7ne~?RrkIE+AnPkNf)!a#8NeMIrYmc6>qnb z&&6o+Y}APAw%Xrox2b-VFrRKgp~pGNnM}hu`9>#=n_WKkVb8a&&74Wjl(N)TyHD&R z*>s^W#j=a$3gxVV*N55cgF>Um;<9`z8Cr!9pdCv<>4>Lg%W0W4{URGyOvPbhjEYRz z!lE)RrWv*4QPF?#D%v|IOm>cJa=fqeaMloO3QlSp+A7JXN(@J^%T7K0!eV6qMv$eH zh2MTdQ^%lcKqAk5bB!v$?CEaiMO6S#|#A zzf#y_m%RJ=g?5k<&*w=W%7lqC*j~o zdsp=huGahSv#wMgUIP;Ya8I@ScP2AAwGC&S(C~ePV(FCa>c*F&6Dx+AWUH^Q&xILE zhGkPO3tB%4Mx@`#9kz`7HrCtgtewwD#mA4}>9{R8PwTFx#UYHtIcY>VKl9BElK5=3 zYMj&Z)=xD#k9z)GT4i9;EV4A`3k`pdsBLp}NS4722hcP!`Z0Iavj$9SZO$4#a+WAm zF6Q#IQ~G83O^@!t-JT-I^8S@Nm4s_+1ZqK+6qKzW9T19RVJA1Wzb7g-O--+E#7UhU z(*kVU;oZ$5_R38Bkfms2M;B7N`$#_iAN#*P3oix7=zc^gc{erYePYkcwym=0jCNG? zt~}Mg2(EBSpP18svhRK+hb z1Z%K6Xz@#-R{Qj0p2lDbw~UU)wqumnALtrwTg$v-tl}?Wr8qEAiW)sgd2PKjYC-;p zJT~APvJrnFhkikGahwxl~Gc1v#@B2Q4`@zovY8QXTWVX_6o?`=n4 zF+HFpq2nH&G$y5Rx_!Dx=ew+d?EDN>7XH!eKmH_0 zd6!EIV7h5y4=qnnb#IHKl3<@*)smyR&;PgxX{pn!v+f&cAPwAjwcG4uZAarqwcB}` zGiqn2(dW?`0ba2t>}|-9?+RM`2`4{#^xP}Pp5)(ZlWTopgwN}i#1#0+LHESwB;jy{ zgWvCltvk;%8!H%CO&`4a=xtL8U<(`{znHH0g3Tw4ky@jE2!N+1Mkt?_$J-!8ItbZCJ2ETiIW zMpj$Yuwy%%%XU<3h#_t=Ug*B?3*tRh8NUU^^JpqB%oZ01&6aL1ZNl$k0bMutMBZ?7 z@5%Lep32r^rh96GTB-su)c$S(Up3AnCHJJ_Su5jfCO9w6DpIY!YCG&d|L zrt3CRG^LD+V}bSY^vG|jJJ=pEUA?YP#;?{(x$DEfE61>su#!-v6o&}1$7@>4ybwg^ zg$vsiHIT^wu7bl$lilHBgpjcBo3&4cTtNyp_qWUFjNK2dIG+jK?^~Q@&#Pomx@p|- zJWojwr5Bh^P|SSP4Lo&aO3x=J-zb$1S`+By_(^(o{#Z9-u0bh+#PVQ6iiks)cMbqf&i zg~?xaONBPwRq{n3YqmI?4qgs2e~a8AmJh2wRjK|?J7d*tGVVSi*i&OzkbsB`^gp*} z?}0<@b5bT=5Ry{kVaT_ZQo)`gx_>0q>z+u)nNuhG3PUBdy&`^^_ce3ym7 zDCJ8+RS3)T3m$8xYwhg0F#>#|FK2Soozo(P`jUOPWY@LTrx!UqN(ptoj)i-uy+sn%<0^UEWq7^Um+C(T^<*ydcI z`0eQ6y;-LVq#PGjn9t6jQqzZen0K7+T|>6Q$_t{cRNiyF>ua)!!wnCCqLa-7x zsP7m2;EL;vT^&~9Va(uhkSLU6so;}*nL$m~(7Cmaq;RE51Q1o_FP~I--OIJzVx&Hc zs>`sl(vJ;Bc&1B!i6vG!2daA_g;3!Tv^>Ns-8EuGQkf|4_g)kh_k+#InCFlLBf`Yb zgeSFCHn~e$lVN@eK1pBUOjPNztHB}MmpUB|4awD@@_Fp|iPs(44At_rkrGOy2|Xq| z&NiqIa_8xCH;Vku=@qLRo0jIl4jq-%rV&#exRWQPG6kf_+xcp-#0O+#YRW4%TNH2# zu>H|P!U%^~MZGnSNnX*KFP*4>G)Y_6#FXSOSmEvd1y9_mVUEd`vC{$6!Z+SD1-8J& zS$|D6)44HZT?V6i^=)pNglpT6kudc=VQY5<-7lHb$r{X+?FPh*w~i&5$c&Wu?mFfGa@`DQI!X zm8BR%Pc*k*@M7&%Qb3h^=NQz#H{J?KtvY3UlkqyfN*4J9*;UJHNlM_!dC<&w%vw+( z!fqo;6h0__^sn^M_7<~T9hwg2ERdTZ32bCTu&}rEZDa&O7 zg(RRY1!i+H{PyR0VhfMl{&k5`p)AxYwC-8N9vEAPDOVKJype?GL5n^RNRnxg<&If@ z>z+xL{mtd{7BI&;InOm6;|-|BX1pdB)0M)%{J-&(NEH+uJN{9@umd*#8Z^_UAy{zo zNd&e1j4k!5l?2%*I{7#bJF=_kj6OWAN)D&aDUtQ3Si$?98p-PAr_mYfi8;pDa@9gD z#qq$9$#hQYUhhS-{4q;1%@`SbMP@>>f~~dvgVqe)B*nrBu6RPre#4?JLZ{*Uhe&VB z%drVoDAdpNzh~hWxN)gm)&jf?duO9r1^NZ`Vq4wJ;9JKbrF(N2cIH) zM)ur#<=7^4FPP)Gb}-fLxN=Um7!XAD*w&B@%;+P!FtG(*f=) z*krpAP*Bh)3QMUzl70qDK>BLvbj@9!?am0#8=A5oR zmi8lIET87e&Qlx@Hi(lcrW|{yBvA0fXhz++s5M{4$=dxZJhPa_Ptr9s{q|X;v9wHa zFxmGK&0FcUxnaSy`oRu7v8Q@DHCx7p2dakbKY!Xe1FpKKQgxduk{aL`Ak?Dzx2Yni zecpdfL2Cp{><$u0a>pZ^H9lQ>Yh;n9PbyaemN^XrtC(R6m|)0R3cR<;q5Byc`#LJ{ zL(eh|jgagHe|u_;a0Xw2T5R}xeU02`Dv6A0K0==L?3YWp$G*q)ai3>~XPH7%oxL%B zt@I40d!en{>X81n=Ml*K@zjP9SWgf(Q2pPWQ(!NCYo9O-l9FqAU)mTxUiC#$HDGgvnTik^1BrEYpT9Tau~C&ZS)&w(2HPo{M6P9_o)CU0_jl+XO8F zt*sK{4~-eN>{jmuJ+2~ko?o^RV7(IPe;1)^m~u}^$Kko`8rY3=WolAeb(6bexdD0q zt~jhSf{Yi6!OIo3jENkfTr3&kI&c9&DoCY^CV^p7>%AUING0wZx;;2aW} zjWh`xmJ=Y%Yk#~HtFy=-dh@irgrvLztj#g=T2^@*Bx~4IRpmPCXqRu@Ug4vJ%5Qgf zT=MBC=|y=ed%ZRV3mYpXRox0u;{dZ!3Jl|+WW(k(ZN=*y7$7hnu0H3bX37wk%SbA*g%?&^|+;Mgqr^})HNg{dG@Z8SeWe<~t zqT%dwR!-_3M#j`ARfS*Xo$C@&Ih9Pl0&@selNp}U^|~h1so}OcP8T4|P>ihLlHKYw zJpL)B6N@FTj^3Z?hv4qBxJR9O{BYCAPSJbHUAlydn9p@BMvYszZeTnZJ02Nb83rY( zK;=SJA?E426V%sZ7~kJ>17^R=tokXPF?sEs?e^p_Un*3;P^{>*pnO}LIOmXHM4ZG4 z7&8_;&uxgIc}R9NljcqBA3NRZk~pPQpiK&KwLNU6){ZWAr1~2vsZEzL5~`oE&b`U~ zYPl@cktjU5P%d5O=TboyAgbAAd8G;peGY9JE}?-yeDqIlrR^Mxv1CGcoLzoa7SMva zw>1|+3**1d*a(GnY(pGoANt*`DijY1kL%+^j6Zp?-~PKbR=aB@xfe*(9`-vwYD;TX zE+z_gFz~1qk`3n>d&QJpD6XbA^ip-erXf=IPo;{$k&*-5z{ZK>624b%M`2RVOxb;1 zpe{%s9dr4ha5kMl(p&aMjdS(onshC3;|K^^0zX?*V0Ilv=CE3FuIo?aj_TP9COu)Wyc z8uqi|1ESR-ErSQ7?f>q)MR+ZwvQbu`N6TZ^E`8-P&oJCOR1&U7Ji5!sM`3S2ce^!y zQ#8kec}9{m)p5|^)snz~eXONUhDN%M-n9@u=@x5OL)TYQu|6MD_7k8f4mLg?MNO7f zrpp~D?>m~$N-Ev^oaqqdabrZ1AlWLr!ht$+WaFNw?@D&p^-tt&CnupU%0!et-d18vbje3*gZdCf-hIemM4ii zx0qkoo+Rt8B*LGwe=8^D*co6uhJrf>7G}?KzjfAhS6@>1gw3{UduD%1lZq>N6z@@F zZ!}YGDCT3;Nu3tYGuWKpfW{ofCRSxDw1&C^GzcucV@ zLwAA>;rSAPM%2bZxTmM1>PS^Yt%Bi@oiObwQ>}r61|POMTfU7U^IA!E{EPSBK^`{> z31)QGAWfKe(b4WxN*uSp#HLV!u1ol zlv4i&9GYndj|ZrQX-`;jD;Twu2v8M*^r{?I?Qx&wi$BYvhN`f|T)Li1+Kh6UDg<{h zY=MXK?3$i){3f@q_w`Pf?d#&tRT~i70q-DLq1ayV=S(_xx4)nOf79?=)`nNxN^DTbl`Q&$9LsLh%6)*=Mb z;i%Z(A#!+@?e~6Qap6*HHuCnhX{%fPl!s+^u1RBVE#gI|L!PLtM1PCuixXuNP?+rO zXGr4o#GQw$ZwmbS2^&OUU>Q;`x*J^q|BEMGwrSlzB?5SDek>e54_>Vxu~tOKos@sT z1-+Jcq!y2WIk1H;N-6gBL%>=8fV0Y5M_^)(KKEhR7WLo20qH}Qg*cH6xnP!uEgH8u zFQ;DL>67kRMVl|QAh5k6WC5&>*okQVd6g};(7sku;o2BTeeG^PD?LRUjHnN@;-a!W zauo_n=m_U^$;H-w42Np z+E1C10IuubZLPqgIAyz%dKv18%~)+%Z}s&;5+Kge)k%|2Dd)`?QeNera_Ugg8qDmqeLVW(K>K1oI>p;%9aVX@boj z!?B~C?jTn}v^)83Wikaf1-I(IkR{gK zM&CMCpgbf8T7zEHq=<9*Aw#&mku+g%CwNa8A?=H`WT<6Uk-lw&Iy@r+R`E1SqCT<` zjA4fe7*YvfFEPo?-V4jUp}V`$Y3TF+y+iEunSmjC{23UVX+(bt;!LC;V4x2`%^XO*eVLcGn-;R&> zI-^qu=FiZkxFN?}UyYC+I72g}!W3$5lA}i#u}e<*)Z)ZxpL}BusYRYyzcp_5 z2aB%Rg(x zx7umG&>XeUe0bv5*xf?OTpwWp-1&szU2oDm=K6QQ0bS&+qmw#I!T8N`dZ@96_EDyq zF$9W4^nDWn&IC*d;;KNI6l)~_TXNp$ET`Q4rJETu$_Z6=iK@uTb9k~CYCEj4PW)Pp zK5Ev#AZLR@6}hw3AhFa!{aGa}23Wf5iOZsduf-#kP2dF)v){guwGRd%uCYcxm{*7{ zbHyg1<0xj9yMa^LGfNK`eRp2&MGRuMa^QRDnPuQLwJ#EZ5ruR{mnC%rgT8s4YMY?V zFB=wm!nPdI!thxI3rQD=j(}Mu^|P|WUMKY}9KSV^_Gb${-bbNI_y(%5!aUuYCe?|e zl+Gg?2+@auSNCTv^0w2PlzFOu+#x!{IaPTQwK)AxrcXqRS3Jr5&CV`TVM}m{`nMP7 z4ygnBz~xuLcsdY%R@t-=mLR(4X#+a zefZj*W_i2Tslt|$7jH+qUU8an20V@51Ov;!7YG01mEN_#v6(6w#g+(X^>RoBlB7iE znC9qj@OktuFrM2|v$&zVRsW8;L;vhPIa}y5hQcWUB7-=iCs&cScL5RR1lX6O^+IRq zZDX`aA5q`H!lfrQ1tJkXx!VRKPKC+BR-$7e5S7*F@Glhn3#AwSU@V3_G7A_@MxmU= z>LnxP1u+kGb3VJ6p=U+Md@A^@9iSZUNITNm1`%oa*9?3?13%~h<=z`ldoqH8QdLBOZ%lb%6+_Lul~^_`{6FHjU;J_mdW^03+@4kiMaWVYOwV0!trq{(3-bDcA8V^$e04Kq$SLUkS1C-{ zAP$|*xTtd})d~^%7nc?gbc=mz{2h)D179v!w?nc?F_*F+5ADf9xD zb(Ob%%eHAG{of$>r}_>hg(FV3EZg*6o&_N<6f@nWtqGiEd`HE$!A4{Hi`lZfAB>gI zd#kB^OQYOeB*l9AG_5(C1u;GEB^9OBp8CrdT=f1rVFTt9C!)|9)gSzslK~}y`*^mU z8_dV{%r{NHSVUI(GSgGen}ZRg_#*;mD{qdNtw-QXkYx`jkh4`tuzc?VX(g)j78vjo znDaZ3x933wnT_OI=||QIDU&C!b+|Brw1 zCP10eBSp^q*?$gac|INkx6F?Bwq=fX_d2IU;Na&00#}L(T$zGPY5#^wv40S}^WMz` z+9-$TQVQTKNzN|A$=z$=MP%f+Iv_3z;BYo!0YAhoV328&r-57o3HizZ#ND6#uDgW3 z9VwY+aY{~^6q2FdQG}T;)X}>kZ>pI~wGn7{hM%j9qE%**%3JDOCt*^&ojYcPt0X{} z2|qfPhpn8U-CgI|<_C>HWIEaJXs&iy#zt{qt`GJ}Pj{HY&wZS6_ImF3{R$q=z#kvR zwqEhPa&{5n`}+>j?jG>61OmK^OQqD9l(KKhK6OWjO_{eNDv!o^A7{OAu*VP zK~XZ5?n1ljSMOIKPede4!WH7MOEv-gO6RpmI>tKp*-tZjC|K;W5WKjLxB(P@- zJ+Xk4GmCWN<3-IT*;j1AyAQXi9$lr_$`U5R7k6o;%2HB4v%*br zZ1bebQUoS+$u`Z|c=)~oQmnN+XCRH}g>5=gE1!l3CTSb6OaYJRgSpoJj=FQ}5wlhS z1^Rt{2!gnEKA1e}4!v^(jP$Xeqr-cs4WdBxYyEbrH2=xKi*je<9Ge=g5zP{d;PwLj zJGYnlz0e3=CW1sLAtUr@RQ~lfGy$tf34M4Fg0jtJ`w_^EsMB3$;E{n4Ve2ym0>f5u zBS&&(qCV$}D7Gayvk2w9{fY~Ujae-bF4^dLtk91y5@pbsq$;TqKrGm$+stm_71?p6Q7;|+fKG(NF@dH`Uyv> zaKpjBB$6?Ljukj!FgjkT5bGWl`ofgCWq;3IKe2V)SdNgSY#;rHLgt8&LKG!tmpS%4 zjOVLzDm^1YLo;jh%{uy2>UtxqQBH}#q^UIAGzi=FBHi^jlJMrulABVKyMO+b(`~*( zpV=U;(dBkQ6eqsGz)ldywZErOaI-UsZ#Z+SM{u&%^rGyocIGx=E?|b#8_ye$Ows2S zn_2Sj%e6FSQOIr=&v&u2LkwLTLCi-@oDPEc39voilx21a6!K%Fd+n2n@5O z3_neEm3C&Db#9e%1bs#y?NVpShkKzJPgB)-l`v$2qufvb1QD3XTN`oEvEEjDb#I0I z@rmcQk@P$*w~k-COH(;e{{!@#0k1#{PwB;Sq5vXWZ_}k7aXCVACA8%qI*HCX+ zn?Sf`134Kcms(E${48JK*^pHFDbjM^!l}4h>L&B1*i=A|B6v(+=m}J$S+C|v6OO!V zCr|$|ALewxtA4fr zDMXl$ag`Hh$VaIcgf*!dh3kxpb)=)RItkQu6dR4EWyQ|<`FdJ0sn_Fz`=l)4?c8UG zbJ>9oh%9V5`g@DT+lxQKL|38@sb;Q|6ZqlUia|W}=2nP@W=bp`c-9W#C^9ina5&+q zJZ?@J#NCz}huwO?K#VtpPmh-GvD;5s1KC+JaYbcqA!GZd<@>ilF&o7E&lNx1a#rSV z`CaGpcE!YWp*cEPir@E&Lwwq)!F2i~B@TU~T9kDhMJ-c5a4P~_M+15S1$y$f9NjAx zj&9zk9E|34>#p&CuM;p=hu$Xac1@K?=o-zQAVH^WZ0YwyBv>C|OupM${mnO<^ z5sXDMs5@*@K_SVO09?@;)F%Wk+fPsd-<&sU=>N+Sl-MO)eF+ldo(mt;5hKR=%;5F;7CyA=t!N`awsDIassf6;KacDFUb%d2dNGln!!Aoo-LQ5XdM&&sVcGlp6WXuEK&t9_0vu9Oc+ zsWkR?f2RM#O3sakVXI`MxT*RLKk}#Iv@**`;{^Uz3Rpt~F5s*u@zOn|*f4PJGV{6= z(|xI1&6K|*`oklbrMn^Ny?)$ItO0WJltEt%PJ7*UP=$fr#Z+s-6soqKvIGphImN6G zNsGO03_dj188A1F&-SiV_5Nyoq>ZHR+0(nOF6e#Je;$pPVwQd)cd%9^w-JmV+1VNy zivMrudm-PS;>tKCza(5Cc8<)L#@!~n6Z?K=zOA5F5t z*9NBeXut9m->G$3#$ew#E?*nu&?R*jY}2%<>q)Fv=G}gq`<34n!KQpz@HHW8Wdlre z+Pv^*uR5klR2F{0y&4F@OvY?)y6az{P{0(}#cPnDqs;vy&~q zXRbTtdGg)a8^H1#f#?_Z#OFtAJ*C~b;@vk7+ml=51H z2)W*acoKnzkXqEV3D;+*B#1XV1SuPCM;E3%G0r_Om=`o3W(_}y>TG&a9n+y=gB?quU>bdma&n@F(arF zLW+s2Z*s~6so{jmT)7rxKT}`ta~iSEu=kkv5hp?OXKH*?!xv3(J~B_WI1O~?^5%U8U9uiv+#R zb+_{|Iqn0;PGcHBZ-nwO3#)rYfbw0ba2CkTWor*!ZF5QiscmQ;zH;AcAYn1nfU?A+rhKo~6LQc;bLZMg<&h zZ!_QWm-zNhlGOoH6VX2nMvf3eydpi_If$f~rHe`ZUCrRWCZ8vni-MCP$mPTH1+No& zuxL11N^Kt8n5=5M!g{~P^{e2ie?gcUhu8Z>y|)vEf!l(2)2(&rs5s{i7t&@;T$R6ufbeYoadD7K~c>xFXZ+-Lt2koJYy z-m%{5@6Ku(>h2AeQBAY}Yd`g0p!gk)mpi0->p?oPY>a>I$9(gFSpx~I-ZK;P((Ph& zJ@!?Vs*x?ikib^2^)H?=*>l8Br<{L9cvRAak4A#>?1paNn6W2f&M87>n_*$)iAvrUoyh+_nDGO`?Ei32^r=`%! z0dy9^=kj6K(52B0CW=nWGgT7pW1V!U2 z?u$#xqzLdCW_P~k4pWY`?&k`{=}xfVY2_DHi52sCR1%xh=q#U#WjN9?00<`{%J<2X z6H?=gq6!)F9}$#+pwvpvBTZ<5Bqb$yofEjo?~6g($a&hETmG? zz4|F<^)G zMCjf`in%Sx#vVhW{z-*?!j$)AfwQ?~0KS0;fzo7UIC1-nQjo%QTpL%JVBANCsi2*lM_uk7k? z1euOjA~h4Q=6Y*oz9h;#kt$9VY(MG4TF!z+#(9EIW!)-u>x(8Ybh3Wlb*GQhOz3ug zKBk){cE=?6M3{x7vSJZY9F=xtqVVB`rIjOkivwljc{Q8;+lIbafURBf&b_McoOC-< z*S%K{>k{+HGYWp9yQW?2(*Z&VVaEXnK742A02{m|`nz}Y5h#l!=r*z2AdGlu9^%ld z2LqnB)*c>dgJqDaUmk=g9&Na=t4R5n+ULJ_h1X6<%}nXMYW$10S=aGo(U>>#O~Pk+ zM+GSmnj%{4_%4*!jo6oYQd6@~{=8vrryWsPSuy?Na(bFmO+oc8_ll@!J!)}1ia%2U zxi{w&$rFVs;vf6g<;^r2@C|iC%Y-fh^1E(6s$Y-&i+3|)gX)V{VseCX?$D7P@`-8x zRh7(X3@t~#5x>?i2YZ`@TG_%}yIVii>pWez1JRgoAj{(rc26&+C7Agt`T?Ek0#Gh@ zI1WfzNip5(pR{>+1VyS>GmM7moR%b~R4cyr`F-4CMJ~7tM$SQK?UU_@(RBKF-QWY* zit9qq7iMoqLr1Il`vB3tPJu=&pm&W=$VLkik-CCR)&Uj08BaunZ!fSiq<(yigVUx0 zkQ#$cS=eyh25I{esc$z&3(t^VxcO-B*XSR@Bt|Td%-MC z&WfOD*IPQ8XkFC(fbqLy>57eoT#bGO03FKr02;J!8qRadvLHg|M6U3`H$#dyYr`r0 zzk;k?`vq9qUp$Rv^zV5Q zf1bfU-`n*?Y`nH)x&=MR7wj;zC!Ehb?}_XTVuKKiU49}Fr!u#bPd_;HR(a2j)JBTW zes{3U);F%(q8qvYgBC$9Lbz4Qg+fl)IE}b(CQH^bj~8mO=sKX2XA{8fj2ihbSNUuK zgn7qBg|eQogaFO#c+-Flz&is{RQJrue}d=-Iu~GLIHF>5UV-u1#n>8RYry1;xJZ<0 zmIn)1hr<)L1y;5%H)7g+k-=$&^qIzqz*`ot@{~xR5d*;7T1?-d6-Ub=FeQ>+QO01w z)Jr>3~Ze)Zmg6;V4v>)@e7Q1(McT zdh^9r>di+NF#s?SJ)A*Oi zwKNca;BcC&$ItxuSieZ~a3#pT#Pu@cw9)@u+Fx)W>fuQiQR}0%)tB&Munb)|SNvq_ zx?f+tQ#h)Ymm*<-AqgfsaJyL{x{4oQChN>sDf*-*YY%72Jpr=-ng(C9GmjG1Xh&S$ z27nk*EAfBb(#~&#JCFZSJ^x{^jwvi=?o1=?Pb0w8fE`sRm9|O1p=G_WYHN&Q-b=3Q zGEzvlaQylW!IC=v?*|#lRuB9l0P%N7bZpQ`PLAoJil`5a9-5J*CV7 z|MwM?%UNZVw6xBad4D_IHXVEJAW!Yty3dwhAo!uh+%=0O`+~)6u4$gNi7`s;G1MyO z7AN=;gGxmrnSOMj8mMp3t8ZJ5BI!#^()5l)0b2?(CK0|AL|lXruozk2USmDp;YkO? zABFT>H6q#yKs|lS_U%o=*QA{Li;8GAq4OiP^km%#R9^9g{6c5wp79D^9X(} z;?FEiYgl825zQLicZt>3<7r|pHG9C;Of9b1k4Di^&Xa;^Held4Mr;hpquJDq)|Sw3 zy&~m5d0u}w-}vKIJ*lyl@yj|X9j=hyhgfypwf3~K<>}6~&YhOM<-yp3*kkAm@}yBI zTcH@;v5Iw$uXQG_U|}hgG1SX~S)m2}?lxXTe_z0ENIb zXqgh>fTm$ciTel95x};x5aet`%NR#;;p0A(z&%o&b6R_pYOV`?=)uE zk-qyKV~DIexDAmBLoAAV;zK|#e8TC1W4>OC?gFsdYf?WttJtcdMHiv|AgsjRB}1f- zIo)4wJG3tB6I6WNWay=&cY5J4j}9Z^1yR7Z5OPk6M)(qW_WR=aJK+-l$9wV_P?4I| zyT}I01-HvpBMJV5jZb<6kYirrxKzNUG2I6{sbX7O{z_CAa2WGh!sF6Zog~} z*r=eJO613-lv@CUJ4>Z=Fje>umhOT42fLB^o}+hJVTJaFOxL@IN1Vz9D!sel5eax8x9@er_Q;ts)!gtte7mJFTi%f} zB^YrkHg@(P+($9dh_F3hKV!};n>^c=S9wP#nPJ#UYsN3PBtAK8=&**042;BQ}DEqm_e#}&3Hk&}2BY$AS+o-Mk&Uh!U+iefzoG`*28Rb0`FRW?M$Z_>^cX7Ca5Q93L5 zy!zt~#Xf3rVRC}DD*%%6&;&kg4ws?`6th_LLiw{n{^3`TBQWJjiRw;Gy-)b4t}fh- zB1KU}P&v?Rw#9b=>tz#u;0)@mC-T;dY|A@zSJy}l&y@?Y`ZAb(_vRNR#LER*c?T7q zSJl*876lof4Os~~_!o)uAzt1y8W?7g-?uL3+R&Qj@armAr^wP#V%iuxk<)$vRyIl) z>vMF%gr{umbRa(ZbXo4hF)INZQ-qnM9wp53fG2d7A|mB;-JY3Y9kzLzEm~^K zGUMivQi1yHi*xVKKntL_DCHn69qiRe%TmFCsXC#P2KP@!b?+~ph+Rq*ZYE#{OES?7QFm2x~7TSBO(H~ zPXr6t03tkcV_U8x(b->+(_B35Jz%bfaBSx?2A64O0Qe2)p{uLAyRHi{9XOIP4}L=$ zR86omG!9S%?&^PWcJcknCIJk~Y6JK#kcm4?YV7~1O>RB1yqpDe6*%Zps5N8Zt9Z12 zwH^rqdOdV#oV)i!blyz-ij;BlL-i;A;mWE>lBz&F!X$Fuz`rgHXaCIJPL;P0OK8usl|AHjZiuz(iT%{Gv=rXsi zDQ!edN(CDiIbVN+Im;oWr9Roa%4M91@Tpt9|dTg6?SK?k95ZK0DmRqU}e zKNc!tOCd`ac&sh>c*Jpa>OWu)xlt|9T%jyLMT%vpXJOpm zX*&IpZ5Q$gjnny0K zRu;3V)P`=bx;aPc~*`7i*t0YGlF~-C6Gx9b5 zUC>~jS`FYi1!+(MwNV=dhmO3#7#cZ7Kd5R?Ma`PeTV94lF7fuK#>_0etBB=6(O%~w zZ%Kdp!(|yqyDI@l*T6$EIxkaMe#=I5!nSFOizjx6O9ABpK*k5y1UwwVwqgjRPeeB; zr$B&o@5w8mS5X$#I5^Fu2ClryU>1N*_B-R8QvkMl5SpfZoSEy{JP>bu^c%;^Ck(}Iju**s%D8h{_5TQi7U*PX6R+mlkL%toyFFicqrWdu3#52 zba?YB#rET*8rOvfY&%h`%Wy2keR-4-thYDcnMPQ4rRWR$5Qlvwi0WbbK z0~*1((FcE3peipH#ofT07eG7aQn*}qVe**8$zl-;8h00vhyTg3;#32k8kqQvawC?U zU`eM1vnd8Mya8KsAf6f((mQR}KKx*EAy##IuXCMU|mG*k2sw7HgSRsT=ta0RY|xCA2M@DK!oj01dzr5fElxMkUR!RW$EVsX+2REt1GNq zU+r;n)^;4x0F*y{_A9cm#nsM9d_m=4uH|U`ael!l`1x(NT`hZsd`zJcD7JnyJ?h-f zi^h()I}|fL%j)&>f7sA6YB|~pfz<9!S`WQiT(LoFD_^P)oyOnZ;<_|0@kw3?@cSKs zvA_ax+OqQ_(1Mz_`LaPcQ>5NjHlF1*HC!P_=^FxCvFfodM8kKkioQ3)T(9{IOJ+qt0{$S0q&awo1(A5h)r>nP%( z`6^!!h1#bnj<4>TZf-Dfr)Pa-v{TFbWp+1ze#bA$pgvUVl+){9o7Cfs=?}s*QyWI$4kJwx8Sw;D;1BYly2eyn2VNq~F61 zzuOl2x}vo7<`MVz`r(q?kuMJ&L9p)W_*-i4}(;YuM`pfOE(M zd@Ppr0nD^@p|nDQvJFPG+mRxLs7yc05BPpOS*-BWL43lkW$gKnpLCxe0^OI6fkP3p zV8F@1Sbp5##TTnU7C8+l+XUSjtF!fKr z^WrD~;&z4p;TOr}yFD*k|KbH19lXtal2o{QtFsr93~|ms%b_b+%;V!|dG>&s-h6I< zN@nz?Fk2DF#bpk=Z~ghUFB~k|)rV^{e?Ly@tmjPf53EeT$d7JdU~S@G7)TI{HNKE! z9syXGZjN!mP=0Vb%LTIjkmHm=%Tg!0^|wvOC zH&Q0Igt;KLilA6F(!TfY!inbz3?6~gP)XFnaauUgn~gmDkpLFd{KKc#^cPR)Kba_I ze`9pH`MC+HE~;8!vX8j^!aT%PNz!CnwaL>`kksmcD9I!%^x?3?Sp7wAjAMzd*t%v& z?hwrw@>9Lry>7!ar@6m)k8y(2P9eeR2CZ%W;fr(k+5WRgxRh#yGpiY2qv-EV{HYhH zN9S*F{QOQe)fAhsOW4a5p^<5B%JniKD=@k zxN4NfZW;=|#8a4+J!sDwYmix87xP)+v3bq=ejqU>U&P-uXz_k{x@$71Z%=|G2z)UH zA~i()XqBdC(|UjL`VPc^EluFa`E1lf^{iKZLI!6uYGb8Ja?gpwX!AmUp`;rm zl$3DjF6okxHVBnQx>GuoZcw@elujv;?(UZE^gYAp`}^Zvt_3QrnYs6z^TdAk-gme| zBU)R{>xsI*fAG42sO_Cl;-8L|sPEx_>fT(tT7cWmGxlu0`<`ime=fJ*TSGl*^+f!K z-__8m*oexG9{HyYbZ9DrHurPSZ@1=#A4GMkD#z^m=7Vazy7p`emQPZ6JhvRzBKn`_ z(F`wC-yo6sb&36ha2W&SW*seIe1h*E9;INOhk8#J?e+qI_+0=^&C?Zj z*lc?SbXnA;Z*nVccP;mFykgYyqeEO^KvM({;Jcg$!cRF+|Mtxk9Kek{L#ii z-C}f;fSDSTe18b+xXgGxZwG=p&V%G|pOJ991ymA>-D_OYdC_AO=*5n^aAfDz3`yc#}N40Ht}kJLLjH4sY}*r&}rG&(0?MG)m+RO5}DBIP}sW~{wC zLJaKsT6O+rO28JH5xpuXlwaMag(XV40Z^JPk<~QRJ|@>-ytI867qWRc#NT5j_-Fo! zl2@AnmyfnO35#Hfp0LSomr|Wrh8C-I>!^-lVTt zO){QT)E`^)&f-$*iyA`_E{v4^>T?Y)O_u|yu6M(;mHh`@JM}5&m<~sOqEUBHL9K+J z(g1+aJp>Q;4-X*S%FQ80s+Xjz#+F@oZJhDs4#rM)qk^X$9~U_|_{^f8M6GH%CfxQi z44+*KgR&A2^#lRcICO&P-Sq%_I7xj|`rw*A$!ou5kHk>+$|%vd^&p3T$ue>iSOw z;!w64-+IugrBIGIv{{M~A z?yD&Ecu*s~Ihty$IRk)3fL&`X?@7F3;fIKY;irBH3Ze#2Q3x}jrk5;K z*|jK*(0Y(-pM|44B%960{?0lDMp~Gv$jthn>E%mv7UC}}*AcHdeVeqL&POKw^LEwi zYe*oC$vzILIM3V>5kJi2|YXq zMD%CQ_eWhCkc5NxXA)GrMYA8!L_j$n_X+>_Dn=eCg5D0jXyI5?`N`Hl4z|L2B!czM zJ@b95BS$gAC6-@EF5YddspO<(`1x1!LJB>#!k7H;QS=nF!Ul_(F6BlypBm!Gn@84b zk)vr0@@|rfQ)AUE#--m*ce$-zsw8(*kblcHa96b1OA`pNxl1FTew%SBzy4X`>*nb$ zAJc=!9B;PdAB~>%@dhb=tq#8SEV+P+S{j%YLX$YJzgSV2?)+-Dky z<+}b+aS-oAli0g^RC_S{&0gGx+_XLbTk-u0LL)W=;k$Mw?VACA9YpA3Iz9Pr)`M51 z4s+49&5MZgZm+V0kULG5x(WdAeOVNQs|v6W4yhpsJqo25Ie*1NDjDN<_Fq)9;vBhB z561QiJ`;;(yxDqwQqq`}sR8(w#cEGN*N#Ts`b|72+=bRUm2T$|qj?wZe1D za*D{+ci>qnPiGBgfJaUOkBWtRxMkmP!}z1yw*><(CG|GGp$zQF%GgngJFv6smzVv~ zv)+lE*UNi0k9&9Cf#~IZ6b_i?9MZB;hsMRGloD~A?P??}&dAoK zyAdSTumr9fz{nRn1?61Qq=fY{Kx39o?&JA24&U`0R$IW6JTIcCuVQ<-&E#bw$ix3Z zH$H#>2ZR9?NnZvc+eA6IIgH>(d*r5ZRcL-Edv|HO#=$`C$ZObCin>SY(~?iD!EcR#vAF+*)0*v6aMZ01({e`NP(T z3o%~rq-k2XAHW-gM4H~swfn=m;=#{**uN*?G8sp4ECm6WB^FD%Jbtp(8rJY}kRb$Z zHW-lR2WY7HYKZ70N!n_DQ&nU&5%J)6mPC75Ei=pp?-;An^e*Rx#92ovJjTc z03<-vvE~J<8l!YlI2!81pNaU3^wY+M1#9KB)we`Zk+_SM-;b0~aUUPUGO)ZIbclcF zy|1>hDdiR_$YDIS8!o`klN{%*EUW(q`5Nb@v&~@Qq_icQs#>^tcC|3b9)Y22Z1UL} z8(y}>e1FgjuBJh_s}WH5Tv0FI-PbDPk@eU3(GS#n7C$N_VY6B+U)Wik92)p- zbw50xict7=TBen!;ka+`NVQaKd zV!O!O5@O?Qwynk0I+w}u zE*cBx+t2eSc9a_c8%zfm)fv#5Q{TQu%-r6u{e!$zT1&#zxwDPX>R>;`@i4rQDjR2c z5Ro%(rYFzwE$Kt`sDneXQ){)kt?gwbjlPIkF@B$zRQYsv=3L_w0}5OGCu5CO>PDWX z+fr(u?M%Fm7xo)=XiD~;%~JRueHd!@rHXXM;P6zk-xERun-fezq`OKxUkbec4@Ye` zz5-J#i~rD3piZ1Y%=i#O0kGA9j%g`~rtAJH;}lD=#Z=VRX8Avx!AFy$mVaKw-l#2v z4ZD3@0$kr@%8NB0T9|suD2yFsseX?C@ly~d)xPV`%0v_5tgO?7DV|mWNsdX1_f78u zjnFJ9BAGzy8g}iA8vcUQiqQ|H4X^jsLq|>r3#C{GtHW8W9{+xk2cB@MYd|He|8h;a zc3gBxztXSecB6U0bzIEAz`I5VV->*fZ(-IVK1rSCufb$*8>^}{ zt#d=%29%7S^9~+M)`G{`r93Z*F03KqtG&|ws>6EvlRx1_ZvZ5#u(&Bl)A^lDC^@OH zY|e9mz~;KJus0e%^vi#qlctRhCA-S^ng!|3T;F;(9T$7m)BtTRX`T z<-8}&h_DwN8*1m(_He8y|x65SPNu88%5^DDF%93AS0QIA8Wq*0Tx)SM}!{lT%Eev z?k}45WAWpS2Z9|q$Nn7y0=8Eu+mAYYSgaUOjrEnSXlTc@Yb&n;?>FcZv)KkZ8IS9=FbUdl0BS`OTu7e*HToE3P4x#A%A7-!(h#Qj`{IZP|YkYuiU$cfbOLJ zr7n+;@E)EjTZ8t)r-<^Z%fp!iNUIn^_6#sn9ZTIqV}n-;uXZe7@V^FEz!#w%3Hox7 zWPungk!_LGn?@*uGUm{BnG0-b5T11b&G#0e{|pl2Sme9$c=e13)m){c&ueI^X$z511Mj15LZKu%Mb?<=JiFVnI!gt8q7Q|{A8=S!f2;VK%aKmqb|9E+k}BNX2E z8#*1FJ}{9$QZ9>h$m0?e1qYbe_!m|mxw10tGvl>F=!>G<#5`s>uY!q=8xyfR1F zzm7@LXBHN}QnEwpJ^mKZKaWBQ{X5n9_C<{k>1{2b?Z|O1irW5zj4tcKy`H=n_SGNe zmlhe(rNyPSsgtnY`2zC4bbPzGIdwu*gUrYKd z=~7nN44}sT0iT5j{%5&u=^KB!E^Q?SY9e#uikWQfm3_I}STR9&%JL7##ySb4!c&ys zt|*d1qWX`YD}9#QrEQmfVZh;DpaJeq0^JZ8$DiOd*emszV@xG`Qqh=KF*b7 z_8u}{z=V5gZF7`HiFZy$+w2t6x`JxVth4LIV#Pz0@LO@^;|t!wnyaJbTW32jWuR%O z1+(Qujzu}|F3&yub0`}~cev2|fm<67KQ1)!zOuXbMOakYi2onx&-4*NJO^zW&D9}V z3dTmcdMV*Xm5R$JKV~jDL+v)LG~m(00wc63MU@wyL2TJmTtqh5orQ;k9eHPZHly+* z?)vtt;If_MmtyF}WPn}NjYc1t56FtF;6(O`hh$B#Y(I5im;pJdVkK1DJ_~UeqYD?C zu7mCFmdctm%kMQ^A%{P~pb&s12%rud1bEOtLI1C8qxmB?)rFrFhG@v(uneUSvj`-= zokq+w{8$J?6`%?i1Jm&Z@Ft65UT^L!P0wU;vmAKW0QGL;^~5HMbil0(*+Op+W0>h;dOXlR1$tt z03fd%-_CG81?~r}JOM~g=aM$=YGh65U0Mk<@(Z?e=X0P54jPHA9V|dVi~e-7^X*5t zg=P2%+}66a-Dl+Qq#XWn3x1c9whlW?oz&`F{R<91y~P)O!9rg)+H#gA_gEe~;E(YZ z>i(l#TvTfQv)f!RC8=G6_6-K3$l1!RTayU&*Ds|g*y24r-`|B$ghP?VOseWpuz7gx zXkKvul`k(MjMXqQwDh2*$R?OXL7X?j`vS_%3xF~&+}-2Rm2Cuv>1D6A8y<_H307ee-@5^1oyga-*L#-M%K$;YcsW7)i$oaUS7u<_AAgvIzC^A zQFh!5MWBbroz`H0+Zw!-2NfKd&U+>N z_C09Z5TvhjnCVY0Be^X zG3@A(Y9f7MyZ-aCaq{fVUllf888ui}IU3!Gf4c8SN^ruz-sQk$l8EP%vX&OBG#K5f zOtjY2g>x0!dz?xZ-iZPZM-+|Kf4_{#7(YQ$JnBaZKD^*2UN{7 zY$%)8%>Yg=aOmhk`M?el4~U%#u>dWxz3tL9!k7SXL!G~a4MvDI zi{2c0Avc#3a`|7FyA3inrIh>2!nR;i3FE10HHn{UwMG=mv?TU`SyZ`2y3&uE$t(DM zewJ?VEsW>OWeBdrpOC)Et~SwrM3=|qCc4H`BM0nvKqp_H3wk-|GCZo@j#}5%bS;1w z$_C<3xrB*dD_Aeo|NaRsFZ}KM%u2_2f;O;ufHei;?eX*~Y?u7F%}Fm~*5#7gcx;mh z1>BUWmTWVzP*cHHvlSe+3M`sQyT@h!f|&zYdomv|lQv+oC!4GRf@X$wpCM`tQ#s(y zg1}M8vf)vcJ`AmsfPQ30^YQ+QQQv+rsk8$hCWQse6quy@pSE5H0Y(Ty7j-WlMzn0{ zU@*G`X+Iop`e77UV7{lzPQ@WRzkPH!%v%8-I@Fn2Sf&CCA;X0^w^|$vyb8Hyjp0eV zKQs2^W};&VDi&oupi8D>SR$;0JcCw%X~r+lg+C$pbBy~Bo_PN?1stSD&)2*P)X8hO^kXJDGZZf`b6#Hh(#++O@OeR$)OjqtVyjd0Q780n!ZK?1FC*% zU25S8oFt+=!m&rh&3s~ZCAAyN>vMIN+u`N$xLAo^lr^t{;a7({T}kahc=|NgY_V-G z8NvJ7)@_l7Nihi`)l86*#2 zSwnK~xgqM&b#cCd$aDQ@vvMG@V~a&4>)O5TZE*f%;(AkWdj^R(^P|wp8&g<#K+`f| z+KRU_`hn&Z+oSJrge?OgYuoXFt!n+Xw~IQn-ncocPHy`D3hZ^7GZchz%zuCmp!h{) zfHJ|@9OX$c{x1YY6a-Kku&?p|XCstxZ}&4m3Sz`7#EW8@vLVuRQzR$_fy)ZuGKhLj z?07SnZjFImb8FxfyN zt9Qkx#{CVC`qKI_TQzj(lUgaBB;T)6wF9q_e;%a7W?@d{y|aYY<+ zTmx|OK;M1i!SKw?oB`2#i6V+C(>r4}L`y?3sfhXB0E|^7INLGPQi9Qq!HYrrW?HP5 z7kv?IXl(Btpt4OixBd^JK&R=NLDZ-K1_XWmC9rYGd~FY)lr;o*7j}3GjGsh7+l}C) zpuT+_{wGqz_Ner}*6gi8&Ok2+dLQKh>sJNZg&$S}O0Zct4tIGH=rft87iF#I5O~rvC>wBl0*I~;VD}?@Rl1Yf zUMsEJE+PndAe-KQZAA=1T8?37dz7*W-EdNq;+v$I1K{2T1_Qtn2SB34e=~Vqo#{a3 z^L84cCPAR0Gk{WH%VBt*N~uNXQNh3@2oyzfU{nH>@kqxP*Dm;=beTZBu)!Y~DA>VP z0-hqEKzR0(+OV6;3>X6;2sZD|4}Zeg5R6@7>)|$#f54p!i!yrj;}Cd&9fG@ed3?U& zvxJc91N;hD6#-fxFna+UUk@gCWX%8KY>m?X_o-JvItGSo&BEOxpV+Ho_PyMhlc>!B z2OP26e^6_=nj(TN*zt%38k7?i3X58voxQMOayA#8sS3MZit^;%trR_+O}#jyxwp4N zMn)F{YNjKh8wvM~;wHdTsk~~A>1r6|unY36wR*PWMzj9oRyBQZ$i(m;@QH_6M%j^Ge;K zzMt_7V;_wBd9@8%QY<)6%Xo^7{Z5;FZFA*aG$wj{Ak;p^c9y<dagXl zv4h7k8VQES$Ojq-*e#sAFH4F~ad$?3N_dZLCpPAldfW+ceIZXCF#o$(k`*P$GjgDJ z?k7`%)!hGSZlZYK;_FpKUg_;(%=b}(12G2c_Zt=c6FR%9jStDTb}zjsq{gh+)-b89 z_dY1=E+5VNWdATzE9ya~zlBf}yLlW3?UHSAew}Ijdf^A?60@w{xzld@^O#S#WjN8& zv-~2$j}2dDi0w59F9Z#!y_4KHehJ=Pt~Ozn%-MdcH2!2}MyP}gh8HaQcpEi*?3bxu z^hJjmD^>&YYhPQA?5Eq+*{II#-wAy%YCG=ONmos>rNRpPQmyN&l3tE9>bQ7r+?g-h z_+PceR1(>hq4a82NY!ssmnv?^sI;5UV-i&nTSr^|Six8jCKv*+k8_96TPf**H3XzFy1EtZ+63AV&mbFVDUo4N=# z-muvZHsiWI_zL+mf=A6z@bHRgWh|&b2Fso@;9HNPY{W) z7q5(zzK)-R0fzbo-6#fjy5O0H;KvT-mpUC&C0O&p{V3DvqlY#k`5TILdD|Ug$HLCC z6fzRgUm02On3(Dvt#0;P4p-x%%Wq7|Sc<4%=HW!oR!O(o`*!z7 zO7espZ5$)MrRQ}HKkJlA-80K8BKiku8$Cd;eGolV`Z-Z0I&Hlx*yO?p(!CL}{_W@M zBA2DgQHmpM;rY=;aI^-uZ;P*68D`^B{M|fv(~crki^o|47ZdQPZ*>ifOHn4fGqIkE z51Ji0g+*#mE+wk%b~RVX@1NJRe^{|f{d>tX%o^!NOK&=rGx0*(aVrbHS|L(`1OTAV{L1} zq=Ofh=z)B7jzjH8EsWvelO8-jQgPSN5ZS~C4?#-@y`SiKo8H(y5I$F~gtUtg6ak#A z-`p7jghw}RzL~gP49)X@DNA&yah01Hvht#J9{Kq>{)3E+L;SEJc>SK@IagLW*Dbeb zmAb{)F{-89tPvbtC~j#oNe}Z`#3)8sWw{9~8xw zl{|_0!^+NqqZ{F+9pcJSp(p}HAJ@5Ip__UVI@tiCA(!oVaLC#c0K-`V|G6o?D;%% zV+Mz8Tqp+3?(nFfSP-mui@3MwW| zHK&2At|`N?KAS-+hD?Hy0Ed2Bb`M&bBtxAJ9u7%>8X5^a{kiI;b=;IHn_SS1jazae zaPqUlSk6E=;?mXU1068Vc~j}nr?z%wDX6aGPrNbCDZerc$&w5!{V<=Fl5 zZ&)Y5Qzg1wW(o3ui-|VX1Wx&eQg!{PLR-P)-DG=8b(;o4)4*AnP)NPCotikhc% zw1usxddb1~p;~5zN}XiC4+d#i^|F^8GyqBE&eZ6ae78Cd6H5dHLKA5<`7Ikm9F8l@ zj!J+RrJC`vXjb0VHcYXwNKv6cHQEe@x{@4@m&sHUaGsb=W=1zKB=z%$z0izgP*D`h zXa0uBAVE17)5y&^Xzh;&^t51_8;v9&l|`iH&~V9z)$ZL2scB1*=Y>a@`$#bQY-r*B zP{a1a{`?g0Ed++?O^hJ}r5!&LO-`rd)*%v=mgD2naGt*@)+!Yq%Rw(uhnmv0Ww1z_ zgv4o{qT3IBt>czqEre_*tOm%G;JNf-65SEDT4*xx+kdjfla~8zpp1{l7Xh>TIvRu9 zlF(o)J)Ku!9M#uLK@kw&I17 z2H9F>uG-m6zUm&BRQF$oIh~WniU;m-hB74RLQR8RTlOQO)iT=>;XRHF-oM*k6G1{r zXQA+6o{D2zl5T0tpiq{tGwosJ-8LUEcUm$RN;bWdXHrSnn!nF1V>OFdG4o|r=W_SY ztTf_c(R!i|@UxK7hbDfS=c@M>VxV*Fmd2Mr<(8{4^G-eXcc~99?{MSzR%q|vP-8I~ zo)9bVu*6NSI!u&|`88rbow3`Cz(eMjE8{zfHCJwoHe)FA&k;rOx?o=VI8GP@L-1#u z{KwXn06tp5P`SubksyI-_nKcKG`E{gA7aDvMb&-a*6k(0kbxg_>+l8jT{|5em8)T- zXVzhGibfW3<3@nF((_bZ-y=7syL4Fh+aF5kMyu^Ie*W0m6Fl=2d+>0eq$ib3Sjb2sG9v{e zjj0F}jQ=2_RO!V#H4YDCbuJRyS=VgG5*y-(WA)mc{%p!nL`1?jOmfq9=vtg%5Bb8A zBtm7B>Lgi$^Ma90>F%^Ri$i;gv@9*O2>)9yUX7cv&4Lp2DlAna%+p?W0ZtkkxA@9^3_)hzh=b^} zZ{yJxRZ-|@3KN42fnBz(>pA<4%@nZD&~b{a0ZJjf6uLNu9ux`Q!ym;5wtwLE&%)5s zGsmiZ=`=lboP`TkTk#^1vBGIFYOFHY-U(^XgNMpDu^2+P?+$3X>FEc;7*V%fae;L+ zYy)5Q3vRDF>hbNwtQqH}t@rvz^wQhAUfmQs7>(16wG3xBDzb6N{k;({1=s=(XOharce-6+3$gjf7%l(+I%P-wB6t96q{cFF`#k zYZ@TiDrgb?e$&6QXzD&l7r>mK0LSBFK3205%=C?oiD|@<4*47h33|GCv6L%;KR0kU z2!p)eNc+Ew$LzrvW*8S6rRyufw)#Zmpo01z9a>=*l^(f|X0&RBpD%{$hjfH;JOO)D=pWJ3b&T z=x!Zg6Oe@ZzIAP(A1I>8#2wi{<($RNay0vNkk`pT#%KCz6np=;oMz{*O#@RsM+Pp< zykFqs#~DtGU6c-0v=TJ(3-U<~Si-2-whrhjUxmm)aq;D2uzEu{ z(DCSTX@@YG{4R(_=z}<)ZAhadi#;Hqz8#c6#gG0grRq#7c9gmA+TXg>6O*W7xAH-o zby(Jls>`=;D^#{WSlC#8LLwjKMDb{tl7(&cH_u+`YO+GV0^{2BTe>vI6|YL1ewnLd3<7Mc=m^?KAmo)&!$Srsv64y|4-itst)X_z$uI=}mk+ zIiFM|1w2|F6$p!d-$<|}uQVx$zC{k>Y@;S0w2_D|XvDJ~`7CtcqOjP$Ue~7TBeTH> zIrehUZrKjLGTlPEp?()gWN{~)Nc=!PMd z^D7v4Iw^PmAZBCAz6XPV-7zU%#?S{5S=yt^C^l0UQ1B#6r9^vZ6>8sXHT2zJvw_%! ztp56ilxqLvdi$YpBC>)$KE9K2c;NJ?CD$(=KgDDPE4XilZ>y9pjwvN1A;u6He*;~E zzAz#N>n6M~K<87VK91HH%r6U* ze~=ZpjBoUuM#A|^A_>Y*9gZvSYJvmRSCK*~FXUW7@WkF`10@dZlPHTJwj`XA<+o}o z`Jgop`$1t!fL|8gFXI#Q1$>_xpxxtSR#NTpJy_C@7svel{PE{nH43=*cWOI#)djMG zooc6%EZ(r6s9x60uic_j@uZRLzU4#@DH>Y57PmJbHi}JkvYZdV`5br?6JVA2+(U1P zb0T2V23e;d)2NS8x1pFA4i zaD}KV_K?3Endk{Z(&9=G*)M(E0?U-rEDBL;6%m-lyQ&tj~m0bBY|(T*uXEXMeTl(tEL_`#N)HNwrCMno2sGu7kiZGrlZ-7 z+PiX4z*LR-q8KrdUGzmuIDAtbHm?SVl;J;i)7$Z;KV} zRS&P0tbCRLRz3&)i@Q@xF-xXS7Oqv7kLC^L`Fm8M!=}Od?1mQTE{l%hHVM3A3lZ&o z1(M?Z^Z^(`O6bovg)q_6hVCQLKZy4mS_jRh4VRC-Cm*(`*5RvwO*fLD{A$y+#Uty2 zTfKmKzki)LoEG(B+0P3f&(T(0z8KFG9gfxNP=KO$q!WlU)IH!&#LVI%##3Ihz}V#w zAj8hmh9)?G-%ePWCkpq0kXB>$7nOIPdONJTcBsb)me#~rG0i1NAx+?sHvE-FLxVVU z5oVEX7x;ND5~p$$6JB)7&xc6g&hrOK2+~pF2m8S#$XX{AdM>+-G#|>P(60F(e#02L znapSnz$R?$=%o?ZcpM5fEe&ojH4`?Sl*TOAHjvG#L3<5!>X+id{6)WGW5}phW5rN4 zu};5JnJT~LZeT4feg}sfi6329Ed3dIj`0tIi=*b4kbWR6bdqbLU!_SWx1>Yp4vN&#D^Cn=x1y=7^4>hQbkUllxH`?JPXIg|b=pDWu zLE^+mQtTkYeptJo9r}3RMNi}j;4&ynZWjb{J>%{__FugAWw2tY+C6My8fmin3@dta z`qngcl=6mW!nq%B1DZ7;A$UF7+Fq_1);G419RzoT(jK&T4u|56QF5jKgZNIOpL?V3 zMXn$}cX72Hl}dkxvdNjXSo0>+XIF!cYr{jlUMl-;0!5!BnRySgX|Ugh8ms(@kDTZ>PO|C z8@ax*Ou15M?nK17upP9#dqC!dUN8pxs!Ov;w*C2gs-qtADa|;s3XDD<8(x2v%{`lD z;L4fx$|aN*g3+)#eZ;1u4KZrT4C51iLo3!O<%YJOx$&?(HP$X*jmYD|n}l>ch$-@B z)`c%F+p7vfpgC`FaHQbJ9G-dk6A2$LxE-f&2fE$hLzK;|tH#1auMk?-+e5YmH~(zr z(8J-RGJd3T!y)*xk8+uAUKAUz1IIQY;$S^c5|)F<+<3gCB??UI9uQrq#G&G!XX7v? ziXlTy?utdZeJm^yM{e%wBd+Q@$pg18)U&;b7|Vgpj)h>%RH-z46kS?8NB@_43H~WW zlq;CI)Few>ok#)WSRSv&qCLWHa+glBPzlU@2=TcZge7V4x^a|oW}9DM{+ftBZ=y>& z!B~Tp=0)X-YbnyRm;uP36+IhQ&1KqC+9XbFfVnYHkZn*Bjt)~!rM2P}HI#|Fe3}_-u(4?4y}zqY=6ThbSv!<`cDt^`DR<$97ySI*C4?z2#G{mv z6Ag^puFAVy1RIbPml4GG;Qd%#)*o1{bZANvvF;T~xktthzC zi{*$DNl`>rWIGq1;?df&ZY|dN$t4i$-}w|AB<|Qw_HXV*uU@u$Icn3~T6sl{=|)ah(`dtV7trc8FIDeln@&8}!9K^yC2@gej`TJQLd z``1Vv*1J4>B7s(S8JZ(~+U92uoRg2!-^UTD*AW=2<8t6b(-l*fG-Wf!_61n*WNRrG zuzdPqE3Acu67Idyby-BRvMkk~wamW#jKgNEkv71A)IpXFp|Ch{8Dvbx1CzkfG{d>0 zJ8bygBG@>d9YHv|CG`B%!aS2Jk%lGoBN;wpO*HV;0(tJq0b2g@LBUCU+dJ4x})xT4xsBT2Icp&>GDl=FUSUjQeVvtP(}x^6Flv#(r2&!ZmnqYV3OJlb+T z>Tbyr>XV7mrX!+eO369gW`891R2zf7QXBYZDM$&Ht1{K(tz?Dq=z9?-6{BeWhJE z^{HuEm+1IK=pi0qpgFCR&EQByrYeTdUl(#I?br7&nmpC<*b}0`+*g(f#Q+iVmpAJurb}6MqIFD z(``1-(Divh`<)E(dpQ{CQdx7w(E-k1!nv-EGUVXz(?hE1mK4n{jGh+r!ZfgJnI_zm zJ-au({~#_R21&~{^Jx1q-=_x~D92M5U~@NiE7LHQG;j1%7iRNgT-uTGK&*NrulnZ>9L&X zWz@ecNSW)S^mcBxTs)_u3a3w;q}+=~J03Fje}JIW>~7N^87QVA<%irXvuI$fNv7;lssiTBrsVr^5fLYT^F_Sg7f)~#z68ve^>0$%n zcy?%x{5)2ZKr4GL=eC9814-Y+oBo!XjPZcKtUZNz+jm^*YdbU&xFgtTqZ(HhU{}Nx zUpH^Br#C#N?!9IDwx8Z$EaE|OYnDIKXr6ynw{yE$aF$_dBtVFI)TsX;oRaE0$n=uX?=~-uah16EAQcVt@?o|&UMU!(>m#4MC zZ$i;$4b~?xR#DwtY3kR)6@d2Uunao0vX`7>anOb;4BPM7sOic)B5eNdXkV_PV;|sK zOu#bhDd)hkg5sPfmsj_B*fP8L^Onm;jFm{fA4NZB26bNlQri=ZI2aEc;t!W&RKe)V zC3yBS_2UbW$&v?^zD_;eH(!`kb*41fL7B7sn4@Zh)hg2eIKl{XuUHFmg2rtrJiJCA z5ssqko{@A_TTbt!?z|iXw_f?8g-zF=0R{$~#WjS)iDB}2b9e7vIokM96}+{cN==5p zT*g}3-hcaOQL65-Xoc2>jOgdJ>1RdRW1>5V8zoZqJa{bL{NgQ4T-A~yqk1)QfVB%V zLkSirn;(`A4NZ{2;UvN!kX6&C7}&^VV7;^3JC1IXN5#0*-WH?F-#`nn=eDY=h(0K% zwiOg!VL>|~XJL4R>nhywU)M9}TcPdL<|%X)0)+B7SaGzv;L4s>r* z<@79gDw`SKIc91psB`{?4e^HJxKXcHad@15>u0;Lg+64QxAK&}m>kGE&i>dofOluG zu_NqURP+Q>pp8C=_CSW#|1)p$Y^DdkACwPIDr5osCVU-7WY+$Mx!b+W)M-7Z@X<4> zgMBR3Q(qS+GhbmiMD+7twKQGld6iIdxAU^A4)uyzQ~#BnR)(v3r@P~>)~Y<~e~?B2 z@&PqVf^qN0hXe;65@Oq{O^!1J%0fd6v+N8QsStnNSv#{V+uAHi?qX9{)CBCp&PiQH3hEs#z)n;kqMBIXv*iskaF}b4`;ZGbrDWa`| z1AA+0kB;O? zJMHsY=L1Y|L?Vq=;@$i?3@~AD3QeV&9-xd_ee!T}PB}u>j3yM(Pc^`nO?TjcSYx;O zjJvt38e+BY5dC03xE(xot|q#j92PO2z0!<5>}>p2m(E%(FmRkAUp=OJHGmrG7gqAn z$l)J^ZH558W;q`zcJqChbfeW|o|ROKk)9}|A>a6gi*b9ykP&XtEAGpRHNA=s9Ha$* zDs%0z%ik(L@6Li@@WkdPL;)uc+wmOL2CrtRZ&GENi9Pa_iGmwf=<*xX?8ndW4X@_Z zo!(prY?)-ZNOgMj7X~*ZZ&5_zZ1v>It@ojdmY`}z%F@2Tk!bPl#1fT#?_-buVhO`9 zIAWZD=ND5xzEq(=jjc$kWfytMAhS6A;{_?V53O`hxnCw7-;8H>V0t;~tqss>7;5$# zK+~vTUc~Sg-U(EjB&Ho*^WtG}pYsM>d-M`>k+QPXJB?^zy1&8W zXa{xU*-_I@`X5XTE-BcBsCK{V5NdUMn&(|}CXXI=egmi$UzZ5;9dUO8%6x`Xb$Z4R zM!Vl5ja0X7J;ozo0#tUK0+VcdD%CHrOxhk`8{!{X>_m-UclPP|CiKgQ|0Z6eEK=cN z33}ztk~eq?7=bb_daR1hI3<*#wjJ})bJJq{IBxoiu7(cD{a88b;N%O5e&zR)UtGJq z;X|EWeQica^Im4_EI*iEm#Ax6Qu0iQ zc#r+|_#om)vZbc9XkEA;+(-Znb*9}*$u2qdj?G@x&+JBis9=bEk+!+NNBsOQ)%eys zb+YEg5Nm#qUMSuA(6R0K!9EA*pMNdSlD#y1t}>{CHXeYXPolGSDXOr5a`~$~tWWmu zi7>H!w4+{E|28l8F=I3PLm}>!dAs(lVT>@Qbk`q@I;Z=LeA%PQfhs}bO zSAq>$^z^C9{`#aDYlJecl*?FCggIIJZLKx#yNDxI6pAt*8WHKi|7IW-#+5Me3n}B% zC4HFs&BL{T#dPPo5z)5>fOVq(!IEOhd84?#<2;A%RLq6(gY;^%8((^cU$|XoL>aia zbZ~J`ZBCZ|L3VD|TjoY5OCG}bH_edqm0`iU5t17f7wNTp8JGdL!^`f;J`BIS!Nt z^wxJyf}HzL8S>XJyz5#k`bQ?$_Jk~myF^if6y&yl4Yd+v9`J2nbKYoLP6Vz8b@5}{ zb@5X=>{^bTTHf{2TZHXH&+xnO-T$Z)=By(HtOgi!Q6vSKMys`A6hpK!lJ$vBVaN~Q+rF^~`L`^e#cT#^1cMkFi7&&nFp0S&>R$)fU7O#KHDP+az2 zv2bwxRp0vfHFIVu)IXa@SYuPcrQo_FlP5-4Tyg7LHbf|E`Nz%cPo=Ri{BJoK8y1d{ zH*5hduZ$kHpE}B2OT-8Y((ElR?N^-%xJRn8aKCq0jLCUG;B#(#kz!P^2Yg!zFV9Nh z%j=y%YcslgyjxdQ{~&JwRz7{*CK8~pxA@NFU}WOwya1?g#((c{x}-U*w&?1Pg)6 z`wvpWHOIOX`;hK#lU+pYH1EP_e9bDQ>qnj&959i3nFjKeK0&Zm-5b(v!{6L#p7Kf? zOHDKWV%@}Emm?&S`^fBrzVfM^IR4~<)y`oj)5pl=XEJGSP*!NU)J>iSuCri6=?8^w z!+Alo+#r0BsqZL_idN5699*f@I2gR?=3V9nHn~!`#aAS#g^5C4W=1}*{#}FmZV(OW z(sk*RxavcR)P~9um$lSyNOSO@rW~|ZA<|62cf`SU5uy8XT}!V;BZIGN;QyVgguI-G zqB~}j8`jjV8k`fgXmt>Y^cSQvs0f-J5|0_D9ecgAr?R-{T25=xUzy*j zXFQ7k_AOrFO8p@h%5tVC^COH56uP)wMP<$RYh9iV%FEVo5`iyOAUp#v8#+w*C6%Em5E4ev3l z45y0s4%NP6HxciRevm~sa`K3Fg=!A0)%)LGbnQD_@69#ebnJ=T*}A!0mt zw7O&z&Rj%Y%;>4ND@vJ*{EnAo%^`W`wAL{z2rrKgGn6DGTU8ye)k5BC0`u6*!zz3k z$9$Aal`bDgcaZyjYcy5z_drbI|oud|sIpo3;R+3d^j7K+xNuNM6 zrVblW)Ne}OJYvRx23?{@v{BXcdcHL#*V6XXO*|*JD(Dx=>K90Ia`BV!qzH;U+p&^u zbH#n%;vljdF(ikTNb8g(L3b9DO_ysq|L5g0D&~%|Na6moxJdYLe@pGq(0Lf$i6hnG z|Duh6c{z#f3F|kenue+Pue8A!I`ZyYS^cghB@|1-1+M=fGGFgN2Ia8{zABSaR8+Yt zsrb`c@n>YNB3*6L>pGgo;*nb3kiS>z*b7Ye)ZUDC`oHI^&r%;UR>Y1f*=aC~9JoGYYkN+cc<-13`yaUxt+tMSND(8-A=3`NeR zwl4^6VwlKoqLLw<%RXl$_pp(93M_|*Az5zrzIm54^j&hz{`}j?HTwsPu)WEt{{71^ z<~bsGsh;2VfOor7zq`~-0yejO@0Yh}(aLlL^VH(Vxt>P*Cs?pn{%W>%Ud)z95HD_p`@_d=lD$?qLqWK)$g zzlLZk?_9(j8P>HAJ=46!NAYYH3~0hjOo@Lh?(=jsWA}x^kXL}bwJh^JrR+*zinS;8 z+5y-rK==j%x%3ABFGsHxeWQW!a&%joH{V;^Dfyrq`EGTp9O9UkSG1 zZ7+dfBpeGh#iFZf(JVx(*e$Ut#V)rzs6i?f=&xTgZf;Oj6t)Nl$(oOr zoZYG%a4NpyWwH;&Zkts(Qcai}RF@6tfz2Ozr;0k`>*t#Mz_`-Lv=IBTuV_!>>5vrGS-q&?V=z z)b4w?94$sb4Ea$t+TPRU0b3UB9RKy2OG}K`P3LzuDM%kKEbSY~tV=ubIA!VMIBOb5 z-mcFcd0Q%DG8<$N%_E=q;%y4`XFknNO9JioZ7xnY-AuZi9)?PZ^A`Xr32wz9SIA$8 zB;ezqi~TCQJRlhU`(>x@Xim62>LuKr(eR356ZH1-JZ58*LB*m>&A$`HxaWE{Bi7=Lt2TPlHGfO)pQnox2m0ds70iEb8hQ1Hd z6>y;4&)fIk2_QcSwyx7qXA(Jkh8uCkK^NKySQ;qgN%Oues^>VlE00pmExtb<=h=Rt zAi9TF_ar;7?9sV`%Rr?Y8O@OOer*nCTL%tkYs}aE zL<;3X{G~;Hj{r(h1kXRvC#88k(0e}0uPr&`dv^Te0=*>4LiJ}Il!&EmwK~@43(4VB zdG)p|$IIpA+a$u`iU((HM$fSXA0 zIkH+rVuR%%hycyELBtgQxR`U|_h*6p21XD3gdzz|{ zyv0r;2)@vrc* z)>CarJ@+eV;Awzg_>h}kE#6CDWoah_d3gu_Am6}Kh~Fz3AeU#rd-cF~>5IoQ15IUv z0e*T58P~KApT+zE?74o$CFGB-$LuGHuYauec2;-=?~jq`~Owzdd%E%7`uofgSA^|S;f+I#M zNp*r}-+&@yAI`G)5qOhnm73R;^Scp2yfGpSA@3zgp30MvmSLpZxMGB|KOH&itvdoi zvP;^C2zN_>KfC3AFvJ{siu2r!+NZ#@;EB1F?PwSL*N#;-j?e3K!!EBJ%n-_&Q}} z%wHRJFDJj7EIoF^eNlHvQ76n0^}f8jih*0pgZ#_Zy;(PS;Q+DM`;y!sAq_Ho=}yt; zrB3gX^R^cehXHxW-wewuL>86ic)d;96l#nn78IUAyv!?I1|)jp>WN?C zL^|NbBqi}^PGe8+1hob4$F8ojq$?6@7BTwqA6|x=C$Y&6+t$}Zfie8=rKn|VpZsp<7j0vwef0^RB%jnL)1YlTz9NfaYK^d2ejo` zvq_50NR82*a3aHJJu$uV!da}Me#VTI7Xx17rj1mkc|_3SBXps;k=1s}3uk2Df^@wy zHA_DVNtW&w@@$itoF$_VYPd_>L+|R0dkpwBn-)!z>##Mx82d@g$AMc~I^!Pxx4J9g z$gK-rkf*N0X!gLPX*5JE{S)Xbr7B9G+(=%pR48z=YN9lCC%|p@xq=hhTn5GKp^9hlTGba4K>Uvkn0eO(d zhgWiL12RSrk!DM}5!c*)$;6+}TImd(z4rP;S#;i(h_W+s@h1T_jn6~)HMk2%*d~F& z?#Ig6sr|E`4D-QhQ=?--Uot>F9axW%^=wBXFT}~Z!^kCTYUIsQAH&>_41brq{mSZB zu`KlGWK%tcusbwZmz#6tJn%UvW?2usUN}prCqR>cU2%@?d;~9C9%C-$9TNrkNXqF5 za7YFLqS^n|z!XjnEk3yTG!i5VQR5Tb|B7YxkRrJ$v1kCuY-;(FdWJb^}^lWIYX^ zYM(x@l2&YB^;hyg_A1`?JMDKUQ$z^2eWZP zX*;o90oaeSo7&Q+2lR7$%a?SXSc+bKS}#vck|qMaBY36HB|9tsjGxuN1OJGhYE=5r zzjHBtp3)5sc>jr7_vZSKRh-u1kyGmDLi+EVh^P0w8w1Xm-asqHC5Lq|8sSeQ+&c$- z3xL6)eV-YXUR5rrwRv$*TGbN$uHxy@3?U7cj*GWT7}@1ocB5P+(8m9E#qYG@0EON? zCf8oEx*MHkz2kc?#&oR~^+GVolcu-8n{}>sk9)DW> z%0(plA1Ja~WZ;zTUHhb@cgf$*$)_h|Wq0jo`li6Gm7fRhaJccR!#wW1(#_i|=yY_9 zZ}dZ3jHvHgIpDKL&Ty&K>4wJ7@wH+OT?{sDM==tkm8(0{aKn|!Ls4(u`Z8yW5(_im z$}WaUPr9bvuV+7#B$hMlfD5YX*CdwH>ij=fIEw?A`PaNVZg7hOJKp+ok3Nq)PFnHD{;qdTwv?B#WRl8pBIcpVy14}d-3K~4M*3S2Qt6d3I3 zAH1N>R@LyN8;khtcG~x|dB4P=?sY#)PV z4XU04AkkLSO!f}3Xl-hC^hzHWGZ;GU3-5`EW>@{|r!8(c-5nr5>0P7gy;;KYURz%1PDR@}5)OjixB z!1Env@Sp2keE9(5-tHaeC(r)_J+Xr^*=U}|<( z?!Q0Jw%<5+hD3EuBl@oRGkz1%250DcRN$^K=ZT{)O^Mae%e$|FDV|#c;9JLg_cw^% zZ47JvQK7a9E5=pEJ9ppju8FK-95PWKO{!QTw3YQsBEk+tPj+|Tuihym(<=msEx-1T z|Hl^0fGr@qU7SN@#nZBUxn{K1wbDvpZ%oKZQhL%n(1l*aRvptiLtYqJUF7FK%@5l+vmR>GbWK-eP{TsgflHzTN2wz8}9d~-_)#%$tQOykiNl=ICtpV3aq_t5(L0MEG(i2YG_Q$b@qIANx~hL8@aU0PWG$7Ocd~L?(Zd zx%;wXi;4n+!|Boi6v$U+CF1 zbMyEgqm7%p(BmetUzcriRE1|nZn8%UJ8HgPXWX15)m)sYgZ1~~TWFbFYam34K;xX5YVU9KCJ#(W{Dl0nl2zB+l+jktM&H}E)z|F zYk3TZ3&>yC1bD}w_;J>=r_xX3YHwf^j+pFH9>hm&mJzDNzE5nzND|yX+rT~zonKd8 zLs3=ePJ{q2^lKX@hU^nCWWI}BuNnTHAOTzn^y1Odw5a<)S+)b3aGOsu++e=#uHA|O zTp``D_6?l$6uZ7M`~25+{Z&wq z+qyohBBcTa?!$nX9Bz^LLCPSk|Mu_vEFwqR3Z$OdKjhj=8Mcs$a5v`3LH^1KMB=%tc4Db9+C% z{7ZfRh9|Fx`j~O}G1spzeeUp`+WIrQR;0fx%lWGggW!R~=VD~AgpsSLF*KZq#A=T4 zsq1)H63^y=QMjX4yBU>iyUbH+`-{HjDy3Fqy}+CNO#8}am|oN2Q)&t;BG+RP%X0T* zYc~8R&cFWm*JB#8Z(`V%A^Yw4E$&z}YnSVTgc|0~v?ou z(x`y22R}j%f^ zZ_}TCHO6pP)IU>4GyUWunS|!B;uS`y1yZosbgpzu&W8~`u7QyrpLCdKlaocL=qXBk z>R;KGPZehdIVeyXJhXR#`mQ$t$0&8^LlyP{)di8MVa2t3C99q6M+;RU|^yztc=>;ZYtnfCPW9*A(pZ{B3-6Bz}x_NRm(My*IXXg+0 zuw<6d!;;`G6G9V&UiH70t>9{ua%4L6$)}TjzJGCRgo$$icog z9YmDat0rtal-9C1P=3yV1YC(xDYJ)@I(=%2KUP}AT8Wo*lnX~H%Rd%MibzhdfSU4-<3n;y~5{uF;w6GAp{Fy8Q|dMZUZnXHmAz z@uS@N9sauk^C=GRmju#QmQE??)8VK7vNCF}i}%%b#`;68<2L>I@GTx2C{HEBW!{jp z1Vwh9edt2w`GX7ZYDoO4QT|(GP0ilN+UD`zXk#DQ?472*zF8mw9EBSkBRK)O`ajUf zB#X&G-YOS^^G7?Lt!y$b@#q}~yjQ`3{Xw3fR9g~jDogHmrA~o+PmGA(Y&^$1hnp)+ zQ}xOYygV@l7`jlSXc?|yK53n8)%Ye_VEUZ~bZg5d#CL_8(OTvSnuZ}$f8Q(SKlHUS zqD&=pyJyPiB~0@B%NAq{Laca55E+Lf!&z^jOG`0;6X(38L_R?`IQ4a)>_KVQkeS+J zB!wDVXjYwxrOjMli#3_dY}Q%hFm26x7%xGdvbl8b^M5$&|LBV;n=BxJlh|BT}LBreQmwN(W5AZ}vU-FGIST(!p>eYVz2XnRNjF-(N zuhECb43pTAFee%Yr+Hfid6$6iO;qiZng{(;>y7v3?AYL=Gbdn|qg?-?>8Qi75pn4` zZzIpT-!}z%SAP~Vnm`xuuWEmja4_fQWdA_gL&K`>jkI;Nzxmh*n0p`)pL;JCLT|#) zIBQNsI>wf1a=(g^gTi0e0L@$66$#0uW~gAuOzYYrQ$P;ZEWajQUMC3-woJt(uM1?> z_=?Ah8>yor;QfguJcvMq0`0QjV>%NErqqr!%vKl0jB1jhNm$2$(;$Ogj|#2O&=Wu- zxFnBC2z)H{gg-1bkQxP)bz6Z>{Ks53hQYy2qdhxe*(XSc3qM7@YJo15V&92*81qiS z$GG)38wy;Z^T3c?a160d)l~Qx>{6=|i)*M-Q zdy^Aqeo^M0y$uq5)^;dQT7 z*`&M^wDV0PLbzgS-%Nk|j6UsD++c|iW5esa(bve`4diQ6p5CFR-#_bImBp%e-XspR z9O)RINso`q@r+CaAYhM9?&rRz=JKqTJWdUR2b$PB`H1K^TXa$h&~V>F0||ilyWTc=reh48Ej(lFP0x@&(48e(7jL2tbrZ|H__wbqe5| z>^D(O7&#k5vQC0YlHoMfACUo1`?XDA%4UQp4S`(!$HFqdFl$S_Ev1idz9`~Wz*>AE1rzt#pBCy=_x^+<4biI z^>whthPc;DuFw-Ytl0vF)-v2ZSFL@geW&PL=`nn*(fLx@G2PrW+0vJ?N0K++^7FiQ z>vYOBPmvS8Jatd-S&Ng-f0Yo<_qD9E|NX2XlFCT#=)OozJFIbkf9{P5amGL~<7=0k zO!Xr(F+bZ^H{2s&b2oo*e{Y(pXIY|>EYj6n6^m$;_XKr8Dtc4|~WT$)L}_e+#cc7$Jg z9AkbnX;w4uLAl7!E;|fya}78mt)zG#8LZUj<&49%cp{!S#I&FSi}^$Rhkb>0L7TLd zDsSxe_`^Wrd)dU7Q_jBxoQTJVBQxE_r>$CnvXCGvQo_?1*sk;Brev?-G0gJvUzo&D zUM;0p&uEvMT7?89h(M2;>~elh1TBXqrTB>1Uv1CBwii9XZ;J*}WCgcwoV56!qa*Ch z{SJys#v_t4*QJH}!5)B_3v&wZ$~MT__E1vMr9g&Q!;xF`6{P4ayA|wW6+w;;>HU;f z#3?h{pgZUlrm`(0zRAP&P_3slbtC+$vdvvwAA`KC1yDm){9n`XAGC7#+vk?yOwX%1l`Z~`I(`s5P%u%1L&P)O zu}tTjD0P|DaSjVfNyy=MiGq*`P<7J=xC9vrpeO%xDvM+(o%Oqg!npIBF8(UN193Q@ zmTr5k%#VrNAD^xf($zTnDNcm$u667&X)t_f#Kl%iW!Qo3+uKQ(j77S!YJL?3FRcs+ z{irzt@HGEGp{SD~DB{PM9$3F{KZzS8lh?>l2S09?D9d|C@BPeb)eRQX=@r-BkG?r4#QFYe-xF#^e4 z^aCl&#n4J{eN6l}MI@{~0LHj8+hV))*w=+9 zoX*EY7NSNFSA`W?Bc24dTJ^4JxnQavwn|EwZ@Acg68Lf#o#pbo zA_uxnxRV$61iZZXboN^2ZJ5s99xwM7wMCj$VV z2G>T9JrJa)sz!B>vDukn0B{0l#H2*22hrq{;SI|d&4fqWJPvJmqD#Mgh`&+z*=BlHovtfUx+p3UD34MlJTh7}38e#JbJo3asP-dLGgf7Zb@Jx@ z!m6<+ZQ&!4{$9fCFMM{wM_?J97$|T&PCh(NH(8v#A4#2XxG7NBlnj&ZhY7f(Mijn7 z@=0#mSa&fomViCD?zE5sm8R34l=x7C-y{_#6kBG;zG!TcWIb?||BLG2I`@UetD1k#PIljbP#arrzjtuoEofItcSv;iqI^IDP zL4rZAg1V5X1i9|sXc;9z9=%>m&=cI&eva|usIRLHy-tdGh18g*itH6SN6*#d z4EL$YH?q5*9-lUKDkt-H!V2myc#sUaaj^t5BN*qXW#!oo=LhoF0Z z#Lr34Fu9dyRY+sJDNRxhpOSEbr9Lg1b*TnGR~uWufTf1i#P?U?HyHLpBT2SgD3#LU zYw6=_>2?GZnF(~N9^XbHzrY)c;XLoJwjcYTzLGPhb6>DyXdMB47a#-Sx!IVv@h~LL z7u&Tnu=b?;KCBl@X6FD^<++)dw^2b);jfg$ew+^>By%ge`3r<+u}uC)r@#wuWqPJd zPD5@VgLJ9xeG&;G!C^>TrF-4^c+W9JIr9;9K@ow5B?Z~n`?|E)3}^TwT=qfNUsJMD z&oEYt?HoQB_GEF6@GrgvNRyPKy~?i_`%^u;`$2Z%?%N|ujh4d2OjlmM18dc^H^~bw zuW5rqDJl?|{9e^FMCM8up|zky)^Sf>LHvzePHNc%ovUGFqHGn6hK9_GW4G>L;lfi6 z-nf=BdgiG#!DAC1rPURl)+OGQI*_qDa+DO7QOD`j%ZnJ1-xeJ-JWR-;kDXLSO!l#UlnfVu@72<#gp@oYFj9K8x{9Jj+{E3zMupMff&Guyway zCRcw;&WyO0@DZE4$e{j%Sv`OEJ7j1%ZDq3oL_LmgualE?!%scY(S448uW;$W%L^kV z$2gej84$NR*UI|Wx8)?#VqN@TiN{uEH*GBY#3*y_0}vKa)O6~8|3Kfb1+!K1QgmqE zvPt*a!2Eo^#kf2B9OfXW{MVA+dBq&v+5$p#R?=I%v_$E6Fllo=D{j zuB{P5?~*DL^{{Ye&If7R$P#rSnh)wCWbCQEi5!FQhHTEb^OC<2$mU4mWwy&sf3U%c zk=bRwf1036$Y&RCwOO3Yy*jH+l~>P3NS5w??n~)Go9K>@Q<3QCrTai6%>)w3G4MvW zFV9b#U0TkelIRkkt##l&@O^YXb}AHFFQyH!&ZZ-5p8AJB>@T2heZ`)Cl$yeX7hk_V zK^Onf=TYBjlVny@Jw&1b=bhS&r#ngzdo<1bOzYZGW)c z8YzM_XtdV|%30?uihEPQ#ELBwsInphTzF`hXF_~!nnCjdA~iIuHJCr8AdnZ3m!g0d zr^3>d^K4Iat4VhIrA{k2)YTUjJj71tWy+lQC7GHfXkRx6xSM&MJI<9>j)?gMPzt<0 z&SgE$v@2e|a51AbN62fQ=0dp&y#ehv#6&pCsG#W1k;F{-Tf1k|=qjM^zLgK|N@b$G z>86Wa7vpPh9OyN~5KaQTge|xC9Y@PZF(Z$*@w5-z{AH+zs9X6x1)rykofD%kNnC?h zlHSDCw{8)A5HXBlp(OqsW8@r3SAb}@_8!IBR`F8bEaD6wE-kp^?$(iB(H{XrIWx>9 zd!SAORd@;H>>HuSK(v3s>p|x!e>I%vr6url{JcU`s^2}<3kPe5mFin~^$x;X>3v3pMvwF67 z9igkeZ0$g1d_9p0s{-dJ^{eL1ffCfR2l%jY=M%z)oCu5J8ss=wu;p=^J=~Rc#a?I?W08VR1SGl-LW2{Nje^6AQw?|hk^ld%@+N?>*ND4>u4MR_RF!}J=;B8< zcc)yq3)NewnjVyELN*J}meLWy4>(cZij zfRLV~BflAOD=;)}GzgTNj*R?h6veQpFfFst?aNtscV3d^U30BO1OI3hXmvkPkeiTL zjusXN7@rr!!Ux_0d7W~3?MAdgz{KBHuH@EL>nsh*ZOR~eAl^Y6Jl_8pk-fFjY$+O$ zxlIEh?bm_K9qr1cS&SQboS9viQiF;7z1)c^7k7ZS=A=Iu{&>~;7%Yc2*A}1e*gZuh zbQY(I|6bm&Q$Wzem+VP~I^)oGcGFDl?B zX07^*Kyp%U|2tMKS_ZE4{7cW(DJfq#$msvR; zoJ_{17o1FTzA>0d)ZaZ6`Jg#BQZNqpymxJI6kdPww+<=-*&m9}{3c-`-Qv%t#yLDOYl_kdi07#^r|m9&5PaZWL*L^>hsw zOJz`frJLXCn0oIms0#twn!Ecq`+$a~V`C9;82og&m|<}0uTTO!_RXeT2CxJ*;h%p@ zOG=*{=qgcPM}u83_Y+3PIz=7#?1k6$iBIxx6JMUbV_Z|x+-d>_j*{Zwf)PpzP3Pt3 zvCoXCc46Ej;?DT*v)9tCk-C}_zF7Z2;(sK5iA6;^*{c>I6YqK5a|nyC-Mon@SlyvH zuy|8jOv9@=nlIBh57v;Jh}GHFVn;vb!5=Ty)rE;f)z=y?k~X~eqt&{3V7x@Ocnj#I zo*5y}Er2N&==|-0cNru`_1y2QdphG3CDpX9ySOuGBbpf$AM{MB#Z2zWzmPB|b5$JK1YMw)0b@#-0s_Z{tOC%mjQb)@jNy=re_C|=kyWQ< zL>voL!=wFj>lIC7o_#9F*~=V$@75g!^licScmVRz_obZlb(qmZNqTQw1i0uYm(lfI zA`*2oQ3ar0xYkcoF3zThYmeI3MjpCvMP)YO1s)dW51;1bT@HuL=_t z3yjj+Rq;h77{<&2(n#X}yiejDZ4b(me(Ao`fkmT%to%_>v3AaD#>c4&GVCO4W0|aw z1D+Tc?W`sw7m*Deu5`aOw@CC}{V}p=H2Cn^x~J1LL+neS_rb!nGd~h%ztxIXQaCpA zbAx*_f3G*guAh{a4(62{IWPegQVE^kR+botMWI&dk)nnv+*y!m*!nXc3zvv`+E3nE z!ZCn2ncTH%_B3n^tR)<`h!Nb!TTVI2z7{MC>BQzOd%Et?xw{{0O38emI~H~&xWOK% zp}VKeJ_YpOcgENBfjn0_>@1ab4fJWZI>X-_aosqWtRoe}pXqd3(>!Ch1? z5Rn}l>^t+~XIb>TR;!HBuoXZX$uI9xFZSK&@@^7i%5+(GjS8J=H$3YC&={(YEAtNW znq&^2|AE3cF`;9=Q#);4#q&!lM15MKjT4p!r49yPn^e=lCa&#X=W%!u%UZbT#h!l}D2l4_R? zj$W5Yw%6W0lm0kZeZDCQZ8Y|769Y~;*oh&MGm^MwQi&C8Sy-1iYMLI<>;je-s{h*t zxR?WEO9}`Uy-CQ%tpRc+H8cm|6T$S8Wh6hj!HQ=qx{3xfMp)jdgG1b|2>&tu%;Qun zuq@AzET4wXJMY#qeiMq{LwBpH));fk{7E3>YzpxQvk)&iPJOTpdvsIw7%|}$3_xeB z3hg3Jn;AKQ>fXU;2Fp8P=%VS@2RD(rhHElg33HUrwypG?*fVnm{$O+41TcTEmLUPV zB$AaqoavbFs}sJ`d>h5bQ%{k>eZScNb(cLlmtNlR5?e*tb@QlUHkkt_AuH8m5R#?TLg zc27kbQnw&g6fkpAY5-XTfW*QZ=@0SBnpo_cEp)7i%N&V4XsjVN7_l77|Z!quc%w)YS|+% z>@ZUMR&b1aeAhFzr-!G@OoK~}ee%CZh;=9gpmY+B`;4GMbZb}z71(DwMvX9XdK@ARn z6LCQjr+Ph9VIrwow%IqRwo0UPQ}Nn1a@q16`-+!3J3*#zo%Gh-oM18Ri-(aDSl&^W zberD<=j`Zh0anw18HgKe8~ku=_jIBe(@5*gY=b}jt*9rNkL)y;w8|@1lkkO;ZoxOh z#}#=@hkGm&_-2Q!7c^A(zB{zv|AC~q-T@PlCe?;A>o=H*5X^`-K1s;wSzsRgnvZQH z(hfX=co5$u-u)f=1^QGx1ykJ&=$@n2zy`Ct{0DH!_u5(bM7U%FOh?~ZgwXF_&bca$ z5#-USh6`zF_Vr9XS(<5R3_vzcWNLUW|GEHc=^p3qJVx2}@>qsQJr4dMG&)nl}9K1D>`NMT}7CGc)zNEatPAlSa zl*;JGLVA7QR^2*+qsDHMn=_mKvYk8MGDOs!Id2!ysOUXs)RR{IRKG6WGHYApNR14# z(9wBdnXD~6;OCP<6v9$a^j?Ri*|$CV&($KE4Huxc(O3(pKtHR)56nX`69Z;U1AI(v zIpKpD?MKPh;tLJyM8$lTb*%)q&IJk;>bjh_SV4AkRaBq>bs3HoOcF{U__J zUOyv$+ie|#5!wC4>R)+QyIwwGs>*BPsvltC<&-IEcBc(Lp#4B{HN2%@-`Akm%!c;0 z#FPBR|HF6T@i0$75yi`~PdEvA+d6uxKZ&;icvyXAhYeZVmTdnkUD5lg#SpZBbS;Cg zT=6C*k{?qycJ5h4XFNoONX*^qlsYRxdV5s9^N^|#Gm72#O(1@$#>q{mKpk%XUdo+n zrk|~8gps>obdGaGVr7@n`(@f`=o>pT+8$4)MDVHfA9z}LV}S6Z%VB|^`XOPI8e}q3 z@KEOd{3QFRO-CIKq$|0}?E%TfJtIO4>5_wd^PZ!>!Y z_O*HMi4FVrf#R$hQ0>?Xavz19X?1r>K2J?_grdT()La4U1K{t|+3`!SOHjBAS+ zfT#yF6U@s$SL;j!^SiP7zyH|Rl2TAWg{LAd9EH+kGSPCQ9(sL}AQhz>LZr!AM~jW0 z$Y6cRrC*FD;fM7#kAEGfeLD=oWhtOeRCr_&p2nEssnQl`=S;|?}+%Vzz+;|sfeh>Wmu^Sc^_<32F-Ef5}#A6xP8 zz9_?3^^kw{2*?{NU^MK5MLtW$`(oNaraR8M=e|Amqo#K1hh(1Dz?R=}Vtq%_mNn8z zqx0CBKH416v!oO=VM4t+F=Jx$EPK){4MV<*wgY)rWZXz6?00WQB`!;JG&z+MekYG$Kt@Z&dr2=;9x!`X5NW=!)-|FS4!$n9~BHHza^I z$poP7O*LWCUw2z|mYRdmMg6e`M2;56u4CKI+<=8ZSzV5op5Q$QkL_qh-svJu^~zTI z`#Y84T!tMP&Y4H|LHU6sod5cyD7%RTx>nKwF8pTfMf*nhLD?KNuJWG@u4vZCaGk#I zn%&4Wmtg24hqHGz~${bM?tjt9Hg7et5JJYM|Trq3rty5Dgh3d zMRV}t9s?YJ0`FQC3LWF2_>T`RZrurgHK&d}`*Mta7UTXq>Ab%10ux5vtm^Tw>sno{ zfKx|3uR#0yA4nPpU4CPdTKAG~^VQWK^Gp~c(3ad(ff7R}Vcef5=p+3uDTAZ`~knA|(806F4mo#1OT>X$3GC?!H}9 zr>s(PS4^s-ODKu8$!S$Np!G9e5g{WfRU&w(i4J7#k2G$U)fe~MR|Ax>_D|3!cKl>r zp~iZ+yY5S2gxfcq!c4X6KNn z6-__Ltwz|FC6D+_%r_7(f?;TZVOWaXi2_-=?^^P<*m-yn z?qH;BiOxwbFgH-_)3P$TSo<@(T;XP13lu5H>P!!#VMtb36((GY%P)cceA8AH1C?$P z3CkS$c7`B4jUQfsF(vBmqfW2XHf9*o6anCciXbwMlOn>7mJArJ#d^vubD z-6O_t^R{wjII>P>$ZDVvo&5)z_*{Rfv#b0Q5Xc{@pXIYE6c_(nfug!7U08pBvOhk^ z<<2hMUY3T{JCg3Vf`O#~HaEveWX36Cei!UpRT8_xo^;;@73paa<4(f%%h^tnB&8kf z0StV$8kc~k-g%C({}xWH*wwJWxZMER$OI6s0?Vkk_NRJ9s#HoJ?*Ug!TnBu5iQ zv2{1ew@LH(Cy4M5h1FS^{U6t=FnI0hbi;s4qVW(~&_Dn4y=|gpCfDhKcGWJfNp@Lr zSGcuHupWwc+2;Ib>}Qnda?AL;_8=97U^V0d0!Do_X$yQ1ZEW=1%356fvI{pWqu++l zYW~66={c~9(m;J)9FVK(fok#$Em7+;Y*vkKBAJ`iGJj=EX z;5-k84t{+`jqu*5d%o2`_2;(Lz`A&>bL~^l>=f+kG5OK z&j7pK&;oa_+@i=Y>H#Q_y(7R4lP##i;Bu5vpCU&7vy+#WMlz#bf$Iu9wCLiV{xHyf zM%nDr_!vt9h(e=>>^e6&^9?`;rCJOhruR#zi(%$T$(U=%(cV(dhoV;4^$aa?P&^BI zWE8_hdP}(7>;q_`tRb41+kH-wfpNgOQLYd31Wq)7)eZ8t7NrQV94yzACY%MMrB3}*yj|fdB>t?D z-cMsYn6`m#83_UaO#+gi(=urHq|$Kn4O^EL_4Z!!f^N7S~XJ6*kk!N;v>h6TXYQ8r!S z4%39YY#vlMg(JKq`ojRz$L@*zSW2ZemPbGzN8jyt(0R-uQW1|)9KjvGcw$bnp#9<3;PJJ1< zr{uR|En!B_OMu;Gz;Uw~q`Co&G>=cCwf@nG)-*| zkhWWC8i3a;^&Cv(y zN2lMF0*W;mecJ_S`0dO#j^-INSi`nkDVN9GS510(r)id3t9RDodCsrLNiGd{!SK=A z@~VuzacB6m`0LQdyV)&piH3jYjMUHht?MH%--SI|W4#%E)e>v{areRGRYtr1o9yx$ zQ9J#il345WtLX75youEd^*b*>=>bmw&)E@8e;)+K_Vfuq-$eHS(Sla|v=>OJfGPe| zEq%h>6HE>lJZ3!>Gek94NqTd(>2%*m-leTXTsX9&Er5>af21@lEIc{T{?7ZY?orE; zFF20(%mIU3rM$sba#q0 zC`fmAcZh^^cL*ZQfOPmB`2F8+z3*DHhQ&A+?>%Rqy`TN;XP=WlT!0`c?*8zrnsSt8 z{4X^%6*q#*si`SqaLMCq(#2*$CnDrNCEz3_V1K^0{>9nWvEs@%#LMZmuFnRQi|w2} z;8M#%Qkw<)oLajIXTr7y@7Z!+2m&&tW^X4FEL-=Qg=_#;d=0+fq|O`v>+Kc~f?}!? zvdzMW!om-XeHDlqq$w$ZNRr}#`I)WY76)0#c3>r)1$`CBJCym$e~!sb_J+<$!B=YC zi!_#3<83dz5RUcpDZaUnTs{Bz>+R;{w4=>}-EgYBVyfa9AvUs?m6a7n{4Y(vah3IF z!+H4+ul$pUkZUiiu5p#s(J0M?DJ(@1@SI>c*16S%;Gnj=;^bwb1?rfvjFL{S_zKQY z#Z-A!l}qfSk(DHC{tw*xe{u9NT(a8OW?WY2(VCv$>%926lC*9KD?x+Wg28o+_|d)H zm!Cn}N|ozT@q0M`&{8KNxUkR*+smpId`jwNW!~Og&~-%B1g`1ijb6G0T`re|gxF+m zKJOxzEF1JacUj4aU?T4EaIX7#mN6X2uk3RsH*9~wSaj@vWS=}f)u0u|-5LdJK8%MD zoAO}_^NI>dQv%MxXfhSrJ3T&;uMiIuc9XOW%S9@9xT6#=tG4{iPQ@tOmR~a1Pry)( ztE_-QsGTA<8!o^S;xXinnoZY9b^VdQMTm_{3#k6M&tH zO{w$2E%0idG}mKgIQ!BSA7lM;X6dRqtk`tcvi}3ChqWkwDr*T##B_YmT*&F_mCpPc zJW(AX#^aQ&<@eQRkXEXhO@`!Wwmi%-7MR_*tv%aS%B1Y9E;SV}mAZC+FA?W!Yv*g1 z9>)iqTH=}BQ*-nV^J18_VANew+*^o8-_x@f%cB|ve*JVqRAil>8vRy8tA-($#QQMz z7fYkNHWY0=h}<8kN7l#WQ;Y&W(rGI>E&iw*=_#Tlm*U8xYMW-p;Q7m1Jm#m}KgdxU zo=ynQkoY9=;2#U?YhZ^j3BOc=c+zLlwSVxj`GfxT4N27cnF+&GLHLF=YAgARz*dAz zk7FmrG05D&bR1ZGOR3PLROmM(b-_{Fty_rt+$QOYUD8{f=~=TcdQY|BL~qE*A4* zaL@m<9#{kDDFOEmj9C2PUg^OlAD*15>MBQRp}|U!fQ&7l|^hfn{nMD^`<+9`T`YkuyNSosJ!SF4ZIzyY4LzjS24^VSveS}vFyTr zMZz`Y!?)Stw&ofkbYjS%2Yr(>y@v3gH?DX5Rh^hKutwI$jS4-AqULRbo0(GQ{X0eS zw8pYEJF8=bT*D{C!Fx6n{u9A`?JD+ob4Pal@}Dl?O9v{i@{V;_$hIFGm#WILz4Fvz z8?jKO*)wh>lpuU?>e;UAcMYm$R=ngb7nbsLV>52GpQ58~m;nQ^aK7yWjtbjL^SLaA zZ}0kD(`Dy9gKtHY;rbm`>O(akLPDWmJs_Vj_$JiO@pEA6646)p6c0|@Uv}_fjj^v3 zasK!n+zbdZNGm9&EQ@VaKJ7QT9+e{R7nwDdI~{E+sK|^tHRPA{-~w;Q!W7LjwacsrENcY=uXN`(meFxpw=; zC(iMZ1{p^N`<(Da?}@s}aDIHo$d&}3uZMEZIea4Tq&b0cea94E;Omx)D%jb_pIarm z!OgUVO23AR;&$J!0@0fA@V8AE7hhg+3!lAiN!h=g`Y#>>_k5rD%(eEb$Kkk2Em&GS z^ROb|(DO5UoNx^Moq!XY;>}ALS?v5Z?zcl(a%*O#NV=O?oP#qkvjQ%xhxNZu3jt5( z8TF}6o723nWWfq!MXCO8y!dEr?$9i-^$O;Pz-vgUVIW@@x#7d+XEn`6AZN)|_F0>RI|=x@6{dGh|^ll~-FrP*0lpuSM99Hj_? zmj^;c=Y^LC2{h`@RBF6h^=}{Slz?LoFU3};xC>I71jFsVlI348=G5a4_-ZQe3rls~ z1~!uO3i?X1c#v*B`Ox1hl>Nzb2M1TcicdkwQTVDM{sI0>0#E@4;D8Y85SILdQ;NvT zs^uZFCjVf+ov&R6O9u?#f4~CRSxc)5SR2fR9K)%Ky-aNg`bf#|C2NEKif6;^o`pGk zF7RSu!NF*$a8#wniUsr~+-bQ{8g(9BaAm6q6(c3_->P>$nO)g^5v^$C^y_eCk#v1X z=V=x8^tE7H<*1Dm_%P%_i^x5cS2^tjlGpz5#hZy^*q@eHs>Cj_UBcIq?xcRU;FOh6 zQzqU~bDwa}*Me14QagjyG6sOo>Hh=hfEWLe-|d9+Zd=58?IILJ()y8iTMnBb(z@)9 zEWWaz_kd4VwV7Dgzury%4Qp{Ww_SDF9S+UT`XK4rxY*9^cZob^?97_i;AP;Soz=7e0A=V8GaQN%eWjW8SvT;r0>OH9{o!ruhvsFt+0a|UP;<(U?ebka zu!q6i9gw#>8mPZ1OHKJ&dHHj({Y+_L)pptwYRkt0zytU_UCHcwCvoi*37eVis>ezF zG2dT(ut*Xf;q=M_UQC>2s)zA!l@%7+FD*swymO3{O$NUJGXR$LpZ5VPYZY8{YBuSb z3EWTf7SV}noM(bM9|=wbl`HglCl#s>FRcvnSfLmmc`Ry6#w=CuJlA^)k?a(sBKFqs z3131cx~8>leddC_+qnTeWlC+5@sE^FZ%0fw-N`vsXbJQy=1313ft>>++4G3AR^N&* zo&Rlk+4m2U`TCf=Y{#so9;RUu z-G^kN1mzK*85}(oc=H#yYmhNKWEd#{>(M0=j+qF=$NisIdvZeGorZ?e3c--IZ@!om zOxrorxxE!7=~81*^gC*Ds)qT>3pPyNWxKu5JSks$>froWCC0F2h)e)NzkEeY8$8Gvw5Z`9Yt#C8Itd@PhAN>T? zBc8X~@yq~zs`CTFt!&}E!Ef<3vhP&x(2=`@3O|n?7~617zk0>205>(C^iPYiL4Lx6s>X#wW1Lvy>)uPns0*Z?yun4&#qbjK^R$4`5U#7 z-rqY(w{%4m5}#&=wsh;QeODkpRr|30#}ZZyV*`Y4_G_JGI_c2$GaS>6Kxu!G^JSQV zlwcSCKghG^bl*|8pF}B0pUTB=qgFy8J2Cjmr>cys(15i%uKoE-AE*zgS2zY zyMuW0_c2=>UWu&vjOh|JeOq2u?|8&K{xY-^q${~ziYe>U2lMKYE1@7vK%=Omg8~x?9 z`=2K5t^I!xiuh*=0+&;(0riJRAt!qOIjMPA@&4D>i!PgAA2O{#tXTtAyVH%GrVszQ z{w+cbfFS>erQ#WNJyZnSR_O>0R;DhUiBK6~PcRvnnCOD`j*l^S!scpLW) zgmST^Jqkqv8GO2XKLxw(F#JJI>eO$s3ywjbY{f&6MfxGAHzc+0gRA@dVtw&b_``(i ztlPbxV{tU0Bbj=N1j+JVtFs4^C@0KI-wrNN;NHGE$FCqXR~Bho7Gzfxb^ny64e-DR z?-}6e*`JzyaC`(K8aS?*0_T6h39{K$wo6_Rj~8#)TaL`yUNuB7tzW%fbX^He%ZNN_ zK_%I0iA z%!c!?BSKCovp&dw1hD+(zrZmH{&S-e<{dbU&N!DwfBYC+X$N{#_G0 zSn#jQ%Br+ThwyB5diq91>G=7vx7Kp4rt1SW-vpsvsJI)g_$Ef>RE1bo7xhMji^7Cq zgAfc6d|7w!oWMW;27YwRlYT3dR$o)}(p>#f`tJ5yIvYzbFHT9%>3U_3ULAE{k z=h2@B&Q2Iv7|}4Sphn94@Em54q;>TR?%@i6a}|=T7F)abfi$*f{3!v1kMz6jtVX|# zKZV|FPh?+8$s^rPEo}7lI7S4wv_F?VQWn*vr#momX0tRR<~m5=KI-|0ogSpDuES6Rxo^Fv-Cw~C6)${zxGkHFPmDC{y}_`g&y zD3x^a(Oo^j{d?GDBHIy<%gcwT1p<&~s}F;`55}xJNQFVZ0Z+AFOI_S*!j8P;Tg@CU zL*%Ip7dBhwIW>l&K*!<2R)wFFu(7GGq1Iwaxx21FmYk@Z*L52=P_PjtDs#xpYy#zi z%D@vVUQ}GQ;fyo%XTwLo-z@Ayi;S68p)E8uiAtoe+YG*#t1D?Rnp&fw_fN7!YOmCT zqcvR56?zJLY8b@f^rua29u5-ze$@NqO@Q|S57H(`S^iIqodoGAFvh+yFjNP(P$e3ZLG@J95}Yi8WTM52@gHQ`*=711qE(-8Ky5<~Y z%=%s=#z_}5*p~#Ei$Xartj`P}E4!jJ{lKq!ciVL9AurmAh0DlrPG|6@W=(vYm=MliO|EW239Ow$qeus^+O=eo2}O?cPyZQ zvyREL#;wk4-dA$(zh}FWw0z#9W*I}m>*b*((iQM!VrS9qx%JD`;bkSW<)Jea{tPhN z5mHMW;h(9C`JgA_HvIXtvYssw)FSq-pRPQ#Uq9Vwiu*>jLFVU&R-@787bafAY0ud) zozq`V?sv6l!C`F00$7YT=;zpS?5npm9~z9cC`x2UK9nEhxG`qO6BpTaGd=`RMlN0)=V`k)il z3irF>(58cyfyop=lB%hIGi)>eqhUQCSTP|G*!UDPJ8kkj$fkeYx+wWV76his*jrlG zTfZ>ZSb{val`;b#F4QJZ_aU;8Uru`<3yhUUwQNzGRV7!jUpl!R0&6<=v0}7cLRc?T zxTEF;88PQt&EVRmc`}++Cs;~=C;>d|CZNkaC|&+zoB*%mev8DGiVLGJN+%X6psLd0 zlRyZ=BTS#Q@JROoN-Zbm4f(mCd)(}gh#>@1aH$b@$eMW zj-+w(-RCgA!rT8KQb84B3KaQ+>S6-X4-G!a3v0J~pX3>m<>a`99xihE$1L`f_0KQ( zIz6w)>TI^?tPeHv;C_1#$BY~O2>XJE_2ow!E?j~HB|N6B6jFmJy8sRicQ9ccc$Ali4$tCa|3Y zQs1+xj|s>)tAQM|sg$wP`-4!TC`d#Co&qw{U|gkUD9Np9%DEx6-J>wEA)cx(&SU;J zCRuVaBddFBYbRDq^2b{Rekr?pfVU@A^e8h3cL}UfD@a3(Oz;;yo^IN^&7+&R1qLy~ zrPaT6+D9665$>db3rvrZRAz&E3&3vLC3+kip1V{5d3 z5P>Y;QJD@hMwIIxI6ewsMcb~mpI!KGi0>JerDyF)j4Cp~DxqWPhFRIQ9f^R$KzeW# zU_L;YP!0-}{(SQFT13}vr33yX(ilqh)T0`DeA`0YII+3c?zva&xe~M6wj%uGYc9HD z6rcSM)(=$Sj@(@usUVxk&$P0_M23x4x$7vj`M|aEujxhABrnS~%cs#z2W4k9waVe2 zJWu8{H)ZA7dW^gvS6v3Fe=cVas;Ca5T8wfyE}WbqS_W<}&Y7)EQbn)R5iITn^BzKF z7cYZ-Hs!TAu8-PJssXkyR?pZH30df4msG=I4-2)C`{!=*G8%i<*6PMyS$=3F{tKNa{A3XLNaeNY*7duCP5-EUisWcs1V|fD6c0=X=X5ei$IF6xHr!?E4 z!vxQA9Rs)Dyc`4Z<>Lyxj*{WbLKRTNqw+1OC2FBF);7_jrjb|TnK$I9%&7A~>-6|Z|CtEz2_IdV;>cTI7Da7I0;AJgk3#Z}eHKFm}c@AG2TyLRCfcn}g+ZPgUlkxcalmxz|%H^JwbgglE0B`0ElRTO8Dd0#Y*m9z&&hK{XJ}3BIR1 zG;&mO{xkvaEo4PhY$G-NrDo0R7Q%>q7FG{U@#0+AJ_US!i$woLAnQ#~C%=%woG>tk z$^VQYL7i6wBY7urBt`1ft0%AZm$)$Q?+@3X+uc)|o1SB%ExKj{y58XIWTcBqeX;yPlRo;GNI`_k&e28qp>HWbK^KwMyq%1@aWaR&O0}IyJ zN_NIO{T+rzi&QvHi4s!me#g6_r0H~3%8>aawIK9sOKQrUKNunHYkFDlDn{#>`Fjo6 z*K<#i23Z(VPp8y^Jf|6?>bY}zK2mh&Q_VZ)tQ2M3@Z(nHTKJPs=w!);Q_voU%>N|D z-L%an;i?|pRqG&V4i&67Tuzh=gPUL!(WkvYih-mb3duKJ6{Z!YW{Ls+q^MAUZd~rK z;>2RduNpV(qiCfEI&)yArzY$q?F0(Sx`2@Th7sVCzr49K>;W?7%jZsC-wpBlO~)lA zdu-b*O%4B-2LSUrbE-p*LV6SVf$*l`^p^&LYg`7?3w33JB%W?N3Q`QZ0|^DWS&!b2 zQ5ELv^Su^lL;3kGtQ8_5f>9in0_^2KU|et-8?7er$8dEPdT4&fA2%U+^{B51s*JH$ zlawH?MaSPL+l0l-4_@E78-16%yR=>5f*8}IlJh<#A)`JHm2-*DxR)vSbMX+-?&I?* z)T+qG*Fh38e-&9Fw(XLgV}33IpD+Cn;xgL=Ak@swjvftY&CF_vhTjmxl2mMcio7{E zkv#6?;ic*SS+|XD+TrA^Ada^;WLKPpM?mCDgJ|05n)fq&RFe- z`SD2&WyDR@>7^A|F1S3rnboJ~t2cFr(pRdFMJ1zR9@g>iAVaedp2GhYdAE$54n?8% zi~dB}{jK(!1Jj%UA`U|EI<;SjHdv~bk8J*9`O$9sljj~N!tY=I#^YJwu&)d!gb(1XO{YtcPSSWZ!9M-cWWWo7 z5=w~iOAk%G?788!mu4U-3c2JO@@^Rt_fX+w)JONa=6osd4=SXOHSkHZNr3)&Z+eut zRsHfaJ05F+&||*SI(5UxT0`r9pA7YU(e9UscF{EEDG?k;&%fCY(+LwDC2r+UBh|^3 zkN8CI8-W-8JUP7TD@gwS@|8ni{~$Q;VP7a@E;9IuRBH;)^O>AWMDf{BU1T5#y|^k% z)NpR-<5DedP=uu&2Bg6Vg5Xr@SAB+ChDX8J`y!B~tZL)kCNa%>$L7{J8uJ!Hni3Sn z1YFOuEFG-3v95<{zGt-=*VCw`AV@G-ZHt_(U89sAOZ0IAy~CtqL?}cMQ&5N%Ajv!F ztxgN$KPNzxdxr-W=tEHb)}E=5!ZWy#cmIr{u7@5UYGaLrK0wA2`+kqe7Ay1MZcc1~ z7}cj=;+LtyzkFm)uHP{jp@Fq|n{f{za04J6(C-+jy$= zpS7c<{~+fnV{w6ej-?PBGJCN`ylV0sD?Hv3$d0wn96DXs|EfZ8ShBGF(GxV*wcQ=F=6CMr7Kk^JPfa5d z0Cdxy^hsfAu_M~DG#{EW`%Mya3$Y+xH7T+rW;Q;5hF@2G3vtt~8F~3xiU(g3#a~teWSTONZ*X*e@FK1+nZM}Il5%47 z_)(l7(Idg7HcDvwP=%h6u@D#I#4;+3Lf)5ayd*0no>$*^A|grfwF^g+KB!*A{ph~l zS1$ADQW9G~8JEHXRXYMg4ytGoD0UU-S78u}$!`LIxoMHQ*q8=^Xo zAtsMhqSD|JXp2S}+>N+ZKWab1JRAl~Rjy7Qe$hMxgE3)>Ct^7U4FY!_L?1h$cT-=W zZ&4KU_Z9ieiG@@q0U14kZ~DU}@R7KS4S0Eex;H+dL^eW?^p_=mt5y-W+%vSqCp08ttEl*nEA|*@?=!!^RmQ>X^pd-I9cvDm2lI!em z`aw_KW^QHyg5o_au4yCM#gH60Ts}XAXbr(GwY_pGtI*Y6YHRB*{|2yct1 z_lwBI57L~c`fQE?WF3sc*S&t27EPfx`JwCzmbAvQjKRXTyI}nTW*ig{m%P%EB#jo^ zgbhWyqNYm!R@&T@tY*!**H}K3JAqVWG)hrXbPXR6mf2Z=;l5ZtsoeiH;@S^tRW*+l zLVrN`J{E;a1N$!hNeC`$`f#1_>OtH_yl(uXo1aWr#58<>maUHWy z3S}3F<(WDPnaL(uigj)n)YN3dC(X)GvAZESB1{H8`c$Zo8nDE!27TB%`3`N$Xq@lC%vfa6;kPQnHSs;f-# zyRBZTvYNPXT*4hznqO#z=g(UZU&$F%@t&Cc#He91Yq)ir^kDJ~j{(E4Fue}v|N0}eu zBO*6k@|28<&MJW*%oaBko5!Ou&#J$9E?tMr#U_(>52D9`VMz3S3jZVHu?xNc!v<<^ zQsZAK`@A;E5{WEpxC=aKNR^4$aGoleN0t3uUaH8IE)|{erj1urbZpfLR7i^OkfL`m zEZ?>jJD$obA)6?$ng*9z4xXefy!)HnR6!SBUn}%^wXqHzX1NZQVrDH7PxBf@#B>3~ zdsL6(sdPOA&NLxM2sLhsrnh36;uZYv50x}b4wo|sv@{pHcuZTV{z|fw2wAB=Xg@Qc z^^4_GTfRTBLZ9rvbqenUihype1}XEuvl0r-H@3+?JBxkaz#l~Gz>3}P~5 z6P!xwao~?)$g5Nqpc< z4`xmLrOz8CmLoyQh?tNh9*pnDRsHY1N<+iRUvnxEv1HVumBl~3eX6;&ip%}-1l{0> zgDmnuYkK}wFKU&vw#i7f=uB>pMi*jxdFS{oN9o$%SB+^z+A|AKWdpp@d>SnX1WU(? zZoSa`RPfx!Z|!}zuMVN<_Z6bj?}*gBs4+!kax!zO>TeD(_JfmK=^@1ZjE0v3 zocc+Pa{bl{yFBLrI(QuDSNH2q@A2p?!qeCdXX294!ms~!Udt~nNPfd)H5ERHbAZt8 z@P%?`)0hR9EA{|&0Yk>Th0cV+vJ=Wvk2KT6)cA@LYk7!aIFb8};~UeD%25iM7N@fK zFrs(Tw-b%k87kFi;cf2ACx)P40O~mW92ZCZ_#X}Ce^XY#{kW|_y@yX);my$+8+lHk zbg##KISnfM$5szwCPX2`$xm%0+Q9c+H~oX0A#{QLs{OtUI(glz67E3{LVjKtny~9@zH^!CL(RJp>r14@sZll}%iL}AWATu8AKgf>*X4lvG-r6tv zhrSQp{Ru^}o%AtGvOxqyCctuO2(y0bS9Ysv;=(ixAZjl86M~{0glXxeMx-sOpYUPI zu=eE_i2IEe2WmI``|pu>pJ?f7T2|3*_>MRGzZ+iW61qj5DMri$(b+u>AA%;XRn{>y zUWAHK3)SMLk)0I!%GEM_$0m_f*%wQDB7WT%7(%WtUS~2L$**a(`jH(uM{|+lU5R(w zn`Zs`;WSGM(^Nw!+hXO7{PQ5Aj0!nDX>KG%!s!JJj~0&>7qOWV-IAF(yc(N#exzqRR(S17_sN7=R{+-a9i#9y;*IXj2dH*e^9u(M zsuI~)H$J3r9xUWwk^!#o{y#b}GISB4Uk$8YCk|z6L~Z8h$k!hw z$qBF~7h2O{XrE4ei#jutYvUbVI3sFcW@JG>}X+$JZy#nR?XQ zS=l8e;B;JWDEVuHmnB>aDB>Libia@x<@20B4*wi?R_rKDw`-eIEcJasH=N7enAW8D zr%IJ6k#fCcD0>h;He$zsi--qcEDF#h#XX^(5v%Ocy5dwcc|Io_*afQ8i`O+S2yxTt z6p_~zLlRuqAba%BbY$V8r7bSQMU6i9Mv!+Eo?f7OroqU)epJp#DUM6M?uL%|3L7hv z(z1!f2sI;;TulC!2ltpk40QFFd8>@sb%dicXeMU{@g%^r>f$)FGUY_3a}jn1Hu{+w zab0J^xa@tuYrXhhB4@QEsAb;~`Ay(n-Trn>`nHIV&$Cd6Xd?ri7Ljm^E~eS$ZTAXI zP6lhKbR-Q!B~tf}M$*~KXCyV&hn*03D598%TXld~6`kd7QGta22_yV$i3Yr(TPxCu z!fL0{)j~=DOwF9L`l$bo6U{$oG|!r<6f*GP_BwhBD8q$#fRTXY9`Kzw%HcrL<6?79 zNkJ*Vn>{wldAZm0!i|C_7^p4~fZ2d@1duwo!;0@y0^uZ$Mme5L{r3?-Rh{12{~+M3 z2yn)*LAxm2#t-8OOyj5)U2-dGdidWibjF$bKKhyQP zczP7t*bH0slrgvKGAH@L?Ftx!{-m#J+>kW%9;WkSZN;ZERORn8xvXnEYzK#<)&PlH=jmbE8a@svq z>NiM7Ex`D(7cPpadn>Wgu@D~quUdC;>_15I#(QLa|LLef(rs6e{2Eu&@Wm`YQ0Rk67#*HqE9S( zgV~whNSKP&(!$(6m0pA@sx`Ql5}#*dal@y(6MmQpTspEa2p16Ms?oOgNk@_g)_zVc$OU=5u9$&erKWAbxvyjipCXhlH z@Q8o@77L9WD3qm55TP1)d4$Y%-RmF;#YPBP3Pg&pGc^u#h{~M4`zc21&-Qvb^Bcd| z=0)2E4zj+VPxWvBPfXs>;Pr_(+ij~-7G7Zi(v`VNmiG%l`IdmMEbnvbksHKTEu;BlDD;$40u zOGmt<+>0fy?z!(`1C6^F)I@UMUX@Ho6&B;yl~Cvx zj=A_zS#=6)eqc|2)d`QV!h}?BN9q8P_{&G64^<&zLr9Lb366~+7i^&wuBwyV&FG1} zUW`EI70bhdkv>0Nkvx~@+Lmg8QF(uz0>zbwmWH(aQ6L>D=qsuDr8(C+VGykx0esl1 zny^gN4=UTiDUJ?T z2&ecG6W(1@g|-%cH;Bxfvk+e@YC*69UVbmLk zo*X7d+Ne~)>oyAmULzH3Gr7?5p>Xv^w}{v7Pu_SmQLY#IFiFemi|}sumq>`dWf&b? zKDZ~wUyvFLdvcUlCGXZRlzF7t5_@P=)Qge8lB5#t8cQz|8K?GTRKA!<{u4&>sdPcP zFgpln7%94E%1H;#kz%XVxz2h9{%6exli@0}w$R}gYQefNkIr6?^vU06b}O9dqM3FK ziBm|~Ro?_lLq-wWr;W%P7_t&quDHbO7_;?{KSZK4-_26m4>C&=NM?(|;)H*bgx8#o z3l1?O^Yjkn^_<%jrdPYc_s?rWyi?)f?qx8lmBtl>myb_yu-~Z65a5om-`e5{bKYYP zeb4-RzZbkgxosdWb$@sxeT8tX*{U@qUcvDXV#gQxv;r?lR7zyJKnyUNT~eDbdr8!E zjo(yYq~e>Nc`VXcYZR2!nb+7+&1luaBbeCqQ}2jIl1M+7o2~m3tU(j}^1AI^&hwvY zCDV)hRv}|LRYzwU2i7vWxNzR78ZA(Lx_LDb17+?n^#Shh1WjUBy_a_naa>@USIK?j z+Y@!ZGZ2%Er11`K&`1VURL}mi&kB?bp=iwPtd=oB*C`EN%In>XeMKH*Y=HKgQ7VuW zMg1O*gzq@SzVFDdE||>u2g$~N4j+x5llX>>gW}V#yscf^Y|4-)@d{BH0x0OIA?Y)z zAqsn+v{_Vg3zW$1AxQApru_)J+l5lsqYhztB@)mn@ubpYDeSj+wQvW-xNOm7$nrwP zlAc>GPh_}g-`BVwuKoXCEUHDnNR@CBTL_L`zBD(X=K_5*uBPb7#=@Csn`i3rXC?Bc$6oht}P%_Kz;QqN? z*AH{dt9{zz=G~o$kd;gQ#B~du|Dq4TJn$OS!_^xt<-(JhZaSW zS2dPBk6sTbu-VVR$zZ;>6n8#~rpkG82APx3rPTPMNIV_-FidQ%Ro(D6Et9as4%3GQ6dd&K}$6szVH@->yZl@JEYw zTox@1vEQTce{qiX7a_sfj5kBj(qIJhW=f$D(Ep|=GS@U*3prxYqlJ6f{obT5O*W>^ zWJexdiRz@&CZwWT;1JhX4t;wd{~1BNtpJ?~E6N#{mY>7|F z`!paPo3M_}=FmqFnDzOXU<({D)$IVU(;fF*`@ogN0i8kJ)yy^8QD%M9t!Ifdc#zt^ z!>hj9$#aG^%<`%ScT)U+tu`+(6$0D_9VgJH5;u*FaNyC$ZUHKhfB8lFtx0+DC_W7a zBPzg45L)R!9$j_C*!>vGg>UKRh#Nhr>0iT(R{bAWX&zJpb3-c@(ol^xiAVc4v*WY5bu3PLgf0TrV zNwcF|E|Ss@67|xuJ`tzpyiqsM4)haMCzeJ+N(GXbfW7OE7^0a zA-nuU>Tb6145_KD_?4dDL6ho3;;(+MLloRDDzn>yAt{BmaQ@an3pKWjpMxr89IJ)y zJn(#Zd>%xuL?FXs#cZNV4^=Hx$+eU zUvF*g<+OdRULKXCWDE}qJ5_B4wstk1OmL=i2{gG+8gt|+Nn4svHuUq`ADV_T-=as+ zvvuB;nWoQL4I)?f`!%f{PKS4^WWG=z6fu$ffnvu-Bqdr&3&Hk&fo=WgCg4Zib!GjV znPP!Zeiza6GmWz@90?+b-bHYx64{GJhQXmd6L~l%4u*sVs(3Qm8`_$My7wMq&E`dc z%a^+4#a>)wy+dQy0uiz1ghcN*7(d@Do!v_Xs!dK|72BG}*8ln;J_LH40DF1$SRHI? z6|zfD=5c3k`-9y|#0h7+<{Qq#&tZP&zryv$iiHZY^5Syq&oME{t?cbrAj#xsHedh> z&0v7T`~lA*P{%v%)#MHOurrpZ?tBzXsq!L(GbcHdf4N;h6A8@hmlbZ!4ojietBgtT zi!~C})_XUDstt)@sO3m<(OdVO!b2@}Y$Ym-5k3oy9=F}gk~qf0!#Umyo%zP1?Dk6A zv=f2RnR(vSj?tkdtm*@PPTqU>xfCW9Lf60p7nK+YIa*OBJOm8_A&({la_U_ca!xe) zJ;3YZ8Sc^jgM6WUwV3H~NO&KU^TXc5O9Aji`$fyYp=!GDeZ5!Y=TB}$0?xx%8*?lCEYj*b!O8+i*|4Z;@+{fd(1R|KI2TTu^L*Uo&0Ti%6*mEv~IM;E8?** z@Wb_u=a=a?42^7K2ItIl48X9^yOg=u2B+zEdjIj`la6tp?-Ewid6Ey6>=uFce}mMn zyPX4Ot|!PQtUcPBkE_sKX8=Ajw`^fyFgy#(w1t+l`t`C_R0#zI4pGKS<*x-lCx6=! zN~9e4j3imn6YvZmdMo3Gi3=7uVinYK^}?r=k2k_Ut0@$syWzI@grGua9^b~ssPS;4 zTpb}f&Iq)=9eBIy7QE{n7dNU8O?>N~Ku<%dF+X(J#Ld5teaz1(QB%2p#L9#1>jye% zfpnP(_Q*$1B8 z@qD^tdvk~S)%z@nn)L3=l3iQZrARVE10^)W=ZR6Xg8AsuI?M|`L-M7q3VDhpDh@Jw-%LVzI?t7fhm;Jr6(+Q%HtW585zt5#BwkKU1znFp<{!Qe#|8Gf!cN zSnl{2pE&k;DnU;HV#GMz$Do80tT}vt8EE)FNI0yN-8xKlxCuft<#6MCVHVQ(lBi09{r@kEMBx~wkq5qtT1vVmGk_fyE ztU}p>glr(rh4-itL}YGdNA{~eJy6gKs8n2z{{urOb^dbHbN5KLZtvHnW1r;t#^*vVOyU>AWd zbzuovS6AsiunRoC5U9-pA$9d(f3CKIqCG^%tyKqG7>CvMFAbU4I9T&XCoq$i>~RB@npQqk@B}}vm`QzLL%$q9_j*H zN2!Gnx+~5Tfu>Z~-5q09X$Mq-CMzN6tAP%goC>5AC5$TIFtdL;nAzjh+yTVPxv^w|YW2-l4T4)KG}5yMjidQ$>K2ibF<>-UrC``v z^5i=n-i;iF1Dl-N+qXu94qshp!XzZ#No3PGVqe!fd^Id4#!jTuhpo@zCSeD>Q75Uw ztMFPA36ok%o2lmbxaldS8bqCq+{n{IE8cyN&3_U^g$;5aIaMO(aw?k?%>k`R#YE&*xj5}1@)`hQHgNo0Hu)vXm`lmrX{ltJd;aQC4;*pls+R-)v4IlD*^YyGZ`EB+iVSV)`)(+QUEC-PJ4J>~IaWeCa6 zrZZgL>wO~QS-lAgFm$nDBV1+X?YMi6W7Cds{k!??&&a=uSwzADJCT(|8kkKB z%=%#marnk@EIbxqv0wqA6-qPCG1JT~gf`V_wE$AXpO8fg9Y6Fh zu}yIUy1ow(a`{~e`Z*8E)X#rSLx*5mUYK3Gb$>FwT_A+K*!8KyDw6AWB5e3a!|cO< zw2tr#a7+V_o#%q`iM8WA4>7QJtZ?6Ug|w+J+N8jqyIAHj7kD(jYtdu+uTbS2zCyET zbh&=-q=J0|(JxtMtLORE0_BG9(*+!6JfTpiB4%@??Mdls$IUCi2YTbUIBIhYN}JHa z>>p3o9p??SoZ=DY?Ti~e9GRf`YNEfiXYm&vO1S1l>?ByCJwma~Frg9MKbaw$mP$L1 zvuw4P(}VjZO-mbIy%MOiPb^#L;4w`~+=ugfYe+~MJ^kD~JWeii4t z8S?MFT{?|&lu2{c)m)w?bQctYEAbCx>1@SQ=d&#~jqU;~)B1HZ3}riING_kt;0xa($3PtUMpx#^SG~YRZfaLc~=7Dgg^N7!a0xoH>23_tC)#s zmss<=;-@K#EnIuQZNC}v%WBxQVEk0@cJedB9`_quhqmm%sjjN1oheG_aAJH6gN zaVr(!^yj>`w?|Y30wLm*Yt8>vT1~BD;0hKtiwPlOAIz!uo8ajW+oEbi1RkDmd;*78 z`$Cu}W&-ig*hRqjFz&Z2fWOQsq@@%*y3pl;?HaHxi2j%T^1h__DQL$`j?XoqbOB4I zuL<0!nBxE_7S;l?C)t{l_Ig6iQlHs78Fp zfB0S!J{aRH)?<0)U{^NP$g(awp!`zzf2rZG%b$Z25l}FW`0z~qhn{KipU)gt#SIDL z7WhpWNmpv;K{{N@td-=LBHh|``}#`Ia-?#T3SDSh+4nb##Rk>HfjWrNJyqY?LuDOh zMc>~PeozT(DE|hh87*W`zDM72Cq=dJm993Z%qNK`q?)_x&ExjR_(_O8(&$qmwZvszD?+Hs7t1lYNTFla;C_7T!oB7XWSWU|kOzB*aef`s zd%d4xi*!2@Q(?Y?BMk=6g&OnN>?49i6L_T$j`T*x2N*d&gG^lKwval_-$TgN!`1!8 zb+eqIylJ<@Wy8diu?BVczdtZGd_9`*&#`K|To$ueL-u_ts`t%pT-{NOC z6g2Ku*Z@f2_RmVIq~l+zFM^WiD?qopPe$5vnWxrl`8#lns_CX$3+AB59$Rb1e7Ah; z>TOWC$UM00rYmH?`@X)Q!SIL4=5h%@A9?@h)9HKW$`1$yT@>|TNi4vDJhIgmfTsXn zFemcSQ~tQDZ^tl;H~}%n_4tdm_h{E%PfCNmz|^9O>xf=v$$7l9BREWJ04FnJc;mqB zzMPAM{W2+HN;H9d)}=zle;~&Z#OD>!J8Xzx54fl@5uaOr-81@bhp3YT5ucjIu^)bc5?I)?5yWBP=S5qE_9tG(07 zzD)>3mr>WjT`ug}AuV2^VHEsuTG@IK06-z?$p_XlSpr@#Aa8IeQ0AiFW2iu|!?rNd z{cmJ*aA@Mb=#i(tW`Cj`k;-kPl=>A3G}2q>|G2`uJlpoHBe4D872F@MW(lsI13}K) zrB~X^9)TN->rNfMWKlguBe{T7^6+T(`5iYHrwSU1mfR+~F7e%2{V9*?T`u^j2#igH zzTP^IgCw*WVYm?6r<%XB4qCxq+_L<*aU4Bo%e9*01->!BVL*L_qf;CiogkWhRs!6?jgv)pqoE%0rI1QnkFF9;bY69D&v2r$B zW4kKlf-<4v1>#kZ(AaC+&y14ZhQ7bpo1aCh;xaj|e#gv&=!B()I>csUqx_XD~ z_hR!{rVzD;5j%yugK7mhB@%Uc4fsFE>BgpG*sA5BqC#=@f)J@5BI@UfQQ4WuoDXc# z(DkuYjb3c4mn1zq@)iC{SYFV53rD9p&carTE^}RSaG@IMc|x4cA}^DNWgi!K4Cg)? zI9qk;Xa|{5MG3@QrGck9law@I!w*N5S;5=+;K+P55+14h{UayN9tS(e^h9jBckM1Q zux+}R80Sz{T>RkZ`gBltLVjyJkuTRX^ zqqVo$c1InNEe!@V*f)}Wlt)?B`)}-auz_Z5HGE;K%jwA|&74G9N^bxJR%g_`yRBf3 z1oIidL+~OfCZEI12@3~naf|I9k&~NHP_!d$sNIx zTgV$y9-nJEactcOU>I<1n81=l?&Hv9q1$duiy0~?`UiPl@A4qb`4of}QlF%;a9_FI z-3>kB3W4Qq2*&3FGk@TeRfpk+2C}#!jGX_b;p|#ZSi|3MW27JkO>ewZe}_3U_c|h3 zAWwR~A$8sA$Pc?Eqp8JQG%ZKlKmAv4vYDSJDfO?P>gPPk>-fmOv50Pet%ZExBI54q zJ6Ej6HJC#Bq-N&WUAZ1OWw2*-o5&$eYu`RLTS+5Yjqn|@VW`ux2QxOVW733_H!S`QN+P_=`HKF#C3DvAs$(*=A*#P18YkAucn+u$r;gv>CH9f5e zaZNQs6;k)h*BLXnMUMBJWfS%dxgQI6B|4a;`q=H$YAlxFZey$09B|>NXK)q}GQ)Wz z+l7QDc+7^&-n-MY%)Knp(jvzfo+ZP|CLEhW2wNrVA*X*(<0!!I8H4|#LCBhc@RMjV z?lSH3Ee&=x1nwzB$5-2!g>0s8Y>R9``93fqswqx3TC7TU$hgDBpaKA=DTFn2+3!s~Pk z)Vo4tY~(xJj!QnzwgGOS8L0RIqCdI&?dH@+46SAishLeoJu%#NQr=B=YIdOhj$OxZ z8h#|*tjQ>Pwap!+UHp;O;wyz`47&6dJ#&?_*=3n-9`j|$s@up}p7gN-(z4qp(>qGB z-A=2l#Q|Jjd5J01h|{ccpC7mB2?dL>0%9J(yZ|Z}&`)a(+y|*L$<#M#VZ2_=q(%{-m*4<%h;4ZMYI?#JwkfVXqr`=h(M#i1;2qDom}(kB(1y z_Y>gvo!UUP>ncgnC~&>2Jw!+~BNhk?o)0r{!wRM^WX`WUifS^7kpFvy{N>3~SHdwd z`{h{0aine5Ns{zkk@e;vaP6d}g>>+IF6OsmOE$Xlx3|i}(N#7YAF_4)`@yOZ2m=;@ zJ^;Y9i}_#AcZh#{picYD(s73JYGYpp)*w=Q&e}DSC1c5~3+l-xn45fwD%>S@H({cV z&-|{|`g488*3@&dcw)+v^O_hZ-qa<=7DnIrGyXrWfm8eW+vm}wy)Y-%dJ0QpPw5o^F)1d%O z#Nq?%=U5iMdF8g%Yi5!GUbi7YS_@hki}mT27E&Owx^Bn*SV(euZ9{yYBK9&0eAL?YhvN#G?FX3t28hh2lv58MqRrb ziV3`Ni(|8sO$*Z3esyX9e|iLSybiH$*`{i0-#T781Sp|G%G4qN5A7~-%((q}&EtSk_puWC;n>l%O z4~uYIOT}`q_`;k9CoCMAJs4h9(yn++bO))w=AM4SDq9AH#6$mqTiz@1*urM#Zt*YI ziK5@GGI|x1f0$f^TXlorGLb<;!ct~5e^Nj7wEdHdrAs>t-kJigmUG*6VQUIeb9Z);v5lwx8C37rOr&9 zyYH&caXMZi#ctIXzR(857Q{dN+1ugn=g;p;SeFPWsb7kGjw;%R1UFMBsQ-}a$Nrx> z=ZVBdby-d|itUf&=hklzp?I-{-e@x-B{JDg%p*DVUau5bz+DWi8I40S7R}pjCLw)I z`g;j_VogoH7LQd4ZpCGQ$c6h~^v93Cfbl35JKjja3D6$en=QFjuTQtYM=Q8cG(8^Y z7w#rO$5)8cQ*%ujO9fD+iLb!t>z=;DPMjqkgOl4d?>NtN zd%m*P@i^`QzR%6v6!V!I^}%!mP$FuroIJRdHGIg**k8CgyDzTjxh2dVNI(>?bSTkD z6bX2jNx#^l`WKnqoWtln+g=RHIg%{;eiQO6HyX0}#@nmgxP9^28{T?sPaZ@AIOA3H zEtxs*28t8AKFXozxo#cy??DGNefT^X?-B7XU3 zwj8^6D~f4maOC!WB*t{Ki5*dNdk!WeFxmx-AOSqC0xn5k>D4lOz>>0i?i;znXE#76 z#A5KBCb%y^zg_YjR$nIbpHDM>nbLZiX`es8r=!v2_=smfbwKC2`vrp_6DDARtM|Tix!}aJXSFkP z`QG2`8ii_SK-;VF+;>*uyoH=erBsroUlF6Xo$5p^KLuxwMq37Gz7@&&ld-3vzmoly zk5IjQZAh#wm3CP-#wXE5)f0sk==~N%+lhXQIP7Axz4>kBmMB&ie2}ZlmRWV01A&*e zMVacK=*LBH#J!3Bb$=J*Cizl3-z}J=H)%?HfHg(%GGXA!Km<+<+6SDy#-;Bhp{*mb zn6ICk1=V)RiJm3QpnRUF|G`_^C_FdsUQn%T11_Q1 z=www+oQy+w)S%X590HhHxoWwnx$Dd zW}dB2PY-p1`)E}5&Lr-tpOb3Q=<|GMlVzSF#G$}TYNZqTuV`rleY%+~%tkVj@Mk!9 z$}$QX;=FCGRM%c}9^w^Om+Z3J=sdELuMt1rhcw2OmG9zPWjh$*R?`j-d{K}6-7Vw+ zp}>M>wbkrn8rUKFz_EwoLnLkbIrePHq*9(8?&fh0aDyiWd=vu&Y6TOJJ8*&)(zzd4 zq#a~_By@-m6yFMHP*0w zL%@a(cN%xN6|50iXjAN!GE&2#Xv;i#5sE>q^76YGVj|CPOPd#H(p0Z%k86HCtIo_n z5iTu#VFm|Rt%&qe6p;!Z_sV$T7xp02`ox_0Sao_r_w}dJD6dnwSfW$<{GT~dMaPH@ ztRL^rH2&H%`o_Gppw?t5)|qd5&C1Yv0B(sn*(46kl)F}UF|VabW^+R+LNgZo51rh% zD*0J;yR1hg$Li3$weX>X^7_jm6q<_{&R*rraT<$Kv|$3-y#`LP z#oO9lvxC65oC;(~%gwJ01@#VO0_oNXgK%tCMg#gCnCK9YME)EyXql3;xYlxa*%>z^ zJqbMY6G)^%Rpe}?HLb&OhCuq3DNdy3p9Z6P7*itVGSJWw`gCiV56Bu~FH7?r zA07zwyjpEmg*#ZO$CjmIRaiGUNIl})SCaxFb`BEkg!9#9-PjexP_hfUCr*gM2m*}GeOz}=BjIUiIpt#ckFI{x5_Szo>=D{F&0SX zJIu&-{B^ew9AzBrOq&DG9!T!CxkqLL5y6`88Sj@@U6f@VKRu!&aeZ}2{bYDQoruMf zMBxp27|66NvRg$=O0FaZM05GI|13veFI0CYK*Us(@Cy8)dx+|1HE#Zy3HLnovs6^k zPsR>7?b8m8sN`2Hs3>c_Y-Wv#;Zf<-VvM<0VSDne*zzAJvgy4IxC?=9^cU{>Af0+ zEucLeI>fngM0>=9e>kIj1vq2ZpmBHv&qN(lEieqY($&^SSj+A&y6qgZG|74NkY<1g z58U_I*a7R6Q^4$Go-*%!fSd!l5S-rG%kY%|wCK+>C{UheYE;M0yR$yP>= z9TkoOO9)1%qTLp%T|SUo=F7wmO0Wc0p1tRph|pikWGHu+9x73&rs2w34Eun_l2X$* zCX64H#9BaiCgEf?a2WY58u?kC_4y-%tIg*=VBz=;U%p8PJ~m;_eFWoz$}+!F1{-s;t>JmKLxf z@qd%F>b{7=*Jvmj{~}qS7@3;VaTh$geT{_g~W1nILw2_^3F4`(o%+v z^r@v4n`WGPoe31-ux1W$!uU>109$$FF`@u;HQGYl&Q>{_#@=hMFOf@c9gPL698u`I zFc4>dZ^Z9L+5ba(?Ppl@6skHqjU~*$711qQwU-&PDn6i9vW&rND1|1{&4N96UF1^i z&n?OFRQ4#V{FdOUq$>CR`-wP># zI$$Yh@yR!vHJye*WbXrxS05oNPMORH11*-7%9Mkj@L>r|iau$-m+s9ZZ*^v}m`mH4 zT|Goi;v88 z<;mTk(iwY!dCCKh1kYJf*dx;3(`u}^i}6QkYOW!o>y_LY=%a&C+P7ESW;0#Z+jvK0 zY!nib=e3|{hEb0#!6C4C!>WgPhOr1pD$Sq3T)MEbEg$4kfG&t22%G?#{TCp0qPOWw zc~hY8v(`BnvKySQV6}iQSDS7@$SRGFXAw$K_#^`xy zs!gL+Xw53gq@xUiBMDu4hnsL{KJmk(4_V3?br!phEt4Yc36BpHu=qPYC5`qkSJ#88?beNe~beW zX2p4VC`b<@jLbBaq#f(6*RA~NT7IaDdba+{p*PAyywf>(_`;9h+N#eoW;XAOZjkZ; zM+ z_mIukQ$LgJ_x)tlRri-_u&3oR-DsBfaAJ5Tbubx)YXB$Omey@nDY?zc=q`nka17XR zi#@N|`g&U_;-`T2z94=Ine${v;nlo%7);X&n3V<>21$*ADKtzq4hqznjw&K3Bt=z|OEjRPV)-aYLtlOh zokDo=Vx=gHOJ3%OK?IWy+(S8M%cPpbvOTBqE<4N|jV{}1%Rkt_B{~s!QFMGmL2W!p zI3OiuPmZqUDb9mpAWp1?ScOc-krIfDPxi8%Kvj>`R37y0vZC*lbPt7c*+pp>3J{CE z=xgb5Xu4KjFQb`VzA#z>BZPkt5DFmrT$2FaT8o+nH~8-w)m4PdOuL7$p2zdlqEn(M zM&#A;k&R4B2IhZ|jc360y0GVTN$JoWr_)ozVl3jzplZE$*&syH)A6*~`1ni`cuW5) z5P?y!!h3h!aoJ__b^g}Jbt0_QiouYHdEskm9J`;_S?7KND|W4rC?Z93Nd#x0Q3{89gzgP!V8 zrvQzbCOQ-Q4UaFA=LojtYBoxLcjfmS^{QF799&wgbg}HsYOKAsDRJDxY2#`5fU9)O zL?WFOD#a)&xTM^|`tGID312NdO(A&VNCF|Y(HI4rQ5B2Hganb)>IXB6BL!;nJYV6+ zTRKDw&^6c0mw7!5S4~GliSRkJI>@cyjL5>&-~AX2FW z_o+~s!3$<8IcH++iQNxGFB798?E8Xfh;)ufC8eqQ2c0qE&h$p}KNc?hawsgAk5d}% z(a}!EBI4Kk6_-fN7T=8}$wpjY2aWJ~-eO|T#3CiIBC2#+UyFMtW|dofo$$LT^`%Jb zn%`NKX)$Pejtd9nRXn;=d;E7xIieFoe%j}us=)$fB zn00H3U2$s492btY4ig~%{VhnnMoUYyAWe|CTg z@(_hseTIE1D6=>-cqsh)Ow%3%p*51 z6O49r_%h>07r;T#pOgK>^sgC3^W^a{h9_3%NUqCUMl76WKu1d1x%exbG*#fdw4vRw6CoB#nl`aJN z1s?2aVmHPmQ(%vdp1`8=W7AK)&mQRak>B0z_SYMfd3(qXx^d}3u$nFdmc1g53uHc3 zmLQ&Gt31SZ!L)CuVzal5aHjS?cwrk>O=II_`@aUsLNfWZ6TL{m53ZM|pFtTu4aC~Q z>m%AV75~rBl9Ur-LUB z9#y2F;X~D0dd2@9{+9b6M5w6++etsKEBctFFJl@aJ;ymugTt@xKDevo zU3aO)h7UrR`MvMJ$9h!hp2t;62QQgL+|Xhj``Zz|(;HBzcN{>aYEO znxulTQY+|5BF0v6-d?>^TX~@BRiI`pxz92sxpd+q)Ci};vChkeAk2$LI>H+^M2D>g zQ+_z4a<gYK7O4CX=-CvCg4LPrP7E*J((p;gTW0&nWIFzDlN3nJjky#Xw`i;t4CWrhHSJf|X z4$erRjGMxCJdSFUF4Q5=*Kz)=u%?VGc_td zj+Z;g&r%%~ckC{0AI>@avl623>OKHz2GH>VkZL6uo~@XV{XH7WJACW>nB?Ss6*_d)Od;Y*(Lx?jex|_hk-Y=v|Fg*X;`@!EPfD4FS6ez{Z|NPbDoIw3x4R zRNTbMfg`Q0Y|9$x6rD*A9mCA5TN&sKcz9*{4_IqK5J&%U>FqFc%X88^EJE?F z_bB$NUt|st0vOrmQPBHK{{~ZkgLY?9c?+BBp@Yp^Km}s+ZG7F}a&#qAlKT%bN52_C zPz{s_kFFo$RUS|EPSvM{sw6MUzG&7gZYDZHP`P|0j+=T`nEBX9Ko2~Hoy~t%Wi=ZZ z<}3=u5A57Ec!anQtv1(vm}Dqy34ARB2b7k$1Bh|qhCflUsXyp@43yysqSIS7cq~RIIrHL`DQkwRhlo0xIzoj(fH`>!H4xJMAJ6bmzPT* zlsGahA)5B=L-i&UXHMx8dE4^38NW_3_N=VbPUPx#D3`pzvz|Qz-as8oe5Ot*IH~g;ZP9<_-fcV zQb_VA=R{V7;f~q*mic}0cQqr7>$~zy`AYsE9&7`S*=o*nKc36qR|!MBwn0wt+td=V ztt%BIB22Fhx;B28$~Y3Oa+sRv_mR9}Qk2}`&qiCmo_}s|R~tb;UE<1yI7oU%-c#oy>YV4f6 zc^ne}tA2m}GqTv^5@{tww8WjPoOpY>Q23tYA^hnuha3^gEgE9VnOAVs`hmh}rjjkm ztC{4@_}vg=RpehR+xO=QDID(tZ_1l8pGFL2m#UK6ojo6_C0S4%Qcz*)9_>~yL6P15 z=)b~?Sm zHx{iRUKJegaR}<`wYt5g1buY$e~_Y{DBrqRKk$wUhYBw}F}=xr?f*fh|5G!EzblX- zds;h1ZN341*pGu}aAg~{_q@L(qAxnTl@g7yEr__tofH_xKOCWQA7SkLc1BJ^6k6V% zT;!F=jThg<5_RHQv;ivDM^7&3<9ej`01~bzooT`KPufBFi>R9N^+J=;?6{ZvOs zurz=R!+CRkTI8~v^pxS@Tj66#1%4yG!hMh6M0UhJ^0~_O(@?B5n=*PrI@~O)UGZ#K zGNl!S0fMLQ*{b7#LB@xjpQfXnWX|x;nM7jaOzK+E>joBq`&3B z8Pg%Y!jz`J5j;T+R%%GuhT(DE!*HhLx;}L5TT(0-q1JG4R$G?Q#QjGe(C{)3|1#{) z2R?rD65*9|#y`mB+RT#? z6`Xy!QY*Ss$2ZV!Hd9Z5^hkOME25hW2^C3aa6QQ+%BL)m2Lj+5C7WemJmm0HVPBd%vpPl9ikO)-=<3Fs3GO{=0r9 zakjlYdTq+8D+g%+?{1qLrHRV=T@atHIh%Oh?1_6k(HH(FQkQ4 zIbyV)rlivzK8wR8m&OO~kal_*k6Nc_a znxwqqx&l>*DKmOs$k8a9nuwADrR}_F&}|c}ADFZzO0&~+l~k&U_jp06_1;zSo9E3ZKOSqi6FRw2D9TF^zf^8-f zxL)gNce3d%3t6rf(91=Kmn6}hZkB7AYZksSO!)hj{+>hMG5|;MnBV8D#PsZ_$|)7^ z=G%YWxBpVqYL5N&z)b%t002gRAbdM-pKCj4Mu16Wjut-xfTQcHzDS%@?k>XtE(h2Z}Ma#g@E>DatdF5Kg6Rna0Uwh0{a8;10_o2 zwk7+;ge(oPmnv7~&PxR47W62|Y)ZIv_KOB0>=wqwD6o?o)F?uCQ0>;{(PZ&%#S$)j zZY0^>vKVk!zGg*3q(%;Do9qkN#FbcAKT3jS8S;2yz#24@n&8-=UFga=bb5~7)wgsG z)>z%Ky;P>=M_6VeOh5%%05!1D2Gb*mZcQ`SOi(N0wzC#np2G{BzdEv9RivIKSv`Vw z*DU?@!m!*?>-7X!zGlJMD0WmRt{QmVF~IQ!m4I+bw_^z>`k;VZu!d>e>gnuKW);s|RJxd3WY1ZBWF4hfeFmF~8Swu9%47!U4)-by`a2O?VgztByHJk|?- zp;U~{N-)*Lt~pexLatl~K^`Ymzya51MYk$X%Uw!LLpI%|uYJb?WXz6Aw9*Q`%Wiev za813WFxLdl{`V(GY?>EOgGfFo>+q|h_+XECXJZE6$)(U!5zg#=L7~Q#V}LKFTgLm2 zE3+abwtQv=muPcv)k!U&Q+ypYhI_6YuL7RUOC-o_RBK>f!cZ;qr&;R{-W5Xc&#I_< z=jCqnt5z)ouoQOfPPdhRZm(D@anYZf08}@D8w5C9R7RLZUaSHGGt5$igF}@?O!8O` zw6K4B0aJ5Fj10-{Z@+zA{X2D!Tk$>CquoUBv_)g4UMNr0&!P*V2~S7E&sB}Jf!_x$y#Fa*mSD>Y8~Hy+Q7~{Ef=@50eE~-vO!b)-e9#I}m_qk9 z99t3n=8QB@s@rW$nX}e+_obft*Qo8(?_JT#5>gs@d%XC{J2IK)3uwfN=9A~BRu7FJCLI>VUE?x+V5XaoDiLIN~nBEi|=2DQGR{?Z!X(640G2Ubjv%Uyk??qC@Fd3JsQ#OvU zRs&C&X28oMB^a|(d?ZDa%ksw%q1Ym#dPMIzZ^>KEPS)r)gK0HKTG3!(ZokeFW1Wy5 zxWy$z$@O+M9VETr8_5}z{XmursRIPY94l;U=dGNIHl?KR#2h$c#W~vu_sEN*F7PZ+ zi!f6)L$Sr=r>8hZWOv-$^o4H&(=+nAAot@aF?`uD24Y%JT?jTC77)aY;{y@HW0(Xe zY4)aJo<4BZ)=NUr_F#Jb)^fb#oHmXyhRyjjit-fisQ%49q@!6OV$@MK0UpK5ArRhh zT+2JGNYu|ptMB=aE|^5}wgOCd{+E5at;kD78Zs^$`eb z-z#Ii(^VAgKA^AOq73 znhD)=xVCmG_733&VU9T|DXV!~o5>(keGGWIHXK=vTC_tFAqYnU^~EpdE6vI`Q53=n zcjA$91KYzSfik(+#riLzcZa(05;SqekYz7?sto&}+Ge&JmW;nh2;|hPQp;m5K~fn0 zr)GCPzs#*l2+nmI`)})i5QZmxxeRRGXaa$VXkSwFC2cO89qw%D$+*l~2keR#MQ2Qg zC!Pc>8yXz|#+mw-2fOp%ZF{gRskiMbj6gjms0~|}5*i3Z*N)6R9!DmR3RJ+aGph@M zXMDFE5V+5TU^B>NBEL}b6DYxejTSg8K#C=iTc*ImPcXsE?usUITo^~m1Y)Q^Kvdbx zl-2>(YWo8kAIy65Yq}XJ);F|c=1vZ4LLQ<_{t$jssg;@J&MI0#vMO~xrcvuc52pb?g_V$W1o`|9}M|da$G@^ki zNw$CXpV|`i&7`l|T|et!GC4+ZZA>CK-w;S*L<3J$;XLIs{Y9rJU~G2O63s>(-jdK~ zUh9t|s>i+X;+S8HOYqbgaKXWejtIca-jz%xhQ2rr73X{K!rQbKlfFUwZiSfbHCZj2 zwQz_M*sXcjU(pCh!c%doUrys?Lpnb%f1_VM1)Q&a_tLOgOx6@J^U176WEQv4fAKkd zAgX3bogY}T0w|9#ZGZtHPs^$C^I@8vMix%Y5G*oJ7zD1aG#bHTJz=>1WF4XBRpqc_ zzH=nj1WnCsJ`>PJfKcB_iC^@Z+!GC!|HXP2v5E|+fm2<#Z3HMXj72xJq$ZSDqtD+7 z67nKqR%Z3BBwj>?h1i}50&9@J8Hx34fVKiXgMScp@OiK>{Ra1pVIkrPk9wa%a3U|3 zGFRji>aZ`lW@P%t=<=+5CbG*B?hrpWj)=sYV*A>4u{T3$o$}SvN}QvXX8F5hOzw7i z;8Wq3$+d)?m9>PbS7lj!Z2G?v!w-M! z3yrTbW5f*NNP?-^(AEjZhm<`N#$W9&67m$pk+68c=U0RcQ@xXHmAddbwIoxB!b{O4 z>^kJDMvxwrK(ug`DUSW9^*i?HhWX5JcjUQ_CR$FA8a6>BhfX7um@9{SyrMPP^>@ZO7-5mt%5-qN*VCm( z2NL!d|EFvapb~l`H@Knsv)p6@n=f0Zo3F3O|F$eLa85AFJiE3vdq|WDX ztaTYmNw|6hiu!(EwdjBL+t)b^&~cwb5wb*M!plnKbeTCcS9#ILPNXbmvzsZG7E+s~ zHSt`FGWOEDA8?O_<|QcdK1`!=F;Lgc;Ck3;TCjMXX&qTq{+!|^I>@diN5f|9lI3KP zwx^>x!q7z&(N$pYSW(pM(ZwZHW-CZX!53BCVq=_58IMgxwuxLNLJUn(DS0(i$?2dg zry24`+DPED_R1i2s~!8cmf*`m(21CIA^;*%L4a6N0hib+ji$E0-4Xa(DTNDu80?R^ zK_FfZ3k|>4spQTFfHc;1uWJW3DNzzZ4Hk zpl7$)D0G56P%nVm73I+s{}{R5_CL-e7p&xR-o*-ED0QpTwV$Ky7vc15;Ta!VnS~|E zlLn+3l?j};^iLpn;c;0HS*m2PeRE-1W?2muJv6AOGz3s~pu~mg)IjUx2G&i6#d{3Esk)_>kNmJg^`@ryd%$ZEBe4&kwyh<$w8S2rk%}W!rOy1O zfuQT9Q1j;{JAvPQ?nzQ|W)SLq3K1+Ew^Gb_&sLjh`X^F;T10F=;CHl>Pl)*IbONL1 z@hjIFeo#|njzHVwI2bGm@q1O9-Wf2^eJqptIB+FuI<#hX5Q2O)(}f?5&EO_8I}H>Y zGMfoyWwb1a+}&D%Y{bcmC~gY#8z}43%|P1iHSk^|`+ikcOV5~&|=P-)hg2@iM5ArY#n0k34AIpvYfsjD2mE{u)aSs5 zeac^s-2Nk--ufwyq3929XPOi%sg+U85LD?k^n&cJH7U_Z{C9}IBz`!}U(G&Q`H7B; zZ%JK-LeR&7`828)9=D7l@d)Ya7AlQEr>P=ajv;;AEty16!H9Qo`jr71thqiuIEE;J zldSv_8bsd)`P873A;R`VA!PNtRw0zZfhGp}qj>oM-GG<*FC2oi@e|EMPoHNrJv@ks z$`Zs?TI=WJJX)ESi8k5>5*z)pP3;O9dEyM2*Efb7hPoz32J(z_&fRoez7kxzs!-an z6h&Pc6_G_mUAz$w!_olRn9m6Jug6t;l$=18`df0Es{*l(!?JEvxZ_k|zUwd$w8AmFqx0ObX%BY*{7BL;fnHTNyiQ`*hx+5sv>ai0&R?wy--q(gm0K z%+D`}3C+n?FpCDj2AZ*!iK65Iclg$y!rw+t1ncc`)OCtG7R{ZL{F*si&^P$ka?M|c z)+~D3MGx2%0I772G%Z9vxI`|4`xS`f16%o_;<=g4P~q0u)wh%P_4#R3zOi=_&v;+J zDrBLAZb$!oM>2T3qhmNShi>>~+%0uvD(78f>IK0AU&r%WakJhD+la2NOp?x}{=TCv zaUlOuj`m;kReO{9Tc_g}rGvzeV_sX7D^uKbRn?X4QOzh~ym*u{y6vV2?vhQ5;yZmV zHm4`e>Sp; zy!f2QpUR>3f5NgT+RS)9w{T3VHR~O$fHZlSA*&f%j3mhtgfiJXE(s>IaQwE|9e9JB zPB!cCrv10R@iumuD9E1nT#UuhE`I&xnXBngy4rNHxI)s6y0dxj$C6kQkMqzIS#fzo zl+7m^C$5;ES;jk${f$30W>1`wkERgu}>4SZZI&xa@A)Z-4YocGgCbmx8@`cM^Z5*NZA#PWn)mco%)i{xZ{wL*LZgjYYZJR*7YcJ|X&iV7p zehPloo}?UT#B3%dr1=n&9z(hSBP8NhSilidC|<}C9`$vPgy7Z8^Dd$G^UMoTu>_KA zE+~W*aoBb7S`uFO8BRrB@+%bq@?-k!Yu={54on#ut7@+4GS3_tTO;|_D+jdbwWBEm!4{+^% zp*oCC_oOVIX!_{h>mYt8<3v7FA@%y?1;F_GLY&!p zH1mIu;W4ewh=*5_7Y+f6PaVnY6ox7GFX3-1*ds4MyuqcGRv&Upkq@aI<`A?74vBxsdFhnEv#kD9`_(MPF~hZO7UGJW+(k>Kz| zRwvrl{-3(O1DfjpkNYBojIs*RKt@^RBC`}BGfA0|k-f5K3YiHhGK*BQGq07Aku7DG zJ>t4t;aWZK@73>rp7WgZoO91D4$isX@Avbbui=v>aw_I#^3yf3;@{V_RW-4jBHNDj zd##!2lV47TWowv*W*UAhxjZ5)_HOfTOS)IBc;TD96N=MXTIz(@AL65Lewnp#<`|RE zww<{u^GA1f+FXtAr_8vQvC~UogEKCTB0J-r`jy_HB@A`y)VZq9=_!53Jhw^=2CV~w zG}h2ZKCj5U?*(RCCI!0q^JqW-PvtfJxj=!Ztk)R5J4(%YIx_fqjynbYy!rkuzQ~ZP zIZCBQ6gTyu6BGUDkE!|gDP`uB!Q<(O1+-4hw>R3coY=HYq>-`inz#_c5AOXDG_Q_{p(a3;~8t_*xMIhN2f(U>Ks%c+8NKKS2b(t(m zsO!<%RKlIm^CnfIeTBY-Cs#*{kFN)_XSqn~qy4@uXTSBN=r(^KsF_f0ObVcJGVp(# z?p+_9rm7G*PuwygQm0Y&B}Ye9*V<#tJg#wi1LhOtKM;wiVAATga#?W+Y*P_)_VwNi z6wyZYi>qw%pe*=(O+xwHIen<;?{%m(HIDnB1Ex`759k9S_y8!@wGG?`UBGQ{MS~8C z_}us+Di^GH?ZubG;s~^Ju6`~B96X1BZK|?M>DN4I{V8ermo3<5V@^!LIdEx8;jBzZu zuvn2gT$`fxpm-iQ%Y}J6qU~N+nPj^lk?crhA?3jmGacjWj8LnwN;Xjc7~i_crvCfb zQ_a*7qdGEl`p{C&QTx=OH|l@>)o}PbB*+lp}Rlo)DOXpL0y-CB^F1c@0 z=kDBUm$>007jRF(1U*4HZk_I@=S$&e6)1P!+?GRFbg?LRuY<#hhwsLjnP#kKJx9OX zTRFn%kSBTZw?m(+pWu&2{m?jaaYJWaAg1XNp|&*Vjo)0&i*PPS8&mvL?>F_}uqKgm z6i-fI*Ag}Pp}8OqTJCaG{B^Z~cLE$`lCEooXPSxgn+Xe(&`cz4oBs)l*eQ?N9)@gq z^)h%Z#TG&h?G9@D~rpMy9>u^6jEy4&kDr}KUu71pkIINd{^<6^e#SvIW4xYb4RZg<)+ozbth6M|Cq*Tfz*rmlIPzD}RpgEAy2zp!k&5p^Crd z_LiSKx{62(mUtYB!})y<5vSVLG1!=G8_O3V+hmw>D>fYL_p`aVs`A@P;t8<`2{yt#k#k?NxzIb>x8Kj&PE03Y3$g+g8NBf$u#Lq z#4*9y#^~Bt_o~Ji9<~+@D0V$5zsjSQLQ zXpK61UqNo|6g5)>7WxKz3Nj0d(Gi0W5{RyXVWshK`DEW?BzHfYfnY4Kp(kugy4p38lXI=O?qx|D(uGEmTF-^~QXSD0_ zSx29Gyr~^K>KC3Xllgk5`Amo$T7%+3W=hV{PL{;)2j5iNq$qbD^|inVq#AxHVJL|P z+eR&_8b?&jhl?Z`){_+*H~b4uU9}FQE^=x3?>4bTZ4X4&AZA6#Z8EU-Z_`tG;qJUA zeHL6Rp|}86y2N(VA$GY15E4NlW}W-$WylT_XczDFXj7Vucj*%03$mgF`w>zF{K!7z z0QBM$o_Uim+mEhNrj7wh@{$M;QIC{jPsiDB_>%Rgw#t%j{3D?~4 z6ICa^L_}+{6ox^v~YZ}bgu=8HF&T+bVFRSb>qf)ZxQ{E}S+dQB!sV%xTpXTw#I|+XD z<>tXZ1uulmEyUGcyqCF~v%FTYy>4-Do&2ERmG^J9L4RZ+*-FH~CavwP07GR+n`8Iv z^SeO)rg?ZLeYJNn5&a0yF1T6|SXui%s=X!7zyrg@kaS&Ksp*u?qdc>)9Tg!R7Gt*$ z@`F5wvj##Z#zNLZxJaK?5^D85hJ>3`xfXG5=q{$yTlve(nf{+tv|BwwDz~-3DJp&;(WWS0ZOAtQu@#z5L zyhD&REordw^HX4vUKQ{c^|YeVBK5@O?dulQ&gvF2ky=+)7j%kT6w-Mw+ATU9R2XU! z<%=whPCI;<6?5f^h2vJ_7W>|7xe&Zl1+PZwm_(f68d?avGr;sXIl0P_y(iDEizSVR zO=J@iL0QyqoY3>>x)U!beLbU>c_slK@d+Sr(_~_HVYaBn2DkSQF9sE5hie??h`cQ) zb*?CBXH6}QPr~y|4$}qQ;f>zgJ0FX49EH=Z{KSIo56(#U2pP33cFsa5R`)(Ul5b;6 z;q1z;t>SUI8pfQW#cXS*KS_)*FkMn78D119;`|U7e=&J*+Lz3bBW0B7n{lvf2dIVaY5qj9lL)(g!{_C0^(@h;1M`OKa zn`KaxLbAPt*H0dhrBK?X>XWm~*l7rD`gIP`EPUmzHJeWl{+YxkMMIj;6|l|FSl%rQ zC;OUYI_SitCrLXIgGshJJg5pw*EKeCf*a#s6rQ6`#DDNv&+NK4^R>iz1{sT)lQ0d@K|Ht!{DpRoJ zp#SGle>^_-rIVYkL{(#k{Ar?U5fLnP>+y9hoy3~wLoUV?QV!0~q>6LUmi#IgpC(;V z*siKz<1|(e`$&0>Cg1(h12P}Mopwd$vzg=!te=Bo`S_fwD=yZT29vMfFiuiUeJ+S0 z$y3OBm&=w^U-PTr_?%vr)z|eQ#;^7|Iy;LuIr#~*G<$4rK0iV)D9{#Ay5$Fk00;k) zkYK1u+o1%Sx3(Rm2V}0^{X*A5(%rMVCG*av(5zxrSzeNx<`MV2g=WZWs7VT~peFGx zkKG<_vpGc9Q|vSQ7xk^2*X=LLR3g$C=83=PL^tCIVx^rX4+MLN3N?~k`gCo>Qci=a zYevKa$-7edrxU(GTE6OuS|TMk=`o<_M8WXW5QYlj&5K0#*5Jx}5JzxxkNURDTwpg| zRQp2UbC3Qf=BSSJI=d_{H#AoI?5h&Ism=fh#;Hs_AU&~=+Fi@Q!r0~`%yKzrC5Z7& zj7H4i^lcSEB~hhx+IU{;KS4aDVZItcR)fEftOgn)#E(l?ucSNEZE-6Pw2q#=tq}Au zL=89;SAKPpHfJ6*tZAQb=_onMaQ0@k5%!{Gb40%10}UW6?8DrMmSk@G_74u@3XXYk zsfIFxB?U*_+inJ1wa#Lqh=5p0qf5Yw%xU8oOZN#T3~c{CVA9*Y8CMXvO9DMBFbSVX z>A!ag&4225@VC@)MGM_yv6|ODa%XOjrUTug+xt+)4ZGjlxiQP{8eSMS-5htFiQo{R z=PtUogH6@Gs}yEl9;9-9x!1?BSthUi9j@O!5{&rv(#&dwxF48+2GtZ>#jpqcWbygh zJ>L5%AVf(zz0sWo`?AKqNj*;Ac=B^q%SLpLJjc%12y#$hH%5Mi%a>4{WKtaA4E{CU zXjC=O+J>8;EVjE>8JfZ*Jv!^9n7Qon8iG%}o{O5;o3~^?dR*q_rL}8oy@oyGl9Gn8 zo9(=8x$&h-)ok-CrFbRIN|57)p<#A%;-L^ruJ7?Y$8o)a5#vW#G}IYh(|6j6Y?96V ziHy9@c>==A`x{+Pj-PH9#KHvW+Z8qVuV84JaRX-rY9%>EqFP~9cO z^nEp$Zgj|{TaIfwKinIXO2~2}?1&K)Gpj^alFhtN+AoeM;)IRp(7-ar{kla`iYQKr z`3Om*Oo)p!!%^)5bD6OC4j3Pf{_aGC6ty*c<;4Enb5wJ^&NKx(BwHInc1&@*3z??& zX2FPVB&AVYZ3>@meP>$;4dHzu9nMKo(7{0otTK&5x&qXaGn2%=4mZn`A0z4-R}gYi z_ESXiIbm0vTR&^nmx&t}20z<@AuB+g5Fw(>jEZJSnfjOu(v*$dDi#4=ip~scTNPC` zqM^Ns;o$RL%YG)HM86{H==hGQy)c30j7yG+L?^F!asABq@c8ZZqjCZm$RSR9XhGbM zn-2&SdS^`rJs*=Cpm*%K*u%M?qM=M}aj)D+vOGaeMRDCXvNo1rV6{kiQ#^yPJ(_fn zFwrK63kw^7DwV9>yZJY7Q;ppPEM)2xRV;TJ=Xt^LY;b2@$UbZlYi>*4zL-Uus%+gg zuUh+?jD_IL^#R4M;Cf{B6OU@U$k+3pH^s?kmem~Tpb+Wq3yoML2bBX5Bgz?c-K1FA zOgLBEqMI+WNwF&5_yXC$vzEQ{)YIc)!`sx4uzoc#)x^*&27ua-|< zN0f(kj^h{WQIocXA84mRlb)Mvo8KOeN!;PRJ2ryHM zO@_m9)fr`1o(CvL{kX^%x_-m9ZRD!5<`I)u+T*pa3c2>^cbuP^h50u3KW4~0-FVQ7 z=TGqufs?s=7z)Sqmjh8Nj)0R_%k4B z4TSoc`HWJR33AoebxKdKJ8AOgiL9YnC{Ms52k83J!ZM%G%awn+_M`sse{p)bGDJ$4 zFV`u#p{<`lNcI>Fpq;Z32EzbGa|4G}d=JEZTAb^hs<|w$`acCMk0;3Q9!k{n^!MtDW#4M0>)MIW?3?Xz)@pveT--+BZU$4I;c}Aq?qebF=R4ACQ_K$C zmJ0aZA{Nrvp1^P8=@ow&_GjT2h<*P&IPP1;T> zvdNiuM!Ooj03X);H0-5qw`^#jbt?^K0YPP{Y5Sim@DMgEaoXrTAN`9uKDA9I*{6nR z*^tQj(E@a%B)0SgB)_Gt(n4a8BRB{o1r<7x`9u;fF7xM#_Uud^8u0XE0fVgTf~NLLSb+Vxx55}Y%psFLP6z+Z_m25zzIIMR%v0s!p z-H4i5Q69Ta-qd94P6Vy8TV)JB++I@pC;^A!s$$@nM1Ec69lMfg94%3OKD%9QG-2+wf6)hs}R7={s=v8wkHHwrfwgL6KP-MgCqd(`c~dhY=t-Pg~Qw;@ry7r zx#%ZgwULqwrbk3$kca<`@ePz}-30|5e(@+XWUnSYTop4Bn{B{IIWw?PoHn`cX*kiZ z!08g#@B%~NdM=yR((OStzT5x45Q_`ftF0>Vm6VrE9Hb1ziAi1IGiE$JI(P4h%Gdq@ z+CxqjN9#5;!NYNSoHDfQVBGp?Tf#BHs;M0j2cpp90@yFRLSuakiZJhsC=o_vf34_O zh0UAeLJb`{7@wz1V>ex=`d!FS9H>c46p9wdjM}@0%NH@d-+#ryPZN(2a*7by>e&R? zdYcFnKR(=FO5ia#tsyZ6hLgWIQtYdiZ%@tGPbehEku~>mhJ{kT1(r-d)>*kXp(>Rt zpjUhf0An01jC*d*kzh>!7j?#Ij3aLM!n?ny5jHzp>*WZVWo(N!Jq8ss%kxq;MS*@+ z@5y9Xu*sNhkJ-fMt?`i$huIyrd-8m-6nmV>fV2|r5yZI?Kh!T156^$A+1JZ`c^?5H zW!0Qd)6`KF#F>22Z1>mt>(t?28mx02d}_$9n)R6* z( zI^QjJ;`-||JHN^0fFPLi_)Q8&8$(ifb$p*hNcoVWr?RVM9dr#_I3{_O0TKck5?*N( zc%O4viSn^Y(`TH5HUsT6nCDL zmd$f5nyJE;RgNuzk5U}68M%eIt?ZF{Ic(vi;%APqS=1iO62Y3J+;Z(_Kme4 z9trt%mr;{pPWwf2jTtH@X~yaRak*hh9hlg#9}YsgG?<9M+rleeSoj;$Nr{~9o3Q`M z3Ji?wZEF!}eq+ng1`E1?Ge6Fa#gP01Q~^3=zZT#itetP)yNJF10_HON&nLX&{`;eu z8PLgX(jph&7veRrk4J@?$zH-F@Sh-rS0=FyL_W^i0Im967sJ=n2~n??*tMEoNkuZ& zQ4&hIlL^(?97R%3EuQ|&We*!MxkXx~D|dx4B7O*lY2-7W^ZNpqNG?3FH$Qihb@d@!c1|W&f_)zw1}=?@|7BL01xn>Qg@k zet@3g5^FK+Njqvg?1_Q8@WI;P8jP9TiEP>p&-Td#nDK=gYRc!J?+Y**9ya2>=4ZpV za`2E8LqtV9`PZA5F0-OemY>Qz;y)36s=Z+6Qls@rArX~{R~GPacYU&!8@NKn zFxydJyzc9N-utbWkL*su=o0;|ar#Y0%M1tVb7#Rj@OfZZ*6kY;OIbZ3#$+NJVmCf( zUavkBUCXD#ZP+r@sikrMS1;V%(?Tt9Uyf(etkGNT@XfZP1Z=E)m7-X}d z*|I&vO+-GW?LPqfPdo8}&n$!?U4e8HJXRq67&K^YI#@>yv+5y4lLlr?$!yD(Y@ZRZ zT-StM{=283=;2V)hVxTcZz809d)TDQ_?2D2I%5xa$}MqfkWFTSdd*Zo`_-NDLe^C0 zlYgEyDpfBXjZqtlsFJRLxd(ChQ9ZEX0FCe94Ce<3sZ>a5^}oGhYxlgI=y%v>!_z0i{Eg&DN?Raag=P0eJ!}`G`mP zrB-on)8uqYCF)jwm^CF*C22n&=IG*>g0wQ+yM0-x}Uz ziae4Zc{8rdU4v5!Rh(Ha5v70NQAIYLoY>M9e5mu(EA56aX&je zCeC5bKXiwrPuXxkM_7LD0JC8GazxMt0k?aq5)B5WKvtD*H^t%m(G z`>(e>uF!IR^aWJ&cZkR!!%@Oeuw~$R^h$>xTo+0H`nPb0hpnn29vv+VX4qT1fty!+ zqyKJ|Z50H<@Qja4`f9i>~5VU<<64`3k?_pOO9fwF}g#Azp!OG%ZHkC8>c5 zEj~JSfSX?It`O|Oi#^?iQ1+AFvBQklg?{4}ka$snIf!hZ58dsE#dx4#VI(x(`c4{qu75jo%HeF7BzTNFvU|cPx2w;!YWSkhYs{ zu%IuHz7*A;4=H(BFrs-qJhTB-AJv}=Kv50FmIsLXO<6Kyu!1 zEwWqE4%@AHHte1=aL0q1Z|5V{6~jH*W7gFhP=i6;kc~V>!<_-0#Q#@SP~^EU+8gx$ zMY(lA(5?T=6`RHjFn}!};;gx$moZ5*8D-IS za+f}&RC9OZryR%U5t1!rj(PkX1{^N_A=zXl0_IG45isyu1hTT91`r?OcwLF0V&e0O zSK{)RbyO7>5@gMI%WVc&^wqvL;3qzfPjlt@$6g+R6dq}PC5lOO`^p4!Yb z;9bNiqR4e3%*7W8Yn~9sd?EtjbQC6h$in(_!D1LUiTrW+Q5@~$3V)K*pf}Hcl0-i3 zAbze2sx^#xj~B6MJIW@=p86XWnmWVMpjtCk2m4M)qh(Jn`zwKqV3xN<`+uziT;zHf z6cfk6)oVIJbx=KXCXaj9#(2Uk-wk`S8K!u8>|^lLeY}u<`djZ@0D|Rz5UXHdldwFD;Q-=O`e YyQa)jn+a diff --git a/app/assets/planetary-network.png b/app/assets/planetary-network.png deleted file mode 100644 index 2de19fef2d7d2b194de34a43b9bf351c6a70a550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75455 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