diff --git a/.drone.yml b/.drone.yml
index 129e1070..76bf5dd7 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -97,16 +97,16 @@ steps:
GOOGLE_KEYSTORE_PASS:
from_secret: GOOGLE_KEYSTORE_PASS
-# - name: Build Intermediate Android Release Artifact (Bundle)
-# commands:
-# - ./ci.py --build-bundle
-# environment:
-# STANDALONE_KEYSTORE_PASS:
-# from_secret: STANDALONE_KEYSTORE_PASS
-# FDROID_KEYSTORE_PASS:
-# from_secret: FDROID_KEYSTORE_PASS
-# GOOGLE_KEYSTORE_PASS:
-# from_secret: GOOGLE_KEYSTORE_PASS
+ - name: Build Intermediate Android Release Artifact (Bundle)
+ commands:
+ - ./ci.py --build-bundle
+ environment:
+ STANDALONE_KEYSTORE_PASS:
+ from_secret: STANDALONE_KEYSTORE_PASS
+ FDROID_KEYSTORE_PASS:
+ from_secret: FDROID_KEYSTORE_PASS
+ GOOGLE_KEYSTORE_PASS:
+ from_secret: GOOGLE_KEYSTORE_PASS
- name: Sign Android Release Artifact (.APK) for Standalone Use
commands:
@@ -132,16 +132,16 @@ steps:
GOOGLE_KEYSTORE_PASS:
from_secret: GOOGLE_KEYSTORE_PASS
-# - name: Sign Android Release Artifact (Bundle) for Google Play
-# commands:
-# - ./ci.py --sign-bundle
-# environment:
-# STANDALONE_KEYSTORE_PASS:
-# from_secret: STANDALONE_KEYSTORE_PASS
-# FDROID_KEYSTORE_PASS:
-# from_secret: FDROID_KEYSTORE_PASS
-# GOOGLE_KEYSTORE_PASS:
-# from_secret: GOOGLE_KEYSTORE_PASS
+ - name: Sign Android Release Artifact (Bundle) for Google Play
+ commands:
+ - ./ci.py --sign-bundle
+ environment:
+ STANDALONE_KEYSTORE_PASS:
+ from_secret: STANDALONE_KEYSTORE_PASS
+ FDROID_KEYSTORE_PASS:
+ from_secret: FDROID_KEYSTORE_PASS
+ GOOGLE_KEYSTORE_PASS:
+ from_secret: GOOGLE_KEYSTORE_PASS
- name: Package Linux AppImage Artifact
commands:
diff --git a/android/gradle.properties b/android/gradle.properties
index 94adc3a3..c396be2a 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,3 +1,4 @@
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
+android.bundle.enableUncompressedNativeLibs=false
diff --git a/assets/images/logos/digital_ocean.svg b/assets/images/logos/digital_ocean.svg
new file mode 100644
index 00000000..98b04c36
--- /dev/null
+++ b/assets/images/logos/digital_ocean.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/logos/hetzner.svg b/assets/images/logos/hetzner.svg
new file mode 100644
index 00000000..5cafc101
--- /dev/null
+++ b/assets/images/logos/hetzner.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/markdown/how_digital_ocean-en.md b/assets/markdown/how_digital_ocean-en.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-en.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-ru.md b/assets/markdown/how_digital_ocean-ru.md
new file mode 100644
index 00000000..a4795811
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-ru.md
@@ -0,0 +1,10 @@
+### How to get Digital Ocean API Token
+1. Перейдите по [ссылке](https://cloud.digitalocean.com/) и войдите в ваш аккаунт.
+2. Перейдите в новый проект, либо создайте проект, если ещё этого не сделали.
+3. Перейдите в "API" раздел в меню слева.
+4. Нажмите на "Generate New Token".
+5. Введите какое-нибудь имя для токена.
+6. Установите время истощения на "No expiry".
+7. Проставьте галочку в пункте "Write (optional)".
+8. Теперь нажмите на "Generate Token" кнопку внизу.
+9. После этого появится ваш токен. Скопируйте его в надёжное место, лучше в ваш собственный менеджер паролей.
\ No newline at end of file
diff --git a/assets/translations/en.json b/assets/translations/en.json
index 05bb823b..7d39a922 100644
--- a/assets/translations/en.json
+++ b/assets/translations/en.json
@@ -4,6 +4,7 @@
"basis": {
"providers": "Providers",
"providers_title": "Your Data Center",
+ "select": "Select",
"services": "Services",
"services_title": "Your personal, private and independent services.",
"users": "Users",
@@ -53,7 +54,8 @@
"about_application_page": {
"title": "About",
"application_version_text": "Application version v.{}",
- "api_version_text": "Server API version v.{}"
+ "api_version_text": "Server API version v.{}",
+ "privacy_policy": "Privacy policy"
},
"application_settings": {
"title": "Application settings",
@@ -79,8 +81,14 @@
"onboarding": {
"page1_title": "Digital independence, available to all of us",
"page1_text": "Mail, VPN, Messenger, social network and much more on your private server, under your control.",
- "page2_title": "SelfPrivacy — it's not a cloud, but your personal datacenter",
- "page2_text": "SelfPrivacy works only with your provider accounts: Hetzner, Cloudflare, Backblaze. If you do not own those, we'll help you to create them."
+ "page2_title": "SelfPrivacy is not a cloud, it's Your personal datacenter",
+ "page2_text": "SelfPrivacy only works with providers that you choose. If you do not have required accounts in those, we'll help you to create them.",
+ "page2_server_provider_title": "Server provider",
+ "page2_server_provider_text": "A server provider maintains your server in its own data center. SelfPrivacy will automatically connect to the provider and setup all necessary things.",
+ "page2_dns_provider_title": "DNS provider",
+ "page2_dns_provider_text": "You need a domain to have a place in the Internet. And you also need a reliable DNS provider to have the domain pointed to your server. We will suggest you pick a supported DNS provider to automatically setup networking.",
+ "page2_backup_provider_title": "Backup provider",
+ "page2_backup_provider_text": "What if something happens to your server? Imagine a hacker attack, an accidental data deletion or denial of service? Your data will be kept safe in your provider of backups. They will be securely encrypted and anytime accessible to restore your server with."
},
"resource_chart": {
"month": "Month",
@@ -268,21 +276,47 @@
"no_ssh_notice": "Only email and SSH accounts are created for this user. Single Sign On for all services is coming soon."
},
"initializing": {
- "connect_to_server": "Connect the server provider",
- "select_provider": "Select your provider",
"server_provider_description": "A place where your data and SelfPrivacy services will reside:",
"dns_provider_description": "A service which lets your IP point towards domain names:",
+ "connect_to_server": "Let's start with a server.",
+ "select_provider": "Pick any provider from the following list, they all support SelfPrivacy",
+ "select_provider_notice": "By 'Relatively small' we mean a machine with 2 cores of CPU and 2 gigabytes of RAM.",
+ "select_provider_countries_title": "Available countries",
+ "select_provider_countries_text_hetzner": "Germany, Finland, USA",
+ "select_provider_countries_text_do": "USA, Netherlands, Singapore, UK, Germany, Canada, India, Australia",
+ "select_provider_price_title": "Average price",
+ "select_provider_price_text_hetzner": "€8 per month for a relatively small server and 50GB of disk storage",
+ "select_provider_price_text_do": "$17 per month for a relatively small server and 50GB of disk storage",
+ "select_provider_payment_title": "Payment methods",
+ "select_provider_payment_text_hetzner": "Credit cards, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "Credit cards, Google Pay, PayPal",
+ "select_provider_email_notice": "E-mail hosting won't be available for new clients. Nevertheless it will be unlocked as soon as you complete your first payment.",
+ "select_provider_site_button": "Visit site",
+ "connect_to_server_provider": "Now log in ",
+ "connect_to_server_provider_text": "With API token SelfPrivacy will be able to rent a machine and setup your server on it",
"how": "How to obtain API token",
"provider_bad_key_error": "Provider API key is invalid",
"could_not_connect": "Counldn't connect to the provider.",
- "choose_location_type": "Choose your server location and type:",
- "back_to_locations": "Go back to available locations!",
- "no_locations_found": "No available locations found. Make sure your account is accessible.",
+ "choose_location_type": "Where do you want to order your server?",
+ "choose_location_type_text": "Different locations provide different server configurations, prices and connection speed.",
+ "locations_not_found": "Oops!",
+ "locations_not_found_text": "There are no available servers to rent",
+ "back_to_locations": "Select something else",
+ "no_locations_found": "No available locations found, make sure your account is accessible",
+ "choose_server_type": "What type of server do you need?",
+ "choose_server_type_text": "Different resource capabilities support different services. Don't worry, you can expand your server anytime",
+ "choose_server_type_notice": "The important things to look at are the CPU and RAM. The data of your services will be stored on a mounted volume which is easily explandable and gets paid for separately.",
+ "choose_server_type_ram": "{} GB of RAM",
+ "choose_server_type_storage": "{} GB of system storage",
+ "choose_server_type_payment_per_month": "{} per month",
"no_server_types_found": "No available server types found. Make sure your account is accessible and try to change your server location.",
"cloudflare_bad_key_error": "Cloudflare API key is invalid",
"backblaze_bad_key_error": "Backblaze storage information is invalid",
"connect_to_dns": "Connect the DNS provider",
+ "select_dns": "Now let's select a DNS provider",
"manage_domain_dns": "To manage your domain's DNS",
+ "use_this_domain": "Use this domain?",
+ "use_this_domain_text": "The token you provided gives access to the following domain",
"cloudflare_api_token": "CloudFlare API Token",
"connect_backblaze_storage": "Connect Backblaze storage",
"no_connected_domains": "No connected domains at the moment",
@@ -393,6 +427,8 @@
"generation_error": "Couldn't generate a recovery key. {}"
},
"modals": {
+ "dns_removal_error": "Couldn't remove DNS records.",
+ "server_deletion_error": "Couldn't delete active server.",
"server_validators_error": "Couldn't fetch available servers.",
"already_exists": "Such server already exists.",
"unexpected_error": "Unexpected error during placement from the provider side.",
@@ -443,4 +479,4 @@
"length_not_equal": "Length is [], should be {}",
"length_longer": "Length is [], should be shorter than or equal to {}"
}
-}
\ No newline at end of file
+}
diff --git a/assets/translations/ru.json b/assets/translations/ru.json
index f9fb3fb2..29492950 100644
--- a/assets/translations/ru.json
+++ b/assets/translations/ru.json
@@ -3,6 +3,7 @@
"locale": "ru",
"basis": {
"providers": "Провайдеры",
+ "select": "Выбрать",
"providers_title": "Ваш Дата Центр",
"services": "Сервисы",
"services_title": "Ваши личные, приватные и независимые сервисы.",
@@ -53,7 +54,8 @@
"about_application_page": {
"title": "О приложении",
"application_version_text": "Версия приложения v.{}",
- "api_version_text": "Версия API сервера v.{}"
+ "api_version_text": "Версия API сервера v.{}",
+ "privacy_policy": "Политика конфиденциальности"
},
"application_settings": {
"title": "Настройки приложения",
@@ -80,7 +82,13 @@
"page1_title": "Цифровая независимость доступна каждому",
"page1_text": "Почта, VPN, Мессенджер, социальная сеть и многое другое на Вашем личном сервере, под Вашим полным контролем.",
"page2_title": "SelfPrivacy — это не облако, а Ваш личный дата-центр",
- "page2_text": "SelfPrivacy работает только с вашими сервис-провайдерами: Hetzner, Cloudflare, Backblaze. Если у Вас нет учётных записей, мы поможем их создать."
+ "page2_text": "SelfPrivacy работает только с сервис-провайдерами на ваш выбор. Если у Вас нет учётных записей, мы поможем их создать.",
+ "page2_server_provider_title": "Сервер-провайдер",
+ "page2_server_provider_text": "Сервер-провайдер будет обслуживать ваш сервер в своём дата-центре. SelfPrivacy автоматически подключится к нему и настроит вам сервер.",
+ "page2_dns_provider_title": "DNS-провайдер",
+ "page2_dns_provider_text": "Чтобы быть в интернете, нужен домен. Чтобы домен указывал на ваш сервер, нужен надёжный DNS сервер. Мы предложим вам выбрать один из поддерживаемых DNS серверов автоматически настроим все записи. Хотите настроить их вручную? Так тоже можно.",
+ "page2_backup_provider_title": "Бэкап-провайдер",
+ "page2_backup_provider_text": "Что если с сервером что-то случится? Хакерская атака, отказ в обслуживании или просто случайное удаление данных? Ваши данные будут в сохранности в другом месте, у провайдера хранилища ваших резервных копий. Все они надёжно шифруются, и вы сможете восстановить свой сервер."
},
"resource_chart": {
"month": "Месяц",
@@ -268,20 +276,45 @@
"no_ssh_notice": "Для этого пользователя созданы только SSH и Email аккаунты. Единая авторизация для всех сервисов ещё не реализована."
},
"initializing": {
- "connect_to_server": "Подключите сервер",
- "server_provider_description": "Здесь будут жить ваши данные и SelfPrivacy-сервисы:",
"dns_provider_description": "Это позволит связать ваш домен с IP адресом:",
+ "connect_to_server": "Начнём с сервера.",
+ "select_provider": "Ниже подборка провайдеров, которых поддерживает SelfPrivacy",
+ "select_provider_notice": "Под 'Небольшим сервером' имеется ввиду сервер с двумя потоками процессора и двумя гигабайтами оперативной памяти.",
+ "select_provider_countries_title": "Доступные страны",
+ "select_provider_countries_text_hetzner": "Германия, Финляндия, США",
+ "select_provider_countries_text_do": "США, Нидерланды, Сингапур, Великобритания, Германия, Канада, Индия, Австралия",
+ "select_provider_price_title": "Средняя цена",
+ "select_provider_price_text_hetzner": "€8 в месяц за небольшой сервер и 50GB места на диске",
+ "select_provider_price_text_do": "$17 в месяц за небольшой сервер и 50GB места на диске",
+ "select_provider_payment_title": "Методы оплаты",
+ "select_provider_payment_text_hetzner": "Банковские карты, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "Банковские карты, Google Pay, PayPal",
+ "select_provider_email_notice": "Хостинг электронной почты недоступен для новых клиентов. Разблокировать можно будет после первой оплаты.",
+ "select_provider_site_button": "Посетить сайт",
+ "connect_to_server_provider": "Авторизоваться в ",
+ "connect_to_server_provider_text": "С помощью API токена приложение SelfPrivacy сможет от вашего имени заказать и настроить сервер",
"how": "Как получить API Token",
"provider_bad_key_error": "API ключ провайдера неверен",
"could_not_connect": "Не удалось соединиться с провайдером.",
- "choose_location_type": "Выберите локацию и тип вашего сервера:",
- "back_to_locations": "Назад к доступным локациям!",
+ "choose_location_type": "Где заказать сервер?",
+ "choose_location_type_text": "От выбора локации будут зависеть доступные конфигурации, цены и скорость вашего соединения с сервером.",
+ "locations_not_found": "Упс!",
+ "locations_not_found_text": "В этом месте не оказалось доступных серверов для аренды",
+ "back_to_locations": "Выберем другой",
"no_locations_found": "Не найдено локаций. Убедитесь, что ваш аккаунт доступен.",
- "no_server_types_found": "Не удалось получить список серверов. Убедитесь, что ваш аккаунт доступен и попытайтесь сменить локацию сервера.",
+ "choose_server_type": "Какой выбрать тип сервера?",
+ "choose_server_type_text": "От ресурсов сервера зависит, какие сервисы смогут запуститься. Расширить сервер можно будет в любое время",
+ "choose_server_type_notice": "Главное, на что стоит обратить внимание — количество потоков процессора и объём оперативной памяти. Данные сервисов будут размещены на отдельном диске, который оплачивается отдельно и легко расширяем!",
+ "choose_server_type_ram": "{} GB у RAM",
+ "choose_server_type_storage": "{} GB системного хранилища",
+ "choose_server_type_payment_per_month": "{} в месяц",
+ "no_server_types_found": "Не найдено доступных типов сервера! Пожалуйста, убедитесь, что у вас есть доступ к провайдеру сервера...",
"cloudflare_bad_key_error": "Cloudflare API ключ неверен",
"backblaze_bad_key_error": "Информация о Backblaze хранилище неверна",
"connect_to_dns": "Подключите DNS провайдер",
"manage_domain_dns": "Для управления DNS вашего домена",
+ "use_this_domain": "Используем этот домен?",
+ "use_this_domain_text": "Указанный вами токен даёт контроль над этим доменом",
"cloudflare_api_token": "CloudFlare API ключ",
"connect_backblaze_storage": "Подключите облачное хранилище Backblaze",
"no_connected_domains": "На данный момент подлюченных доменов нет",
@@ -393,6 +426,8 @@
"generation_error": "Не удалось сгенерировать ключ. {}"
},
"modals": {
+ "dns_removal_error": "Невозможно удалить DNS записи.",
+ "server_deletion_error": "Невозможно удалить сервер.",
"server_validators_error": "Не удалось получить список серверов.",
"already_exists": "Такой сервер уже существует.",
"unexpected_error": "Непредвиденная ошибка со стороны провайдера.",
@@ -443,4 +478,4 @@
"length_not_equal": "Длина строки [], должно быть равно {}",
"length_longer": "Длина строки [], должно быть меньше либо равно {}"
}
-}
\ No newline at end of file
+}
diff --git a/ci.py b/ci.py
index 02a17004..b0b9e996 100755
--- a/ci.py
+++ b/ci.py
@@ -149,6 +149,7 @@ def package_linux_archive():
def deploy_gitea_release():
gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/standalone_{APP_NAME}-{APP_SEMVER}.apk")
gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/standalone_{APP_NAME}-{APP_SEMVER}.apk.idsig")
+ gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/{APP_NAME}-{APP_SEMVER}.aab")
gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/SelfPrivacy-{APP_SEMVER}-x86_64.AppImage")
gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/SelfPrivacy-{APP_SEMVER}-x86_64.AppImage.zsync")
gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/{APP_NAME}-{APP_SEMVER}.flatpak")
diff --git a/fastlane/metadata/android/en-US/changelogs/0.8.0.txt b/fastlane/metadata/android/en-US/changelogs/0.8.0.txt
new file mode 100644
index 00000000..e7d8dbad
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/0.8.0.txt
@@ -0,0 +1,33 @@
+Server setup:
+- Added support for Digital Ocean as server provider
+- You can now choose server region
+- You can now choose server tier
+- Server installation UI has been refreshed
+- Fields now have more specific error messages
+
+Common UI:
+- New app bar used in most of the screens
+
+Services:
+- Services are now sorted by their status
+
+Server settings:
+- Timezone search screen now has a search bar
+- Fixed job creation when switching the setting multiple times
+- Server destruction now works
+
+Jobs:
+- Jobs panel now should take slightly less space
+
+Auth:
+- Recovery key page can now be reloaded by dragging down
+
+Logging:
+- Log console now has a limit of 500 lines
+- GraphQL API requests are now logged in the console
+- Networks errors are better handled
+
+For developers:
+- App now only uses GraphQL API to communicate with the server. All REST API calls have been removed.
+- Server can now be deployed with staging ACME certificates
+- Language assets have been reorganized
diff --git a/lib/illustrations/stray_deer.dart b/lib/illustrations/stray_deer.dart
new file mode 100644
index 00000000..88fd55c3
--- /dev/null
+++ b/lib/illustrations/stray_deer.dart
@@ -0,0 +1,2895 @@
+import 'package:dynamic_color/dynamic_color.dart';
+import 'package:flutter/material.dart';
+import 'package:material_color_utilities/palettes/core_palette.dart';
+
+// max_width coefficient is 1
+class StrayDeerPainter extends CustomPainter {
+ StrayDeerPainter({required this.colorPalette, required this.colorScheme});
+
+ final CorePalette colorPalette;
+ final ColorScheme colorScheme;
+
+ @override
+ void paint(final Canvas canvas, final Size size) {
+ final Color deerTracks = Color(colorPalette.tertiary.get(70));
+ final Color mailBag = Color(colorPalette.tertiary.get(80));
+ final Color contourColor = Color(colorPalette.tertiary.get(10));
+ final Color deerSkin =
+ const Color(0xffe0ac9c).harmonizeWith(colorScheme.primary);
+
+ print('deerSkin: $deerSkin');
+ print('colorScheme.primary: ${colorScheme.primary}');
+ print('colorPalette.tertiary.get(10): ${colorPalette.tertiary.get(50)}');
+
+ final Path path0 = Path();
+ path0.moveTo(size.width * 0.6099773, size.height * 0.6719577);
+ path0.lineTo(size.width * 0.6088435, size.height * 0.6719577);
+ path0.lineTo(size.width * 0.6148904, size.height * 0.6727135);
+ path0.lineTo(size.width * 0.6099773, size.height * 0.6719577);
+ path0.close();
+ path0.moveTo(size.width * 0.5593348, size.height * 0.6723356);
+ path0.cubicTo(
+ size.width * 0.5525321,
+ size.height * 0.6723356,
+ size.width * 0.5461073,
+ size.height * 0.6738473,
+ size.width * 0.5400605,
+ size.height * 0.6761149,
+ );
+ path0.lineTo(size.width * 0.5476190, size.height * 0.6806500);
+ path0.cubicTo(
+ size.width * 0.5529101,
+ size.height * 0.6798942,
+ size.width * 0.5585790,
+ size.height * 0.6806500,
+ size.width * 0.5634921,
+ size.height * 0.6787604,
+ );
+ path0.cubicTo(
+ size.width * 0.5653817,
+ size.height * 0.6780045,
+ size.width * 0.5680272,
+ size.height * 0.6764928,
+ size.width * 0.5680272,
+ size.height * 0.6746032,
+ );
+ path0.cubicTo(
+ size.width * 0.5680272,
+ size.height * 0.6727135,
+ size.width * 0.5653817,
+ size.height * 0.6727135,
+ size.width * 0.5642479,
+ size.height * 0.6727135,
+ );
+ path0.lineTo(size.width * 0.5593348, size.height * 0.6727135);
+ path0.close();
+ path0.moveTo(size.width * 0.6757370, size.height * 0.6727135);
+ path0.lineTo(size.width * 0.6700680, size.height * 0.6730915);
+ path0.cubicTo(
+ size.width * 0.6681784,
+ size.height * 0.6734694,
+ size.width * 0.6655329,
+ size.height * 0.6730915,
+ size.width * 0.6636432,
+ size.height * 0.6746032,
+ );
+ path0.lineTo(size.width * 0.6636432, size.height * 0.6753590);
+ path0.lineTo(size.width * 0.6723356, size.height * 0.6810280);
+ path0.lineTo(size.width * 0.6874528, size.height * 0.6825397);
+ path0.cubicTo(
+ size.width * 0.6897203,
+ size.height * 0.6825397,
+ size.width * 0.6923658,
+ size.height * 0.6832955,
+ size.width * 0.6938776,
+ size.height * 0.6814059,
+ );
+ path0.cubicTo(
+ size.width * 0.6953893,
+ size.height * 0.6798942,
+ size.width * 0.6931217,
+ size.height * 0.6776266,
+ size.width * 0.6919879,
+ size.height * 0.6772487,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.6757370, size.height * 0.6727135),
+ radius: Radius.elliptical(
+ size.width * 0.03325775,
+ size.height * 0.03325775,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.5971277, size.height * 0.6768707);
+ path0.cubicTo(
+ size.width * 0.5997732,
+ size.height * 0.6780045,
+ size.width * 0.6027967,
+ size.height * 0.6780045,
+ size.width * 0.6054422,
+ size.height * 0.6768707,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.4950869, size.height * 0.6814059);
+ path0.lineTo(size.width * 0.4924414, size.height * 0.6814059);
+ path0.cubicTo(
+ size.width * 0.4909297,
+ size.height * 0.6814059,
+ size.width * 0.4886621,
+ size.height * 0.6814059,
+ size.width * 0.4871504,
+ size.height * 0.6825397,
+ );
+ path0.lineTo(size.width * 0.4833711, size.height * 0.6912320);
+ path0.cubicTo(
+ size.width * 0.4894180,
+ size.height * 0.6904762,
+ size.width * 0.4954649,
+ size.height * 0.6904762,
+ size.width * 0.5011338,
+ size.height * 0.6882086,
+ );
+ path0.cubicTo(
+ size.width * 0.5030234,
+ size.height * 0.6874528,
+ size.width * 0.5049131,
+ size.height * 0.6866969,
+ size.width * 0.5064248,
+ size.height * 0.6851852,
+ );
+ path0.cubicTo(
+ size.width * 0.5071807,
+ size.height * 0.6840514,
+ size.width * 0.5056689,
+ size.height * 0.6829176,
+ size.width * 0.5045351,
+ size.height * 0.6825397,
+ );
+ path0.cubicTo(
+ size.width * 0.5015117,
+ size.height * 0.6817838,
+ size.width * 0.4984883,
+ size.height * 0.6814059,
+ size.width * 0.4950869,
+ size.height * 0.6814059,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.6303855, size.height * 0.6832955);
+ path0.arcToPoint(
+ Offset(size.width * 0.6179138, size.height * 0.6863190),
+ radius: Radius.elliptical(
+ size.width * 0.03401361,
+ size.height * 0.03401361,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.6167800,
+ size.height * 0.6866969,
+ size.width * 0.6148904,
+ size.height * 0.6874528,
+ size.width * 0.6148904,
+ size.height * 0.6889645,
+ );
+ path0.cubicTo(
+ size.width * 0.6148904,
+ size.height * 0.6904762,
+ size.width * 0.6167800,
+ size.height * 0.6904762,
+ size.width * 0.6175359,
+ size.height * 0.6900983,
+ );
+ path0.lineTo(size.width * 0.6179138, size.height * 0.6938776);
+ path0.cubicTo(
+ size.width * 0.6250945,
+ size.height * 0.6934996,
+ size.width * 0.6322751,
+ size.height * 0.6934996,
+ size.width * 0.6386999,
+ size.height * 0.6904762,
+ );
+ path0.cubicTo(
+ size.width * 0.6398337,
+ size.height * 0.6900983,
+ size.width * 0.6417234,
+ size.height * 0.6889645,
+ size.width * 0.6413454,
+ size.height * 0.6874528,
+ );
+ path0.cubicTo(
+ size.width * 0.6405896,
+ size.height * 0.6851852,
+ size.width * 0.6379441,
+ size.height * 0.6848073,
+ size.width * 0.6360544,
+ size.height * 0.6840514,
+ );
+ path0.lineTo(size.width * 0.6303855, size.height * 0.6832955);
+ path0.close();
+ path0.moveTo(size.width * 0.7959184, size.height * 0.6885865);
+ path0.lineTo(size.width * 0.7932729, size.height * 0.6889645);
+ path0.lineTo(size.width * 0.7932729, size.height * 0.6893424);
+ path0.lineTo(size.width * 0.7932729, size.height * 0.6893424);
+ path0.lineTo(size.width * 0.7951625, size.height * 0.6980348);
+ path0.arcToPoint(
+ Offset(size.width * 0.8148148, size.height * 0.7018141),
+ radius: Radius.elliptical(
+ size.width * 0.02116402,
+ size.height * 0.02116402,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.8163265,
+ size.height * 0.7010582,
+ size.width * 0.8178382,
+ size.height * 0.6999244,
+ size.width * 0.8170824,
+ size.height * 0.6980348,
+ );
+ path0.cubicTo(
+ size.width * 0.8163265,
+ size.height * 0.6961451,
+ size.width * 0.8140590,
+ size.height * 0.6946334,
+ size.width * 0.8121693,
+ size.height * 0.6938776,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.7981859, size.height * 0.6885865),
+ radius: Radius.elliptical(
+ size.width * 0.03665911,
+ size.height * 0.03665911,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.lineTo(size.width * 0.7959184, size.height * 0.6885865);
+ path0.close();
+ path0.moveTo(size.width * 0.7448980, size.height * 0.6900983);
+ path0.lineTo(size.width * 0.7430083, size.height * 0.6900983);
+ path0.cubicTo(
+ size.width * 0.7407407,
+ size.height * 0.6904762,
+ size.width * 0.7384732,
+ size.height * 0.6916100,
+ size.width * 0.7369615,
+ size.height * 0.6938776,
+ );
+ path0.cubicTo(
+ size.width * 0.7365835,
+ size.height * 0.6938776,
+ size.width * 0.7369615,
+ size.height * 0.6946334,
+ size.width * 0.7369615,
+ size.height * 0.6946334,
+ );
+ path0.lineTo(size.width * 0.7369615, size.height * 0.6999244);
+ path0.cubicTo(
+ size.width * 0.7418745,
+ size.height * 0.7006803,
+ size.width * 0.7467876,
+ size.height * 0.7014361,
+ size.width * 0.7520786,
+ size.height * 0.7006803,
+ );
+ path0.cubicTo(
+ size.width * 0.7543462,
+ size.height * 0.7006803,
+ size.width * 0.7566138,
+ size.height * 0.6999244,
+ size.width * 0.7585034,
+ size.height * 0.6980348,
+ );
+ path0.cubicTo(
+ size.width * 0.7600151,
+ size.height * 0.6969010,
+ size.width * 0.7585034,
+ size.height * 0.6953893,
+ size.width * 0.7573696,
+ size.height * 0.6942555,
+ );
+ path0.cubicTo(
+ size.width * 0.7535903,
+ size.height * 0.6919879,
+ size.width * 0.7494331,
+ size.height * 0.6897203,
+ size.width * 0.7448980,
+ size.height * 0.6900983,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.4357521, size.height * 0.6961451);
+ path0.lineTo(size.width * 0.4349962, size.height * 0.7052154);
+ path0.cubicTo(
+ size.width * 0.4399093,
+ size.height * 0.7055933,
+ size.width * 0.4448224,
+ size.height * 0.7040816,
+ size.width * 0.4489796,
+ size.height * 0.7014361,
+ );
+ path0.cubicTo(
+ size.width * 0.4504913,
+ size.height * 0.7010582,
+ size.width * 0.4523810,
+ size.height * 0.7003023,
+ size.width * 0.4531368,
+ size.height * 0.6991686,
+ );
+ path0.cubicTo(
+ size.width * 0.4538927,
+ size.height * 0.6980348,
+ size.width * 0.4527589,
+ size.height * 0.6972789,
+ size.width * 0.4520030,
+ size.height * 0.6972789,
+ );
+ path0.cubicTo(
+ size.width * 0.4489796,
+ size.height * 0.6961451,
+ size.width * 0.4459562,
+ size.height * 0.6972789,
+ size.width * 0.4433107,
+ size.height * 0.6965231,
+ );
+ path0.lineTo(size.width * 0.4357521, size.height * 0.6961451);
+ path0.close();
+ path0.moveTo(size.width * 0.3408919, size.height * 0.6999244);
+ path0.arcToPoint(
+ Offset(size.width * 0.3250189, size.height * 0.7052154),
+ radius: Radius.elliptical(
+ size.width * 0.03401361,
+ size.height * 0.03401361,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.lineTo(size.width * 0.3208617, size.height * 0.7108844);
+ path0.cubicTo(
+ size.width * 0.3465608,
+ size.height * 0.7146636,
+ size.width * 0.3522298,
+ size.height * 0.6999244,
+ size.width * 0.3408919,
+ size.height * 0.6999244,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.8435374, size.height * 0.7195767);
+ path0.cubicTo(
+ size.width * 0.8420257,
+ size.height * 0.7195767,
+ size.width * 0.8405140,
+ size.height * 0.7199546,
+ size.width * 0.8397581,
+ size.height * 0.7210884,
+ );
+ path0.lineTo(size.width * 0.8344671, size.height * 0.7248677);
+ path0.cubicTo(
+ size.width * 0.8359788,
+ size.height * 0.7271353,
+ size.width * 0.8374906,
+ size.height * 0.7297808,
+ size.width * 0.8397581,
+ size.height * 0.7312925,
+ );
+ path0.cubicTo(
+ size.width * 0.8416478,
+ size.height * 0.7328042,
+ size.width * 0.8446712,
+ size.height * 0.7324263,
+ size.width * 0.8473167,
+ size.height * 0.7324263,
+ );
+ path0.cubicTo(
+ size.width * 0.8488284,
+ size.height * 0.7324263,
+ size.width * 0.8510960,
+ size.height * 0.7324263,
+ size.width * 0.8526077,
+ size.height * 0.7309146,
+ );
+ path0.cubicTo(
+ size.width * 0.8541194,
+ size.height * 0.7286470,
+ size.width * 0.8533636,
+ size.height * 0.7260015,
+ size.width * 0.8522298,
+ size.height * 0.7241119,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.8431595, size.height * 0.7195767),
+ radius: Radius.elliptical(
+ size.width * 0.01020408,
+ size.height * 0.01020408,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.2883598, size.height * 0.7237339);
+ path0.cubicTo(
+ size.width * 0.2853364,
+ size.height * 0.7237339,
+ size.width * 0.2808012,
+ size.height * 0.7244898,
+ size.width * 0.2743764,
+ size.height * 0.7256236,
+ );
+ path0.lineTo(size.width * 0.2660620, size.height * 0.7343159);
+ path0.cubicTo(
+ size.width * 0.2834467,
+ size.height * 0.7331822,
+ size.width * 0.3012094,
+ size.height * 0.7237339,
+ size.width * 0.2883598,
+ size.height * 0.7237339,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.8907785, size.height * 0.7241119);
+ path0.lineTo(size.width * 0.8892668, size.height * 0.7241119);
+ path0.lineTo(size.width * 0.8869992, size.height * 0.7278912);
+ path0.cubicTo(
+ size.width * 0.8881330,
+ size.height * 0.7312925,
+ size.width * 0.8904006,
+ size.height * 0.7331822,
+ size.width * 0.8926682,
+ size.height * 0.7350718,
+ );
+ path0.cubicTo(
+ size.width * 0.8945578,
+ size.height * 0.7369615,
+ size.width * 0.8964475,
+ size.height * 0.7388511,
+ size.width * 0.8990930,
+ size.height * 0.7403628,
+ );
+ path0.cubicTo(
+ size.width * 0.9006047,
+ size.height * 0.7411187,
+ size.width * 0.9028723,
+ size.height * 0.7422525,
+ size.width * 0.9043840,
+ size.height * 0.7418745,
+ );
+ path0.cubicTo(
+ size.width * 0.9058957,
+ size.height * 0.7411187,
+ size.width * 0.9058957,
+ size.height * 0.7392290,
+ size.width * 0.9062736,
+ size.height * 0.7380952,
+ );
+ path0.cubicTo(
+ size.width * 0.9062736,
+ size.height * 0.7339380,
+ size.width * 0.9047619,
+ size.height * 0.7294029,
+ size.width * 0.9009826,
+ size.height * 0.7271353,
+ );
+ path0.cubicTo(
+ size.width * 0.8987150,
+ size.height * 0.7256236,
+ size.width * 0.8956916,
+ size.height * 0.7248677,
+ size.width * 0.8926682,
+ size.height * 0.7244898,
+ );
+ path0.lineTo(size.width * 0.8907785, size.height * 0.7244898);
+ path0.close();
+ path0.moveTo(size.width * 0.2078609, size.height * 0.7373394);
+ path0.cubicTo(
+ size.width * 0.2029478,
+ size.height * 0.7388511,
+ size.width * 0.1976568,
+ size.height * 0.7388511,
+ size.width * 0.1931217,
+ size.height * 0.7414966,
+ );
+ path0.cubicTo(
+ size.width * 0.1908541,
+ size.height * 0.7430083,
+ size.width * 0.1893424,
+ size.height * 0.7464097,
+ size.width * 0.1912320,
+ size.height * 0.7486772,
+ );
+ path0.cubicTo(
+ size.width * 0.1931217,
+ size.height * 0.7509448,
+ size.width * 0.1965231,
+ size.height * 0.7513228,
+ size.width * 0.1991686,
+ size.height * 0.7517007,
+ );
+ path0.cubicTo(
+ size.width * 0.2048375,
+ size.height * 0.7517007,
+ size.width * 0.2105064,
+ size.height * 0.7517007,
+ size.width * 0.2154195,
+ size.height * 0.7490552,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.2214664, size.height * 0.7452759),
+ radius: Radius.elliptical(
+ size.width * 0.02645503,
+ size.height * 0.02645503,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.2226002,
+ size.height * 0.7445200,
+ size.width * 0.2237339,
+ size.height * 0.7422525,
+ size.width * 0.2222222,
+ size.height * 0.7407407,
+ );
+ path0.cubicTo(
+ size.width * 0.2203326,
+ size.height * 0.7388511,
+ size.width * 0.2173091,
+ size.height * 0.7380952,
+ size.width * 0.2146636,
+ size.height * 0.7384732,
+ );
+ path0.cubicTo(
+ size.width * 0.2135299,
+ size.height * 0.7384732,
+ size.width * 0.2123961,
+ size.height * 0.7392290,
+ size.width * 0.2116402,
+ size.height * 0.7399849,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.1583522, size.height * 0.7392290);
+ path0.cubicTo(
+ size.width * 0.1572184,
+ size.height * 0.7392290,
+ size.width * 0.1564626,
+ size.height * 0.7392290,
+ size.width * 0.1553288,
+ size.height * 0.7399849,
+ );
+ path0.cubicTo(
+ size.width * 0.1545729,
+ size.height * 0.7403628,
+ size.width * 0.1541950,
+ size.height * 0.7411187,
+ size.width * 0.1541950,
+ size.height * 0.7422525,
+ );
+ path0.lineTo(size.width * 0.1466364, size.height * 0.7422525);
+ path0.cubicTo(
+ size.width * 0.1436130,
+ size.height * 0.7441421,
+ size.width * 0.1405896,
+ size.height * 0.7460317,
+ size.width * 0.1379441,
+ size.height * 0.7490552,
+ );
+ path0.cubicTo(
+ size.width * 0.1364324,
+ size.height * 0.7505669,
+ size.width * 0.1341648,
+ size.height * 0.7528345,
+ size.width * 0.1341648,
+ size.height * 0.7551020,
+ );
+ path0.cubicTo(
+ size.width * 0.1349206,
+ size.height * 0.7573696,
+ size.width * 0.1371882,
+ size.height * 0.7577475,
+ size.width * 0.1390779,
+ size.height * 0.7577475,
+ );
+ path0.cubicTo(
+ size.width * 0.1451247,
+ size.height * 0.7577475,
+ size.width * 0.1504157,
+ size.height * 0.7554800,
+ size.width * 0.1557067,
+ size.height * 0.7520786,
+ );
+ path0.cubicTo(
+ size.width * 0.1579743,
+ size.height * 0.7505669,
+ size.width * 0.1594860,
+ size.height * 0.7482993,
+ size.width * 0.1617536,
+ size.height * 0.7464097,
+ );
+ path0.cubicTo(
+ size.width * 0.1628874,
+ size.height * 0.7448980,
+ size.width * 0.1647770,
+ size.height * 0.7426304,
+ size.width * 0.1628874,
+ size.height * 0.7407407,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.1583522, size.height * 0.7392290),
+ radius: Radius.elliptical(
+ size.width * 0.007558579,
+ size.height * 0.007558579,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.8764172, size.height * 0.7505669);
+ path0.lineTo(size.width * 0.8726379, size.height * 0.7532124);
+ path0.cubicTo(
+ size.width * 0.8737717,
+ size.height * 0.7569917,
+ size.width * 0.8733938,
+ size.height * 0.7615268,
+ size.width * 0.8756614,
+ size.height * 0.7645503,
+ );
+ path0.lineTo(size.width * 0.8794407, size.height * 0.7694633);
+ path0.cubicTo(
+ size.width * 0.8809524,
+ size.height * 0.7705971,
+ size.width * 0.8832200,
+ size.height * 0.7717309,
+ size.width * 0.8851096,
+ size.height * 0.7705971,
+ );
+ path0.cubicTo(
+ size.width * 0.8862434,
+ size.height * 0.7694633,
+ size.width * 0.8866213,
+ size.height * 0.7675737,
+ size.width * 0.8862434,
+ size.height * 0.7660620,
+ );
+ path0.cubicTo(
+ size.width * 0.8862434,
+ size.height * 0.7630385,
+ size.width * 0.8847317,
+ size.height * 0.7600151,
+ size.width * 0.8832200,
+ size.height * 0.7573696,
+ );
+ path0.cubicTo(
+ size.width * 0.8824641,
+ size.height * 0.7547241,
+ size.width * 0.8809524,
+ size.height * 0.7520786,
+ size.width * 0.8783069,
+ size.height * 0.7513228,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.8764172, size.height * 0.7509448),
+ radius: Radius.elliptical(
+ size.width * 0.007558579,
+ size.height * 0.007558579,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.1190476, size.height * 0.7709751);
+ path0.cubicTo(
+ size.width * 0.1190476,
+ size.height * 0.7709751,
+ size.width * 0.1190476,
+ size.height * 0.7709751,
+ size.width * 0.1190476,
+ size.height * 0.7709751,
+ );
+ path0.cubicTo(
+ size.width * 0.1171580,
+ size.height * 0.7709751,
+ size.width * 0.1156463,
+ size.height * 0.7713530,
+ size.width * 0.1145125,
+ size.height * 0.7721088,
+ );
+ path0.lineTo(size.width * 0.1141345, size.height * 0.7728647);
+ path0.lineTo(size.width * 0.1111111, size.height * 0.7739985);
+ path0.cubicTo(
+ size.width * 0.1092215,
+ size.height * 0.7762661,
+ size.width * 0.1073318,
+ size.height * 0.7785336,
+ size.width * 0.1065760,
+ size.height * 0.7815571,
+ );
+ path0.cubicTo(
+ size.width * 0.1061980,
+ size.height * 0.7834467,
+ size.width * 0.1065760,
+ size.height * 0.7853364,
+ size.width * 0.1080877,
+ size.height * 0.7860922,
+ );
+ path0.cubicTo(
+ size.width * 0.1095994,
+ size.height * 0.7868481,
+ size.width * 0.1114890,
+ size.height * 0.7860922,
+ size.width * 0.1130008,
+ size.height * 0.7853364,
+ );
+ path0.cubicTo(
+ size.width * 0.1156463,
+ size.height * 0.7834467,
+ size.width * 0.1182918,
+ size.height * 0.7815571,
+ size.width * 0.1205593,
+ size.height * 0.7785336,
+ );
+ path0.cubicTo(
+ size.width * 0.1213152,
+ size.height * 0.7766440,
+ size.width * 0.1220711,
+ size.height * 0.7747543,
+ size.width * 0.1216931,
+ size.height * 0.7728647,
+ );
+ path0.cubicTo(
+ size.width * 0.1216931,
+ size.height * 0.7713530,
+ size.width * 0.1201814,
+ size.height * 0.7709751,
+ size.width * 0.1190476,
+ size.height * 0.7709751,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.9213908, size.height * 0.7739985);
+ path0.lineTo(size.width * 0.9172336, size.height * 0.7758881);
+ path0.cubicTo(
+ size.width * 0.9142101,
+ size.height * 0.7808012,
+ size.width * 0.9126984,
+ size.height * 0.7868481,
+ size.width * 0.9123205,
+ size.height * 0.7925170,
+ );
+ path0.cubicTo(
+ size.width * 0.9123205,
+ size.height * 0.7940287,
+ size.width * 0.9111867,
+ size.height * 0.7962963,
+ size.width * 0.9123205,
+ size.height * 0.7974301,
+ );
+ path0.cubicTo(
+ size.width * 0.9138322,
+ size.height * 0.7981859,
+ size.width * 0.9157218,
+ size.height * 0.7974301,
+ size.width * 0.9168556,
+ size.height * 0.7970522,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.9263039, size.height * 0.7845805),
+ radius: Radius.elliptical(
+ size.width * 0.01511716,
+ size.height * 0.01511716,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.9263039,
+ size.height * 0.7808012,
+ size.width * 0.9259259,
+ size.height * 0.7770219,
+ size.width * 0.9229025,
+ size.height * 0.7743764,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.9213908, size.height * 0.7743764),
+ radius: Radius.elliptical(
+ size.width * 0.002267574,
+ size.height * 0.002267574,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.1511716, size.height * 0.7902494);
+ path0.lineTo(size.width * 0.1451247, size.height * 0.8027211);
+ path0.cubicTo(
+ size.width * 0.1466364,
+ size.height * 0.8061224,
+ size.width * 0.1485261,
+ size.height * 0.8099017,
+ size.width * 0.1519274,
+ size.height * 0.8117914,
+ );
+ path0.cubicTo(
+ size.width * 0.1553288,
+ size.height * 0.8133031,
+ size.width * 0.1594860,
+ size.height * 0.8140590,
+ size.width * 0.1625094,
+ size.height * 0.8121693,
+ );
+ path0.cubicTo(
+ size.width * 0.1643991,
+ size.height * 0.8114135,
+ size.width * 0.1651550,
+ size.height * 0.8091459,
+ size.width * 0.1651550,
+ size.height * 0.8072562,
+ );
+ path0.cubicTo(
+ size.width * 0.1643991,
+ size.height * 0.8015873,
+ size.width * 0.1625094,
+ size.height * 0.7959184,
+ size.width * 0.1575964,
+ size.height * 0.7928949,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.1511716, size.height * 0.7902494),
+ radius: Radius.elliptical(
+ size.width * 0.01511716,
+ size.height * 0.01511716,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.8805745, size.height * 0.8008314);
+ path0.lineTo(size.width * 0.8779289, size.height * 0.8012094);
+ path0.arcToPoint(
+ Offset(size.width * 0.8643235, size.height * 0.8087680),
+ radius: Radius.elliptical(
+ size.width * 0.03665911,
+ size.height * 0.03665911,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.8635676,
+ size.height * 0.8099017,
+ size.width * 0.8643235,
+ size.height * 0.8110355,
+ size.width * 0.8650794,
+ size.height * 0.8110355,
+ );
+ path0.cubicTo(
+ size.width * 0.8673469,
+ size.height * 0.8114135,
+ size.width * 0.8699924,
+ size.height * 0.8117914,
+ size.width * 0.8722600,
+ size.height * 0.8110355,
+ );
+ path0.cubicTo(
+ size.width * 0.8752834,
+ size.height * 0.8102797,
+ size.width * 0.8779289,
+ size.height * 0.8087680,
+ size.width * 0.8798186,
+ size.height * 0.8065004,
+ );
+ path0.cubicTo(
+ size.width * 0.8809524,
+ size.height * 0.8053666,
+ size.width * 0.8817082,
+ size.height * 0.8042328,
+ size.width * 0.8813303,
+ size.height * 0.8027211,
+ );
+ path0.cubicTo(
+ size.width * 0.8813303,
+ size.height * 0.8019652,
+ size.width * 0.8805745,
+ size.height * 0.8012094,
+ size.width * 0.8809524,
+ size.height * 0.8008314,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.8030990, size.height * 0.8216175);
+ path0.lineTo(size.width * 0.7985639, size.height * 0.8227513);
+ path0.arcToPoint(
+ Offset(size.width * 0.7910053, size.height * 0.8276644),
+ radius: Radius.elliptical(
+ size.width * 0.02267574,
+ size.height * 0.02267574,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.7902494,
+ size.height * 0.8287982,
+ size.width * 0.7910053,
+ size.height * 0.8303099,
+ size.width * 0.7921391,
+ size.height * 0.8306878,
+ );
+ path0.cubicTo(
+ size.width * 0.7947846,
+ size.height * 0.8321995,
+ size.width * 0.7974301,
+ size.height * 0.8321995,
+ size.width * 0.8004535,
+ size.height * 0.8318216,
+ );
+ path0.cubicTo(
+ size.width * 0.8046107,
+ size.height * 0.8318216,
+ size.width * 0.8087680,
+ size.height * 0.8303099,
+ size.width * 0.8129252,
+ size.height * 0.8295540,
+ );
+ path0.cubicTo(
+ size.width * 0.8140590,
+ size.height * 0.8291761,
+ size.width * 0.8155707,
+ size.height * 0.8280423,
+ size.width * 0.8136810,
+ size.height * 0.8272865,
+ );
+ path0.lineTo(size.width * 0.8046107, size.height * 0.8216175);
+ path0.lineTo(size.width * 0.8030990, size.height * 0.8216175);
+ path0.close();
+ path0.moveTo(size.width * 0.8499622, size.height * 0.8280423);
+ path0.cubicTo(
+ size.width * 0.8473167,
+ size.height * 0.8284203,
+ size.width * 0.8450491,
+ size.height * 0.8295540,
+ size.width * 0.8427816,
+ size.height * 0.8310658,
+ );
+ path0.cubicTo(
+ size.width * 0.8405140,
+ size.height * 0.8321995,
+ size.width * 0.8382464,
+ size.height * 0.8340892,
+ size.width * 0.8374906,
+ size.height * 0.8363568,
+ );
+ path0.cubicTo(
+ size.width * 0.8367347,
+ size.height * 0.8374906,
+ size.width * 0.8374906,
+ size.height * 0.8393802,
+ size.width * 0.8386243,
+ size.height * 0.8397581,
+ );
+ path0.cubicTo(
+ size.width * 0.8408919,
+ size.height * 0.8401361,
+ size.width * 0.8435374,
+ size.height * 0.8397581,
+ size.width * 0.8458050,
+ size.height * 0.8393802,
+ );
+ path0.cubicTo(
+ size.width * 0.8480726,
+ size.height * 0.8386243,
+ size.width * 0.8507181,
+ size.height * 0.8382464,
+ size.width * 0.8526077,
+ size.height * 0.8367347,
+ );
+ path0.cubicTo(
+ size.width * 0.8544974,
+ size.height * 0.8356009,
+ size.width * 0.8563870,
+ size.height * 0.8340892,
+ size.width * 0.8575208,
+ size.height * 0.8321995,
+ );
+ path0.cubicTo(
+ size.width * 0.8582766,
+ size.height * 0.8306878,
+ size.width * 0.8563870,
+ size.height * 0.8303099,
+ size.width * 0.8552532,
+ size.height * 0.8299320,
+ );
+ path0.lineTo(size.width * 0.8533636, size.height * 0.8299320);
+ path0.close();
+ path0.moveTo(size.width * 0.1375661, size.height * 0.8291761);
+ path0.cubicTo(
+ size.width * 0.1364324,
+ size.height * 0.8291761,
+ size.width * 0.1356765,
+ size.height * 0.8291761,
+ size.width * 0.1345427,
+ size.height * 0.8299320,
+ );
+ path0.cubicTo(
+ size.width * 0.1341648,
+ size.height * 0.8299320,
+ size.width * 0.1334089,
+ size.height * 0.8306878,
+ size.width * 0.1334089,
+ size.height * 0.8314437,
+ );
+ path0.lineTo(size.width * 0.1303855, size.height * 0.8352230);
+ path0.cubicTo(
+ size.width * 0.1296296,
+ size.height * 0.8374906,
+ size.width * 0.1315193,
+ size.height * 0.8397581,
+ size.width * 0.1334089,
+ size.height * 0.8412698,
+ );
+ path0.lineTo(size.width * 0.1379441, size.height * 0.8450491);
+ path0.arcToPoint(
+ Offset(size.width * 0.1455026, size.height * 0.8480726),
+ radius: Radius.elliptical(
+ size.width * 0.01133787,
+ size.height * 0.01133787,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.1481481,
+ size.height * 0.8480726,
+ size.width * 0.1511716,
+ size.height * 0.8469388,
+ size.width * 0.1530612,
+ size.height * 0.8450491,
+ );
+ path0.cubicTo(
+ size.width * 0.1541950,
+ size.height * 0.8431595,
+ size.width * 0.1530612,
+ size.height * 0.8412698,
+ size.width * 0.1523054,
+ size.height * 0.8393802,
+ );
+ path0.cubicTo(
+ size.width * 0.1496599,
+ size.height * 0.8356009,
+ size.width * 0.1458806,
+ size.height * 0.8329554,
+ size.width * 0.1421013,
+ size.height * 0.8303099,
+ );
+ path0.cubicTo(
+ size.width * 0.1409675,
+ size.height * 0.8295540,
+ size.width * 0.1390779,
+ size.height * 0.8291761,
+ size.width * 0.1375661,
+ size.height * 0.8291761,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.6749811, size.height * 0.8363568);
+ path0.lineTo(size.width * 0.6742252, size.height * 0.8363568);
+ path0.cubicTo(
+ size.width * 0.6708239,
+ size.height * 0.8363568,
+ size.width * 0.6674225,
+ size.height * 0.8363568,
+ size.width * 0.6643991,
+ size.height * 0.8378685,
+ );
+ path0.lineTo(size.width * 0.6598639, size.height * 0.8405140);
+ path0.cubicTo(
+ size.width * 0.6606198,
+ size.height * 0.8416478,
+ size.width * 0.6621315,
+ size.height * 0.8424036,
+ size.width * 0.6636432,
+ size.height * 0.8427816,
+ );
+ path0.lineTo(size.width * 0.6712018, size.height * 0.8446712);
+ path0.cubicTo(
+ size.width * 0.6749811,
+ size.height * 0.8458050,
+ size.width * 0.6798942,
+ size.height * 0.8461829,
+ size.width * 0.6836735,
+ size.height * 0.8442933,
+ );
+ path0.cubicTo(
+ size.width * 0.6851852,
+ size.height * 0.8431595,
+ size.width * 0.6870748,
+ size.height * 0.8420257,
+ size.width * 0.6866969,
+ size.height * 0.8405140,
+ );
+ path0.cubicTo(
+ size.width * 0.6866969,
+ size.height * 0.8386243,
+ size.width * 0.6848073,
+ size.height * 0.8378685,
+ size.width * 0.6829176,
+ size.height * 0.8374906,
+ );
+ path0.cubicTo(
+ size.width * 0.6806500,
+ size.height * 0.8367347,
+ size.width * 0.6776266,
+ size.height * 0.8363568,
+ size.width * 0.6749811,
+ size.height * 0.8363568,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.2003023, size.height * 0.8401361);
+ path0.cubicTo(
+ size.width * 0.1984127,
+ size.height * 0.8401361,
+ size.width * 0.1965231,
+ size.height * 0.8401361,
+ size.width * 0.1946334,
+ size.height * 0.8412698,
+ );
+ path0.cubicTo(
+ size.width * 0.1938776,
+ size.height * 0.8416478,
+ size.width * 0.1916100,
+ size.height * 0.8424036,
+ size.width * 0.1931217,
+ size.height * 0.8431595,
+ );
+ path0.lineTo(size.width * 0.1931217, size.height * 0.8442933);
+ path0.cubicTo(
+ size.width * 0.1931217,
+ size.height * 0.8465608,
+ size.width * 0.1953893,
+ size.height * 0.8480726,
+ size.width * 0.1969010,
+ size.height * 0.8488284,
+ );
+ path0.cubicTo(
+ size.width * 0.2006803,
+ size.height * 0.8503401,
+ size.width * 0.2044596,
+ size.height * 0.8510960,
+ size.width * 0.2082389,
+ size.height * 0.8507181,
+ );
+ path0.cubicTo(
+ size.width * 0.2101285,
+ size.height * 0.8503401,
+ size.width * 0.2120181,
+ size.height * 0.8495843,
+ size.width * 0.2127740,
+ size.height * 0.8480726,
+ );
+ path0.cubicTo(
+ size.width * 0.2135299,
+ size.height * 0.8458050,
+ size.width * 0.2123961,
+ size.height * 0.8439153,
+ size.width * 0.2105064,
+ size.height * 0.8427816,
+ );
+ path0.cubicTo(
+ size.width * 0.2074830,
+ size.height * 0.8408919,
+ size.width * 0.2040816,
+ size.height * 0.8401361,
+ size.width * 0.2003023,
+ size.height * 0.8401361,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.5816327, size.height * 0.8439153);
+ path0.cubicTo(
+ size.width * 0.5782313,
+ size.height * 0.8439153,
+ size.width * 0.5752079,
+ size.height * 0.8446712,
+ size.width * 0.5721844,
+ size.height * 0.8450491,
+ );
+ path0.cubicTo(
+ size.width * 0.5691610,
+ size.height * 0.8458050,
+ size.width * 0.5661376,
+ size.height * 0.8465608,
+ size.width * 0.5646259,
+ size.height * 0.8495843,
+ );
+ path0.lineTo(size.width * 0.5661376, size.height * 0.8507181);
+ path0.lineTo(size.width * 0.5714286, size.height * 0.8522298);
+ path0.cubicTo(
+ size.width * 0.5752079,
+ size.height * 0.8533636,
+ size.width * 0.5789872,
+ size.height * 0.8537415,
+ size.width * 0.5827664,
+ size.height * 0.8533636,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.5903250, size.height * 0.8514739),
+ radius: Radius.elliptical(
+ size.width * 0.02267574,
+ size.height * 0.02267574,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.5918367,
+ size.height * 0.8507181,
+ size.width * 0.5933485,
+ size.height * 0.8492063,
+ size.width * 0.5922147,
+ size.height * 0.8476946,
+ );
+ path0.cubicTo(
+ size.width * 0.5910809,
+ size.height * 0.8461829,
+ size.width * 0.5891912,
+ size.height * 0.8454271,
+ size.width * 0.5873016,
+ size.height * 0.8446712,
+ );
+ path0.cubicTo(
+ size.width * 0.5854119,
+ size.height * 0.8439153,
+ size.width * 0.5835223,
+ size.height * 0.8439153,
+ size.width * 0.5816327,
+ size.height * 0.8439153,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.7403628, size.height * 0.8492063);
+ path0.cubicTo(
+ size.width * 0.7384732,
+ size.height * 0.8492063,
+ size.width * 0.7365835,
+ size.height * 0.8499622,
+ size.width * 0.7346939,
+ size.height * 0.8507181,
+ );
+ path0.cubicTo(
+ size.width * 0.7324263,
+ size.height * 0.8510960,
+ size.width * 0.7309146,
+ size.height * 0.8544974,
+ size.width * 0.7328042,
+ size.height * 0.8567649,
+ );
+ path0.cubicTo(
+ size.width * 0.7339380,
+ size.height * 0.8578987,
+ size.width * 0.7358277,
+ size.height * 0.8578987,
+ size.width * 0.7373394,
+ size.height * 0.8582766,
+ );
+ path0.cubicTo(
+ size.width * 0.7426304,
+ size.height * 0.8590325,
+ size.width * 0.7482993,
+ size.height * 0.8594104,
+ size.width * 0.7524565,
+ size.height * 0.8571429,
+ );
+ path0.cubicTo(
+ size.width * 0.7547241,
+ size.height * 0.8563870,
+ size.width * 0.7562358,
+ size.height * 0.8552532,
+ size.width * 0.7577475,
+ size.height * 0.8533636,
+ );
+ path0.cubicTo(
+ size.width * 0.7585034,
+ size.height * 0.8518519,
+ size.width * 0.7566138,
+ size.height * 0.8510960,
+ size.width * 0.7554800,
+ size.height * 0.8507181,
+ );
+ path0.lineTo(size.width * 0.7543462, size.height * 0.8507181);
+ path0.lineTo(size.width * 0.7418745, size.height * 0.8492063);
+ path0.lineTo(size.width * 0.7403628, size.height * 0.8492063);
+ path0.close();
+ path0.moveTo(size.width * 0.3287982, size.height * 0.8552532);
+ path0.lineTo(size.width * 0.3208617, size.height * 0.8560091);
+ path0.cubicTo(
+ size.width * 0.3159486,
+ size.height * 0.8567649,
+ size.width * 0.3117914,
+ size.height * 0.8586546,
+ size.width * 0.3087680,
+ size.height * 0.8620559,
+ );
+ path0.lineTo(size.width * 0.3087680, size.height * 0.8665911);
+ path0.lineTo(size.width * 0.3140590, size.height * 0.8665911);
+ path0.cubicTo(
+ size.width * 0.3208617,
+ size.height * 0.8650794,
+ size.width * 0.3276644,
+ size.height * 0.8647014,
+ size.width * 0.3340892,
+ size.height * 0.8624339,
+ );
+ path0.cubicTo(
+ size.width * 0.3356009,
+ size.height * 0.8616780,
+ size.width * 0.3378685,
+ size.height * 0.8609221,
+ size.width * 0.3378685,
+ size.height * 0.8590325,
+ );
+ path0.cubicTo(
+ size.width * 0.3382464,
+ size.height * 0.8571429,
+ size.width * 0.3359788,
+ size.height * 0.8560091,
+ size.width * 0.3340892,
+ size.height * 0.8556311,
+ );
+ path0.lineTo(size.width * 0.3287982, size.height * 0.8556311);
+ path0.close();
+ path0.moveTo(size.width * 0.3083900, size.height * 0.8665911);
+ path0.lineTo(size.width * 0.3083900, size.height * 0.8665911);
+ path0.close();
+ path0.moveTo(size.width * 0.4546485, size.height * 0.8601663);
+ path0.cubicTo(
+ size.width * 0.4527589,
+ size.height * 0.8601663,
+ size.width * 0.4508692,
+ size.height * 0.8601663,
+ size.width * 0.4489796,
+ size.height * 0.8609221,
+ );
+ path0.cubicTo(
+ size.width * 0.4463341,
+ size.height * 0.8616780,
+ size.width * 0.4436886,
+ size.height * 0.8631897,
+ size.width * 0.4433107,
+ size.height * 0.8658352,
+ );
+ path0.lineTo(size.width * 0.4444444, size.height * 0.8684807);
+ path0.lineTo(size.width * 0.4493575, size.height * 0.8688587);
+ path0.cubicTo(
+ size.width * 0.4542706,
+ size.height * 0.8696145,
+ size.width * 0.4591837,
+ size.height * 0.8696145,
+ size.width * 0.4640967,
+ size.height * 0.8688587,
+ );
+ path0.cubicTo(
+ size.width * 0.4659864,
+ size.height * 0.8688587,
+ size.width * 0.4678760,
+ size.height * 0.8681028,
+ size.width * 0.4693878,
+ size.height * 0.8662132,
+ );
+ path0.cubicTo(
+ size.width * 0.4701436,
+ size.height * 0.8650794,
+ size.width * 0.4708995,
+ size.height * 0.8631897,
+ size.width * 0.4693878,
+ size.height * 0.8624339,
+ );
+ path0.cubicTo(
+ size.width * 0.4671202,
+ size.height * 0.8613001,
+ size.width * 0.4644747,
+ size.height * 0.8613001,
+ size.width * 0.4618292,
+ size.height * 0.8609221,
+ );
+ path0.lineTo(size.width * 0.4542706, size.height * 0.8601663);
+ path0.close();
+ path0.moveTo(size.width * 0.2301587, size.height * 0.8654573);
+ path0.lineTo(size.width * 0.2290249, size.height * 0.8654573);
+ path0.cubicTo(
+ size.width * 0.2260015,
+ size.height * 0.8654573,
+ size.width * 0.2233560,
+ size.height * 0.8665911,
+ size.width * 0.2207105,
+ size.height * 0.8677249,
+ );
+ path0.cubicTo(
+ size.width * 0.2199546,
+ size.height * 0.8677249,
+ size.width * 0.2191988,
+ size.height * 0.8681028,
+ size.width * 0.2207105,
+ size.height * 0.8677249,
+ );
+ path0.lineTo(size.width * 0.2169312, size.height * 0.8722600);
+ path0.cubicTo(
+ size.width * 0.2184429,
+ size.height * 0.8749055,
+ size.width * 0.2214664,
+ size.height * 0.8760393,
+ size.width * 0.2241119,
+ size.height * 0.8760393,
+ );
+ path0.cubicTo(
+ size.width * 0.2297808,
+ size.height * 0.8779289,
+ size.width * 0.2358277,
+ size.height * 0.8786848,
+ size.width * 0.2414966,
+ size.height * 0.8771731,
+ );
+ path0.cubicTo(
+ size.width * 0.2437642,
+ size.height * 0.8767952,
+ size.width * 0.2460317,
+ size.height * 0.8764172,
+ size.width * 0.2467876,
+ size.height * 0.8745276,
+ );
+ path0.cubicTo(
+ size.width * 0.2479214,
+ size.height * 0.8726379,
+ size.width * 0.2460317,
+ size.height * 0.8711262,
+ size.width * 0.2448980,
+ size.height * 0.8699924,
+ );
+ path0.cubicTo(
+ size.width * 0.2411187,
+ size.height * 0.8662132,
+ size.width * 0.2354497,
+ size.height * 0.8654573,
+ size.width * 0.2297808,
+ size.height * 0.8654573,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.6326531, size.height * 0.8730159);
+ path0.lineTo(size.width * 0.6239607, size.height * 0.8741497);
+ path0.cubicTo(
+ size.width * 0.6201814,
+ size.height * 0.8749055,
+ size.width * 0.6160242,
+ size.height * 0.8760393,
+ size.width * 0.6126228,
+ size.height * 0.8790627,
+ );
+ path0.lineTo(size.width * 0.6137566, size.height * 0.8828420);
+ path0.lineTo(size.width * 0.6190476, size.height * 0.8839758);
+ path0.lineTo(size.width * 0.6292517, size.height * 0.8843537);
+ path0.cubicTo(
+ size.width * 0.6337868,
+ size.height * 0.8843537,
+ size.width * 0.6386999,
+ size.height * 0.8839758,
+ size.width * 0.6417234,
+ size.height * 0.8805745,
+ );
+ path0.cubicTo(
+ size.width * 0.6428571,
+ size.height * 0.8798186,
+ size.width * 0.6439909,
+ size.height * 0.8783069,
+ size.width * 0.6436130,
+ size.height * 0.8767952,
+ );
+ path0.cubicTo(
+ size.width * 0.6428571,
+ size.height * 0.8749055,
+ size.width * 0.6402116,
+ size.height * 0.8749055,
+ size.width * 0.6386999,
+ size.height * 0.8741497,
+ );
+ path0.cubicTo(
+ size.width * 0.6368103,
+ size.height * 0.8733938,
+ size.width * 0.6349206,
+ size.height * 0.8733938,
+ size.width * 0.6326531,
+ size.height * 0.8733938,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.6137566, size.height * 0.8832200);
+ path0.cubicTo(
+ size.width * 0.6137566,
+ size.height * 0.8832200,
+ size.width * 0.6137566,
+ size.height * 0.8832200,
+ size.width * 0.6137566,
+ size.height * 0.8832200,
+ );
+ path0.lineTo(size.width * 0.6137566, size.height * 0.8832200);
+ path0.close();
+ path0.moveTo(size.width * 0.6791383, size.height * 0.8783069);
+ path0.lineTo(size.width * 0.6798942, size.height * 0.8794407);
+ path0.lineTo(size.width * 0.6791383, size.height * 0.8783069);
+ path0.close();
+ path0.moveTo(size.width * 0.6798942, size.height * 0.8794407);
+ path0.cubicTo(
+ size.width * 0.6814059,
+ size.height * 0.8813303,
+ size.width * 0.6825397,
+ size.height * 0.8835979,
+ size.width * 0.6844293,
+ size.height * 0.8851096,
+ );
+ path0.lineTo(size.width * 0.6851852, size.height * 0.8858655);
+ path0.close();
+ path0.moveTo(size.width * 0.6689342, size.height * 0.8801965);
+ path0.lineTo(size.width * 0.6746032, size.height * 0.8858655);
+ path0.lineTo(size.width * 0.6689342, size.height * 0.8801965);
+ path0.close();
+ path0.moveTo(size.width * 0.3556311, size.height * 0.8801965);
+ path0.cubicTo(
+ size.width * 0.3529856,
+ size.height * 0.8801965,
+ size.width * 0.3503401,
+ size.height * 0.8805745,
+ size.width * 0.3480726,
+ size.height * 0.8820862,
+ );
+ path0.cubicTo(
+ size.width * 0.3473167,
+ size.height * 0.8828420,
+ size.width * 0.3461829,
+ size.height * 0.8835979,
+ size.width * 0.3458050,
+ size.height * 0.8847317,
+ );
+ path0.lineTo(size.width * 0.3427816, size.height * 0.8862434);
+ path0.arcToPoint(
+ Offset(size.width * 0.3616780, size.height * 0.8938020),
+ radius: Radius.elliptical(
+ size.width * 0.03590325,
+ size.height * 0.03590325,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.3654573,
+ size.height * 0.8945578,
+ size.width * 0.3692366,
+ size.height * 0.8956916,
+ size.width * 0.3730159,
+ size.height * 0.8938020,
+ );
+ path0.cubicTo(
+ size.width * 0.3745276,
+ size.height * 0.8926682,
+ size.width * 0.3775510,
+ size.height * 0.8915344,
+ size.width * 0.3771731,
+ size.height * 0.8892668,
+ );
+ path0.cubicTo(
+ size.width * 0.3771731,
+ size.height * 0.8869992,
+ size.width * 0.3749055,
+ size.height * 0.8854875,
+ size.width * 0.3733938,
+ size.height * 0.8847317,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.3556311, size.height * 0.8801965),
+ radius: Radius.elliptical(
+ size.width * 0.03476946,
+ size.height * 0.03476946,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.4962207, size.height * 0.8832200);
+ path0.lineTo(size.width * 0.4913076, size.height * 0.8835979);
+ path0.cubicTo(
+ size.width * 0.4894180,
+ size.height * 0.8839758,
+ size.width * 0.4871504,
+ size.height * 0.8854875,
+ size.width * 0.4867725,
+ size.height * 0.8877551,
+ );
+ path0.lineTo(size.width * 0.4875283, size.height * 0.8896447);
+ path0.lineTo(size.width * 0.4871504, size.height * 0.8900227);
+ path0.cubicTo(
+ size.width * 0.4867725,
+ size.height * 0.8915344,
+ size.width * 0.4894180,
+ size.height * 0.8919123,
+ size.width * 0.4909297,
+ size.height * 0.8926682,
+ );
+ path0.arcToPoint(
+ Offset(size.width * 0.5045351, size.height * 0.8964475),
+ radius: Radius.elliptical(
+ size.width * 0.03401361,
+ size.height * 0.03401361,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path0.cubicTo(
+ size.width * 0.5079365,
+ size.height * 0.8964475,
+ size.width * 0.5117158,
+ size.height * 0.8964475,
+ size.width * 0.5143613,
+ size.height * 0.8945578,
+ );
+ path0.cubicTo(
+ size.width * 0.5158730,
+ size.height * 0.8934240,
+ size.width * 0.5173847,
+ size.height * 0.8907785,
+ size.width * 0.5154951,
+ size.height * 0.8892668,
+ );
+ path0.cubicTo(
+ size.width * 0.5128496,
+ size.height * 0.8873772,
+ size.width * 0.5098262,
+ size.height * 0.8862434,
+ size.width * 0.5064248,
+ size.height * 0.8851096,
+ );
+ path0.cubicTo(
+ size.width * 0.5034014,
+ size.height * 0.8839758,
+ size.width * 0.4996221,
+ size.height * 0.8832200,
+ size.width * 0.4962207,
+ size.height * 0.8832200,
+ );
+ path0.close();
+ path0.moveTo(size.width * 0.6746032, size.height * 0.8858655);
+ path0.lineTo(size.width * 0.6749811, size.height * 0.8866213);
+ path0.close();
+
+ final Paint paint0Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint0Stroke.color = deerTracks.withOpacity(1);
+ paint0Stroke.strokeCap = StrokeCap.round;
+ paint0Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path0, paint0Stroke);
+
+ final Path path_1 = Path();
+ path_1.moveTo(size.width * 0.3605442, size.height * 0.4489796);
+ path_1.cubicTo(
+ size.width * 0.3594104,
+ size.height * 0.4667423,
+ size.width * 0.3439153,
+ size.height * 0.4690098,
+ size.width * 0.3367347,
+ size.height * 0.4708995,
+ );
+ path_1.cubicTo(
+ size.width * 0.3227513,
+ size.height * 0.4232804,
+ size.width * 0.3053666,
+ size.height * 0.4395314,
+ size.width * 0.3193500,
+ size.height * 0.4765684,
+ );
+ path_1.cubicTo(
+ size.width * 0.3072562,
+ size.height * 0.4811036,
+ size.width * 0.2800454,
+ size.height * 0.4882842,
+ size.width * 0.2702192,
+ size.height * 0.4916856,
+ );
+ path_1.cubicTo(
+ size.width * 0.2653061,
+ size.height * 0.4848828,
+ size.width * 0.2426304,
+ size.height * 0.4622071,
+ size.width * 0.2195767,
+ size.height * 0.4656085,
+ );
+ path_1.cubicTo(
+ size.width * 0.2044596,
+ size.height * 0.4640967,
+ size.width * 0.1836735,
+ size.height * 0.4648526,
+ size.width * 0.1855631,
+ size.height * 0.4754346,
+ );
+ path_1.cubicTo(
+ size.width * 0.1965231,
+ size.height * 0.4863946,
+ size.width * 0.1825397,
+ size.height * 0.4962207,
+ size.width * 0.1885865,
+ size.height * 0.4965986,
+ );
+ path_1.cubicTo(
+ size.width * 0.1613757,
+ size.height * 0.5086924,
+ size.width * 0.1545729,
+ size.height * 0.4523810,
+ size.width * 0.1405896,
+ size.height * 0.4523810,
+ );
+ path_1.cubicTo(
+ size.width * 0.1315193,
+ size.height * 0.4572940,
+ size.width * 0.1462585,
+ size.height * 0.4973545,
+ size.width * 0.1311413,
+ size.height * 0.4807256,
+ );
+ path_1.cubicTo(
+ size.width * 0.1164021,
+ size.height * 0.4769463,
+ size.width * 0.1148904,
+ size.height * 0.4331066,
+ size.width * 0.09977324,
+ size.height * 0.4452003,
+ );
+ path_1.cubicTo(
+ size.width * 0.09599395,
+ size.height * 0.4656085,
+ size.width * 0.1095994,
+ size.height * 0.4867725,
+ size.width * 0.1239607,
+ size.height * 0.5003779,
+ );
+ path_1.cubicTo(
+ size.width * 0.1409675,
+ size.height * 0.5162509,
+ size.width * 0.1678005,
+ size.height * 0.5060469,
+ size.width * 0.1844293,
+ size.height * 0.5192744,
+ );
+ path_1.cubicTo(
+ size.width * 0.1825397,
+ size.height * 0.5347695,
+ size.width * 0.2014361,
+ size.height * 0.5495087,
+ size.width * 0.1908541,
+ size.height * 0.5650038,
+ );
+ path_1.cubicTo(
+ size.width * 0.1870748,
+ size.height * 0.5740741,
+ size.width * 0.1825397,
+ size.height * 0.5831444,
+ size.width * 0.1961451,
+ size.height * 0.5831444,
+ );
+ path_1.cubicTo(
+ size.width * 0.2082389,
+ size.height * 0.5914588,
+ size.width * 0.2278912,
+ size.height * 0.5922147,
+ size.width * 0.2377173,
+ size.height * 0.5967498,
+ );
+ path_1.cubicTo(
+ size.width * 0.2460317,
+ size.height * 0.6107332,
+ size.width * 0.2728647,
+ size.height * 0.6148904,
+ size.width * 0.2626606,
+ size.height * 0.6360544,
+ );
+ path_1.lineTo(size.width * 0.2539683, size.height * 0.7324263);
+ path_1.cubicTo(
+ size.width * 0.2743764,
+ size.height * 0.7384732,
+ size.width * 0.2811791,
+ size.height * 0.7150416,
+ size.width * 0.2834467,
+ size.height * 0.6999244,
+ );
+ path_1.cubicTo(
+ size.width * 0.2860922,
+ size.height * 0.6900983,
+ size.width * 0.2879819,
+ size.height * 0.6651550,
+ size.width * 0.2966742,
+ size.height * 0.6662887,
+ );
+ path_1.cubicTo(
+ size.width * 0.3053666,
+ size.height * 0.6787604,
+ size.width * 0.3042328,
+ size.height * 0.7154195,
+ size.width * 0.3257748,
+ size.height * 0.7067271,
+ );
+ path_1.cubicTo(
+ size.width * 0.3446712,
+ size.height * 0.6972789,
+ size.width * 0.3253968,
+ size.height * 0.6757370,
+ size.width * 0.3257748,
+ size.height * 0.6602419,
+ );
+ path_1.lineTo(size.width * 0.3125472, size.height * 0.6024187);
+ path_1.lineTo(size.width * 0.4070295, size.height * 0.6024187);
+ path_1.cubicTo(
+ size.width * 0.4085412,
+ size.height * 0.6364324,
+ size.width * 0.4089191,
+ size.height * 0.6734694,
+ size.width * 0.4104308,
+ size.height * 0.7071051,
+ );
+ path_1.cubicTo(
+ size.width * 0.4323507,
+ size.height * 0.7142857,
+ size.width * 0.4436886,
+ size.height * 0.6874528,
+ size.width * 0.4410431,
+ size.height * 0.6693122,
+ );
+ path_1.lineTo(size.width * 0.4470899, size.height * 0.6277400);
+ path_1.cubicTo(
+ size.width * 0.4569161,
+ size.height * 0.6466364,
+ size.width * 0.4557823,
+ size.height * 0.6712018,
+ size.width * 0.4720333,
+ size.height * 0.6863190,
+ );
+ path_1.cubicTo(
+ size.width * 0.4939531,
+ size.height * 0.6832955,
+ size.width * 0.4890401,
+ size.height * 0.6693122,
+ size.width * 0.4833711,
+ size.height * 0.6428571,
+ );
+ path_1.cubicTo(
+ size.width * 0.4803477,
+ size.height * 0.6050642,
+ size.width * 0.4708995,
+ size.height * 0.5684051,
+ size.width * 0.4618292,
+ size.height * 0.5321240,
+ );
+ path_1.cubicTo(
+ size.width * 0.4792139,
+ size.height * 0.5192744,
+ size.width * 0.4811036,
+ size.height * 0.4943311,
+ size.width * 0.4693878,
+ size.height * 0.4773243,
+ );
+ path_1.cubicTo(
+ size.width * 0.4576720,
+ size.height * 0.4546485,
+ size.width * 0.4455782,
+ size.height * 0.4848828,
+ size.width * 0.4467120,
+ size.height * 0.4977324,
+ );
+ path_1.cubicTo(
+ size.width * 0.4489796,
+ size.height * 0.5211640,
+ size.width * 0.4202570,
+ size.height * 0.5000000,
+ size.width * 0.4070295,
+ size.height * 0.5011338,
+ );
+ path_1.cubicTo(
+ size.width * 0.3941799,
+ size.height * 0.4973545,
+ size.width * 0.3556311,
+ size.height * 0.4890401,
+ size.width * 0.3537415,
+ size.height * 0.4848828,
+ );
+ path_1.cubicTo(
+ size.width * 0.3813303,
+ size.height * 0.4716553,
+ size.width * 0.3854875,
+ size.height * 0.4648526,
+ size.width * 0.3771731,
+ size.height * 0.4402872,
+ );
+ path_1.cubicTo(
+ size.width * 0.3654573,
+ size.height * 0.3873772,
+ size.width * 0.3439153,
+ size.height * 0.4021164,
+ size.width * 0.3605442,
+ size.height * 0.4489796,
+ );
+ path_1.close();
+
+ final Paint paint1Fill = Paint()..style = PaintingStyle.fill;
+ paint1Fill.color = deerSkin.withOpacity(1);
+ canvas.drawPath(path_1, paint1Fill);
+
+ final Path path_2 = Path();
+ path_2.moveTo(size.width * 0.3624339, size.height * 0.4818594);
+ path_2.lineTo(size.width * 0.3492063, size.height * 0.4882842);
+ path_2.cubicTo(
+ size.width * 0.3616780,
+ size.height * 0.4886621,
+ size.width * 0.3775510,
+ size.height * 0.5090703,
+ size.width * 0.3760393,
+ size.height * 0.5192744,
+ );
+ path_2.cubicTo(
+ size.width * 0.3548753,
+ size.height * 0.5222978,
+ size.width * 0.3325775,
+ size.height * 0.5283447,
+ size.width * 0.3178382,
+ size.height * 0.5241875,
+ );
+ path_2.lineTo(size.width * 0.3114135, size.height * 0.5003779);
+ path_2.cubicTo(
+ size.width * 0.3076342,
+ size.height * 0.5011338,
+ size.width * 0.2944067,
+ size.height * 0.4992441,
+ size.width * 0.2981859,
+ size.height * 0.5064248,
+ );
+ path_2.lineTo(size.width * 0.3057445, size.height * 0.5253212);
+ path_2.arcToPoint(
+ Offset(size.width * 0.2970522, size.height * 0.5423280),
+ radius: Radius.elliptical(
+ size.width * 0.01360544,
+ size.height * 0.01360544,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path_2.cubicTo(
+ size.width * 0.3004535,
+ size.height * 0.5748299,
+ size.width * 0.2898715,
+ size.height * 0.6345427,
+ size.width * 0.3393802,
+ size.height * 0.6194255,
+ );
+ path_2.lineTo(size.width * 0.4168556, size.height * 0.6054422);
+ path_2.lineTo(size.width * 0.4259259, size.height * 0.5952381);
+ path_2.cubicTo(
+ size.width * 0.4229025,
+ size.height * 0.5718065,
+ size.width * 0.4236584,
+ size.height * 0.5623583,
+ size.width * 0.4202570,
+ size.height * 0.5385488,
+ );
+ path_2.cubicTo(
+ size.width * 0.4179894,
+ size.height * 0.5306122,
+ size.width * 0.4115646,
+ size.height * 0.5166289,
+ size.width * 0.4036281,
+ size.height * 0.5185185,
+ );
+ path_2.cubicTo(
+ size.width * 0.3998488,
+ size.height * 0.5177627,
+ size.width * 0.3956916,
+ size.height * 0.5177627,
+ size.width * 0.3915344,
+ size.height * 0.5177627,
+ );
+ path_2.cubicTo(
+ size.width * 0.3885110,
+ size.height * 0.5068027,
+ size.width * 0.3862434,
+ size.height * 0.4920635,
+ size.width * 0.3794407,
+ size.height * 0.4882842,
+ );
+ path_2.cubicTo(
+ size.width * 0.3771731,
+ size.height * 0.4867725,
+ size.width * 0.3643235,
+ size.height * 0.4837491,
+ size.width * 0.3624339,
+ size.height * 0.4818594,
+ );
+ path_2.close();
+
+ final Paint paint2Fill = Paint()..style = PaintingStyle.fill;
+ paint2Fill.color = mailBag.withOpacity(1);
+ canvas.drawPath(path_2, paint2Fill);
+
+ final Path path3 = Path();
+ path3.moveTo(size.width * 0.2872260, size.height * 0.8212396);
+ path3.cubicTo(
+ size.width * 0.2917611,
+ size.height * 0.8193500,
+ size.width * 0.2966742,
+ size.height * 0.8189720,
+ size.width * 0.3015873,
+ size.height * 0.8201058,
+ );
+ path3.lineTo(size.width * 0.3091459, size.height * 0.8219955);
+ path3.moveTo(size.width * 0.3212396, size.height * 0.8072562);
+ path3.arcToPoint(
+ Offset(size.width * 0.3696145, size.height * 0.8174603),
+ radius: Radius.elliptical(
+ size.width * 0.09070295,
+ size.height * 0.09070295,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: true,
+ );
+ path3.moveTo(size.width * 0.3624339, size.height * 0.8034769);
+ path3.cubicTo(
+ size.width * 0.3673469,
+ size.height * 0.8049887,
+ size.width * 0.3722600,
+ size.height * 0.8065004,
+ size.width * 0.3764172,
+ size.height * 0.8099017,
+ );
+ path3.lineTo(size.width * 0.3813303, size.height * 0.8136810);
+
+ final Paint paint3Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint3Stroke.color = deerTracks.withOpacity(1);
+ paint3Stroke.strokeCap = StrokeCap.round;
+ paint3Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path3, paint3Stroke);
+
+ final Path path4 = Path();
+ path4.moveTo(size.width * 0.2437642, size.height * 0.6077098);
+ path4.arcToPoint(
+ Offset(size.width * 0.2634165, size.height * 0.6167800),
+ radius: Radius.elliptical(
+ size.width * 0.02947846,
+ size.height * 0.02947846,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+
+ final Paint paint4Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint4Stroke.color = contourColor.withOpacity(1);
+ paint4Stroke.strokeCap = StrokeCap.round;
+ paint4Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path4, paint4Stroke);
+
+ final Path path5 = Path();
+ path5.moveTo(size.width * 0.2653061, size.height * 0.6046863);
+ path5.cubicTo(
+ size.width * 0.2603930,
+ size.height * 0.6455026,
+ size.width * 0.2551020,
+ size.height * 0.6878307,
+ size.width * 0.2524565,
+ size.height * 0.7282691,
+ );
+ path5.moveTo(size.width * 0.2464097, size.height * 0.7312925);
+ path5.cubicTo(
+ size.width * 0.2569917,
+ size.height * 0.7369615,
+ size.width * 0.2671958,
+ size.height * 0.7339380,
+ size.width * 0.2773998,
+ size.height * 0.7305367,
+ );
+ path5.moveTo(size.width * 0.3053666, size.height * 0.6043084);
+ path5.cubicTo(
+ size.width * 0.2978080,
+ size.height * 0.6356765,
+ size.width * 0.2928949,
+ size.height * 0.6972789,
+ size.width * 0.2751323,
+ size.height * 0.7244898,
+ );
+ path5.moveTo(size.width * 0.2974301, size.height * 0.6621315);
+ path5.cubicTo(
+ size.width * 0.3004535,
+ size.height * 0.6734694,
+ size.width * 0.3034769,
+ size.height * 0.6851852,
+ size.width * 0.3087680,
+ size.height * 0.6961451,
+ );
+ path5.moveTo(size.width * 0.3117914, size.height * 0.7040816);
+ path5.lineTo(size.width * 0.3136810, size.height * 0.7040816);
+ path5.moveTo(size.width * 0.3121693, size.height * 0.7112623);
+ path5.cubicTo(
+ size.width * 0.3182162,
+ size.height * 0.7120181,
+ size.width * 0.3219955,
+ size.height * 0.7093726,
+ size.width * 0.3280423,
+ size.height * 0.7082389,
+ );
+ path5.moveTo(size.width * 0.3185941, size.height * 0.6224490);
+ path5.cubicTo(
+ size.width * 0.3201058,
+ size.height * 0.6269841,
+ size.width * 0.3204837,
+ size.height * 0.6318972,
+ size.width * 0.3216175,
+ size.height * 0.6364324,
+ );
+ path5.cubicTo(
+ size.width * 0.3253968,
+ size.height * 0.6523054,
+ size.width * 0.3284203,
+ size.height * 0.6678005,
+ size.width * 0.3306878,
+ size.height * 0.6836735,
+ );
+ path5.lineTo(size.width * 0.3321995, size.height * 0.7014361);
+
+ final Paint paint5Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint5Stroke.color = contourColor.withOpacity(1);
+ paint5Stroke.strokeCap = StrokeCap.round;
+ paint5Stroke.strokeJoin = StrokeJoin.miter;
+ canvas.drawPath(path5, paint5Stroke);
+
+ final Path path6 = Path();
+ path6.moveTo(size.width * 0.2362056, size.height * 0.5933485);
+ path6.cubicTo(
+ size.width * 0.2467876,
+ size.height * 0.6050642,
+ size.width * 0.2675737,
+ size.height * 0.6073318,
+ size.width * 0.2815571,
+ size.height * 0.6009070,
+ );
+ path6.moveTo(size.width * 0.2165533, size.height * 0.5899471);
+ path6.cubicTo(
+ size.width * 0.2392290,
+ size.height * 0.5967498,
+ size.width * 0.2543462,
+ size.height * 0.5793651,
+ size.width * 0.2641723,
+ size.height * 0.5612245,
+ );
+ path6.moveTo(size.width * 0.2033258, size.height * 0.5835223);
+ path6.cubicTo(
+ size.width * 0.2071051,
+ size.height * 0.5884354,
+ size.width * 0.2120181,
+ size.height * 0.5891912,
+ size.width * 0.2169312,
+ size.height * 0.5861678,
+ );
+ path6.moveTo(size.width * 0.1965231, size.height * 0.5529101);
+ path6.cubicTo(
+ size.width * 0.1965231,
+ size.height * 0.5551776,
+ size.width * 0.1840514,
+ size.height * 0.5680272,
+ size.width * 0.1870748,
+ size.height * 0.5774754,
+ );
+ path6.moveTo(size.width * 0.1987906, size.height * 0.5234316);
+ path6.cubicTo(
+ size.width * 0.1987906,
+ size.height * 0.5287226,
+ size.width * 0.2037037,
+ size.height * 0.5415722,
+ size.width * 0.2089947,
+ size.height * 0.5479970,
+ );
+ path6.moveTo(size.width * 0.2256236, size.height * 0.5245654);
+ path6.arcToPoint(
+ Offset(size.width * 0.2354497, size.height * 0.5483749),
+ radius: Radius.elliptical(
+ size.width * 0.05668934,
+ size.height * 0.05668934,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path6.moveTo(size.width * 0.1904762, size.height * 0.4947090);
+ path6.cubicTo(
+ size.width * 0.1764928,
+ size.height * 0.5136054,
+ size.width * 0.1836735,
+ size.height * 0.5393046,
+ size.width * 0.1965231,
+ size.height * 0.5521542,
+ );
+
+ final Paint paint6Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint6Stroke.color = contourColor.withOpacity(1);
+ paint6Stroke.strokeCap = StrokeCap.round;
+ paint6Stroke.strokeJoin = StrokeJoin.miter;
+ canvas.drawPath(path6, paint6Stroke);
+
+ final Path path7 = Path();
+ path7.moveTo(size.width * 0.09826153, size.height * 0.4595616);
+ path7.cubicTo(
+ size.width * 0.1046863,
+ size.height * 0.4935752,
+ size.width * 0.1337868,
+ size.height * 0.5117158,
+ size.width * 0.1825397,
+ size.height * 0.5124717,
+ );
+
+ final Paint paint7Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint7Stroke.color = contourColor.withOpacity(1);
+ paint7Stroke.strokeCap = StrokeCap.round;
+ paint7Stroke.strokeJoin = StrokeJoin.miter;
+ canvas.drawPath(path7, paint7Stroke);
+
+ final Path path8 = Path();
+ path8.moveTo(size.width * 0.09788360, size.height * 0.4546485);
+ path8.cubicTo(
+ size.width * 0.09297052,
+ size.height * 0.4421769,
+ size.width * 0.1092215,
+ size.height * 0.4334845,
+ size.width * 0.1152683,
+ size.height * 0.4527589,
+ );
+ path8.cubicTo(
+ size.width * 0.1182918,
+ size.height * 0.4625850,
+ size.width * 0.1228269,
+ size.height * 0.4724112,
+ size.width * 0.1269841,
+ size.height * 0.4788360,
+ );
+ path8.moveTo(size.width * 0.1292517, size.height * 0.4811036);
+ path8.cubicTo(
+ size.width * 0.1341648,
+ size.height * 0.4845049,
+ size.width * 0.1398337,
+ size.height * 0.4863946,
+ size.width * 0.1447468,
+ size.height * 0.4886621,
+ );
+ path8.moveTo(size.width * 0.1462585, size.height * 0.4894180);
+ path8.cubicTo(
+ size.width * 0.1424792,
+ size.height * 0.4818594,
+ size.width * 0.1371882,
+ size.height * 0.4701436,
+ size.width * 0.1352986,
+ size.height * 0.4622071,
+ );
+ path8.cubicTo(
+ size.width * 0.1334089,
+ size.height * 0.4531368,
+ size.width * 0.1451247,
+ size.height * 0.4459562,
+ size.width * 0.1504157,
+ size.height * 0.4584278,
+ );
+ path8.moveTo(size.width * 0.1670446, size.height * 0.4935752);
+ path8.cubicTo(
+ size.width * 0.1632653,
+ size.height * 0.4826153,
+ size.width * 0.1557067,
+ size.height * 0.4678760,
+ size.width * 0.1507937,
+ size.height * 0.4580499,
+ );
+
+ final Paint paint8Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint8Stroke.color = contourColor.withOpacity(1);
+ paint8Stroke.strokeCap = StrokeCap.round;
+ paint8Stroke.strokeJoin = StrokeJoin.miter;
+ canvas.drawPath(path8, paint8Stroke);
+
+ final Path path9 = Path();
+ path9.moveTo(size.width * 0.1957672, size.height * 0.4950869);
+ path9.cubicTo(
+ size.width * 0.1719577,
+ size.height * 0.4977324,
+ size.width * 0.1938776,
+ size.height * 0.4818594,
+ size.width * 0.2071051,
+ size.height * 0.4829932,
+ );
+ path9.cubicTo(
+ size.width * 0.2021920,
+ size.height * 0.4818594,
+ size.width * 0.1882086,
+ size.height * 0.4829932,
+ size.width * 0.1851852,
+ size.height * 0.4773243,
+ );
+ path9.cubicTo(
+ size.width * 0.1814059,
+ size.height * 0.4697657,
+ size.width * 0.2116402,
+ size.height * 0.4671202,
+ size.width * 0.2161754,
+ size.height * 0.4663643,
+ );
+ path9.cubicTo(
+ size.width * 0.2422525,
+ size.height * 0.4629630,
+ size.width * 0.2630385,
+ size.height * 0.4754346,
+ size.width * 0.2690854,
+ size.height * 0.4905518,
+ );
+
+ final Paint paint9Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint9Stroke.color = contourColor.withOpacity(1);
+ paint9Stroke.strokeCap = StrokeCap.round;
+ paint9Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path9, paint9Stroke);
+
+ final Path path10 = Path();
+ path10.moveTo(size.width * 0.2694633, size.height * 0.4935752);
+ path10.cubicTo(
+ size.width * 0.2872260,
+ size.height * 0.4897959,
+ size.width * 0.2989418,
+ size.height * 0.4860166,
+ size.width * 0.3163265,
+ size.height * 0.4799698,
+ );
+ path10.moveTo(size.width * 0.2751323, size.height * 0.5105820);
+ path10.cubicTo(
+ size.width * 0.2970522,
+ size.height * 0.5041572,
+ size.width * 0.3817082,
+ size.height * 0.4863946,
+ size.width * 0.3809524,
+ size.height * 0.4538927,
+ );
+ path10.moveTo(size.width * 0.3790627, size.height * 0.4459562);
+ path10.cubicTo(
+ size.width * 0.3809524,
+ size.height * 0.4444444,
+ size.width * 0.3805745,
+ size.height * 0.4452003,
+ size.width * 0.3820862,
+ size.height * 0.4433107,
+ );
+ path10.moveTo(size.width * 0.3193500, size.height * 0.4773243);
+ path10.cubicTo(
+ size.width * 0.3163265,
+ size.height * 0.4705215,
+ size.width * 0.3163265,
+ size.height * 0.4629630,
+ size.width * 0.3129252,
+ size.height * 0.4561602,
+ );
+ path10.moveTo(size.width * 0.3401361, size.height * 0.4705215);
+ path10.cubicTo(
+ size.width * 0.3469388,
+ size.height * 0.4671202,
+ size.width * 0.3590325,
+ size.height * 0.4606954,
+ size.width * 0.3578987,
+ size.height * 0.4489796,
+ );
+ path10.moveTo(size.width * 0.3371126, size.height * 0.4693878);
+ path10.cubicTo(
+ size.width * 0.3333333,
+ size.height * 0.4603175,
+ size.width * 0.3276644,
+ size.height * 0.4327286,
+ size.width * 0.3163265,
+ size.height * 0.4399093,
+ );
+ path10.cubicTo(
+ size.width * 0.3106576,
+ size.height * 0.4433107,
+ size.width * 0.3110355,
+ size.height * 0.4478458,
+ size.width * 0.3117914,
+ size.height * 0.4531368,
+ );
+ path10.moveTo(size.width * 0.4100529, size.height * 0.7093726);
+ path10.cubicTo(
+ size.width * 0.4149660,
+ size.height * 0.7105064,
+ size.width * 0.4229025,
+ size.height * 0.7093726,
+ size.width * 0.4244142,
+ size.height * 0.7082389,
+ );
+ path10.moveTo(size.width * 0.4327286, size.height * 0.7048375);
+ path10.lineTo(size.width * 0.4289494, size.height * 0.7010582);
+ path10.moveTo(size.width * 0.4108088, size.height * 0.7010582);
+ path10.cubicTo(
+ size.width * 0.4092971,
+ size.height * 0.6708239,
+ size.width * 0.4115646,
+ size.height * 0.6405896,
+ size.width * 0.4108088,
+ size.height * 0.6103553,
+ );
+ path10.moveTo(size.width * 0.4357521, size.height * 0.6965231);
+ path10.cubicTo(
+ size.width * 0.4410431,
+ size.height * 0.6560847,
+ size.width * 0.4508692,
+ size.height * 0.6141345,
+ size.width * 0.4527589,
+ size.height * 0.5729403,
+ );
+ path10.moveTo(size.width * 0.4508692, size.height * 0.5672714);
+ path10.cubicTo(
+ size.width * 0.4546485,
+ size.height * 0.5702948,
+ size.width * 0.4523810,
+ size.height * 0.5680272,
+ size.width * 0.4569161,
+ size.height * 0.5748299,
+ );
+ path10.moveTo(size.width * 0.4656085, size.height * 0.6855631);
+ path10.lineTo(size.width * 0.4693878, size.height * 0.6817838);
+
+ final Paint paint10Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint10Stroke.color = contourColor.withOpacity(1);
+ paint10Stroke.strokeCap = StrokeCap.round;
+ paint10Stroke.strokeJoin = StrokeJoin.miter;
+ canvas.drawPath(path10, paint10Stroke);
+
+ final Path path11 = Path();
+ path11.moveTo(size.width * 0.4648526, size.height * 0.6753590);
+ path11.cubicTo(
+ size.width * 0.4603175,
+ size.height * 0.6579743,
+ size.width * 0.4520030,
+ size.height * 0.6417234,
+ size.width * 0.4452003,
+ size.height * 0.6254724,
+ );
+ path11.moveTo(size.width * 0.4739229, size.height * 0.6878307);
+ path11.arcToPoint(
+ Offset(size.width * 0.4863946, size.height * 0.6832955),
+ radius: Radius.elliptical(
+ size.width * 0.04913076,
+ size.height * 0.04913076,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path11.moveTo(size.width * 0.4882842, size.height * 0.6746032);
+ path11.arcToPoint(
+ Offset(size.width * 0.4606954, size.height * 0.5362812),
+ radius:
+ Radius.elliptical(size.width * 0.8752834, size.height * 0.8752834),
+ rotation: 0,
+ largeArc: false,
+ clockwise: false,
+ );
+ path11.moveTo(size.width * 0.4622071, size.height * 0.5328798);
+ path11.cubicTo(
+ size.width * 0.4863946,
+ size.height * 0.5166289,
+ size.width * 0.4735450,
+ size.height * 0.4822373,
+ size.width * 0.4546485,
+ size.height * 0.4686319,
+ );
+
+ final Paint paint11Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint11Stroke.color = contourColor.withOpacity(1);
+ paint11Stroke.strokeCap = StrokeCap.round;
+ paint11Stroke.strokeJoin = StrokeJoin.miter;
+ canvas.drawPath(path11, paint11Stroke);
+
+ final Path path12 = Path();
+ path12.moveTo(size.width * 0.4512472, size.height * 0.4761905);
+ path12.cubicTo(
+ size.width * 0.4531368,
+ size.height * 0.4803477,
+ size.width * 0.4572940,
+ size.height * 0.4863946,
+ size.width * 0.4588057,
+ size.height * 0.4894180,
+ );
+ path12.moveTo(size.width * 0.4501134, size.height * 0.4829932);
+ path12.cubicTo(
+ size.width * 0.4425548,
+ size.height * 0.4913076,
+ size.width * 0.4399093,
+ size.height * 0.5113379,
+ size.width * 0.4512472,
+ size.height * 0.5173847,
+ );
+ path12.moveTo(size.width * 0.3900227, size.height * 0.5000000);
+ path12.cubicTo(
+ size.width * 0.4070295,
+ size.height * 0.5011338,
+ size.width * 0.4270597,
+ size.height * 0.5022676,
+ size.width * 0.4433107,
+ size.height * 0.5083144,
+ );
+
+ final Paint paint12Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint12Stroke.color = contourColor.withOpacity(1);
+ paint12Stroke.strokeCap = StrokeCap.round;
+ paint12Stroke.strokeJoin = StrokeJoin.miter;
+ canvas.drawPath(path12, paint12Stroke);
+
+ final Path path13 = Path();
+ path13.moveTo(size.width * 0.3065004, size.height * 0.6084656);
+ path13.cubicTo(
+ size.width * 0.3072562,
+ size.height * 0.6133787,
+ size.width * 0.3091459,
+ size.height * 0.6179138,
+ size.width * 0.3140590,
+ size.height * 0.6194255,
+ );
+ path13.cubicTo(
+ size.width * 0.3201058,
+ size.height * 0.6224490,
+ size.width * 0.3941799,
+ size.height * 0.6130008,
+ size.width * 0.4160998,
+ size.height * 0.6069539,
+ );
+ path13.moveTo(size.width * 0.4225246, size.height * 0.5990174);
+ path13.cubicTo(
+ size.width * 0.4213908,
+ size.height * 0.5975057,
+ size.width * 0.4202570,
+ size.height * 0.5959940,
+ size.width * 0.4187453,
+ size.height * 0.5952381,
+ );
+ path13.moveTo(size.width * 0.4270597, size.height * 0.5910809);
+ path13.cubicTo(
+ size.width * 0.4270597,
+ size.height * 0.5850340,
+ size.width * 0.4198791,
+ size.height * 0.5393046,
+ size.width * 0.4195011,
+ size.height * 0.5328798,
+ );
+ path13.cubicTo(
+ size.width * 0.4183673,
+ size.height * 0.5234316,
+ size.width * 0.4157218,
+ size.height * 0.5158730,
+ size.width * 0.4032502,
+ size.height * 0.5177627,
+ );
+ path13.moveTo(size.width * 0.3926682, size.height * 0.5721844);
+ path13.cubicTo(
+ size.width * 0.3990930,
+ size.height * 0.5767196,
+ size.width * 0.4092971,
+ size.height * 0.5831444,
+ size.width * 0.4138322,
+ size.height * 0.5884354,
+ );
+
+ final Paint paint13Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint13Stroke.color = contourColor.withOpacity(1);
+ paint13Stroke.strokeCap = StrokeCap.round;
+ paint13Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path13, paint13Stroke);
+
+ final Path path14 = Path();
+ path14.moveTo(size.width * 0.4104308, size.height * 0.5226757);
+ path14.cubicTo(
+ size.width * 0.3998488,
+ size.height * 0.5377929,
+ size.width * 0.3847317,
+ size.height * 0.5740741,
+ size.width * 0.3707483,
+ size.height * 0.5755858,
+ );
+ path14.cubicTo(
+ size.width * 0.3556311,
+ size.height * 0.5767196,
+ size.width * 0.3163265,
+ size.height * 0.5468632,
+ size.width * 0.3038549,
+ size.height * 0.5389267,
+ );
+ path14.moveTo(size.width * 0.3182162, size.height * 0.6111111);
+ path14.cubicTo(
+ size.width * 0.3235072,
+ size.height * 0.6027967,
+ size.width * 0.3306878,
+ size.height * 0.5963719,
+ size.width * 0.3356009,
+ size.height * 0.5876795,
+ );
+ path14.moveTo(size.width * 0.3408919, size.height * 0.5801209);
+ path14.cubicTo(
+ size.width * 0.3431595,
+ size.height * 0.5767196,
+ size.width * 0.3454271,
+ size.height * 0.5729403,
+ size.width * 0.3469388,
+ size.height * 0.5687831,
+ );
+
+ final Paint paint14Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint14Stroke.color = contourColor.withOpacity(1);
+ paint14Stroke.strokeCap = StrokeCap.round;
+ paint14Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path14, paint14Stroke);
+
+ final Path path15 = Path();
+ path15.moveTo(size.width * 0.3046107, size.height * 0.6009070);
+ path15.cubicTo(
+ size.width * 0.3034769,
+ size.height * 0.5903250,
+ size.width * 0.2955404,
+ size.height * 0.5529101,
+ size.width * 0.2955404,
+ size.height * 0.5427060,
+ );
+ path15.cubicTo(
+ size.width * 0.2955404,
+ size.height * 0.5328798,
+ size.width * 0.2978080,
+ size.height * 0.5275888,
+ size.width * 0.3219955,
+ size.height * 0.5264550,
+ );
+ path15.moveTo(size.width * 0.3303099, size.height * 0.5253212);
+ path15.cubicTo(
+ size.width * 0.3514739,
+ size.height * 0.5215420,
+ size.width * 0.3733938,
+ size.height * 0.5196523,
+ size.width * 0.3934240,
+ size.height * 0.5188964,
+ );
+ path15.moveTo(size.width * 0.3518519, size.height * 0.4935752);
+ path15.cubicTo(
+ size.width * 0.3662132,
+ size.height * 0.4860166,
+ size.width * 0.3749055,
+ size.height * 0.5079365,
+ size.width * 0.3756614,
+ size.height * 0.5166289,
+ );
+ path15.moveTo(size.width * 0.3631897, size.height * 0.4818594);
+ path15.cubicTo(
+ size.width * 0.3813303,
+ size.height * 0.4829932,
+ size.width * 0.3907785,
+ size.height * 0.5034014,
+ size.width * 0.3896447,
+ size.height * 0.5170068,
+ );
+
+ final Paint paint15Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint15Stroke.color = contourColor.withOpacity(1);
+ paint15Stroke.strokeCap = StrokeCap.round;
+ paint15Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path15, paint15Stroke);
+
+ final Path path16 = Path();
+ path16.moveTo(size.width * 0.3049887, size.height * 0.5291005);
+ path16.cubicTo(
+ size.width * 0.3034769,
+ size.height * 0.5222978,
+ size.width * 0.3004535,
+ size.height * 0.5154951,
+ size.width * 0.2981859,
+ size.height * 0.5086924,
+ );
+ path16.moveTo(size.width * 0.3212396, size.height * 0.5268330);
+ path16.cubicTo(
+ size.width * 0.3185941,
+ size.height * 0.5192744,
+ size.width * 0.3167045,
+ size.height * 0.5117158,
+ size.width * 0.3129252,
+ size.height * 0.5049131,
+ );
+ path16.moveTo(size.width * 0.1678005, size.height * 0.4950869);
+ path16.lineTo(size.width * 0.1749811, size.height * 0.4965986);
+ path16.moveTo(size.width * 0.2683296, size.height * 0.5226757);
+ path16.cubicTo(
+ size.width * 0.2910053,
+ size.height * 0.5464853,
+ size.width * 0.2944067,
+ size.height * 0.5162509,
+ size.width * 0.2728647,
+ size.height * 0.5102041,
+ );
+
+ final Paint paint16Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint16Stroke.color = contourColor.withOpacity(1);
+ paint16Stroke.strokeCap = StrokeCap.round;
+ paint16Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path16, paint16Stroke);
+
+ final Path path17 = Path();
+ path17.moveTo(size.width * 0.1927438, size.height * 0.5820106);
+ path17.cubicTo(
+ size.width * 0.1980348,
+ size.height * 0.5839002,
+ size.width * 0.2033258,
+ size.height * 0.5823885,
+ size.width * 0.2101285,
+ size.height * 0.5782313,
+ );
+
+ final Paint paint17Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint17Stroke.color = contourColor.withOpacity(1);
+ paint17Stroke.strokeCap = StrokeCap.round;
+ paint17Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path17, paint17Stroke);
+
+ final Paint paint17Fill = Paint()..style = PaintingStyle.fill;
+ paint17Fill.color = contourColor.withOpacity(1);
+ canvas.drawPath(path17, paint17Fill);
+
+ final Path path18 = Path();
+ path18.moveTo(size.width * 0.3764172, size.height * 0.4365079);
+ path18.cubicTo(
+ size.width * 0.3730159,
+ size.height * 0.4270597,
+ size.width * 0.3718821,
+ size.height * 0.4040060,
+ size.width * 0.3571429,
+ size.height * 0.4085412,
+ );
+ path18.cubicTo(
+ size.width * 0.3469388,
+ size.height * 0.4119426,
+ size.width * 0.3563870,
+ size.height * 0.4349962,
+ size.width * 0.3571429,
+ size.height * 0.4402872,
+ );
+
+ final Paint paint18Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint18Stroke.color = contourColor.withOpacity(1);
+ paint18Stroke.strokeCap = StrokeCap.round;
+ paint18Stroke.strokeJoin = StrokeJoin.miter;
+ canvas.drawPath(path18, paint18Stroke);
+
+ final Path path19 = Path();
+ path19.moveTo(size.width * 0.1530612, size.height * 0.4104308);
+ path19.cubicTo(
+ size.width * 0.1477702,
+ size.height * 0.4085412,
+ size.width * 0.1447468,
+ size.height * 0.4028723,
+ size.width * 0.1455026,
+ size.height * 0.3972033,
+ );
+ path19.cubicTo(
+ size.width * 0.1458806,
+ size.height * 0.3919123,
+ size.width * 0.1485261,
+ size.height * 0.3866213,
+ size.width * 0.1530612,
+ size.height * 0.3839758,
+ );
+ path19.cubicTo(
+ size.width * 0.1568405,
+ size.height * 0.3817082,
+ size.width * 0.1617536,
+ size.height * 0.3809524,
+ size.width * 0.1655329,
+ size.height * 0.3828420,
+ );
+ path19.cubicTo(
+ size.width * 0.1700680,
+ size.height * 0.3847317,
+ size.width * 0.1742252,
+ size.height * 0.3881330,
+ size.width * 0.1757370,
+ size.height * 0.3926682,
+ );
+ path19.arcToPoint(
+ Offset(size.width * 0.1734694, size.height * 0.4096750),
+ radius: Radius.elliptical(
+ size.width * 0.01889645,
+ size.height * 0.01889645,
+ ),
+ rotation: 0,
+ largeArc: false,
+ clockwise: true,
+ );
+ path19.cubicTo(
+ size.width * 0.1712018,
+ size.height * 0.4134543,
+ size.width * 0.1659108,
+ size.height * 0.4142101,
+ size.width * 0.1651550,
+ size.height * 0.4187453,
+ );
+ path19.cubicTo(
+ size.width * 0.1643991,
+ size.height * 0.4232804,
+ size.width * 0.1689342,
+ size.height * 0.4270597,
+ size.width * 0.1708239,
+ size.height * 0.4308390,
+ );
+ path19.moveTo(size.width * 0.1757370, size.height * 0.4383976);
+ path19.cubicTo(
+ size.width * 0.1757370,
+ size.height * 0.4387755,
+ size.width * 0.1761149,
+ size.height * 0.4383976,
+ size.width * 0.1761149,
+ size.height * 0.4383976,
+ );
+ path19.lineTo(size.width * 0.1761149, size.height * 0.4387755);
+
+ final Paint paint19Stroke = Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = size.width * 0.007558579;
+ paint19Stroke.color = contourColor.withOpacity(1);
+ paint19Stroke.strokeCap = StrokeCap.round;
+ paint19Stroke.strokeJoin = StrokeJoin.round;
+ canvas.drawPath(path19, paint19Stroke);
+ }
+
+ @override
+ bool shouldRepaint(covariant final StrayDeerPainter oldDelegate) =>
+ colorPalette != oldDelegate.colorPalette;
+}
diff --git a/lib/logic/api_maps/rest_maps/backblaze.dart b/lib/logic/api_maps/rest_maps/backblaze.dart
index edc283b5..8ea94803 100644
--- a/lib/logic/api_maps/rest_maps/backblaze.dart
+++ b/lib/logic/api_maps/rest_maps/backblaze.dart
@@ -90,7 +90,8 @@ class BackblazeApi extends ApiMap {
),
);
if (response.statusCode == HttpStatus.ok) {
- isTokenValid = response.data['allowed']['capabilities'].contains('listBuckets');
+ isTokenValid =
+ response.data['allowed']['capabilities'].contains('listBuckets');
} else if (response.statusCode == HttpStatus.unauthorized) {
isTokenValid = false;
} else {
diff --git a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart
index c7928653..4beb53f7 100644
--- a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart
+++ b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart
@@ -18,6 +18,7 @@ import 'package:selfprivacy/logic/models/server_metadata.dart';
import 'package:selfprivacy/logic/models/server_provider_location.dart';
import 'package:selfprivacy/logic/models/server_type.dart';
import 'package:selfprivacy/utils/extensions/string_extensions.dart';
+import 'package:selfprivacy/utils/network_utils.dart';
import 'package:selfprivacy/utils/password_generator.dart';
class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
@@ -325,23 +326,6 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
return success;
}
- static String getHostnameFromDomain(final String domain) {
- // Replace all non-alphanumeric characters with an underscore
- String hostname =
- domain.split('.')[0].replaceAll(RegExp(r'[^a-zA-Z0-9]'), '-');
- if (hostname.endsWith('-')) {
- hostname = hostname.substring(0, hostname.length - 1);
- }
- if (hostname.startsWith('-')) {
- hostname = hostname.substring(1);
- }
- if (hostname.isEmpty) {
- hostname = 'selfprivacy-server';
- }
-
- return hostname;
- }
-
@override
Future> createServer({
required final String dnsApiToken,
@@ -431,17 +415,42 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
}
@override
- Future deleteServer({
+ Future> deleteServer({
required final String domainName,
}) async {
final Dio client = await getClient();
- final ServerBasicInfo serverToRemove = (await getServers()).firstWhere(
- (final el) => el.name == domainName,
- );
- final ServerVolume volumeToRemove = (await getVolumes()).firstWhere(
- (final el) => el.serverId == serverToRemove.id,
- );
+ final String hostname = getHostnameFromDomain(domainName);
+ final servers = await getServers();
+ final ServerBasicInfo serverToRemove;
+ try {
+ serverToRemove = servers.firstWhere(
+ (final el) => el.name == hostname,
+ );
+ } catch (e) {
+ print(e);
+ return APIGenericResult(
+ data: false,
+ success: false,
+ message: e.toString(),
+ );
+ }
+
+ final volumes = await getVolumes();
+ final ServerVolume volumeToRemove;
+ try {
+ volumeToRemove = volumes.firstWhere(
+ (final el) => el.serverId == serverToRemove.id,
+ );
+ } catch (e) {
+ print(e);
+ return APIGenericResult(
+ data: false,
+ success: false,
+ message: e.toString(),
+ );
+ }
+
final List laterFutures = [];
await detachVolume(volumeToRemove);
@@ -449,13 +458,23 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
try {
laterFutures.add(deleteVolume(volumeToRemove));
- laterFutures.add(client.delete('/droplets/$serverToRemove.id'));
+ laterFutures.add(client.delete('/droplets/${serverToRemove.id}'));
await Future.wait(laterFutures);
} catch (e) {
print(e);
+ return APIGenericResult(
+ success: false,
+ data: false,
+ message: e.toString(),
+ );
} finally {
close(client);
}
+
+ return APIGenericResult(
+ success: true,
+ data: true,
+ );
}
@override
diff --git a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart
index f0e032e8..7f51c768 100644
--- a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart
+++ b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart
@@ -19,6 +19,7 @@ import 'package:selfprivacy/logic/models/server_metadata.dart';
import 'package:selfprivacy/logic/models/server_provider_location.dart';
import 'package:selfprivacy/logic/models/server_type.dart';
import 'package:selfprivacy/utils/extensions/string_extensions.dart';
+import 'package:selfprivacy/utils/network_utils.dart';
import 'package:selfprivacy/utils/password_generator.dart';
class HetznerApi extends ServerProviderApi with VolumeProviderApi {
@@ -461,49 +462,47 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
);
}
- static String getHostnameFromDomain(final String domain) {
- // Replace all non-alphanumeric characters with an underscore
- String hostname =
- domain.split('.')[0].replaceAll(RegExp(r'[^a-zA-Z0-9]'), '-');
- if (hostname.endsWith('-')) {
- hostname = hostname.substring(0, hostname.length - 1);
- }
- if (hostname.startsWith('-')) {
- hostname = hostname.substring(1);
- }
- if (hostname.isEmpty) {
- hostname = 'selfprivacy-server';
- }
-
- return hostname;
- }
-
@override
- Future deleteServer({
+ Future> deleteServer({
required final String domainName,
}) async {
final Dio client = await getClient();
+ try {
+ final String hostname = getHostnameFromDomain(domainName);
- final String hostname = getHostnameFromDomain(domainName);
+ final Response serversReponse = await client.get('/servers');
+ final List servers = serversReponse.data['servers'];
+ final Map server =
+ servers.firstWhere((final el) => el['name'] == hostname);
+ final List volumes = server['volumes'];
+ final List laterFutures = [];
- final Response serversReponse = await client.get('/servers');
- final List servers = serversReponse.data['servers'];
- final Map server = servers.firstWhere((final el) => el['name'] == hostname);
- final List volumes = server['volumes'];
- final List laterFutures = [];
+ for (final volumeId in volumes) {
+ await client.post('/volumes/$volumeId/actions/detach');
+ }
+ await Future.delayed(const Duration(seconds: 10));
- for (final volumeId in volumes) {
- await client.post('/volumes/$volumeId/actions/detach');
+ for (final volumeId in volumes) {
+ laterFutures.add(client.delete('/volumes/$volumeId'));
+ }
+ laterFutures.add(client.delete('/servers/${server['id']}'));
+
+ await Future.wait(laterFutures);
+ } catch (e) {
+ print(e);
+ return APIGenericResult(
+ success: false,
+ data: false,
+ message: e.toString(),
+ );
+ } finally {
+ close(client);
}
- await Future.delayed(const Duration(seconds: 10));
- for (final volumeId in volumes) {
- laterFutures.add(client.delete('/volumes/$volumeId'));
- }
- laterFutures.add(client.delete('/servers/${server['id']}'));
-
- await Future.wait(laterFutures);
- close(client);
+ return APIGenericResult(
+ success: true,
+ data: true,
+ );
}
@override
diff --git a/lib/logic/api_maps/rest_maps/server_providers/server_provider.dart b/lib/logic/api_maps/rest_maps/server_providers/server_provider.dart
index 05fb5e61..c858d67b 100644
--- a/lib/logic/api_maps/rest_maps/server_providers/server_provider.dart
+++ b/lib/logic/api_maps/rest_maps/server_providers/server_provider.dart
@@ -31,7 +31,9 @@ abstract class ServerProviderApi extends ApiMap {
Future restart();
Future powerOn();
- Future deleteServer({required final String domainName});
+ Future> deleteServer({
+ required final String domainName,
+ });
Future> createServer({
required final String dnsApiToken,
required final User rootUser,
diff --git a/lib/logic/cubit/app_settings/app_settings_cubit.dart b/lib/logic/cubit/app_settings/app_settings_cubit.dart
index 06b46730..d013d418 100644
--- a/lib/logic/cubit/app_settings/app_settings_cubit.dart
+++ b/lib/logic/cubit/app_settings/app_settings_cubit.dart
@@ -1,7 +1,12 @@
+import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:hive/hive.dart';
+import 'package:material_color_utilities/material_color_utilities.dart'
+ as color_utils;
+import 'package:selfprivacy/config/brand_colors.dart';
import 'package:selfprivacy/config/hive_config.dart';
+import 'package:selfprivacy/theming/factory/app_theme_factory.dart';
export 'package:provider/provider.dart';
@@ -20,7 +25,7 @@ class AppSettingsCubit extends Cubit {
Box box = Hive.box(BNames.appSettingsBox);
- void load() {
+ void load() async {
final bool? isDarkModeOn = box.get(BNames.isDarkModeOn);
final bool? isOnboardingShowing = box.get(BNames.isOnboardingShowing);
emit(
@@ -29,6 +34,14 @@ class AppSettingsCubit extends Cubit {
isOnboardingShowing: isOnboardingShowing,
),
);
+ WidgetsFlutterBinding.ensureInitialized();
+ final color_utils.CorePalette? colorPalette =
+ await AppThemeFactory.getCorePalette();
+ emit(
+ state.copyWith(
+ corePalette: colorPalette,
+ ),
+ );
}
void updateDarkMode({required final bool isDarkModeOn}) {
diff --git a/lib/logic/cubit/app_settings/app_settings_state.dart b/lib/logic/cubit/app_settings/app_settings_state.dart
index 92da9667..8b29f6e9 100644
--- a/lib/logic/cubit/app_settings/app_settings_state.dart
+++ b/lib/logic/cubit/app_settings/app_settings_state.dart
@@ -4,20 +4,27 @@ class AppSettingsState extends Equatable {
const AppSettingsState({
required this.isDarkModeOn,
required this.isOnboardingShowing,
+ this.corePalette,
});
final bool isDarkModeOn;
final bool isOnboardingShowing;
+ final color_utils.CorePalette? corePalette;
AppSettingsState copyWith({
final bool? isDarkModeOn,
final bool? isOnboardingShowing,
+ final color_utils.CorePalette? corePalette,
}) =>
AppSettingsState(
isDarkModeOn: isDarkModeOn ?? this.isDarkModeOn,
isOnboardingShowing: isOnboardingShowing ?? this.isOnboardingShowing,
+ corePalette: corePalette ?? this.corePalette,
);
+ color_utils.CorePalette get corePaletteOrDefault =>
+ corePalette ?? color_utils.CorePalette.of(BrandColors.primary.value);
+
@override
- List